]> gitweb.factorcode.org Git - factor.git/blob - unmaintained/cairo-demo/cairo-demo.factor
Various load-everything fixes
[factor.git] / unmaintained / cairo-demo / cairo-demo.factor
1 ! Cairo "Hello World" demo
2 !  Copyright (c) 2007 Sampo Vuori
3 !    License: http://factorcode.org/license.txt
4 !
5 ! This example is an adaptation of the following cairo sample code:
6 !  http://cairographics.org/samples/text/
7
8
9 USING: cairo.ffi math math.constants byte-arrays kernel ui
10 ui.render combinators ui.gadgets opengl.gl accessors
11 namespaces opengl ;
12
13 IN: cairo-demo
14
15 : make-image-array ( -- array )
16     384 256 4 * * <byte-array> ;
17
18 : convert-array-to-surface ( array -- cairo_surface_t )
19     CAIRO_FORMAT_ARGB32 384 256 over 4 *
20     cairo_image_surface_create_for_data ;
21
22 TUPLE: cairo-demo-gadget < gadget image-array cairo-t ;
23
24 M: cairo-demo-gadget draw-gadget* ( gadget -- )
25     origin get [
26         0 0 glRasterPos2i
27         1.0 -1.0 glPixelZoom
28         [ 384 256 GL_RGBA GL_UNSIGNED_BYTE ] dip
29         image-array>> glDrawPixels
30     ] with-translation ;
31
32 : create-surface ( gadget -- cairo_surface_t )
33     make-image-array [ swap (>>image-array) ] keep
34     convert-array-to-surface ;
35
36 : init-cairo ( gadget -- cairo_t )
37     create-surface cairo_create ;
38
39 M: cairo-demo-gadget pref-dim* drop { 384 256 } ;
40
41 ERROR: no-cairo-t ;
42
43 <PRIVATE
44
45 : draw-hello-world ( gadget -- )
46     cairo-t>> [ no-cairo-t ] unless*
47     {
48         [
49             "Sans" CAIRO_FONT_SLANT_NORMAL CAIRO_FONT_WEIGHT_BOLD
50             cairo_select_font_face
51         ]
52         [ 90.0 cairo_set_font_size ]
53         [ 10.0 135.0 cairo_move_to ]
54         [ "Hello" cairo_show_text ]
55         [ 70.0 165.0 cairo_move_to ]
56         [ "World" cairo_text_path ]
57         [ 0.5 0.5 1 cairo_set_source_rgb ]
58         [ cairo_fill_preserve ]
59         [ 0 0 0 cairo_set_source_rgb ]
60         [ 2.56 cairo_set_line_width ]
61         [ cairo_stroke ]
62         [ 1 0.2 0.2 0.6 cairo_set_source_rgba ]
63         [ 10.0 135.0 5.12 0 pi 2 * cairo_arc ]
64         [ cairo_close_path ]
65         [ 70.0 165.0 5.12 0 pi 2 * cairo_arc ]
66         [ cairo_fill ]
67     } cleave ;
68
69 PRIVATE>
70
71 M: cairo-demo-gadget graft* ( gadget -- )
72     dup dup init-cairo swap (>>cairo-t) draw-hello-world ;
73
74 M: cairo-demo-gadget ungraft* ( gadget -- )
75     cairo-t>> cairo_destroy ;
76
77 : <cairo-demo-gadget> ( -- gadget )
78     cairo-demo-gadget new-gadget ;
79
80 : run ( -- )
81     [
82         <cairo-demo-gadget> "Hello World from Factor!" open-window
83     ] with-ui ;
84
85 MAIN: run