chiark / gitweb /
Infra: Rudimentary setup system.
[clg] / rsvg / rsvg.lisp
index 5fef7f83bbbb82511164a4c3c8b5614ee4e9bf0d..a6da95c89d7d9c0f2ce6c2bd45cc6f6216aa8389 100644 (file)
 ;; 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.7 2006-12-24 14:32:35 espen Exp $
+;; $Id: rsvg.lisp,v 1.9 2008-10-08 18:24:01 espen Exp $
 
 (in-package "RSVG")
 
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
-  (init-types-in-library 
-   #.(concatenate 'string (pkg-config:pkg-variable "librsvg-2.0" "libdir") 
-                         "/librsvg-2." asdf:*dso-extension*) :prefix "rsvg_")
+  (init-types-in-library rsvg "librsvg-2" :prefix "rsvg_")
 
-(define-types-by-introspection "Rsvg"
-  ("RsvgError" :ignore t)))
+  (define-types-by-introspection "Rsvg"
+    ("RsvgError" :ignore t)))
 
 
 (defbinding init () nil)
@@ -72,6 +70,11 @@ (defmethod allocate-foreign ((handle handle) &key data filename)
    (data (%handle-new-from-data data))
    (t (call-next-method))))
 
+(defmacro with-handle ((handle &rest args) &body body)
+  `(let ((,handle (make-instance 'handle ,@args)))
+     (unwind-protect
+         (progn ,@body)
+       (handle-close ,handle))))
 
 ;;; Cairo interface
 
@@ -79,3 +82,22 @@ (defbinding (render-cairo "rsvg_handle_render_cairo_sub") (handle cr &optional i
   (handle handle)
   (cr cairo:context)
   (id (or null string)))
+
+(defun image-surface-create-from-svg (filename &key width height (format :argb32)id)
+  (with-handle (handle :filename filename)
+    (multiple-value-bind (width height)
+       (cond
+         ((and width height) (values width height))
+         (width 
+          (let ((ratio (/ (handle-height handle) (handle-width handle))))
+            (values width (truncate (* width ratio)))))
+         (height 
+          (let ((ratio (/ (handle-width handle) (handle-height handle))))
+            (values (truncate (* height ratio)) height)))
+         (t (values (handle-width handle) (handle-height handle))))
+      (let ((image (make-instance 'cairo:image-surface 
+                   :width width :height height :format format)))
+       (cairo:with-surface (image cr)
+         (cairo:scale cr (/ width (handle-width handle)) (/ height (handle-height handle)))
+         (render-cairo handle cr id))
+       image))))