X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/2f60440d56a8a467b43b6a4a981e5e8c9544f2d5..39551e64989423bc2cbc50119e8bfb64dedfebba:/cairo/cairo.lisp diff --git a/cairo/cairo.lisp b/cairo/cairo.lisp index 142a22d..e37b4a2 100644 --- a/cairo/cairo.lisp +++ b/cairo/cairo.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: cairo.lisp,v 1.2 2005-11-15 10:03:04 espen Exp $ +;; $Id: cairo.lisp,v 1.7 2006-12-24 14:28:20 espen Exp $ (in-package "CAIRO") @@ -52,7 +52,7 @@ (define-enum-type hint-style :default :none :slight :medium :full) (define-enum-type hint-metrics :default :off :on) - (defclass glyph (proxy) + (defclass glyph (struct) ((index :allocation :alien :initarg :index @@ -72,7 +72,9 @@ (defclass font-face (proxy) () - (:metaclass proxy-class)) + (:metaclass proxy-class) + (:ref %font-face-reference) + (:unref %font-face-destroy)) (defclass font-options (proxy) ((antialias @@ -99,11 +101,15 @@ :setter "font_options_set_hint_metrics" :accessor font-options-hint-metrics :type hint-metrics)) - (:metaclass proxy-class)) + (:metaclass proxy-class) + (:ref %font-options-reference) + (:unref %font-options-destroy)) (defclass scaled-font (proxy) () - (:metaclass proxy-class)) + (:metaclass proxy-class) + (:ref %scaled-font-reference) + (:unref %scaled-font-destroy)) (defclass matrix (struct) ((xx :allocation :alien :initarg :xx :initform 1.0 @@ -149,7 +155,16 @@ :setter "cairo_pattern_set_matrix" :accessor pattern-matrix :type matrix)) - (:metaclass proxy-class)) + (:metaclass proxy-class) + (:ref %pattern-reference) + (:unref %pattern-destroy)) + + + (defclass surface (proxy) + () + (:metaclass proxy-class) + (:ref %surface-reference) + (:unref %surface-destroy)) (defclass context (proxy) ((target @@ -236,11 +251,9 @@ :writer (setf matrix) :type matrix) ) - (:metaclass proxy-class)) - - (defclass surface (proxy) - () - (:metaclass proxy-class)) + (:metaclass proxy-class) + (:ref %reference) + (:unref %destroy)) (defclass image-surface (surface) ((width @@ -253,7 +266,10 @@ :getter "cairo_image_surface_get_height" :reader surface-height :type int)) - (:metaclass proxy-class)) + (:metaclass proxy-class) + (:ref %surface-reference) + (:unref %surface-destroy)) + ;; (defclass path (proxy) ;; () @@ -270,12 +286,6 @@ (defbinding %destroy () nil (location pointer)) -(defmethod reference-foreign ((class (eql (find-class 'context))) location) - (%reference location)) - -(defmethod unreference-foreign ((class (eql (find-class 'context))) location) - (%destroy location)) - (defbinding (save-context "cairo_save") () nil (cr context)) @@ -293,12 +303,17 @@ (defbinding status () status (cr context)) +(defun ensure-color-component (component) + (etypecase component + (float component) + (integer (/ component 256.0)))) + (defbinding (set-source-color "cairo_set_source_rgba") (cr red green blue &optional (alpha 1.0)) nil (cr context) - (red double-float) - (green double-float) - (blue double-float) - (alpha double-float)) + ((ensure-color-component red) double-float) + ((ensure-color-component green) double-float) + ((ensure-color-component blue) double-float) + ((ensure-color-component alpha) double-float)) (defbinding set-source-surface () nil (cr context) @@ -377,6 +392,10 @@ (defbinding new-path () nil (cr context)) +#?(pkg-exists-p "cairo" :atleast-version "1.2") +(defbinding new-sub-path () nil + (cr context)) + (defbinding close-path () nil (cr context)) @@ -484,12 +503,6 @@ (defbinding %pattern-destroy () nil (location pointer)) -(defmethod reference-foreign ((class (eql (find-class 'pattern))) location) - (%pattern-reference location)) - -(defmethod unreference-foreign ((class (eql (find-class 'pattern))) location) - (%pattern-destroy location)) - (defbinding pattern-status () status (pattern pattern)) @@ -517,30 +530,30 @@ (defbinding (matrix "cairo_get_matrix") () nil (cr context) - ((make-instance 'matrix) matrix :return)) + ((make-instance 'matrix) matrix :in/return)) (defbinding identity-matrix () nil (cr context)) (defbinding user-to-device () nil (cr context) - (x double-float :in-out) - (y double-float :in-out)) + (x double-float :in/out) + (y double-float :in/out)) -(defbinding user-to-device-distance () nil +(defbinding user-to-device-distance (cr dx &optional (dy 0.0)) nil (cr context) - (dx double-float :in-out) - (dy double-float :in-out)) + (dx double-float :in/out) + (dy double-float :in/out)) (defbinding device-to-user () nil (cr context) - (x double-float :in-out) - (y double-float :in-out)) + (x double-float :in/out) + (y double-float :in/out)) -(defbinding device-to-user-distance () nil +(defbinding device-to-user-distance (cr dx &optional (dy 0.0)) nil (cr context) - (dx double-float :in-out) - (dy double-float :in-out)) + (dx double-float :in/out) + (dy double-float :in/out)) ;;; Text @@ -570,13 +583,13 @@ (defbinding text-extents (cr text &optional (extents (make-instance 'text-extents))) nil (cr context) (text string) - (extents text-extents :return)) + (extents text-extents :in/return)) (defbinding glyph-extents (cr glyphs &optional (extents (make-instance 'text-extents))) nil (cr context) (glyphs (vector glyph)) ((length glyphs) int) - (extents text-extents :return)) + (extents text-extents :in/return)) ;;; Fonts @@ -587,12 +600,6 @@ (defbinding %font-face-destroy () nil (location pointer)) -(defmethod reference-foreign ((class (eql (find-class 'font-face))) location) - (%font-face-reference location)) - -(defmethod unreference-foreign ((class (eql (find-class 'font-face))) location) - (%font-face-destroy location)) - (defbinding font-face-status () status (font-face font-face)) @@ -606,24 +613,18 @@ (defbinding %scaled-font-destroy () nil (location pointer)) -(defmethod reference-foreign ((class (eql (find-class 'scaled-font))) location) - (%scaled-font-reference location)) - -(defmethod unreference-foreign ((class (eql (find-class 'scaled-font))) location) - (%scaled-font-destroy location)) - (defbinding scaled-font-status () status (scaled-font scaled-font)) (defbinding scaled-font-extents (scaled-font &optional (extents (make-instance 'text-extents))) nil (scaled-font scaled-font) - (extents text-extents :return)) + (extents text-extents :in/return)) (defbinding scaled-font-glyph-extents (scaled-font glyphs &optional (extents (make-instance 'text-extents))) nil (scaled-font scaled-font) (glyphs (vector glyph)) ((length glyphs) int) - (extents text-extents :return)) + (extents text-extents :in/return)) (defbinding %scaled-font-create () pointer (font-face font-face) @@ -631,11 +632,8 @@ (ctm matrix) (options font-options)) -(defmethod initialize-instance ((scaled-font scaled-font) &key font-face font-matrix cmt options) - (setf - (slot-value scaled-font 'location) - (%scaled-font-create font-face font-matrix cmt options)) - (call-next-method)) +(defmethod allocate-foreign ((scaled-font scaled-font) &key font-face font-matrix cmt options) + (%scaled-font-create font-face font-matrix cmt options)) @@ -648,24 +646,17 @@ (defbinding %font-options-destroy () nil (location pointer)) -(defmethod reference-foreign ((class (eql (find-class 'font-options))) location) - (%font-options-reference location)) - -(defmethod unreference-foreign ((class (eql (find-class 'font-options))) location) - (%font-options-destroy location)) - (defbinding font-options-status () status (font-options font-options)) (defbinding %font-options-create () pointer) -(defmethod initialize-instance ((font-options font-options) &rest initargs) +(defmethod allocate-foreign ((font-options font-options) &rest initargs) (declare (ignore initargs)) - (setf (slot-value font-options 'location) (%font-options-create)) - (call-next-method)) + (%font-options-create)) (defbinding font-options-merge () nil - (options1 font-options :return) + (options1 font-options :in/return) (options2 font-options)) (defbinding font-options-hash () unsigned-int @@ -685,12 +676,6 @@ (defbinding %surface-destroy () nil (location pointer)) -(defmethod reference-foreign ((class (eql (find-class 'surface))) location) - (%surface-reference location)) - -(defmethod unreference-foreign ((class (eql (find-class 'surface))) location) - (%surface-destroy location)) - (defbinding surface-create-similar () surface (other surface) (format surface-format ) @@ -705,7 +690,7 @@ (defbinding surface-get-font-options () nil (surface surface) - ((make-instance 'font-options) font-options :return)) + ((make-instance 'font-options) font-options :in/return)) (defbinding surface-set-device-offset () nil (surface surface) @@ -735,18 +720,15 @@ ;; Image Surface ;; Should data be automatically freed when the surface is GCed? -(defmethod initialize-instance ((surface image-surface) - &key width height stride format data) - (setf - (slot-value surface 'location) - (if (not data) - (%image-surface-create format width height) - (%image-surface-create-for-data data format width height - (or - stride - (let ((element-size (cdr (assoc format '((:argb32 . 4) (:rgb24 . 4) (:a8 . 1) (:a1 1/8)))))) - (ceiling (* width element-size))))))) - (call-next-method)) +(defmethod allocate-foreign ((surface image-surface) + &key width height stride format data) + (if (not data) + (%image-surface-create format width height) + (%image-surface-create-for-data data format width height + (or + stride + (let ((element-size (cdr (assoc format '((:argb32 . 4) (:rgb24 . 4) (:a8 . 1) (:a1 1/8)))))) + (ceiling (* width element-size))))))) (defbinding %image-surface-create () image-surface @@ -774,44 +756,44 @@ ;;; Matrices (defbinding matrix-init () nil - (matrix matrix :return) + (matrix matrix :in/return) (xx double-float) (yx double-float) (xy double-float) (yy double-float) (x0 double-float) (y0 double-float)) (defbinding matrix-init-identity () nil - (matrix matrix :return)) + (matrix matrix :in/return)) (defbinding matrix-init-translate () nil - (matrix matrix :return) + (matrix matrix :in/return) (tx double-float) (ty double-float)) (defbinding matrix-init-scale () nil - (matrix matrix :return) + (matrix matrix :in/return) (sx double-float) (sy double-float)) (defbinding matrix-init-rotate () nil - (matrix matrix :return) + (matrix matrix :in/return) (radians double-float)) (defbinding matrix-translate () nil - (matrix matrix :return) + (matrix matrix :in/return) (tx double-float) (ty double-float)) (defbinding matrix-scale () nil - (matrix matrix :return) + (matrix matrix :in/return) (sx double-float) (sy double-float)) (defbinding matrix-rotate () nil - (matrix matrix :return) + (matrix matrix :in/return) (radians double-float)) (defbinding matrix-invert () nil - (matrix matrix :return)) + (matrix matrix :in/return)) (defbinding matrix-multiply () nil (result matrix :out) @@ -819,12 +801,12 @@ (b matrix)) (defbinding matrix-transform-distance () nil - (matrix matrix :return) + (matrix matrix :in/return) (dx double-float) (dy double-float)) (defbinding matrix-transform-point () nil - (matrix matrix :return) + (matrix matrix :in/return) (x double-float) (y double-float))