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