chiark / gitweb /
Added documentation for some initargs to make-instance
[clg] / cairo / cairo.lisp
1 ;; Common Lisp bindings for Cairo
2 ;; Copyright 2005 Espen S. Johnsen <espen@users.sf.net>
3 ;;
4 ;; Permission is hereby granted, free of charge, to any person obtaining
5 ;; a copy of this software and associated documentation files (the
6 ;; "Software"), to deal in the Software without restriction, including
7 ;; without limitation the rights to use, copy, modify, merge, publish,
8 ;; distribute, sublicense, and/or sell copies of the Software, and to
9 ;; permit persons to whom the Software is furnished to do so, subject to
10 ;; the following conditions:
11 ;;
12 ;; The above copyright notice and this permission notice shall be
13 ;; included in all copies or substantial portions of the Software.
14 ;;
15 ;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 ;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 ;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 ;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19 ;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
23 ;; $Id: cairo.lisp,v 1.6 2006-04-26 12:37:48 espen Exp $
24
25 (in-package "CAIRO")
26
27 (eval-when (:compile-toplevel :load-toplevel :execute)
28   (define-enum-type surface-format :argb32 :rgb24 :a8 :a1)
29
30   (define-enum-type status
31     :success :no-memory :invalid-restore :invalid-pop-group
32     :no-current-point :invalid-matrix :invalid-status :null-pointer
33     :invalid-string :invalid-path-data :read-error :write-error
34     :surface-finished :surface-type-mismatch :pattern-type-mismatch
35     :invalid-content :invalid-format :invalid-visual :file-not-found
36     :invalid-dash)
37
38   (define-enum-type fill-rule :winding :even-odd)
39   (define-enum-type line-cap :butt :round :square)
40   (define-enum-type line-join :miter :round :bevel)    
41   (define-enum-type font-slant :normal :itaic :oblique)
42   (define-enum-type font-weight :normal :bold)
43
44   (define-enum-type operator
45    :clear :source :over :in :out :atop :dest :dest-over 
46    :dest-in :dest-out :dest-atop :xor :add :saturate)
47
48   (define-enum-type antialias :default :none :gray :subpixel)
49   (define-enum-type extend :none :repeat :reflect)
50   (define-enum-type filter :fast :good :best :nearest :bilinear :gaussian)
51   (define-enum-type subpixel-order :default :rgb :bgr :vrgb :vbgr)
52   (define-enum-type hint-style :default :none :slight :medium :full)
53   (define-enum-type hint-metrics :default :off :on)
54
55   (defclass glyph (struct)
56     ((index 
57       :allocation :alien 
58       :initarg :index 
59       :accessor glyph-index 
60       :type unsigned-long)
61      (x     
62       :allocation :alien 
63       :initarg :x 
64       :accessor glyph-x 
65       :type double-float)
66      (y     
67       :allocation :alien 
68       :initarg :y 
69       :accessor glyph-y
70       :type double-float))
71     (:metaclass struct-class))
72
73   (defclass font-face (proxy)
74     ()
75     (:metaclass proxy-class)
76     (:ref %font-face-reference)
77     (:unref %font-face-destroy))
78
79   (defclass font-options (proxy)
80     ((antialias
81       :allocation :virtual 
82       :getter "font_options_get_antialias"
83       :setter "font_options_set_antialias"
84       :accessor font-options-antialias
85       :type antialias)
86      (subpixel-order
87       :allocation :virtual 
88       :getter "font_options_get_subpixel_order"
89       :setter "font_options_set_subpixel_order"
90       :accessor font-options-subpixel-order
91       :type subpixel-order)
92      (hint-style
93       :allocation :virtual 
94       :getter "font_options_get_hint_style"
95       :setter "font_options_set_hint_style"
96       :accessor font-options-hint-style
97       :type hint-style)
98      (hint-metrics
99       :allocation :virtual 
100       :getter "font_options_get_hint_metrics"
101       :setter "font_options_set_hint_metrics"
102       :accessor font-options-hint-metrics
103       :type hint-metrics))
104     (:metaclass proxy-class)    
105     (:ref %font-options-reference)
106     (:unref %font-options-destroy))
107
108   (defclass scaled-font (proxy)
109     ()
110     (:metaclass proxy-class)
111     (:ref %scaled-font-reference)
112     (:unref %scaled-font-destroy))
113
114   (defclass matrix (struct)
115     ((xx :allocation :alien :initarg :xx :initform 1.0
116          :accessor matrix-xx :type double-float)
117      (yx :allocation :alien  :initarg :yx :initform 0.0
118          :accessor matrix-yx :type double-float)
119      (xy :allocation :alien  :initarg :xy :initform 1.0
120          :accessor matrix-xy :type double-float)
121      (yy :allocation :alien  :initarg :yy :initform 0.0
122          :accessor matrix-yy :type double-float)
123      (x0 :allocation :alien  :initarg :x0 :initform 0.0
124          :accessor matrix-x0 :type double-float)
125      (y0 :allocation :alien  :initarg :y0 :initform 0.0
126          :accessor matrix-y0 :type double-float))
127     (:metaclass struct-class))
128
129
130   (defclass text-extents (struct)
131     ((x-bearing :allocation :alien :reader text-extents-x-bearing :type double-float)
132      (y-bearing :allocation :alien :reader text-extents-y-bearing :type double-float)
133      (width :allocation :alien :reader text-extents-width :type double-float)
134      (height :allocation :alien :reader text-extents-height :type double-float)
135      (x-advance :allocation :alien :reader text-extents-x-advance :type double-float)
136      (y-advance :allocation :alien :reader text-extents-y-advance :type double-float))
137     (:metaclass struct-class))
138
139   (defclass pattern (proxy)
140     ((extend
141       :allocation :virtual 
142       :getter "cairo_pattern_get_extend"
143       :setter "cairo_pattern_set_extend"
144       :accessor pattern-extend
145       :type extend)
146      (filter
147       :allocation :virtual 
148       :getter "cairo_pattern_get_filter"
149       :setter "cairo_pattern_set_filter"
150       :accessor pattern-filter
151       :type filter)
152      (matrix
153       :allocation :virtual 
154       :getter "cairo_pattern_get_matrix"
155       :setter "cairo_pattern_set_matrix"
156       :accessor pattern-matrix
157       :type matrix))
158     (:metaclass proxy-class)
159     (:ref %pattern-reference)
160     (:unref %pattern-destroy))
161
162
163   (defclass surface (proxy)
164     ()
165     (:metaclass proxy-class)
166     (:ref %surface-reference)
167     (:unref %surface-destroy))
168
169   (defclass context (proxy)
170     ((target
171       :allocation :virtual 
172       :getter "cairo_get_target"
173       :reader target
174       :type surface)
175      (source
176       :allocation :virtual 
177       :getter "cairo_get_source"
178       :setter "cairo_set_source"
179       :accessor source
180       :type pattern)
181      (antialias
182       :allocation :virtual 
183       :getter "cairo_get_antialias"
184       :setter "cairo_set_antialias"
185       :accessor antialias
186       :type antialias)
187      (tolerance
188       :allocation :virtual 
189       :getter "cairo_get_tolerance"
190       :setter "cairo_set_tolerance"
191       :accessor tolerance
192       :type double-float)
193      (fill-rule
194       :allocation :virtual 
195       :getter "cairo_get_fill_rule"
196       :setter "cairo_set_fill_rule"
197       :accessor fill-rule
198       :type fill-rule)
199      (line-width
200       :allocation :virtual 
201       :getter "cairo_get_line_width"
202       :setter "cairo_set_line_width"
203       :accessor line-width
204       :type double-float)
205      (line-cap
206       :allocation :virtual 
207       :getter "cairo_get_line_cap"
208       :setter "cairo_set_line_cap"
209       :accessor line-cap
210       :type line-cap)
211      (line-join
212       :allocation :virtual 
213       :getter "cairo_get_line_join"
214       :setter "cairo_set_line_join"
215       :accessor line-join
216       :type line-join)
217      (miter-limit
218       :allocation :virtual 
219       :getter "cairo_get_miter_limit"
220       :setter "cairo_set_miter_limit"
221       :accessor miter-limit
222       :type double-float)
223      (font-matrix
224       :allocation :virtual 
225       :getter "cairo_get_font_matrix"
226       :setter "cairo_set_font_matrix"
227       :accessor font-matrix
228       :type matrix)
229      (font-options
230       :allocation :virtual 
231       :getter "cairo_get_font_options"
232       :setter "cairo_set_font_options"
233       :accessor font-options
234       :type font-options)
235      (font-face
236       :allocation :virtual 
237       :getter "cairo_get_font_face"
238       :setter "cairo_set_font_face"
239       :accessor font-face
240       :type font-face)
241      (operator
242       :allocation :virtual 
243       :getter "cairo_get_operator"
244       :setter "cairo_set_operator"
245       :accessor operator
246       :type operator)
247      (matrix
248       :allocation :virtual 
249       :getter matrix
250       :setter "cairo_set_matrix"
251       :writer (setf matrix)
252       :type matrix)
253      )
254     (:metaclass proxy-class)
255     (:ref %reference)
256     (:unref %destroy))
257
258   (defclass image-surface (surface)
259     ((width
260       :allocation :virtual 
261       :getter "cairo_image_surface_get_width"
262       :reader surface-width
263       :type int)
264      (height
265       :allocation :virtual 
266       :getter "cairo_image_surface_get_height"
267       :reader surface-height
268       :type int))
269     (:metaclass proxy-class)
270     (:ref %surface-reference)
271     (:unref %surface-destroy))
272
273
274 ;;   (defclass path (proxy)
275 ;;     ()
276 ;;     (:metaclass proxy-class))
277
278 )
279
280
281 ;;; Cairo context
282
283 (defbinding %reference () nil
284   (location pointer))
285
286 (defbinding %destroy () nil
287   (location pointer))
288
289 (defbinding (save-context "cairo_save") () nil
290   (cr context))
291
292 (defbinding (restore-context "cairo_restore") () nil
293   (cr context))
294
295 (defmacro with-context ((cr) &body body)
296   (let ((context (make-symbol "CONTEXT")))
297     `(let ((,context ,cr))
298        (save-context ,context)
299        (unwind-protect
300            (progn ,@body)
301          (restore-context ,context)))))
302
303 (defbinding status () status
304   (cr context))
305
306 (defbinding (set-source-color "cairo_set_source_rgba") (cr red green blue &optional (alpha 1.0)) nil
307   (cr context)
308   (red double-float)
309   (green double-float)
310   (blue double-float)
311   (alpha double-float))
312
313 (defbinding set-source-surface () nil
314   (cr context)
315   (surface surface)
316   (x double-float)
317   (y double-float))
318
319 (defbinding set-dash (cr dashes &optional (offset 0.0)) nil
320   (cr context)
321   (dashes (vector double-float))
322   ((length dashes) int)
323   (offset double-float))
324
325 (defbinding (paint "cairo_paint_with_alpha") (cr &optional (alpha 1.0)) nil
326   (cr context)
327   (alpha double-float))
328
329 (defbinding mask () nil
330   (cr context)
331   (pattern pattern))
332
333 (defbinding mask-surface () nil
334   (cr context)
335   (surface surface)
336   (surface-x double-float)
337   (surface-y double-float))
338
339 (defmacro defoperator (name &optional clip-p)
340   (let ((iname (intern (format nil "%~A" name)))
341         (pname (intern (format nil "%~A-PRESERVE" name))))
342     `(progn
343        (defbinding ,iname () nil
344          (cr context))
345        (defbinding ,pname () nil
346          (cr context))
347        (defun ,name (cr &optional preserve)
348          (if preserve
349              (,pname cr)
350            (,iname cr)))
351        ,(unless clip-p
352           (let ((tname (intern (format nil "IN-~A-P" name)))
353                 (ename (intern (format nil "~A-EXTENTS" name))))
354             `(progn
355                (defbinding ,tname () boolean
356                  (cr context)
357                  (x double-float)
358                  (y double-float))
359                (defbinding ,ename () boolean
360                  (cr context)
361                  (x1 double-float :out)
362                  (y1 double-float :out)
363                  (x2 double-float :out)
364                  (y2 double-float :out))))))))
365
366 (defoperator clip t)
367 (defoperator stroke)
368 (defoperator fill)
369
370 (defbinding reset-clip () nil
371   (cr context))
372
373 (defbinding copy-page () nil
374   (cr context))
375
376 (defbinding show-page () nil
377   (cr context))
378
379
380 ;;; Paths
381
382 (defbinding get-current-point () nil
383   (cr context)
384   (x double-float :out)
385   (y double-float :out))
386
387 (defbinding new-path () nil
388   (cr context))
389
390 (defbinding close-path () nil
391   (cr context))
392
393 (defbinding arc () nil
394   (cr context)
395   (xc double-float)
396   (yc double-float)
397   (radius double-float)
398   (angle1 double-float)
399   (angle2 double-float))
400
401 (defbinding arc-negative () nil
402   (cr context)
403   (xc double-float)
404   (yc double-float)
405   (radius double-float)
406   (angle1 double-float)
407   (angle2 double-float))
408
409 (defun circle (cr x y radius)
410   (arc cr x y radius 0.0 (* pi 2)))
411
412 (defmacro defpath (name &rest args)
413   (let ((relname (intern (format nil "REL-~A" name))))
414     `(progn
415        (defbinding ,name () nil
416          (cr context)
417          ,@args)
418        (defbinding ,relname () nil
419          (cr context)
420          ,@args))))
421
422 (defpath curve-to
423   (x1 double-float)
424   (y1 double-float)
425   (x2 double-float)
426   (y2 double-float)
427   (x3 double-float)
428   (y3 double-float))
429
430 (defpath line-to
431   (x double-float)
432   (y double-float))
433
434 (defpath move-to
435   (x double-float)
436   (y double-float))
437
438 (defbinding rectangle () nil
439   (cr context)
440   (x double-float)
441   (y double-float)
442   (width double-float)
443   (height double-float))
444
445 (defbinding glyph-path (cr glyphs) nil
446   (cr context)
447   (glyphs (vector glyph))
448   ((length glyphs) int))
449
450 (defbinding text-path () nil
451   (cr context)
452   (text string))
453
454
455
456 ;;; Patterns
457
458 (defbinding (pattern-add-color-stop "cairo_pattern_add_color_stop_rgba")
459     (pattern offset red green blue &optional (alpha 1.0)) nil
460   (pattern pattern)
461   (offset double-float)
462   (red double-float)
463   (green double-float)
464   (blue double-float)
465   (alpha double-float))
466
467 (defbinding (pattern-create "cairo_pattern_create_rgba")
468     (red green blue &optional (alpha 1.0)) pattern   
469   (red double-float)
470   (green double-float)
471   (blue double-float)
472   (alpha double-float))
473
474 (defbinding pattern-create-for-surface () pattern
475   (surface surface))
476
477 (defbinding pattern-create-linear () pattern
478   (x0 double-float)
479   (y0 double-float)
480   (x1 double-float)
481   (y1 double-float))
482
483 (defbinding pattern-create-radial () pattern
484   (cx0 double-float)
485   (cy0 double-float)
486   (radius0 double-float)
487   (cx1 double-float)
488   (cy1 double-float)
489   (radius1 double-float))
490
491 (defbinding %pattern-reference () nil
492   (location pointer))
493
494 (defbinding %pattern-destroy () nil
495   (location pointer))
496
497 (defbinding pattern-status () status
498   (pattern pattern))
499
500
501
502 ;;; Transformations
503
504 (defbinding translate () nil
505   (cr context)
506   (tx double-float)
507   (ty double-float))
508
509 (defbinding scale () nil
510   (cr context)
511   (sx double-float)
512   (sy double-float))
513
514 (defbinding rotate () nil
515   (cr context)
516   (angle double-float))
517
518 (defbinding transform () nil
519   (cr context)
520   (matrix matrix))
521
522 (defbinding (matrix "cairo_get_matrix") () nil
523   (cr context)
524   ((make-instance 'matrix) matrix :in/return))
525
526 (defbinding identity-matrix () nil
527   (cr context))
528
529 (defbinding user-to-device () nil
530   (cr context)
531   (x double-float :in/out)
532   (y double-float :in/out))
533
534 (defbinding user-to-device-distance () nil
535   (cr context)
536   (dx double-float :in/out)
537   (dy double-float :in/out))
538
539 (defbinding device-to-user () nil
540   (cr context)
541   (x double-float :in/out)
542   (y double-float :in/out))
543
544 (defbinding device-to-user-distance () nil
545   (cr context)
546   (dx double-float :in/out)
547   (dy double-float :in/out))
548
549
550 ;;; Text
551
552 (defbinding select-font-face () nil
553   (cr context)
554   (family string)
555   (slant font-slant)
556   (weight font-weight))
557
558 (defbinding set-font-size () nil
559   (cr context)
560   (size double-float))
561
562 (defbinding show-text () nil
563   (cr context)
564   (text string))
565
566 (defbinding show-glyphs () nil
567   (cr context)
568   (glyphs (vector glyph))
569   ((length glyphs) int))
570
571 (defbinding font-extents () boolean
572   (cr context))
573
574 (defbinding text-extents (cr text &optional (extents (make-instance 'text-extents))) nil
575   (cr context)
576   (text string)
577   (extents text-extents :in/return))
578
579 (defbinding glyph-extents (cr glyphs &optional (extents (make-instance 'text-extents))) nil
580   (cr context)
581   (glyphs (vector glyph))
582   ((length glyphs) int)
583   (extents text-extents :in/return))
584
585
586 ;;; Fonts
587
588 (defbinding %font-face-reference () nil
589   (location pointer))
590
591 (defbinding %font-face-destroy () nil
592   (location pointer))
593
594 (defbinding font-face-status () status
595   (font-face font-face))
596
597
598
599 ;;; Scaled Fonts
600
601 (defbinding %scaled-font-reference () nil
602   (location pointer))
603
604 (defbinding %scaled-font-destroy () nil
605   (location pointer))
606
607 (defbinding scaled-font-status () status
608   (scaled-font scaled-font))
609
610 (defbinding scaled-font-extents (scaled-font &optional (extents (make-instance 'text-extents))) nil
611   (scaled-font scaled-font)
612   (extents text-extents :in/return))
613
614 (defbinding scaled-font-glyph-extents (scaled-font glyphs &optional (extents (make-instance 'text-extents))) nil
615   (scaled-font scaled-font)
616   (glyphs (vector glyph))
617   ((length glyphs) int)
618   (extents text-extents :in/return))
619
620 (defbinding %scaled-font-create () pointer
621   (font-face font-face)
622   (font-matrix matrix)
623   (ctm matrix)
624   (options font-options))
625
626 (defmethod allocate-foreign ((scaled-font scaled-font) &key font-face font-matrix cmt options)
627   (%scaled-font-create font-face font-matrix cmt options))
628
629
630
631 ;;; Font Options
632
633
634 (defbinding %font-options-copy () nil
635   (location pointer))
636
637 (defbinding %font-options-destroy () nil
638   (location pointer))
639
640 (defbinding font-options-status () status
641   (font-options font-options))
642
643 (defbinding %font-options-create () pointer)
644
645 (defmethod allocate-foreign ((font-options font-options) &rest initargs)
646   (declare (ignore initargs))
647   (%font-options-create))
648
649 (defbinding font-options-merge () nil
650   (options1 font-options :in/return)
651   (options2 font-options))
652
653 (defbinding font-options-hash () unsigned-int
654   (options font-options))
655
656 (defbinding font-options-equal-p () boolean
657   (options1 font-options)
658   (options2 font-options))
659
660
661
662 ;;; Surfaces
663
664 (defbinding %surface-reference () nil
665   (location pointer))
666
667 (defbinding %surface-destroy () nil
668   (location pointer))
669
670 (defbinding surface-create-similar () surface
671   (other surface)
672   (format surface-format )
673   (width int)
674   (height int))
675
676 (defbinding surface-finish () nil
677   (surface surface))
678
679 (defbinding surface-flush () nil
680   (surface surface))
681
682 (defbinding surface-get-font-options () nil
683   (surface surface)
684   ((make-instance 'font-options) font-options :in/return))
685
686 (defbinding surface-set-device-offset () nil
687   (surface surface)
688   (x-offset double-float)
689   (y-offset double-float))
690
691 (defbinding surface-status () status
692   (surface surface))
693
694 (defbinding %surface-mark-dirty () nil
695   (surface surface))
696
697 (defbinding %surface-mark-dirty-rectangle () nil
698   (surface surface)
699   (x int)
700   (y int)
701   (width int)
702   (height int))
703
704 (defun surface-mark-dirty (surface &optional x y width height)
705   (if x
706       (%surface-mark-dirty-rectangle surface x y width height)
707     (%surface-mark-dirty surface)))
708
709
710
711 ;; Image Surface
712
713 ;; Should data be automatically freed when the surface is GCed?
714 (defmethod allocate-foreign ((surface image-surface) 
715                              &key width height stride format data)
716   (if (not data)
717       (%image-surface-create format width height)
718     (%image-surface-create-for-data data format width height 
719      (or 
720       stride
721       (let ((element-size (cdr (assoc format '((:argb32 . 4) (:rgb24 . 4) (:a8 . 1) (:a1 1/8))))))
722         (ceiling (* width element-size)))))))
723
724
725 (defbinding %image-surface-create () image-surface
726   (format surface-format)
727   (width int)
728   (hegit int))
729
730 (defbinding %image-surface-create-for-data () image-surface
731   (data pointer)
732   (format surface-format)
733   (width int)
734   (hegit int)
735   (stride int))
736
737
738
739 ;;; PNG Surface
740
741 (defbinding image-surface-create-from-png (filename) image-surface
742   ((truename filename) pathname))
743
744
745
746
747 ;;; Matrices
748
749 (defbinding matrix-init () nil
750   (matrix matrix :in/return)
751   (xx double-float) (yx double-float) 
752   (xy double-float) (yy double-float) 
753   (x0 double-float) (y0 double-float))
754
755 (defbinding matrix-init-identity () nil
756   (matrix matrix :in/return))
757
758 (defbinding matrix-init-translate () nil
759   (matrix matrix :in/return)
760   (tx double-float)
761   (ty double-float))
762
763 (defbinding matrix-init-scale () nil
764   (matrix matrix :in/return)
765   (sx double-float)
766   (sy double-float))
767
768 (defbinding matrix-init-rotate () nil
769   (matrix matrix :in/return)
770   (radians double-float))
771
772 (defbinding matrix-translate () nil
773   (matrix matrix :in/return)
774   (tx double-float)
775   (ty double-float))
776
777 (defbinding matrix-scale () nil
778   (matrix matrix :in/return)
779   (sx double-float)
780   (sy double-float))
781
782 (defbinding matrix-rotate () nil
783   (matrix matrix :in/return)
784   (radians double-float))
785
786 (defbinding matrix-invert () nil
787   (matrix matrix :in/return))
788
789 (defbinding matrix-multiply () nil
790   (result matrix :out)
791   (a matrix)
792   (b matrix))
793
794 (defbinding matrix-transform-distance () nil
795   (matrix matrix :in/return)
796   (dx double-float)
797   (dy double-float))
798
799 (defbinding matrix-transform-point () nil
800   (matrix matrix :in/return)
801   (x double-float)
802   (y double-float))
803
804
805