forked from dmitryvk/cl-gtk2
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgdk.region.lisp
159 lines (116 loc) · 4.41 KB
/
gdk.region.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
(in-package :gdk)
(defcfun gdk-rectangle-intersect :boolean
(src-1 (g-boxed-foreign rectangle))
(src-2 (g-boxed-foreign rectangle))
(dest (g-boxed-foreign rectangle)))
(defun rectangle-intersect (rectangle-1 rectangle-2)
(let ((dest (make-rectangle)))
(when (gdk-rectangle-intersect rectangle-1 rectangle-2 dest)
dest)))
(export 'rectangle-intersect)
(defcfun gdk-rectangle-union :boolean
(src-1 (g-boxed-foreign rectangle))
(src-2 (g-boxed-foreign rectangle))
(dest (g-boxed-foreign rectangle)))
(defun rectangle-union (rectangle-1 rectangle-2)
(let ((dest (make-rectangle)))
(when (gdk-rectangle-union rectangle-1 rectangle-2 dest)
dest)))
(export 'rectangle-union)
(defcfun gdk-region-polygon (g-boxed-foreign region :return)
(points :pointer)
(n-points :int)
(fill-rule gdk-fill-rule))
(defun region-from-polygon (points fill-rule)
(with-foreign-boxed-array (n pts point points)
(gdk-region-polygon pts n fill-rule)))
(export 'region-from-polygon)
(defcfun (region-from-rectangle "gdk_region_rectangle") (g-boxed-foreign region :return)
(rectangle (g-boxed-foreign rectangle)))
(export 'region-from-rectangle)
(defcfun gdk-region-get-clipbox :void
(region (g-boxed-foreign region))
(rectangle (g-boxed-foreign rectangle)))
(defun region-get-clipbox (region)
(let ((clipbox (make-rectangle)))
(gdk-region-get-clipbox region clipbox)
clipbox))
(export 'region-get-clipbox)
(defcfun gdk-region-get-rectangles :void
(region (g-boxed-foreign region))
(rectangles :pointer)
(n-rectangles :pointer))
(defun region-get-rectangles (region)
(with-foreign-objects ((rectangles-ptr :pointer) (n-rectangles-ptr :int))
(gdk-region-get-rectangles region rectangles-ptr n-rectangles-ptr)
(let ((n (mem-ref n-rectangles-ptr :int))
(rectangles (mem-ref rectangles-ptr :pointer)))
(prog1
(iter (for i from 0 below n)
(for rect = (convert-from-foreign (inc-pointer rectangles (* i (foreign-type-size 'rectangle-cstruct)))
'(g-boxed-foreign rectangle)))
(collect rect))
(glib:g-free rectangles)))))
(export 'region-get-rectangles)
(defcfun (region-is-empty "gdk_region_empty") :boolean
(region (g-boxed-foreign region)))
(export 'region-is-empty)
(defcfun (region= "gdk_region_equal") :boolean
(region-1 (g-boxed-foreign region))
(region-2 (g-boxed-foreign region)))
(export 'region=)
(defcfun (region-point-in "gdk_region_point_in") :boolean
(region (g-boxed-foreign region))
(x :int)
(y :int))
(export 'region-point-in)
(defcfun (region-rect-in "gdk_region_rect_in") overlap-type
(region (g-boxed-foreign region))
(rectangle (g-boxed-foreign rectangle)))
(export 'region-rect-in)
(defcfun (region-offset "gdk_region_offset") :void
(region (g-boxed-foreign region))
(dx :int)
(dy :int))
(export 'region-offset)
(defcfun (region-shrink "gdk_region_shrink") :void
(region (g-boxed-foreign region))
(dx :int)
(dy :int))
(export 'region-shrink)
(defcfun (region-union-with-rect "gdk_region_union_with_rect") :void
(region (g-boxed-foreign region))
(rect (g-boxed-foreign rectangle)))
(export 'region-union-with-rect)
(defcfun (region-intersect "gdk_region_intersect") :void
(target (g-boxed-foreign region))
(source (g-boxed-foreign region)))
(export 'region-intersect)
(defcfun (region-union "gdk_region_union") :void
(target (g-boxed-foreign region))
(source (g-boxed-foreign region)))
(export 'region-union)
(defcfun (region-subtract "gdk_region_subtract") :void
(target (g-boxed-foreign region))
(source (g-boxed-foreign region)))
(export 'region-subtract)
(defcfun (region-xor "gdk_region_xor") :void
(target (g-boxed-foreign region))
(source (g-boxed-foreign region)))
(export 'region-xor)
(defcallback gdk-span-func-callback :void
((span (g-boxed-foreign span)) (data :pointer))
(let ((fn (stable-pointer-value data)))
(funcall fn span)))
(defcfun gdk-region-spans-intersect-foreach :void
(region (g-boxed-foreign region))
(spans :pointer)
(n-spans :int)
(sorted :boolean)
(function :pointer)
(data :pointer))
(defun region-spans-intersect-foreach (region spans sorted fn)
(with-stable-pointer (ptr fn)
(with-foreign-boxed-array (n spans-ptr span spans)
(gdk-region-spans-intersect-foreach region spans-ptr n sorted (callback gdk-region-spans-intersect-foreach) ptr))))
(export 'region-spans-intersect-foreach)