1ed0a2c5 |
1 | ;; This file contains the cairo C snippets translated to lisp |
2 | ;; See http://cairographics.org/samples/ |
3 | |
4 | #+sbcl(require :gtk) |
5 | #+cmu(asdf:oos 'asdf:load-op :gtk) |
6 | #+sbcl(require :cairo) |
7 | #+cmu(asdf:oos 'asdf:load-op :cairo) |
8 | |
9 | ;;#+sbcl(require :rsvg) |
10 | ;;#+cmu(asdf:oos 'asdf:load-op :avg-cairo) |
11 | |
12 | (defpackage "TESTCAIRO" |
13 | (:use "COMMON-LISP" "GTK") |
14 | (:export "CREATE-TESTS")) |
15 | |
16 | (in-package "TESTCAIRO") |
17 | |
18 | (declaim (inline deg-to-rad)) |
19 | (defun deg-to-rad (deg) |
20 | (* deg (/ pi 180))) |
21 | |
22 | (declaim (inline rad-to-deg)) |
23 | (defun rad-to-deg (rad) |
24 | (/ (* rad 180) pi)) |
25 | |
26 | |
27 | (defvar *snippets* ()) |
28 | |
29 | |
30 | (defmacro define-snippet (name (cr) &body body) |
31 | (let ((widget (make-symbol "WIDGET")) |
32 | (window (make-symbol "WINDOW")) |
33 | (pointer (make-symbol "POINTER"))) |
34 | `(let ((,window nil)) |
35 | (setq *snippets* (pushnew ',name *snippets*)) |
36 | (defun ,name () |
37 | (if (not ,window) |
38 | (let ((,widget (make-instance 'drawing-area))) |
39 | (setq ,window |
40 | (make-instance 'window |
41 | :width-request 300 :height-request 300 |
42 | :title ,(string-downcase name) |
43 | :visible t :child ,widget)) |
44 | (signal-connect ,window 'destroy |
45 | #'(lambda () (setq ,window nil))) |
46 | (signal-connect ,widget 'expose-event |
47 | #'(lambda (,pointer) |
48 | (declare (ignore ,pointer)) |
49 | (let ((,cr (gdk:cairo-create (widget-window ,widget)))) |
50 | (multiple-value-bind (width height) |
51 | (widget-get-size-allocation ,widget) |
52 | (cairo:scale ,cr width height)) |
53 | (setf (cairo:line-width ,cr) 0.04) |
54 | ,@body))) |
55 | (widget-show-all ,window)) |
56 | (widget-destroy ,window)))))) |
57 | |
58 | |
59 | |
60 | |
61 | (defun arc-helper-lines (cr xc yc radius angle1 angle2) |
62 | (cairo:set-source-color cr 1 0.2 0.2 0.6) |
63 | (cairo:arc cr xc yc 0.05 0 (deg-to-rad 360)) |
64 | (cairo:fill cr) |
65 | (setf (cairo:line-width cr) 0.03) |
66 | (cairo:move-to cr xc yc) |
67 | (cairo:rel-line-to cr (* radius (cos angle1)) (* radius (sin angle1))) |
68 | (cairo:stroke cr) |
69 | (cairo:move-to cr xc yc) |
70 | (cairo:rel-line-to cr (* radius (cos angle2)) (* radius (sin angle2))) |
71 | (cairo:stroke cr)) |
72 | |
73 | (define-snippet arc (cr) |
74 | (let ((xc 0.5) |
75 | (yc 0.5) |
76 | (radius 0.4) |
77 | (angle1 (deg-to-rad 45.0)) |
78 | (angle2 (deg-to-rad 180.0))) |
79 | |
80 | (cairo:with-context (cr) |
81 | (setf (cairo:line-cap cr) :round) |
82 | (cairo:arc cr xc yc radius angle1 angle2) |
83 | (cairo:stroke cr)) |
84 | |
85 | (arc-helper-lines cr xc yc radius angle1 angle2))) |
86 | |
87 | (define-snippet arc-negative (cr) |
88 | (let ((xc 0.5) |
89 | (yc 0.5) |
90 | (radius 0.4) |
91 | (angle1 (deg-to-rad 45.0)) |
92 | (angle2 (deg-to-rad 180.0))) |
93 | |
94 | (cairo:with-context (cr) |
95 | (setf (cairo:line-cap cr) :round) |
96 | (cairo:arc-negative cr xc yc radius angle1 angle2) |
97 | (cairo:stroke cr)) |
98 | |
99 | (arc-helper-lines cr xc yc radius angle1 angle2))) |
100 | |
101 | |
102 | (define-snippet clip (cr) |
103 | (cairo:circle cr 0.5 0.5 0.3) |
104 | (cairo:clip cr) |
105 | |
106 | (cairo:new-path cr) ; current path is not consumed by cairo:clip |
107 | (cairo:rectangle cr 0 0 1 1) |
108 | (cairo:fill cr) |
109 | (cairo:set-source-color cr 0 1 0) |
110 | (cairo:move-to cr 0 0) |
111 | (cairo:line-to cr 1 1) |
112 | (cairo:move-to cr 1 0) |
113 | (cairo:line-to cr 0 1) |
114 | (cairo:stroke cr)) |
115 | |
116 | |
117 | (define-snippet clip-image (cr) |
118 | (cairo:circle cr 0.5 0.5 0.3) |
119 | (cairo:clip cr) |
120 | (cairo:new-path cr) |
121 | |
122 | (let ((image (cairo:image-surface-create-from-png |
123 | #p"clg:examples;romedalen.png"))) |
124 | |
125 | (let ((width (cairo:surface-width image)) |
126 | (height (cairo:surface-height image))) |
127 | (cairo:scale cr (/ 1.0 width) (/ 1.0 height))) |
128 | |
129 | (cairo:set-source-surface cr image 0 0) |
130 | (cairo:paint cr))) |
131 | |
132 | (define-snippet clip-rectangle (cr) |
133 | (cairo:new-path cr) |
134 | (cairo:move-to cr 0.25 0.25) |
135 | (cairo:line-to cr 0.25 0.75) |
136 | (cairo:line-to cr 0.75 0.75) |
137 | (cairo:line-to cr 0.75 0.25) |
138 | (cairo:line-to cr 0.25 0.25) |
139 | (cairo:close-path cr) |
140 | |
141 | (cairo:clip cr) |
142 | |
143 | (cairo:move-to cr 0 0) |
144 | (cairo:line-to cr 1 1) |
145 | (cairo:stroke cr)) |
146 | |
147 | |
148 | ;; (define-snippet curve-rectangle (cr) |
149 | ;; (let ((x0 0.1) |
150 | ;; (y0 0.1) |
151 | ;; (width 0.8) |
152 | ;; (height 0.8) |
153 | ;; (radius 0.4)) |
154 | ;; (unless (and (zerop width) (zerop height)) |
155 | ;; (let ((x1 (+ x0 width)) |
156 | ;; (y1 (+ y0 height))) |
157 | ;; (cond |
158 | ;; ((and (< (* 0.5 width) radius) (< (* 0.5 height) radius)) |
159 | ;; (cairo:move-to cr x0 (* 0.5 (+ y0 y1))) |
160 | ;; (cairo:curve-to cr x0 y0 x0 y0 (* 0.5 (+ x0 x1)) y0) |
161 | ;; (cairo:curve-to cr x1 y0 x1 y0 x1 (* 0.5 (+ y0 y1))) |
162 | ;; (cairo:curve-to cr x1 y1 x1 y1 (* 0.5 (+ x0 x1)) y1) |
163 | ;; (cairo:curve-to cr x0 y1 x0 y1 x0 (* 0.5 (+ y0 y1)))) |
164 | ;; ((< (* 0.5 width) radius) |
165 | ;; (cairo:move-to cr x0 (+ y0 radius)) |
166 | ;; (cairo:curve-to cr x0 y0 x0 y0 (* 0.5 (+ x0 x1)) y0) |
167 | ;; (cairo:curve-to cr x1 y0 x1 y0 x1 (+ y0 radius)) |
168 | ;; (cairo:line-to cr x1 (- y1 radius)) |
169 | ;; (cairo:curve-to cr x1 y1 x1 y1 (* 0.5 (+ x0 x1)) y1) |
170 | ;; (cairo:curve-to cr x0 y1 x0 y1 x0 (- y1 radius))) |
171 | ;; ((< (* 0.5 height) radius) |
172 | ;; (cairo:move-to cr x0 (* 0.5 (+ y0 y1))) |
173 | ;; (cairo:curve-to cr x0 y0 x0 y0 (+ x0 radius) y0) |
174 | ;; (cairo:line-to cr (- x1 radius) y0) |
175 | ;; (cairo:curve-to cr x1 y0 x1 y0 x1 (* 0.5 (+ y0 y1))) |
176 | ;; (cairo:curve-to cr x1 y1 x1 y1 (- x1 radius) y1) |
177 | ;; (cairo:line-to cr (+ x0 radius) y1) |
178 | ;; (cairo:curve-to cr x0 y1 x0 y1 x0 (* 0.5 (+ y0 y1)))) |
179 | ;; (t |
180 | ;; (cairo:move-to cr x0 (+ y0 radius)) |
181 | ;; (cairo:curve-to cr x0 y0 x0 y0 (+ x0 radius) y0) |
182 | ;; (cairo:line-to cr (- x1 radius) y0) |
183 | ;; (cairo:curve-to cr x1 y0 x1 y0 x1 (+ y0 radius)) |
184 | ;; (cairo:line-to cr x1 (- y1 radius)) |
185 | ;; (cairo:curve-to cr x1 y1 x1 y1 (- x1 radius) y1) |
186 | ;; (cairo:line-to cr (+ x0 radius) y1) |
187 | ;; (cairo:curve-to cr x0 y1 x0 y1 x0 (- y1 radius)))) |
188 | ;; (cairo:close-path cr) |
189 | |
190 | ;; (cairo:set-source-color cr 0.5 0.5 1.0) |
191 | ;; (cairo:fill cr t) |
192 | ;; (cairo:set-source-color cr 0.5 0.0 0.0 0.5) |
193 | ;; (cairo:stroke cr))))) |
194 | |
195 | |
196 | |
197 | (define-snippet curve-to (cr) |
198 | (let ((x 0.1) (y 0.5) |
199 | (x1 0.4) (y1 0.9) |
200 | (x2 0.6) (y2 0.1) |
201 | (x3 0.9) (y3 0.5)) |
202 | |
203 | (cairo:move-to cr x y) |
204 | (cairo:curve-to cr x1 y1 x2 y2 x3 y3) |
205 | |
206 | (cairo:stroke cr) |
207 | |
208 | (cairo:set-source-color cr 1 0.2 0.2 0.6) |
209 | (setf (cairo:line-width cr) 0.03) |
210 | (cairo:move-to cr x y) |
211 | (cairo:line-to cr x1 y1) |
212 | (cairo:move-to cr x2 y2) |
213 | (cairo:line-to cr x3 y3) |
214 | (cairo:stroke cr))) |
215 | |
216 | |
217 | (define-snippet dash (cr) |
218 | (let ((dashes #(0.20 0.05 0.05 0.05)) |
219 | (offset -0.2)) |
220 | (cairo:set-dash cr dashes offset) |
221 | (cairo:move-to cr 0.5 0.1) |
222 | (cairo:line-to cr 0.9 0.9) |
223 | (cairo:rel-line-to cr -0.4 0.0) |
224 | (cairo:curve-to cr 0.2 0.9 0.2 0.5 0.5 0.5) |
225 | (cairo:stroke cr))) |
226 | |
227 | |
228 | (defun fill-and-stroke-common (cr) |
229 | (cairo:move-to cr 0.5 0.1) |
230 | (cairo:line-to cr 0.9 0.9) |
231 | (cairo:rel-line-to cr -0.4 0.0) |
232 | (cairo:curve-to cr 0.2 0.9 0.2 0.5 0.5 0.5) |
233 | (cairo:close-path cr)) |
234 | |
235 | |
236 | (define-snippet fill-and-stroke2 (cr) |
237 | (fill-and-stroke-common cr) |
238 | (cairo:move-to cr 0.25 0.1) |
239 | (cairo:rel-line-to cr 0.2 0.2) |
240 | (cairo:rel-line-to cr -0.2 0.2) |
241 | (cairo:rel-line-to cr -0.2 -0.2) |
242 | (cairo:close-path cr) |
243 | |
244 | (cairo:set-source-color cr 0 0 1) |
245 | (cairo:fill cr t) |
246 | (cairo:set-source-color cr 0 0 0) |
247 | (cairo:stroke cr)) |
248 | |
249 | |
250 | (define-snippet fill-and-stroke (cr) |
251 | (fill-and-stroke-common cr) |
252 | |
253 | (cairo:set-source-color cr 0 0 1) |
254 | (cairo:fill cr t) |
255 | (cairo:set-source-color cr 0 0 0) |
256 | (cairo:stroke cr)) |
257 | |
258 | |
259 | (define-snippet gradient (cr) |
260 | (let ((pattern (cairo:pattern-create-linear 0.0 0.0 0.0 1.0))) |
261 | (cairo:pattern-add-color-stop pattern 1 0 0 0 1) |
262 | (cairo:pattern-add-color-stop pattern 0 1 1 1 1) |
263 | (cairo:rectangle cr 0 0 1 1) |
264 | (setf (cairo:source cr) pattern) |
265 | (cairo:fill cr)) |
266 | (let ((pattern (cairo:pattern-create-radial 0.45 0.4 0.1 0.4 0.4 0.5))) |
267 | (cairo:pattern-add-color-stop pattern 0 1 1 1 1) |
268 | (cairo:pattern-add-color-stop pattern 1 0 0 0 1) |
269 | (setf (cairo:source cr) pattern) |
270 | (cairo:circle cr 0.5 0.5 0.3) |
271 | (cairo:fill cr))) |
272 | |
273 | |
274 | (define-snippet image (cr) |
275 | (let ((image (cairo:image-surface-create-from-png |
276 | #p"clg:examples;romedalen.png"))) |
277 | (cairo:translate cr 0.5 0.5) |
278 | (cairo:rotate cr (deg-to-rad 45)) |
279 | (let ((width (cairo:surface-width image)) |
280 | (height (cairo:surface-height image))) |
281 | (cairo:scale cr (/ 1.0 width) (/ 1.0 height)) |
282 | (cairo:translate cr (* -0.5 width) (* -0.5 height))) |
283 | (cairo:set-source-surface cr image 0 0) |
284 | (cairo:paint cr))) |
285 | |
286 | |
287 | (define-snippet image-pattern (cr) |
288 | (let* ((image (cairo:image-surface-create-from-png |
289 | #p"clg:examples;romedalen.png")) |
290 | (pattern (cairo:pattern-create-for-surface image))) |
291 | (setf (cairo:pattern-extend pattern) :repeat) |
292 | (cairo:translate cr 0.5 0.5) |
293 | (cairo:rotate cr (deg-to-rad 45)) |
294 | (cairo:scale cr (/ 1.0 (sqrt 2)) (/ 1.0 (sqrt 2))) |
295 | (cairo:translate cr -0.5 -0.5) |
296 | (let ((width (cairo:surface-width image)) |
297 | (height (cairo:surface-height image)) |
298 | (matrix (make-instance 'cairo:matrix))) |
299 | (cairo:matrix-init-scale matrix (* 5 width) (* 5 height)) |
300 | (setf (cairo:pattern-matrix pattern) matrix)) |
301 | (setf (cairo:source cr) pattern) |
302 | (cairo:rectangle cr 0.0 0.0 1.0 1.0) |
303 | (cairo:fill cr))) |
304 | |
305 | |
306 | ;; (defun snippet-set-bg-svg (cr filename) |
307 | ;; (let ((handle (make-instance 'rsvg:handle :filename filename))) |
308 | ;; (cairo:with-context (cr) |
309 | ;; (with-slots (rsvg:width rsvg:height) (rsvg:handle-dimensions handle) |
310 | ;; (cairo:scale cr (/ 1.0 rsvg:width) (/ 1.0 rsvg:height)) |
311 | ;; (rsvg:cairo-render cr handle))))) |
312 | |
313 | ;; (define-snippet librsvg (cr) |
314 | ;; (snippet-set-bg-svg cr "clg:examples;home.svg")) |
315 | |
316 | |
317 | (defmacro define-operator-snippet (operator) |
318 | (let ((name (intern (format nil "OPERATOR-~A" operator)))) |
319 | `(define-snippet ,name (cr) |
320 | (snippet-set-bg-svg cr "clg:examples;freedesktop.svg") |
321 | (setf (cairo:operator cr) ,operator) |
322 | |
323 | (cairo:set-source-color cr 1.0 0.0 0.0 0.5) |
324 | (cairo:rectangle cr 0.2 0.2 0.5 0.5) |
325 | (cairo:fill) |
326 | |
327 | (cairo:set-source-color cr 0.0 1.0 0.0) |
328 | (cairo:rectangle cr 0.4 0.4 0.4 0.4) |
329 | (cairo:fill) |
330 | |
331 | (cairo:set-source-color cr 0.0 0.0 1.0) |
332 | (cairo:rectangle cr 0.6 0.6 0.3 0.3) |
333 | (cairo:fill)))) |
334 | |
335 | ;; (define-operator-snippet :add) |
336 | ;; (define-operator-snippet :atop) |
337 | ;; (define-operator-snippet :atop-reverse) |
338 | ;; (define-operator-snippet :in) |
339 | ;; (define-operator-snippet :in-reverse) |
340 | ;; (define-operator-snippet :out) |
341 | ;; (define-operator-snippet :out-reverse) |
342 | ;; (define-operator-snippet :over) |
343 | ;; (define-operator-snippet :over-reverse) |
344 | ;; (define-operator-snippet :saturate) |
345 | ;; (define-operator-snippet :xor) |
346 | |
347 | |
348 | |
349 | (define-snippet path (cr) |
350 | (cairo:move-to cr 0.5 0.1) |
351 | (cairo:line-to cr 0.9 0.9) |
352 | (cairo:rel-line-to cr -0.4 0.0) |
353 | (cairo:curve-to cr 0.2 0.9 0.2 0.5 0.5 0.5) |
354 | (cairo:stroke cr)) |
355 | |
356 | |
357 | ;; (let ((path)) |
358 | ;; (define-snippet pattern-fill (cr) |
359 | ;; (let ((spikes 10) |
360 | ;; (text "KAPOW!")) |
361 | ;; (unless path |
362 | ;; (let ((x-fuzz 0.08) |
363 | ;; (y-fuzz 0.08) |
364 | ;; (x-inner-radius 0.3) |
365 | ;; (y-inner-radius 0.2) |
366 | ;; (x-outer-radius 0.45) |
367 | ;; (y-outer-radius 0.35)) |
368 | ;; (setq path (make-array (* 2 spikes))) |
369 | ;; (loop |
370 | ;; for i from 0 below (* 2 spikes) |
371 | ;; do (multiple-value-bind (x-radius y-radius) |
372 | ;; (if (evenp i) |
373 | ;; (values x-inner-radius y-inner-radius) |
374 | ;; (values x-outer-radius y-outer-radius)) |
375 | ;; (setf |
376 | ;; (svref path i) |
377 | ;; (cons |
378 | ;; (+ 0.5 (* (cos (* pi (/ i spikes))) x-radius) |
379 | ;; (* (random 1.0) x-fuzz)) |
380 | ;; (+ 0.5 (* (sin (* pi (/ i spikes))) y-radius) |
381 | ;; (* (random 1.0) y-fuzz)))))))) |
382 | |
383 | ;; (setf (cairo:line-width cr) 0.01) |
384 | ;; (cairo:move-to cr (car (svref path 0)) (cdr (svref path 0))) |
385 | ;; (loop |
386 | ;; for i from 1 below (* 2 spikes) |
387 | ;; do (cairo:line-to cr (car (svref path i)) (cdr (svref path i)))) |
388 | ;; (cairo:close-path cr) |
389 | ;; (cairo:stroke cr) |
390 | ;; (cairo:move-to cr |
391 | ;; (car (svref path (1- spikes))) (cdr (svref path (1- spikes)))) |
392 | |
393 | ;; (cairo:select-font-face cr "Sans" :normal :bold) |
394 | ;; (time (cairo:text-path cr text)) |
395 | ;; (cairo:set-source-color cr 1.0 1.0 0.5) |
396 | ;; (cairo:fill cr) |
397 | |
398 | ;; (cairo:set-font-size cr 0.2) |
399 | ;; (let* ((extents (cairo:text-extents cr text)) |
400 | ;; (x (- 0.5 (+ (* 0.5 (cairo:text-extents-width extents)) (cairo:text-extents-x-bearing extents)))) |
401 | ;; (y (- 0.5 (+ (* 0.5 (cairo:text-extents-height extents)) (cairo:text-extents-y-bearing extents))))) |
402 | |
403 | ;; (cairo:move-to cr x y) |
404 | ;; (cairo:text-path cr text) |
405 | ;; (cairo:set-source-color cr 0 0 0) |
406 | ;; (cairo:stroke cr))))) |
407 | |
408 | |
409 | |
410 | (define-snippet set-line-cap (cr) |
411 | (setf (cairo:line-width cr) 0.12) |
412 | (setf (cairo:line-cap cr) :butt) |
413 | (cairo:move-to cr 0.25 0.2) |
414 | (cairo:line-to cr 0.25 0.8) |
415 | (cairo:stroke cr) |
416 | (setf (cairo:line-cap cr) :round) |
417 | (cairo:move-to cr 0.5 0.2) |
418 | (cairo:line-to cr 0.5 0.8) |
419 | (cairo:stroke cr) |
420 | (setf (cairo:line-cap cr) :square) |
421 | (cairo:move-to cr 0.75 0.2) |
422 | (cairo:line-to cr 0.75 0.8) |
423 | (cairo:stroke cr) |
424 | |
425 | ;; draw helping lines |
426 | (cairo:set-source-color cr 1 0.2 0.2) |
427 | (setf (cairo:line-width cr) 0.01) |
428 | (cairo:move-to cr 0.25 0.2) |
429 | (cairo:line-to cr 0.25 0.8) |
430 | (cairo:move-to cr 0.5 0.2) |
431 | (cairo:line-to cr 0.5 0.8) |
432 | (cairo:move-to cr 0.75 0.2) |
433 | (cairo:line-to cr 0.75 0.8) |
434 | (cairo:stroke cr)) |
435 | |
436 | |
437 | (define-snippet set-line-join (cr) |
438 | (setf (cairo:line-width cr) 0.16) |
439 | (cairo:move-to cr 0.3 0.33) |
440 | (cairo:rel-line-to cr 0.2 -0.2) |
441 | (cairo:rel-line-to cr 0.2 0.2) |
442 | (setf (cairo:line-join cr) :miter) ; default |
443 | (cairo:stroke cr) |
444 | |
445 | (cairo:move-to cr 0.3 0.63) |
446 | (cairo:rel-line-to cr 0.2 -0.2) |
447 | (cairo:rel-line-to cr 0.2 0.2) |
448 | (setf (cairo:line-join cr) :bevel) |
449 | (cairo:stroke cr) |
450 | |
451 | (cairo:move-to cr 0.3 0.93) |
452 | (cairo:rel-line-to cr 0.2 -0.2) |
453 | (cairo:rel-line-to cr 0.2 0.2) |
454 | (setf (cairo:line-join cr) :round) |
455 | (cairo:stroke cr)) |
456 | |
457 | |
458 | |
459 | (define-snippet text (cr) |
460 | (cairo:select-font-face cr "Sans" :normal :bold) |
461 | ;; ;(setf (cairo:font-size cr) 0.35) |
462 | (cairo:set-font-size cr 0.35) |
463 | |
464 | (cairo:move-to cr 0.04 0.53) |
465 | (cairo:show-text cr "Hello") |
466 | |
467 | (cairo:move-to cr 0.27 0.65) |
468 | (cairo:text-path cr "void") |
469 | (cairo:set-source-color cr 0.5 0.5 1) |
470 | (cairo:fill cr t) |
471 | |
472 | (cairo:set-source-color cr 0 0 0) |
473 | (setf (cairo:line-width cr) 0.01) |
474 | (cairo:stroke cr) |
475 | |
476 | ;; draw helping lines |
477 | (cairo:set-source-color cr 1 0.2 0.2 0.6) |
478 | (cairo:arc cr 0.04 0.53 0.02 0 (deg-to-rad 360)) |
479 | (cairo:arc cr 0.27 0.65 0.02 0 (deg-to-rad 360)) |
480 | (cairo:fill cr)) |
481 | |
482 | |
483 | (define-snippet text-align-center (cr) |
484 | (let ((text "cairo")) |
485 | (cairo:select-font-face cr "Sans" :normal :normal) |
486 | (cairo:set-font-size cr 0.2) |
487 | |
488 | (let* ((extents (cairo:text-extents cr text)) |
489 | (x (- 0.5 (+ (/ (cairo:text-extents-width extents) 2) (cairo:text-extents-x-bearing extents)))) |
490 | (y (- 0.5 (+ (/ (cairo:text-extents-height extents) 2) (cairo:text-extents-y-bearing extents))))) |
491 | (cairo:move-to cr x y) |
492 | (cairo:show-text cr text) |
493 | |
494 | ;; draw helping lines |
495 | (cairo:set-source-color cr 1.0 0.2 0.2 0.6) |
496 | (cairo:circle cr x y 0.05) |
497 | (cairo:fill cr) |
498 | (cairo:move-to cr 0.5 0.0) |
499 | (cairo:rel-line-to cr 0.0 1.0) |
500 | (cairo:move-to cr 0.0 0.5) |
501 | (cairo:rel-line-to cr 1.0 0.0) |
502 | (cairo:stroke cr)))) |
503 | |
504 | (define-snippet text-extents (cr) |
505 | (let ((text "cairo")) |
506 | (cairo:select-font-face cr "Sans" :normal :normal) |
507 | (cairo:set-font-size cr 0.4) |
508 | |
509 | (let* ((extents (cairo:text-extents cr text)) |
510 | (x 0.1) |
511 | (y 0.6)) |
512 | (cairo:move-to cr x y) |
513 | (cairo:show-text cr text) |
514 | |
515 | ;; draw helping lines |
516 | (cairo:set-source-color cr 1.0 0.2 0.2 0.6) |
517 | (cairo:circle cr x y 0.05) |
518 | (cairo:fill cr) |
519 | (cairo:move-to cr x y) |
520 | (cairo:rel-line-to cr 0 (- (cairo:text-extents-height extents))) |
521 | (cairo:rel-line-to cr (cairo:text-extents-width extents) 0) |
522 | (cairo:rel-line-to cr |
523 | (cairo:text-extents-x-bearing extents) |
524 | (- (cairo:text-extents-y-bearing extents))) |
525 | (cairo:stroke cr)))) |
526 | |
527 | |
528 | (defun create-tests () |
529 | ;; (rc-parse "clg:examples;testgtkrc2") |
530 | ;; (rc-parse "clg:examples;testgtkrc") |
531 | |
532 | (let* ((main-window (make-instance 'window |
533 | :title "testcairo.lisp" :name "main-window" |
534 | :default-width 200 :default-height 400 |
535 | :allow-grow t :allow-shrink nil)) |
536 | (scrolled-window (make-instance 'scrolled-window |
537 | :hscrollbar-policy :automatic |
538 | :vscrollbar-policy :automatic |
539 | :border-width 10)) |
540 | (close-button (make-instance 'button |
541 | :label "close" :can-default t |
542 | :signal (list 'clicked #'widget-destroy |
543 | :object main-window)))) |
544 | |
545 | (let ((icon (gdk:pixbuf-load #p"clg:examples;gtk.png"))) |
546 | (setf |
547 | (window-icon main-window) |
548 | (gdk:pixbuf-add-alpha icon t 254 254 252))) |
549 | |
550 | ;; Main box |
551 | (make-instance 'v-box |
552 | :parent main-window |
553 | :child-args '(:expand nil) |
554 | :child (list (make-instance 'label :label (gtk-version)) :fill nil) |
555 | :child (list (make-instance 'label :label (clg-version)) :fill nil) |
556 | :child (list (make-instance 'label |
557 | :label #-cmu(format nil "~A (~A)" |
558 | (lisp-implementation-type) |
559 | (lisp-implementation-version)) |
560 | ;; The version string in CMUCL is far too long |
561 | #+cmu(lisp-implementation-type)) |
562 | :fill nil) |
563 | :child (list scrolled-window :expand t) |
564 | :child (make-instance 'h-separator) |
565 | :child (make-instance 'v-box |
566 | :homogeneous nil :spacing 10 :border-width 10 |
567 | :child close-button)) |
568 | |
569 | (let ((content-box |
570 | (make-instance 'v-box |
571 | :focus-vadjustment (scrolled-window-vadjustment scrolled-window) |
572 | :children (mapcar #'(lambda (snippet) |
573 | (create-button (string-downcase snippet) snippet)) |
574 | (sort *snippets* #'string<))))) |
575 | (scrolled-window-add-with-viewport scrolled-window content-box)) |
576 | |
577 | (widget-grab-focus close-button) |
578 | (widget-show-all main-window) |
579 | main-window)) |
580 | |
581 | |
582 | (clg-init) |
583 | ;;(rsvg:init) |