X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/015f771e0ce4720e5d0da59d61c1942ed8ada079..355283f625ca83ba32d886425e3a702b16d333bd:/cairo/cairo.lisp diff --git a/cairo/cairo.lisp b/cairo/cairo.lisp index 40d7414..b743c77 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.12 2007-04-06 14:12:09 espen Exp $ +;; $Id: cairo.lisp,v 1.17 2007-10-19 10:12:25 espen Exp $ (in-package "CAIRO") @@ -40,7 +40,7 @@ (define-enum-type status (define-enum-type fill-rule :winding :even-odd) (define-enum-type line-cap :butt :round :square) (define-enum-type line-join :miter :round :bevel) - (define-enum-type font-slant :normal :itaic :oblique) + (define-enum-type font-slant :normal :italic :oblique) (define-enum-type font-weight :normal :bold) (define-enum-type operator @@ -58,7 +58,7 @@ (define-enum-type hint-metrics :default :off :on) (define-enum-type surface-type image-surface pdf-surface ps-surface xlib-surface xcb-surface glitz-surface quartz-surface win32-surface beos-surface - directfb-surface) + directfb-surface svg-surface os2-surface) (defclass surface-class (proxy-class) ()) @@ -206,7 +206,7 @@ (defclass image-surface (surface) (stride :allocation :virtual :getter "cairo_image_surface_get_stride" - :reader surface-height + :reader surface-stride :type int)) (:metaclass surface-class)) @@ -326,11 +326,12 @@ (defclass context (ref-counted-object) (: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 +454,19 @@ (defbinding show-page () nil ;;; 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) @@ -470,9 +484,9 @@ (defbinding close-path () nil (defmacro defpath (name args &optional relative-p) (flet ((def (name type) - `(progn - ,(when (eq type 'optimized-double-float) - `(declaim (ftype (function (context ,@(loop repeat (length args) collect 'double-float))) ,(first name)))) + `(progn + ,(when (eq type 'optimized-double-float) + `(declaim (inline ,(first name)))) (defbinding ,name () nil (cr context) ,@(mapcar #'(lambda (arg) (list arg type)) args))))) @@ -577,11 +591,13 @@ (defbinding scale (cr sx &optional (sy sx)) nil (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 (x y) - (multiple-value-call #'user-to-device cr (get-current-point cr)) -; (identity-matrix cr) - (setf (matrix cr) (matrix-init-identity)) + (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) + (multiple-value-call #'user-to-device cr (get-current-point cr))) + (identity-matrix cr) (translate cr x y)))) (defbinding rotate () nil @@ -830,6 +846,11 @@ (define-callback stream-write-func status :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? @@ -981,12 +1002,18 @@ (defbinding matrix-init () nil (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)) @@ -1000,7 +1027,7 @@ (defbinding matrix-translate () nil (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)) @@ -1017,15 +1044,12 @@ (defbinding matrix-multiply () nil (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))