X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/c470da880479bee6a13115ccb70d62cdcf6f532c..b133c3a76f14ae9d29402af48b2b80cecec5a200:/cairo/cairo.lisp diff --git a/cairo/cairo.lisp b/cairo/cairo.lisp index 23e14e2..f550888 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.15 2007-09-07 07:13:55 espen Exp $ +;; $Id: cairo.lisp,v 1.19 2007-12-02 14:50:41 espen Exp $ (in-package "CAIRO") @@ -140,6 +140,13 @@ :accessor matrix-y0 :type double-float)) (:metaclass struct-class)) + (defclass font-extents (struct) + ((ascent :allocation :alien :reader font-extents-ascent :type double-float) + (descent :allocation :alien :reader font-extents-descent :type double-float) + (height :allocation :alien :reader font-extents-height :type double-float) + (max-x-advance :allocation :alien :reader font-extents-max-x-advance :type double-float) + (max-y-advance :allocation :alien :reader font-extents-max-y-advance :type double-float)) + (:metaclass struct-class)) (defclass text-extents (struct) ((x-bearing :allocation :alien :reader text-extents-x-bearing :type double-float) @@ -206,7 +213,7 @@ (stride :allocation :virtual :getter "cairo_image_surface_get_stride" - :reader surface-height + :reader surface-stride :type int)) (:metaclass surface-class)) @@ -292,15 +299,15 @@ :type double-float) (font-matrix :allocation :virtual - :getter "cairo_get_font_matrix" + :getter font-matrix :setter "cairo_set_font_matrix" - :accessor font-matrix + :writer (setf font-matrix) :type matrix) (font-options :allocation :virtual - :getter "cairo_get_font_options" + :getter font-options :setter "cairo_set_font_options" - :accessor font-options + :writer (setf font-options) :type font-options) (font-face :allocation :virtual @@ -308,6 +315,13 @@ :setter "cairo_set_font_face" :accessor font-face :type font-face) + #?(pkg-exists-p "cairo" :atleast-version "1.4") + (scaled-font + :allocation :virtual + :getter "cairo_get_scaled_font" + :setter "cairo_set_scaled_font" + :accessor scaled-font + :type scaled-font) (operator :allocation :virtual :getter "cairo_get_operator" @@ -326,11 +340,12 @@ (:unref %destroy)) -;; (defclass path (proxy) -;; () -;; (:metaclass proxy-class)) - - ) + (defclass path (struct) + ((status :allocation :alien :type status) + (data :allocation :alien :type pointer) + (length :allocation :alien :type int)) + (:metaclass proxy-class) + (:unref %path-destroy))) ;;; Cairo context @@ -453,6 +468,19 @@ ;;; Paths +(defbinding %path-destroy () nil + (location pointer)) + +(defbinding copy-path () path + (cr context)) + +(defbinding copy-path-flat () path + (cr context)) + +(defbinding append-path () nil + (cr context) + (path path)) + (defbinding get-current-point () nil (cr context) (x double-float :out) @@ -577,7 +605,8 @@ (defun scale-to-device (cr &optional keep-rotation-p) (if keep-rotation-p - (multiple-value-call #'scale cr (device-to-user-distance cr 1.0)) + (multiple-value-bind (dx dy) (device-to-user-distance cr 1.0 0.0) + (scale cr (sqrt (+ (* dx dx) (* dy dy))))) (multiple-value-bind (x y) (with-context (cr) (move-to cr 0.0 0.0) @@ -633,6 +662,14 @@ (cr context) (size double-float)) +(defbinding (font-matrix "cairo_get_font_matrix") () nil + (cr context) + ((make-instance 'matrix) matrix :in/return)) + +(defbinding (font-options "cairo_get_font_options") () nil + (cr context) + ((make-instance 'font-options) font-options :in/return)) + (defbinding show-text () nil (cr context) (text string)) @@ -642,8 +679,9 @@ (glyphs (vector glyph)) ((length glyphs) int)) -(defbinding font-extents () boolean - (cr context)) +(defbinding font-extents (cr &optional (extents (make-instance 'font-extents))) nil + (cr context) + (extents font-extents :in/return)) (defbinding text-extents (cr text &optional (extents (make-instance 'text-extents))) nil (cr context) @@ -831,6 +869,11 @@ :success) +(defmacro with-surface ((surface cr) &body body) + `(let ((,cr (make-instance 'context :target ,surface))) + ,@body)) + + ;; Image Surface ;; Should data be automatically freed when the surface is GCed? @@ -982,12 +1025,18 @@ (defbinding matrix-init-identity (&optional (matrix (make-instance 'matrix))) nil (matrix matrix :in/return)) +(defun identity-matrix-p (matrix) + (with-slots (xx yx xy yy x0 y0) matrix + (and + (= xx 1.0d0) (= yx 0.0d0) (= xy 0.0d0) + (= yy 1.0d0) (= x0 0.0d0) (= y0 0.0d0)))) + (defbinding matrix-init-translate () nil (matrix matrix :in/return) (tx double-float) (ty double-float)) -(defbinding matrix-init-scale () nil +(defbinding matrix-init-scale (matrix sx &optional (sy sx)) nil (matrix matrix :in/return) (sx double-float) (sy double-float)) @@ -1001,7 +1050,7 @@ (tx double-float) (ty double-float)) -(defbinding matrix-scale () nil +(defbinding matrix-scale (matrix sx &optional (sy sx)) nil (matrix matrix :in/return) (sx double-float) (sy double-float)) @@ -1018,15 +1067,12 @@ (a matrix) (b matrix)) -(defbinding matrix-transform-distance () nil - (matrix matrix :in/return) - (dx double-float) - (dy double-float)) +(defbinding matrix-transform-distance (matrix dx &optional (dy dx)) nil + (matrix matrix) + (dx double-float :in/out) + (dy double-float :in/out)) (defbinding matrix-transform-point () nil - (matrix matrix :in/return) - (x double-float) - (y double-float)) - - - + (matrix matrix) + (x double-float :in/out) + (y double-float :in/out))