1 ! Copyright (C) 2008 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays kernel accessors math ui.gadgets ui.render
4 opengl.gl byte-arrays namespaces opengl cairo.ffi cairo.lib
5 inspector sequences combinators io.backend ;
8 TUPLE: png surface width height cairo-t array ;
9 TUPLE: png-gadget png ;
11 ERROR: cairo-error string ;
13 : check-zero ( n -- n )
15 "PNG dimension is 0" cairo-error
18 : cairo-png-error ( n -- )
20 { CAIRO_STATUS_NO_MEMORY [ "Cairo: no memory" cairo-error ] }
21 { CAIRO_STATUS_FILE_NOT_FOUND [ "Cairo: file not found" cairo-error ] }
22 { CAIRO_STATUS_READ_ERROR [ "Cairo: read error" cairo-error ] }
26 : <png> ( path -- png )
28 cairo_image_surface_create_from_png
29 dup cairo_surface_status cairo-png-error
30 dup [ cairo_image_surface_get_width check-zero ]
31 [ cairo_image_surface_get_height check-zero ] [ ] tri
32 cairo-surface>array png boa ;
34 : write-png ( png path -- )
36 cairo_surface_write_to_png
37 zero? [ "write png failed" throw ] unless ;
39 : <png-gadget> ( path -- gadget )
40 png-gadget construct-gadget swap
43 M: png-gadget pref-dim* ( gadget -- )
45 [ width>> ] [ height>> ] bi 2array ;
47 M: png-gadget draw-gadget* ( gadget -- )
53 [ height>> GL_RGBA GL_UNSIGNED_BYTE ]
54 ! [ height>> GL_BGRA GL_UNSIGNED_BYTE ]
59 M: png-gadget graft* ( gadget -- )
62 M: png-gadget ungraft* ( gadget -- )
63 png>> surface>> cairo_destroy ;
65 ! "resource:misc/icons/Factor_1x16.png" USE: cairo.png <png-gadget> gadget.