From f5a040cfc2ea8886a7c9f98e715499504bf3c175 Mon Sep 17 00:00:00 2001
From: Matthew Willis <matthew.willis@mac.com>
Date: Sat, 3 May 2008 09:59:59 -0700
Subject: [PATCH] added cairo.gadget and cairo.samples

---
 extra/cairo/cairo.factor           |  5 ++---
 extra/cairo/gadget/gadget.factor   | 34 ++++++++++++++++++++++++++++++
 extra/cairo/samples/samples.factor | 13 ++++++++++++
 3 files changed, 49 insertions(+), 3 deletions(-)
 create mode 100644 extra/cairo/gadget/gadget.factor
 create mode 100644 extra/cairo/samples/samples.factor

diff --git a/extra/cairo/cairo.factor b/extra/cairo/cairo.factor
index 1cdd86fc36..b82191f72c 100644
--- a/extra/cairo/cairo.factor
+++ b/extra/cairo/cairo.factor
@@ -703,7 +703,7 @@ cairo_status_to_string ( cairo_status_t status ) ;
 ! Surface manipulation
 
 FUNCTION: cairo_surface_t*
-cairo_surface_create_similar ( cairo_surface_t * other, cairo_content_t	content, int width, int height ) ;
+cairo_surface_create_similar ( cairo_surface_t* other, cairo_content_t content, int width, int height ) ;
 
 FUNCTION: cairo_surface_t*
 cairo_surface_reference ( cairo_surface_t* surface ) ;
@@ -744,8 +744,7 @@ FUNCTION: cairo_content_t
 cairo_surface_get_content ( cairo_surface_t* surface ) ;
 
 FUNCTION: cairo_status_t
-cairo_surface_write_to_png ( cairo_surface_t	*surface,
-			    const char		*filename ) ;
+cairo_surface_write_to_png ( cairo_surface_t* surface, char* filename ) ;
 
 FUNCTION: cairo_status_t
 cairo_surface_write_to_png_stream ( cairo_surface_t* surface, cairo_write_func_t write_func, void* closure ) ;
diff --git a/extra/cairo/gadget/gadget.factor b/extra/cairo/gadget/gadget.factor
new file mode 100644
index 0000000000..50abfb35ba
--- /dev/null
+++ b/extra/cairo/gadget/gadget.factor
@@ -0,0 +1,34 @@
+USING: cairo ui.render kernel opengl.gl opengl
+math byte-arrays ui.gadgets accessors arrays 
+namespaces ;
+
+IN: cairo.gadget
+
+TUPLE: cairo-gadget width height quot ;
+: <cairo-gadget> ( width height quot -- cairo-gadget )
+    cairo-gadget construct-gadget 
+    swap >>quot
+    swap >>height
+    swap >>width ;
+
+: with-surface ( surface quot -- )
+    >r dup cairo_create dup r> call
+    cairo_destroy cairo_surface_destroy ;
+
+: cairo>bytes ( width height quot -- byte-array )
+    >r over 4 *
+    [ * nip <byte-array> dup CAIRO_FORMAT_ARGB32 ]
+    [ cairo_image_surface_create_for_data ] 3bi
+    r> with-surface ;
+
+M: cairo-gadget draw-gadget* ( gadget -- )
+    origin get [
+        0 0 glRasterPos2i
+        1.0 -1.0 glPixelZoom
+        [ width>> ] [ height>> ] [ quot>> ] tri
+        [ drop GL_RGBA GL_UNSIGNED_BYTE ] [ cairo>bytes ] 3bi
+        glDrawPixels
+    ] with-translation ;
+
+M: cairo-gadget pref-dim* ( gadget -- rect )
+    [ width>> ] [ height>> ] bi 2array ;
\ No newline at end of file
diff --git a/extra/cairo/samples/samples.factor b/extra/cairo/samples/samples.factor
new file mode 100644
index 0000000000..714e2b9396
--- /dev/null
+++ b/extra/cairo/samples/samples.factor
@@ -0,0 +1,13 @@
+USING: cairo locals ;
+
+IN: cairo.samples
+
+SYMBOL: cr
+:: cairo-samp ( cr -- )
+    [let | |
+        cr 10.0 cairo_set_line_width
+        cr 50.0 50.0 20.0 0.0 3.0 cairo_arc
+        cr 1.0 1.0 0.0 1.0 cairo_set_source_rgba
+        cr cairo_stroke
+        cr cairo_fill
+    ] ;
\ No newline at end of file