diff options
Diffstat (limited to 'osrgn.icl')
-rw-r--r-- | osrgn.icl | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/osrgn.icl b/osrgn.icl new file mode 100644 index 0000000..9af1a24 --- /dev/null +++ b/osrgn.icl @@ -0,0 +1,85 @@ +implementation module osrgn
+
+import StdBool, StdInt, StdList
+from ostypes import :: OSRect{..}
+import pictCCall_12, rgnCCall_12
+
+:: OSRgnHandle
+ :== Int
+:: OSPointH
+ :== Int
+
+// Region creation and disposal operations.
+osnewrgn :: !*OSToolbox -> (!OSRgnHandle,!*OSToolbox)
+osnewrgn tb
+ = winCreateRectRgn 0 0 1 1 tb
+
+osnewrectrgn :: !OSRect !*OSToolbox -> (!OSRgnHandle,!*OSToolbox)
+osnewrectrgn {rleft,rtop,rright,rbottom} tb
+ = winCreateRectRgn rleft rtop rright rbottom tb
+
+osdisposergn :: !OSRgnHandle !*OSToolbox -> *OSToolbox
+osdisposergn osrgn tb
+ = winDeleteObject osrgn tb
+
+
+// Setting the shape of a Region.
+osrectrgn :: !OSRect !OSRgnHandle !*OSToolbox -> (!OSRgnHandle,!*OSToolbox)
+osrectrgn {rleft,rtop,rright,rbottom} osrgn tb
+ = winSetRgnToRect rleft rtop rright rbottom osrgn tb
+
+ospolyrgn :: !(!Int,!Int) ![(Int,Int)] !OSRgnHandle !*OSToolbox -> (!OSRgnHandle,!*OSToolbox)
+ospolyrgn base shape osrgn tb
+ # (osrgn,tb) = winCombineRgn osrgn osrgn osrgn RGN_DIFF tb
+ | len==0
+ = (osrgn,tb)
+ | otherwise
+ # (shapeH,tb) = winAllocPolyShape len tb
+ # tb = setpolyshape shapeH 0 base shape tb
+ # (prgn,tb) = winCreatePolygonRgn shapeH len WINDING tb
+ # (osrgn,tb) = winCombineRgn osrgn prgn prgn RGN_COPY tb
+ # tb = winDeleteObject prgn tb
+ # tb = winFreePolyShape shapeH tb
+ = (osrgn,tb)
+where
+ len = length shape
+
+ setpolyshape :: !OSPointH !Int !(!Int,!Int) ![(Int,Int)] !*OSToolbox -> *OSToolbox
+ setpolyshape shapeH i (x,y) [(vx,vy):vs] tb
+ # tb = winSetPolyPoint i x y shapeH tb
+ # tb = setpolyshape shapeH (i+1) (x+vx,y+vy) vs tb
+ = tb
+ setpolyshape _ _ _ _ tb
+ = tb
+
+
+// Combining the shapes of two Regions into a new Region.
+ossectrgn :: !OSRgnHandle !OSRgnHandle !*OSToolbox -> (!OSRgnHandle,!*OSToolbox)
+ossectrgn rgn1 rgn2 tb
+ # (rrgn,tb) = winCreateRectRgn 0 0 1 1 tb
+ # (rrgn,tb) = winCombineRgn rrgn rgn1 rgn2 RGN_AND tb
+ = (rrgn,tb)
+
+osunionrgn :: !OSRgnHandle !OSRgnHandle !*OSToolbox -> (!OSRgnHandle,!*OSToolbox)
+osunionrgn rgn1 rgn2 tb
+ # (rrgn,tb) = winCreateRectRgn 0 0 1 1 tb
+ # (rrgn,tb) = winCombineRgn rrgn rgn1 rgn2 RGN_OR tb
+ = (rrgn,tb)
+
+osdiffrgn :: !OSRgnHandle !OSRgnHandle !*OSToolbox -> (!OSRgnHandle,!*OSToolbox)
+osdiffrgn rgn1 rgn2 tb
+ # (rrgn,tb) = winCreateRectRgn 0 0 1 1 tb
+ # (rrgn,tb) = winCombineRgn rrgn rgn1 rgn2 RGN_DIFF tb
+ = (rrgn,tb)
+
+
+// Region property access functions.
+osgetrgnbox :: !OSRgnHandle !*OSToolbox -> (!Bool,!OSRect,!*OSToolbox)
+osgetrgnbox rgn tb
+ # (l,t, r,b, isRect,_,tb) = winGetRgnBox rgn tb
+ = (isRect,{rleft=l,rtop=t,rright=r,rbottom=b}, tb)
+
+osisemptyrgn:: !OSRgnHandle !*OSToolbox -> (!Bool,!*OSToolbox)
+osisemptyrgn rgn tb
+ # (_,_,_,_,_,isempty,tb) = winGetRgnBox rgn tb
+ = (isempty,tb)
|