]> gitweb.factorcode.org Git - factor.git/commitdiff
cairo image surface buffer needs to be mallocked
authorJoe Groff <arcata@gmail.com>
Wed, 31 Dec 2008 20:35:10 +0000 (12:35 -0800)
committerJoe Groff <arcata@gmail.com>
Wed, 31 Dec 2008 20:35:10 +0000 (12:35 -0800)
basis/cairo/gadgets/gadgets.factor

index 131f7425c90ee18cb6304b1c2e39628b6e9a7ec3..87942b4c91540b24887039815ebb04f262e671ce 100644 (file)
@@ -2,19 +2,26 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: sequences math kernel byte-arrays cairo.ffi cairo
 io.backend ui.gadgets accessors opengl.gl arrays fry
-classes ui.render namespaces ;
-
+classes ui.render namespaces destructors libc ;
 IN: cairo.gadgets
 
+<PRIVATE
 : width>stride ( width -- stride ) 4 * ;
+
+: image-dims ( gadget -- width height stride )
+    dim>> first2 over width>stride ; inline
+: image-buffer ( width height stride -- alien )
+    * nip malloc ; inline
+PRIVATE>
     
 GENERIC: render-cairo* ( gadget -- )
 
-: render-cairo ( gadget -- byte-array )
-    dup dim>> first2 over width>stride
-    [ * nip <byte-array> dup CAIRO_FORMAT_ARGB32 ] 
-    [ cairo_image_surface_create_for_data ] 3bi
-    rot '[ _ render-cairo* ] with-cairo-from-surface ; inline
+: render-cairo ( gadget -- alien )
+    [
+        image-dims
+        [ image-buffer dup CAIRO_FORMAT_ARGB32 ] 
+        [ cairo_image_surface_create_for_data ] 3bi
+    ] [ '[ _ render-cairo* ] with-cairo-from-surface ] bi ;
 
 TUPLE: cairo-gadget < gadget ;
 
@@ -23,11 +30,13 @@ TUPLE: cairo-gadget < gadget ;
         swap >>dim ;
 
 M: cairo-gadget draw-gadget*
-    [ dim>> ] [ render-cairo ] bi
-    origin get first2 glRasterPos2i
-    1.0 -1.0 glPixelZoom
-    [ first2 GL_BGRA GL_UNSIGNED_BYTE ] dip
-    glDrawPixels ;
+    [
+        [ dim>> ] [ render-cairo &free ] bi
+        origin get first2 glRasterPos2i
+        1.0 -1.0 glPixelZoom
+        [ first2 GL_BGRA GL_UNSIGNED_BYTE ] dip
+        glDrawPixels
+    ] with-destructors ;
 
 : copy-surface ( surface -- )
     cr swap 0 0 cairo_set_source_surface