From 1ed0a2c57d1624d098f180bff1c567960a9b1b36 Mon Sep 17 00:00:00 2001 Message-Id: <1ed0a2c57d1624d098f180bff1c567960a9b1b36.1714376848.git.mdw@distorted.org.uk> From: Mark Wooding Date: Thu, 10 Nov 2005 08:50:45 +0000 Subject: [PATCH] Initial checkin Organization: Straylight/Edgeware From: espen --- cairo/cairo.asd | 18 + cairo/cairo.lisp | 832 +++++++++++++++++++++++++++++++++++++++ cairo/defpackage.lisp | 4 + cairo/export.lisp | 18 + examples/freedesktop.svg | 45 +++ examples/home.svg | 172 ++++++++ examples/romedalen.png | Bin 0 -> 80944 bytes examples/testcairo.lisp | 583 +++++++++++++++++++++++++++ rsvg/defpackage.lisp | 3 + rsvg/export.lisp | 4 + rsvg/rsvg.asd | 18 + rsvg/rsvg.lisp | 138 +++++++ 12 files changed, 1835 insertions(+) create mode 100644 cairo/cairo.asd create mode 100644 cairo/cairo.lisp create mode 100644 cairo/defpackage.lisp create mode 100644 cairo/export.lisp create mode 100644 examples/freedesktop.svg create mode 100644 examples/home.svg create mode 100644 examples/romedalen.png create mode 100644 examples/testcairo.lisp create mode 100644 rsvg/defpackage.lisp create mode 100644 rsvg/export.lisp create mode 100644 rsvg/rsvg.asd create mode 100644 rsvg/rsvg.lisp diff --git a/cairo/cairo.asd b/cairo/cairo.asd new file mode 100644 index 0000000..d7bada9 --- /dev/null +++ b/cairo/cairo.asd @@ -0,0 +1,18 @@ +;;; -*- Mode: lisp -*- + +(defpackage "CAIRO-SYSTEM" + (:use "COMMON-LISP" "ASDF" "PKG-CONFIG")) + + +(in-package "CAIRO-SYSTEM") + +(pkg-exists-p "cairo" :atleast-version "1.0.2") + + +(defsystem cairo + :depends-on (glib) + :components ((:library "libcairo" + :libdir #.(pkg-variable "cairo" "libdir")) + (:file "defpackage") + (:file "cairo" :depends-on ("defpackage" "libcairo")) + (:file "export" :depends-on ("cairo")))) diff --git a/cairo/cairo.lisp b/cairo/cairo.lisp new file mode 100644 index 0000000..ea493f4 --- /dev/null +++ b/cairo/cairo.lisp @@ -0,0 +1,832 @@ +;; Common Lisp bindings for Cairo +;; Copyright 2005 Espen S. Johnsen +;; +;; Permission is hereby granted, free of charge, to any person obtaining +;; a copy of this software and associated documentation files (the +;; "Software"), to deal in the Software without restriction, including +;; without limitation the rights to use, copy, modify, merge, publish, +;; distribute, sublicense, and/or sell copies of the Software, and to +;; permit persons to whom the Software is furnished to do so, subject to +;; the following conditions: +;; +;; The above copyright notice and this permission notice shall be +;; included in all copies or substantial portions of the Software. +;; +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +;; 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.1 2005-11-10 08:50:45 espen Exp $ + +(in-package "CAIRO") + +(eval-when (:compile-toplevel :load-toplevel :execute) + (define-enum-type surface-format :argb32 :rgb24 :a8 :a1) + + (define-enum-type status + :success :no-memory :invalid-restore :invalid-pop-group + :no-current-point :invalid-matrix :invalid-status :null-pointer + :invalid-string :invalid-path-data :read-error :write-error + :surface-finished :surface-type-mismatch :pattern-type-mismatch + :invalid-content :invalid-format :invalid-visual :file-not-found + :invalid-dash) + + (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-weight :normal :bold) + + (define-enum-type operator + :clear :source :over :in :out :atop :dest :dest-over + :dest-in :dest-out :dest-atop :xor :add :saturate) + + (define-enum-type antialias :default :none :gray :subpixel) + (define-enum-type extend :none :repeat :reflect) + (define-enum-type filter :fast :good :best :nearest :bilinear :gaussian) + (define-enum-type subpixel-order :default :rgb :bgr :vrgb :vbgr) + (define-enum-type hint-style :default :none :slight :medium :full) + (define-enum-type hint-metrics :default :off :on) + + (defclass glyph (proxy) + ((index + :allocation :alien + :initarg :index + :accessor glyph-index + :type unsigned-long) + (x + :allocation :alien + :initarg :x + :accessor glyph-x + :type double-float) + (y + :allocation :alien + :initarg :y + :accessor glyph-y + :type double-float)) + (:metaclass struct-class)) + + (defclass font-face (proxy) + () + (:metaclass proxy-class)) + + (defclass font-options (proxy) + ((antialias + :allocation :virtual + :getter "font_options_get_antialias" + :setter "font_options_set_antialias" + :accessor font-options-antialias + :type antialias) + (subpixel-order + :allocation :virtual + :getter "font_options_get_subpixel_order" + :setter "font_options_set_subpixel_order" + :accessor font-options-subpixel-order + :type subpixel-order) + (hint-style + :allocation :virtual + :getter "font_options_get_hint_style" + :setter "font_options_set_hint_style" + :accessor font-options-hint-style + :type hint-style) + (hint-metrics + :allocation :virtual + :getter "font_options_get_hint_metrics" + :setter "font_options_set_hint_metrics" + :accessor font-options-hint-metrics + :type hint-metrics)) + (:metaclass proxy-class)) + + (defclass scaled-font (proxy) + () + (:metaclass proxy-class)) + + (defclass matrix (struct) + ((xx :allocation :alien :initarg :xx :initform 1.0 + :accessor matrix-xx :type double-float) + (yx :allocation :alien :initarg :yx :initform 0.0 + :accessor matrix-yx :type double-float) + (xy :allocation :alien :initarg :xy :initform 1.0 + :accessor matrix-xy :type double-float) + (yy :allocation :alien :initarg :yy :initform 0.0 + :accessor matrix-yy :type double-float) + (x0 :allocation :alien :initarg :x0 :initform 0.0 + :accessor matrix-x0 :type double-float) + (y0 :allocation :alien :initarg :y0 :initform 0.0 + :accessor matrix-y0 :type double-float)) + (:metaclass struct-class)) + + + (defclass text-extents (struct) + ((x-bearing :allocation :alien :reader text-extents-x-bearing :type double-float) + (y-bearing :allocation :alien :reader text-extents-y-bearing :type double-float) + (width :allocation :alien :reader text-extents-width :type double-float) + (height :allocation :alien :reader text-extents-height :type double-float) + (x-advance :allocation :alien :reader text-extents-x-advance :type double-float) + (y-advance :allocation :alien :reader text-extents-y-advance :type double-float)) + (:metaclass struct-class)) + + (defclass pattern (proxy) + ((extend + :allocation :virtual + :getter "cairo_pattern_get_extend" + :setter "cairo_pattern_set_extend" + :accessor pattern-extend + :type extend) + (filter + :allocation :virtual + :getter "cairo_pattern_get_filter" + :setter "cairo_pattern_set_filter" + :accessor pattern-filter + :type filter) + (matrix + :allocation :virtual + :getter "cairo_pattern_get_matrix" + :setter "cairo_pattern_set_matrix" + :accessor pattern-matrix + :type matrix)) + (:metaclass proxy-class)) + + (defclass context (proxy) + ((target + :allocation :virtual + :getter "cairo_get_target" + :reader target + :type surface) + (source + :allocation :virtual + :getter "cairo_get_source" + :setter "cairo_set_source" + :accessor source + :type pattern) + (antialias + :allocation :virtual + :getter "cairo_get_antialias" + :setter "cairo_set_antialias" + :accessor antialias + :type antialias) + (tolerance + :allocation :virtual + :getter "cairo_get_tolerance" + :setter "cairo_set_tolerance" + :accessor tolerance + :type double-float) + (fill-rule + :allocation :virtual + :getter "cairo_get_fill_rule" + :setter "cairo_set_fill_rule" + :accessor fill-rule + :type fill-rule) + (line-width + :allocation :virtual + :getter "cairo_get_line_width" + :setter "cairo_set_line_width" + :accessor line-width + :type double-float) + (line-cap + :allocation :virtual + :getter "cairo_get_line_cap" + :setter "cairo_set_line_cap" + :accessor line-cap + :type line-cap) + (line-join + :allocation :virtual + :getter "cairo_get_line_join" + :setter "cairo_set_line_join" + :accessor line-join + :type line-join) + (miter-limit + :allocation :virtual + :getter "cairo_get_miter_limit" + :setter "cairo_set_miter_limit" + :accessor miter-limit + :type double-float) + (font-matrix + :allocation :virtual + :getter "cairo_get_font_matrix" + :setter "cairo_set_font_matrix" + :accessor font-matrix + :type matrix) + (font-options + :allocation :virtual + :getter "cairo_get_font_options" + :setter "cairo_set_font_options" + :accessor font-options + :type font-options) + (font-face + :allocation :virtual + :getter "cairo_get_font_face" + :setter "cairo_set_font_face" + :accessor font-face + :type font-face) + (operator + :allocation :virtual + :getter "cairo_get_operator" + :setter "cairo_set_operator" + :accessor operator + :type operator) + (matrix + :allocation :virtual + :getter matrix + :setter "cairo_set_matrix" + :writer (setf matrix) + :type matrix) + ) + (:metaclass proxy-class)) + + (defclass surface (proxy) + () + (:metaclass proxy-class)) + + (defclass image-surface (surface) + ((width + :allocation :virtual + :getter "cairo_image_surface_get_width" + :reader surface-width + :type int) + (height + :allocation :virtual + :getter "cairo_image_surface_get_height" + :reader surface-height + :type int)) + (:metaclass proxy-class)) + +;; (defclass path (proxy) +;; () +;; (:metaclass proxy-class)) + +) + + +;;; Cairo context + +(defbinding %reference () nil + (location pointer)) + +(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)) + +(defbinding (restore-context "cairo_restore") () nil + (cr context)) + +(defmacro with-context ((cr) &body body) + (let ((context (make-symbol "CONTEXT"))) + `(let ((,context ,cr)) + (save-context ,context) + (unwind-protect + (progn ,@body) + (restore-context ,context))))) + +(defbinding status () status + (cr context)) + +(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)) + +(defbinding set-source-surface () nil + (cr context) + (surface surface) + (x double-float) + (y double-float)) + +(defbinding set-dash (cr dashes &optional (offset 0.0)) nil + (cr context) + (dashes (vector double-float)) + ((length dashes) int) + (offset double-float)) + +(defbinding (paint "cairo_paint_with_alpha") (cr &optional (alpha 1.0)) nil + (cr context) + (alpha double-float)) + +(defbinding mask () nil + (cr context) + (pattern pattern)) + +(defbinding mask-surface () nil + (cr context) + (surface surface) + (surface-x double-float) + (surface-y double-float)) + +(defmacro defoperator (name &optional clip-p) + (let ((iname (intern (format nil "%~A" name))) + (pname (intern (format nil "%~A-PRESERVE" name)))) + `(progn + (defbinding ,iname () nil + (cr context)) + (defbinding ,pname () nil + (cr context)) + (defun ,name (cr &optional preserve) + (if preserve + (,pname cr) + (,iname cr))) + ,(unless clip-p + (let ((tname (intern (format nil "IN~A-P" name))) + (ename (intern (format nil "~A-EXTENTS" name)))) + `(progn + (defbinding ,tname () boolean + (cr context) + (x double-float) + (y double-float)) + (defbinding ,ename () boolean + (cr context) + (x1 double-float :out) + (y1 double-float :out) + (x2 double-float :out) + (y2 double-float :out)))))))) + +(defoperator clip t) +(defoperator stroke) +(defoperator fill) + +(defbinding reset-clip () nil + (cr context)) + +(defbinding copy-page () nil + (cr context)) + +(defbinding show-page () nil + (cr context)) + + +;;; Paths + +(defbinding get-current-point () nil + (cr context) + (x double-float :out) + (y double-float :out)) + +(defbinding new-path () nil + (cr context)) + +(defbinding close-path () nil + (cr context)) + +(defbinding arc () nil + (cr context) + (xc double-float) + (yc double-float) + (radius double-float) + (angle1 double-float) + (angle2 double-float)) + +(defbinding arc-negative () nil + (cr context) + (xc double-float) + (yc double-float) + (radius double-float) + (angle1 double-float) + (angle2 double-float)) + +(defun circle (cr x y radius) + (arc cr x y radius 0.0 (* pi 2))) + +(defmacro defpath (name &rest args) + (let ((relname (intern (format nil "REL-~A" name)))) + `(progn + (defbinding ,name () nil + (cr context) + ,@args) + (defbinding ,relname () nil + (cr context) + ,@args)))) + +(defpath curve-to + (x1 double-float) + (y1 double-float) + (x2 double-float) + (y2 double-float) + (x3 double-float) + (y3 double-float)) + +(defpath line-to + (x double-float) + (y double-float)) + +(defpath move-to + (x double-float) + (y double-float)) + +(defbinding rectangle () nil + (cr context) + (x double-float) + (y double-float) + (width double-float) + (height double-float)) + +(defbinding glyph-path (cr glyphs) nil + (cr context) + (glyphs (vector glyph)) + ((length glyphs) int)) + +(defbinding text-path () nil + (cr context) + (text string)) + + + +;;; Patterns + +(defbinding (pattern-add-color-stop "cairo_pattern_add_color_stop_rgba") + (pattern offset red green blue &optional (alpha 1.0)) nil + (pattern pattern) + (offset double-float) + (red double-float) + (green double-float) + (blue double-float) + (alpha double-float)) + +(defbinding (pattern-create "cairo_pattern_create_rgba") + (red green blue &optional (alpha 1.0)) pattern + (red double-float) + (green double-float) + (blue double-float) + (alpha double-float)) + +(defbinding pattern-create-for-surface () pattern + (surface surface)) + +(defbinding pattern-create-linear () pattern + (x0 double-float) + (y0 double-float) + (x1 double-float) + (y1 double-float)) + +(defbinding pattern-create-radial () pattern + (cx0 double-float) + (cy0 double-float) + (radius0 double-float) + (cx1 double-float) + (cy1 double-float) + (radius1 double-float)) + +(defbinding %pattern-reference () nil + (location pointer)) + +(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)) + + + +;;; Transformations + +(defbinding translate () nil + (cr context) + (tx double-float) + (ty double-float)) + +(defbinding scale () nil + (cr context) + (sx double-float) + (sy double-float)) + +(defbinding rotate () nil + (cr context) + (angle double-float)) + +(defbinding transform () nil + (cr context) + (matrix matrix)) + +(defbinding (matrix "cairo_get_matrix") () nil + (cr context) + ((make-instance 'matrix) matrix :return)) + +(defbinding identity-matrix () nil + (cr context)) + +(defbinding user-to-device () nil + (cr context) + (x double-float :in-out) + (y double-float :in-out)) + +(defbinding user-to-device-distance () nil + (cr context) + (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)) + +(defbinding device-to-user-distance () nil + (cr context) + (dx double-float :in-out) + (dy double-float :in-out)) + + +;;; Text + +(defbinding select-font-face () nil + (cr context) + (family string) + (slant font-slant) + (weight font-weight)) + +(defbinding set-font-size () nil + (cr context) + (size double-float)) + +(defbinding show-text () nil + (cr context) + (text string)) + +(defbinding show-glyphs () nil + (cr context) + (glyphs (vector glyph)) + ((length glyphs) int)) + +(defbinding font-extents () boolean + (cr context)) + +(defbinding text-extents (cr text &optional (extents (make-instance 'text-extents))) nil + (cr context) + (text string) + (extents text-extents :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)) + + +;;; Fonts + +(defbinding %font-face-reference () nil + (location pointer)) + +(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)) + + + +;;; Scaled Fonts + +(defbinding %scaled-font-reference () nil + (location pointer)) + +(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)) + +(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)) + +(defbinding %scaled-font-create () pointer + (font-face font-face) + (font-matrix matrix) + (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)) + + + +;;; Font Options + + +(defbinding %font-options-copy () nil + (location pointer)) + +(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) + (declare (ignore initargs)) + (setf (slot-value font-options 'location) (%font-options-create)) + (call-next-method)) + +(defbinding font-options-merge () nil + (options1 font-options :return) + (options2 font-options)) + +(defbinding font-options-hash () unsigned-int + (options font-options)) + +(defbinding font-options-equal-p () boolean + (options1 font-options) + (options2 font-options)) + + + +;;; Surfaces + +(defbinding %surface-reference () nil + (location pointer)) + +(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 ) + (width int) + (height int)) + +(defbinding surface-finish () nil + (surface surface)) + +(defbinding surface-flush () nil + (surface surface)) + +(defbinding surface-get-font-options () nil + (surface surface) + ((make-instance 'font-options) font-options :return)) + +(defbinding surface-set-device-offset () nil + (surface surface) + (x-offset double-float) + (y-offset double-float)) + +(defbinding surface-status () status + (surface surface)) + +(defbinding %surface-mark-dirty () nil + (surface surface)) + +(defbinding %surface-mark-dirty-rectangle () nil + (surface surface) + (x int) + (y int) + (width int) + (height int)) + +(defun surface-mark-dirty (surface &optional x y width height) + (if x + (%surface-mark-dirty-rectangle surface x y width height) + (%surface-mark-dirty surface))) + + + +;; 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)) + + +(defbinding %image-surface-create () image-surface + (format surface-format) + (width int) + (hegit int)) + +(defbinding %image-surface-create-for-data () image-surface + (data pointer) + (format surface-format) + (width int) + (hegit int) + (stride int)) + + + +;;; PNG Surface + +(defbinding image-surface-create-from-png (filename) image-surface + ((truename filename) pathname)) + + + + +;;; Matrices + +(defbinding matrix-init () nil + (matrix matrix :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)) + +(defbinding matrix-init-translate () nil + (matrix matrix :return) + (tx double-float) + (ty double-float)) + +(defbinding matrix-init-scale () nil + (matrix matrix :return) + (sx double-float) + (sy double-float)) + +(defbinding matrix-init-rotate () nil + (matrix matrix :return) + (radians double-float)) + +(defbinding matrix-translate () nil + (matrix matrix :return) + (tx double-float) + (ty double-float)) + +(defbinding matrix-scale () nil + (matrix matrix :return) + (sx double-float) + (sy double-float)) + +(defbinding matrix-rotate () nil + (matrix matrix :return) + (radians double-float)) + +(defbinding matrix-invert () nil + (matrix matrix :return)) + +(defbinding matrix-multiply () nil + (result matrix :out) + (a matrix) + (b matrix)) + +(defbinding matrix-transform-distance () nil + (matrix matrix :return) + (dx double-float) + (dy double-float)) + +(defbinding matrix-transform-point () nil + (matrix matrix :return) + (x double-float) + (y double-float)) + + + diff --git a/cairo/defpackage.lisp b/cairo/defpackage.lisp new file mode 100644 index 0000000..631beb7 --- /dev/null +++ b/cairo/defpackage.lisp @@ -0,0 +1,4 @@ +(defpackage "CAIRO" + (:use "COMMON-LISP" "GLIB" "AUTOEXPORT") + (:shadow "FILL")) + diff --git a/cairo/export.lisp b/cairo/export.lisp new file mode 100644 index 0000000..d3e084f --- /dev/null +++ b/cairo/export.lisp @@ -0,0 +1,18 @@ +(in-package "CAIRO") + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defexport defoperator (name &optional clip-p) + (if clip-p + name + (let ((tname (intern (format nil "IN~A-P" name))) + (ename (intern (format nil "~A-EXTENTS" name)))) + (list name tname ename)))) + + (defexport defpath (name &rest args) + (declare (ignore args)) + (list name (intern (format nil "REL-~A" name))))) + + +;;; Autogenerating exported symbols +(export-from-file #p"clg:cairo;cairo.lisp") + \ No newline at end of file diff --git a/examples/freedesktop.svg b/examples/freedesktop.svg new file mode 100644 index 0000000..aef3899 --- /dev/null +++ b/examples/freedesktop.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + diff --git a/examples/home.svg b/examples/home.svg new file mode 100644 index 0000000..1e6e9ef --- /dev/null +++ b/examples/home.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/romedalen.png b/examples/romedalen.png new file mode 100644 index 0000000000000000000000000000000000000000..0c41eb0cfd29177c4ff83b4bcf99f7bec6a96c97 GIT binary patch literal 80944 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%0Agh7a)>cPiR96c-o4u~89Ah|m928c{( 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 KMNUMnLSTY`L)R4m literal 0 HcmV?d00001 diff --git a/examples/testcairo.lisp b/examples/testcairo.lisp new file mode 100644 index 0000000..131cfed --- /dev/null +++ b/examples/testcairo.lisp @@ -0,0 +1,583 @@ +;; This file contains the cairo C snippets translated to lisp +;; See http://cairographics.org/samples/ + +#+sbcl(require :gtk) +#+cmu(asdf:oos 'asdf:load-op :gtk) +#+sbcl(require :cairo) +#+cmu(asdf:oos 'asdf:load-op :cairo) + +;;#+sbcl(require :rsvg) +;;#+cmu(asdf:oos 'asdf:load-op :avg-cairo) + +(defpackage "TESTCAIRO" + (:use "COMMON-LISP" "GTK") + (:export "CREATE-TESTS")) + +(in-package "TESTCAIRO") + +(declaim (inline deg-to-rad)) +(defun deg-to-rad (deg) + (* deg (/ pi 180))) + +(declaim (inline rad-to-deg)) +(defun rad-to-deg (rad) + (/ (* rad 180) pi)) + + +(defvar *snippets* ()) + + +(defmacro define-snippet (name (cr) &body body) + (let ((widget (make-symbol "WIDGET")) + (window (make-symbol "WINDOW")) + (pointer (make-symbol "POINTER"))) + `(let ((,window nil)) + (setq *snippets* (pushnew ',name *snippets*)) + (defun ,name () + (if (not ,window) + (let ((,widget (make-instance 'drawing-area))) + (setq ,window + (make-instance 'window + :width-request 300 :height-request 300 + :title ,(string-downcase name) + :visible t :child ,widget)) + (signal-connect ,window 'destroy + #'(lambda () (setq ,window nil))) + (signal-connect ,widget 'expose-event + #'(lambda (,pointer) + (declare (ignore ,pointer)) + (let ((,cr (gdk:cairo-create (widget-window ,widget)))) + (multiple-value-bind (width height) + (widget-get-size-allocation ,widget) + (cairo:scale ,cr width height)) + (setf (cairo:line-width ,cr) 0.04) + ,@body))) + (widget-show-all ,window)) + (widget-destroy ,window)))))) + + + + +(defun arc-helper-lines (cr xc yc radius angle1 angle2) + (cairo:set-source-color cr 1 0.2 0.2 0.6) + (cairo:arc cr xc yc 0.05 0 (deg-to-rad 360)) + (cairo:fill cr) + (setf (cairo:line-width cr) 0.03) + (cairo:move-to cr xc yc) + (cairo:rel-line-to cr (* radius (cos angle1)) (* radius (sin angle1))) + (cairo:stroke cr) + (cairo:move-to cr xc yc) + (cairo:rel-line-to cr (* radius (cos angle2)) (* radius (sin angle2))) + (cairo:stroke cr)) + +(define-snippet arc (cr) + (let ((xc 0.5) + (yc 0.5) + (radius 0.4) + (angle1 (deg-to-rad 45.0)) + (angle2 (deg-to-rad 180.0))) + + (cairo:with-context (cr) + (setf (cairo:line-cap cr) :round) + (cairo:arc cr xc yc radius angle1 angle2) + (cairo:stroke cr)) + + (arc-helper-lines cr xc yc radius angle1 angle2))) + +(define-snippet arc-negative (cr) + (let ((xc 0.5) + (yc 0.5) + (radius 0.4) + (angle1 (deg-to-rad 45.0)) + (angle2 (deg-to-rad 180.0))) + + (cairo:with-context (cr) + (setf (cairo:line-cap cr) :round) + (cairo:arc-negative cr xc yc radius angle1 angle2) + (cairo:stroke cr)) + + (arc-helper-lines cr xc yc radius angle1 angle2))) + + +(define-snippet clip (cr) + (cairo:circle cr 0.5 0.5 0.3) + (cairo:clip cr) + + (cairo:new-path cr) ; current path is not consumed by cairo:clip + (cairo:rectangle cr 0 0 1 1) + (cairo:fill cr) + (cairo:set-source-color cr 0 1 0) + (cairo:move-to cr 0 0) + (cairo:line-to cr 1 1) + (cairo:move-to cr 1 0) + (cairo:line-to cr 0 1) + (cairo:stroke cr)) + + +(define-snippet clip-image (cr) + (cairo:circle cr 0.5 0.5 0.3) + (cairo:clip cr) + (cairo:new-path cr) + + (let ((image (cairo:image-surface-create-from-png + #p"clg:examples;romedalen.png"))) + + (let ((width (cairo:surface-width image)) + (height (cairo:surface-height image))) + (cairo:scale cr (/ 1.0 width) (/ 1.0 height))) + + (cairo:set-source-surface cr image 0 0) + (cairo:paint cr))) + +(define-snippet clip-rectangle (cr) + (cairo:new-path cr) + (cairo:move-to cr 0.25 0.25) + (cairo:line-to cr 0.25 0.75) + (cairo:line-to cr 0.75 0.75) + (cairo:line-to cr 0.75 0.25) + (cairo:line-to cr 0.25 0.25) + (cairo:close-path cr) + + (cairo:clip cr) + + (cairo:move-to cr 0 0) + (cairo:line-to cr 1 1) + (cairo:stroke cr)) + + +;; (define-snippet curve-rectangle (cr) +;; (let ((x0 0.1) +;; (y0 0.1) +;; (width 0.8) +;; (height 0.8) +;; (radius 0.4)) +;; (unless (and (zerop width) (zerop height)) +;; (let ((x1 (+ x0 width)) +;; (y1 (+ y0 height))) +;; (cond +;; ((and (< (* 0.5 width) radius) (< (* 0.5 height) radius)) +;; (cairo:move-to cr x0 (* 0.5 (+ y0 y1))) +;; (cairo:curve-to cr x0 y0 x0 y0 (* 0.5 (+ x0 x1)) y0) +;; (cairo:curve-to cr x1 y0 x1 y0 x1 (* 0.5 (+ y0 y1))) +;; (cairo:curve-to cr x1 y1 x1 y1 (* 0.5 (+ x0 x1)) y1) +;; (cairo:curve-to cr x0 y1 x0 y1 x0 (* 0.5 (+ y0 y1)))) +;; ((< (* 0.5 width) radius) +;; (cairo:move-to cr x0 (+ y0 radius)) +;; (cairo:curve-to cr x0 y0 x0 y0 (* 0.5 (+ x0 x1)) y0) +;; (cairo:curve-to cr x1 y0 x1 y0 x1 (+ y0 radius)) +;; (cairo:line-to cr x1 (- y1 radius)) +;; (cairo:curve-to cr x1 y1 x1 y1 (* 0.5 (+ x0 x1)) y1) +;; (cairo:curve-to cr x0 y1 x0 y1 x0 (- y1 radius))) +;; ((< (* 0.5 height) radius) +;; (cairo:move-to cr x0 (* 0.5 (+ y0 y1))) +;; (cairo:curve-to cr x0 y0 x0 y0 (+ x0 radius) y0) +;; (cairo:line-to cr (- x1 radius) y0) +;; (cairo:curve-to cr x1 y0 x1 y0 x1 (* 0.5 (+ y0 y1))) +;; (cairo:curve-to cr x1 y1 x1 y1 (- x1 radius) y1) +;; (cairo:line-to cr (+ x0 radius) y1) +;; (cairo:curve-to cr x0 y1 x0 y1 x0 (* 0.5 (+ y0 y1)))) +;; (t +;; (cairo:move-to cr x0 (+ y0 radius)) +;; (cairo:curve-to cr x0 y0 x0 y0 (+ x0 radius) y0) +;; (cairo:line-to cr (- x1 radius) y0) +;; (cairo:curve-to cr x1 y0 x1 y0 x1 (+ y0 radius)) +;; (cairo:line-to cr x1 (- y1 radius)) +;; (cairo:curve-to cr x1 y1 x1 y1 (- x1 radius) y1) +;; (cairo:line-to cr (+ x0 radius) y1) +;; (cairo:curve-to cr x0 y1 x0 y1 x0 (- y1 radius)))) +;; (cairo:close-path cr) + +;; (cairo:set-source-color cr 0.5 0.5 1.0) +;; (cairo:fill cr t) +;; (cairo:set-source-color cr 0.5 0.0 0.0 0.5) +;; (cairo:stroke cr))))) + + + +(define-snippet curve-to (cr) + (let ((x 0.1) (y 0.5) + (x1 0.4) (y1 0.9) + (x2 0.6) (y2 0.1) + (x3 0.9) (y3 0.5)) + + (cairo:move-to cr x y) + (cairo:curve-to cr x1 y1 x2 y2 x3 y3) + + (cairo:stroke cr) + + (cairo:set-source-color cr 1 0.2 0.2 0.6) + (setf (cairo:line-width cr) 0.03) + (cairo:move-to cr x y) + (cairo:line-to cr x1 y1) + (cairo:move-to cr x2 y2) + (cairo:line-to cr x3 y3) + (cairo:stroke cr))) + + +(define-snippet dash (cr) + (let ((dashes #(0.20 0.05 0.05 0.05)) + (offset -0.2)) + (cairo:set-dash cr dashes offset) + (cairo:move-to cr 0.5 0.1) + (cairo:line-to cr 0.9 0.9) + (cairo:rel-line-to cr -0.4 0.0) + (cairo:curve-to cr 0.2 0.9 0.2 0.5 0.5 0.5) + (cairo:stroke cr))) + + +(defun fill-and-stroke-common (cr) + (cairo:move-to cr 0.5 0.1) + (cairo:line-to cr 0.9 0.9) + (cairo:rel-line-to cr -0.4 0.0) + (cairo:curve-to cr 0.2 0.9 0.2 0.5 0.5 0.5) + (cairo:close-path cr)) + + +(define-snippet fill-and-stroke2 (cr) + (fill-and-stroke-common cr) + (cairo:move-to cr 0.25 0.1) + (cairo:rel-line-to cr 0.2 0.2) + (cairo:rel-line-to cr -0.2 0.2) + (cairo:rel-line-to cr -0.2 -0.2) + (cairo:close-path cr) + + (cairo:set-source-color cr 0 0 1) + (cairo:fill cr t) + (cairo:set-source-color cr 0 0 0) + (cairo:stroke cr)) + + +(define-snippet fill-and-stroke (cr) + (fill-and-stroke-common cr) + + (cairo:set-source-color cr 0 0 1) + (cairo:fill cr t) + (cairo:set-source-color cr 0 0 0) + (cairo:stroke cr)) + + +(define-snippet gradient (cr) + (let ((pattern (cairo:pattern-create-linear 0.0 0.0 0.0 1.0))) + (cairo:pattern-add-color-stop pattern 1 0 0 0 1) + (cairo:pattern-add-color-stop pattern 0 1 1 1 1) + (cairo:rectangle cr 0 0 1 1) + (setf (cairo:source cr) pattern) + (cairo:fill cr)) + (let ((pattern (cairo:pattern-create-radial 0.45 0.4 0.1 0.4 0.4 0.5))) + (cairo:pattern-add-color-stop pattern 0 1 1 1 1) + (cairo:pattern-add-color-stop pattern 1 0 0 0 1) + (setf (cairo:source cr) pattern) + (cairo:circle cr 0.5 0.5 0.3) + (cairo:fill cr))) + + +(define-snippet image (cr) + (let ((image (cairo:image-surface-create-from-png + #p"clg:examples;romedalen.png"))) + (cairo:translate cr 0.5 0.5) + (cairo:rotate cr (deg-to-rad 45)) + (let ((width (cairo:surface-width image)) + (height (cairo:surface-height image))) + (cairo:scale cr (/ 1.0 width) (/ 1.0 height)) + (cairo:translate cr (* -0.5 width) (* -0.5 height))) + (cairo:set-source-surface cr image 0 0) + (cairo:paint cr))) + + +(define-snippet image-pattern (cr) + (let* ((image (cairo:image-surface-create-from-png + #p"clg:examples;romedalen.png")) + (pattern (cairo:pattern-create-for-surface image))) + (setf (cairo:pattern-extend pattern) :repeat) + (cairo:translate cr 0.5 0.5) + (cairo:rotate cr (deg-to-rad 45)) + (cairo:scale cr (/ 1.0 (sqrt 2)) (/ 1.0 (sqrt 2))) + (cairo:translate cr -0.5 -0.5) + (let ((width (cairo:surface-width image)) + (height (cairo:surface-height image)) + (matrix (make-instance 'cairo:matrix))) + (cairo:matrix-init-scale matrix (* 5 width) (* 5 height)) + (setf (cairo:pattern-matrix pattern) matrix)) + (setf (cairo:source cr) pattern) + (cairo:rectangle cr 0.0 0.0 1.0 1.0) + (cairo:fill cr))) + + +;; (defun snippet-set-bg-svg (cr filename) +;; (let ((handle (make-instance 'rsvg:handle :filename filename))) +;; (cairo:with-context (cr) +;; (with-slots (rsvg:width rsvg:height) (rsvg:handle-dimensions handle) +;; (cairo:scale cr (/ 1.0 rsvg:width) (/ 1.0 rsvg:height)) +;; (rsvg:cairo-render cr handle))))) + +;; (define-snippet librsvg (cr) +;; (snippet-set-bg-svg cr "clg:examples;home.svg")) + + +(defmacro define-operator-snippet (operator) + (let ((name (intern (format nil "OPERATOR-~A" operator)))) + `(define-snippet ,name (cr) + (snippet-set-bg-svg cr "clg:examples;freedesktop.svg") + (setf (cairo:operator cr) ,operator) + + (cairo:set-source-color cr 1.0 0.0 0.0 0.5) + (cairo:rectangle cr 0.2 0.2 0.5 0.5) + (cairo:fill) + + (cairo:set-source-color cr 0.0 1.0 0.0) + (cairo:rectangle cr 0.4 0.4 0.4 0.4) + (cairo:fill) + + (cairo:set-source-color cr 0.0 0.0 1.0) + (cairo:rectangle cr 0.6 0.6 0.3 0.3) + (cairo:fill)))) + +;; (define-operator-snippet :add) +;; (define-operator-snippet :atop) +;; (define-operator-snippet :atop-reverse) +;; (define-operator-snippet :in) +;; (define-operator-snippet :in-reverse) +;; (define-operator-snippet :out) +;; (define-operator-snippet :out-reverse) +;; (define-operator-snippet :over) +;; (define-operator-snippet :over-reverse) +;; (define-operator-snippet :saturate) +;; (define-operator-snippet :xor) + + + +(define-snippet path (cr) + (cairo:move-to cr 0.5 0.1) + (cairo:line-to cr 0.9 0.9) + (cairo:rel-line-to cr -0.4 0.0) + (cairo:curve-to cr 0.2 0.9 0.2 0.5 0.5 0.5) + (cairo:stroke cr)) + + +;; (let ((path)) +;; (define-snippet pattern-fill (cr) +;; (let ((spikes 10) +;; (text "KAPOW!")) +;; (unless path +;; (let ((x-fuzz 0.08) +;; (y-fuzz 0.08) +;; (x-inner-radius 0.3) +;; (y-inner-radius 0.2) +;; (x-outer-radius 0.45) +;; (y-outer-radius 0.35)) +;; (setq path (make-array (* 2 spikes))) +;; (loop +;; for i from 0 below (* 2 spikes) +;; do (multiple-value-bind (x-radius y-radius) +;; (if (evenp i) +;; (values x-inner-radius y-inner-radius) +;; (values x-outer-radius y-outer-radius)) +;; (setf +;; (svref path i) +;; (cons +;; (+ 0.5 (* (cos (* pi (/ i spikes))) x-radius) +;; (* (random 1.0) x-fuzz)) +;; (+ 0.5 (* (sin (* pi (/ i spikes))) y-radius) +;; (* (random 1.0) y-fuzz)))))))) + +;; (setf (cairo:line-width cr) 0.01) +;; (cairo:move-to cr (car (svref path 0)) (cdr (svref path 0))) +;; (loop +;; for i from 1 below (* 2 spikes) +;; do (cairo:line-to cr (car (svref path i)) (cdr (svref path i)))) +;; (cairo:close-path cr) +;; (cairo:stroke cr) +;; (cairo:move-to cr +;; (car (svref path (1- spikes))) (cdr (svref path (1- spikes)))) + +;; (cairo:select-font-face cr "Sans" :normal :bold) +;; (time (cairo:text-path cr text)) +;; (cairo:set-source-color cr 1.0 1.0 0.5) +;; (cairo:fill cr) + +;; (cairo:set-font-size cr 0.2) +;; (let* ((extents (cairo:text-extents cr text)) +;; (x (- 0.5 (+ (* 0.5 (cairo:text-extents-width extents)) (cairo:text-extents-x-bearing extents)))) +;; (y (- 0.5 (+ (* 0.5 (cairo:text-extents-height extents)) (cairo:text-extents-y-bearing extents))))) + +;; (cairo:move-to cr x y) +;; (cairo:text-path cr text) +;; (cairo:set-source-color cr 0 0 0) +;; (cairo:stroke cr))))) + + + +(define-snippet set-line-cap (cr) + (setf (cairo:line-width cr) 0.12) + (setf (cairo:line-cap cr) :butt) + (cairo:move-to cr 0.25 0.2) + (cairo:line-to cr 0.25 0.8) + (cairo:stroke cr) + (setf (cairo:line-cap cr) :round) + (cairo:move-to cr 0.5 0.2) + (cairo:line-to cr 0.5 0.8) + (cairo:stroke cr) + (setf (cairo:line-cap cr) :square) + (cairo:move-to cr 0.75 0.2) + (cairo:line-to cr 0.75 0.8) + (cairo:stroke cr) + + ;; draw helping lines + (cairo:set-source-color cr 1 0.2 0.2) + (setf (cairo:line-width cr) 0.01) + (cairo:move-to cr 0.25 0.2) + (cairo:line-to cr 0.25 0.8) + (cairo:move-to cr 0.5 0.2) + (cairo:line-to cr 0.5 0.8) + (cairo:move-to cr 0.75 0.2) + (cairo:line-to cr 0.75 0.8) + (cairo:stroke cr)) + + +(define-snippet set-line-join (cr) + (setf (cairo:line-width cr) 0.16) + (cairo:move-to cr 0.3 0.33) + (cairo:rel-line-to cr 0.2 -0.2) + (cairo:rel-line-to cr 0.2 0.2) + (setf (cairo:line-join cr) :miter) ; default + (cairo:stroke cr) + + (cairo:move-to cr 0.3 0.63) + (cairo:rel-line-to cr 0.2 -0.2) + (cairo:rel-line-to cr 0.2 0.2) + (setf (cairo:line-join cr) :bevel) + (cairo:stroke cr) + + (cairo:move-to cr 0.3 0.93) + (cairo:rel-line-to cr 0.2 -0.2) + (cairo:rel-line-to cr 0.2 0.2) + (setf (cairo:line-join cr) :round) + (cairo:stroke cr)) + + + +(define-snippet text (cr) + (cairo:select-font-face cr "Sans" :normal :bold) +;; ;(setf (cairo:font-size cr) 0.35) + (cairo:set-font-size cr 0.35) + + (cairo:move-to cr 0.04 0.53) + (cairo:show-text cr "Hello") + + (cairo:move-to cr 0.27 0.65) + (cairo:text-path cr "void") + (cairo:set-source-color cr 0.5 0.5 1) + (cairo:fill cr t) + + (cairo:set-source-color cr 0 0 0) + (setf (cairo:line-width cr) 0.01) + (cairo:stroke cr) + + ;; draw helping lines + (cairo:set-source-color cr 1 0.2 0.2 0.6) + (cairo:arc cr 0.04 0.53 0.02 0 (deg-to-rad 360)) + (cairo:arc cr 0.27 0.65 0.02 0 (deg-to-rad 360)) + (cairo:fill cr)) + + +(define-snippet text-align-center (cr) + (let ((text "cairo")) + (cairo:select-font-face cr "Sans" :normal :normal) + (cairo:set-font-size cr 0.2) + + (let* ((extents (cairo:text-extents cr text)) + (x (- 0.5 (+ (/ (cairo:text-extents-width extents) 2) (cairo:text-extents-x-bearing extents)))) + (y (- 0.5 (+ (/ (cairo:text-extents-height extents) 2) (cairo:text-extents-y-bearing extents))))) + (cairo:move-to cr x y) + (cairo:show-text cr text) + + ;; draw helping lines + (cairo:set-source-color cr 1.0 0.2 0.2 0.6) + (cairo:circle cr x y 0.05) + (cairo:fill cr) + (cairo:move-to cr 0.5 0.0) + (cairo:rel-line-to cr 0.0 1.0) + (cairo:move-to cr 0.0 0.5) + (cairo:rel-line-to cr 1.0 0.0) + (cairo:stroke cr)))) + +(define-snippet text-extents (cr) + (let ((text "cairo")) + (cairo:select-font-face cr "Sans" :normal :normal) + (cairo:set-font-size cr 0.4) + + (let* ((extents (cairo:text-extents cr text)) + (x 0.1) + (y 0.6)) + (cairo:move-to cr x y) + (cairo:show-text cr text) + + ;; draw helping lines + (cairo:set-source-color cr 1.0 0.2 0.2 0.6) + (cairo:circle cr x y 0.05) + (cairo:fill cr) + (cairo:move-to cr x y) + (cairo:rel-line-to cr 0 (- (cairo:text-extents-height extents))) + (cairo:rel-line-to cr (cairo:text-extents-width extents) 0) + (cairo:rel-line-to cr + (cairo:text-extents-x-bearing extents) + (- (cairo:text-extents-y-bearing extents))) + (cairo:stroke cr)))) + + +(defun create-tests () +;; (rc-parse "clg:examples;testgtkrc2") +;; (rc-parse "clg:examples;testgtkrc") + + (let* ((main-window (make-instance 'window + :title "testcairo.lisp" :name "main-window" + :default-width 200 :default-height 400 + :allow-grow t :allow-shrink nil)) + (scrolled-window (make-instance 'scrolled-window + :hscrollbar-policy :automatic + :vscrollbar-policy :automatic + :border-width 10)) + (close-button (make-instance 'button + :label "close" :can-default t + :signal (list 'clicked #'widget-destroy + :object main-window)))) + + (let ((icon (gdk:pixbuf-load #p"clg:examples;gtk.png"))) + (setf + (window-icon main-window) + (gdk:pixbuf-add-alpha icon t 254 254 252))) + + ;; Main box + (make-instance 'v-box + :parent main-window + :child-args '(:expand nil) + :child (list (make-instance 'label :label (gtk-version)) :fill nil) + :child (list (make-instance 'label :label (clg-version)) :fill nil) + :child (list (make-instance 'label + :label #-cmu(format nil "~A (~A)" + (lisp-implementation-type) + (lisp-implementation-version)) + ;; The version string in CMUCL is far too long + #+cmu(lisp-implementation-type)) + :fill nil) + :child (list scrolled-window :expand t) + :child (make-instance 'h-separator) + :child (make-instance 'v-box + :homogeneous nil :spacing 10 :border-width 10 + :child close-button)) + + (let ((content-box + (make-instance 'v-box + :focus-vadjustment (scrolled-window-vadjustment scrolled-window) + :children (mapcar #'(lambda (snippet) + (create-button (string-downcase snippet) snippet)) + (sort *snippets* #'string<))))) + (scrolled-window-add-with-viewport scrolled-window content-box)) + + (widget-grab-focus close-button) + (widget-show-all main-window) + main-window)) + + +(clg-init) +;;(rsvg:init) diff --git a/rsvg/defpackage.lisp b/rsvg/defpackage.lisp new file mode 100644 index 0000000..afe70a5 --- /dev/null +++ b/rsvg/defpackage.lisp @@ -0,0 +1,3 @@ +(defpackage "RSVG" + (:use "COMMON-LISP" "GLIB" "AUTOEXPORT")) + diff --git a/rsvg/export.lisp b/rsvg/export.lisp new file mode 100644 index 0000000..f5b1400 --- /dev/null +++ b/rsvg/export.lisp @@ -0,0 +1,4 @@ +(in-package "RSVG") + +;;; Autogenerating exported symbols +(export-from-file #p"clg:rsvg;rsvg.lisp") diff --git a/rsvg/rsvg.asd b/rsvg/rsvg.asd new file mode 100644 index 0000000..db9785a --- /dev/null +++ b/rsvg/rsvg.asd @@ -0,0 +1,18 @@ +;;; -*- Mode: lisp -*- + +(defpackage "RSVG-SYSTEM" + (:use "COMMON-LISP" "ASDF" "PKG-CONFIG")) + + +(in-package "RSVG-SYSTEM") + +(pkg-exists-p "librsvg-2.0" :atleast-version "2.13.2") + + +(defsystem rsvg + :depends-on (glib gdk cairo) + :components ((:library "librsvg-2" + :libdir #.(pkg-variable "librsvg-2.0" "libdir")) + (:file "defpackage") + (:file "rsvg" :depends-on ("defpackage" "librsvg-2")) + (:file "export" :depends-on ("rsvg")))) diff --git a/rsvg/rsvg.lisp b/rsvg/rsvg.lisp new file mode 100644 index 0000000..212c1f1 --- /dev/null +++ b/rsvg/rsvg.lisp @@ -0,0 +1,138 @@ +;; Common Lisp bindings for librsvg +;; Copyright 2005 Espen S. Johnsen +;; +;; Permission is hereby granted, free of charge, to any person obtaining +;; a copy of this software and associated documentation files (the +;; "Software"), to deal in the Software without restriction, including +;; without limitation the rights to use, copy, modify, merge, publish, +;; distribute, sublicense, and/or sell copies of the Software, and to +;; permit persons to whom the Software is furnished to do so, subject to +;; the following conditions: +;; +;; The above copyright notice and this permission notice shall be +;; included in all copies or substantial portions of the Software. +;; +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +;; $Id: rsvg.lisp,v 1.1 2005-11-10 08:53:24 espen Exp $ + +(in-package "RSVG") + + +(eval-when (:compile-toplevel :load-toplevel :execute) + + (defclass dimension-data (struct) + ((width + :allocation :alien + :initarg :width + :accessor dimension-data-width + :type int) + (height + :allocation :alien + :initarg :height + :accessor dimension-data-height + :type int) + (em + :allocation :alien + :initarg :em + :accessor dimension-data-em + :type double-float) + (ex + :allocation :alien + :initarg :ex + :accessor dimension-data-ex + :type double-float)) + (:metaclass struct-class)) + + + (defclass handle (proxy) + ((base-uri + :allocation :virtual + :getter "rsvg_handle_get_base_uri" + :setter "rsvg_handle_set_base_uri" + :accessor handle-base-uri + :type string) + (dimensions + :allocation :virtual + :getter handle-get-dimensions + :reader handle-dimensions + :type dimension-data) + (title + :allocation :virtual + :getter "rsvg_handle_get_title" + :reader handle-title + :type string) + (description + :allocation :virtual + :getter "rsvg_handle_get_desc" + :reader handle-description + :type string) + (metadata + :allocation :virtual + :getter "rsvg_handle_get_metadata" + :reader handle-metadata + :type string)) + (:metaclass proxy-class)) + +) + +(defbinding init () nil) +(defbinding term () nil) + +(defbinding set-default-dpi () nil + (dpi-x double-float) + (dpi-y double-float)) + +(defbinding handle-set-dpi () nil + (handle handle) + (dpi-x double-float) + (dpi-y double-float)) + + +(defbinding handle-get-dimensions (handle &optional (dimensions (make-instance 'dimension-data))) nil + (handle handle) + (dimensions dimension-data :return)) + + + +(defbinding handle-close () boolean + (handle handle) + (nil gerror :out)) + +(defbinding %handle-new () pointer) + +(defbinding %handle-new-from-file () pointer + (filename pathname) + (nil gerror :out)) + +(defmethod initialize-instance ((handle handle) &key filename) + (multiple-value-bind (location gerror) + (cond + (filename (%handle-new-from-file filename)) + (t (%handle-new))) + (if gerror + (signal-gerror gerror) + (setf (slot-value handle 'location) location))) + (call-next-method)) + + +(defbinding %handle-free () nil + (location pointer)) + +(defmethod unreference-foreign ((class (eql (find-class 'handle))) location) + (%handle-free location)) + + + + +;;; Cairo interface + +(defbinding cairo-render () nil + (cr cairo:context) + (handle handle)) \ No newline at end of file -- [mdw]