]> gitweb.factorcode.org Git - factor.git/blob - basis/pango/layouts/layouts.factor
First attempt at ui.text.pango
[factor.git] / basis / pango / layouts / layouts.factor
1 ! Copyright (C) 2008 Matthew Willis.
2 ! Copyright (C) 2009 Slava Pestov.
3 ! See http://factorcode.org/license.txt for BSD license.
4 USING: arrays sequences alien alien.c-types alien.destructors
5 alien.syntax math math.vectors destructors combinators colors fonts
6 accessors assocs namespaces kernel pango pango.fonts pango.cairo cairo
7 cairo.ffi glib unicode.data locals images cache init ;
8 IN: pango.layouts
9
10 LIBRARY: pango
11
12 FUNCTION: PangoLayout*
13 pango_layout_new ( PangoContext* context ) ;
14
15 FUNCTION: void
16 pango_layout_set_text ( PangoLayout* layout, char* text, int length ) ;
17
18 FUNCTION: char*
19 pango_layout_get_text ( PangoLayout* layout ) ;
20
21 FUNCTION: void
22 pango_layout_get_size ( PangoLayout* layout, int* width, int* height ) ;
23
24 FUNCTION: void
25 pango_layout_set_font_description ( PangoLayout* layout, PangoFontDescription* desc ) ;
26
27 FUNCTION: PangoFontDescription*
28 pango_layout_get_font_description ( PangoLayout* layout ) ;
29
30 FUNCTION: void
31 pango_layout_get_pixel_size ( PangoLayout* layout, int* width, int* height ) ;
32
33 FUNCTION: int
34 pango_layout_get_baseline ( PangoLayout* layout ) ;
35
36 FUNCTION: void
37 pango_layout_get_pixel_extents ( PangoLayout* layout, PangoRectangle* ink_rect, PangoRectangle* logical_rect ) ;
38
39 FUNCTION: PangoLayoutLine*
40 pango_layout_get_line_readonly ( PangoLayout* layout, int line ) ;
41                                                          
42 FUNCTION: void
43 pango_layout_line_index_to_x ( PangoLayoutLine* line, int index_, gboolean trailing, int* x_pos ) ;
44
45 FUNCTION: gboolean
46 pango_layout_line_x_to_index ( PangoLayoutLine* line, int x_pos, int* index_, int* trailing ) ;
47
48 FUNCTION: PangoLayoutIter*
49 pango_layout_get_iter ( PangoLayout* layout ) ;
50
51 FUNCTION: int
52 pango_layout_iter_get_baseline ( PangoLayoutIter* iter ) ;
53
54 FUNCTION: void
55 pango_layout_iter_free ( PangoLayoutIter* iter ) ;
56
57 DESTRUCTOR: pango_layout_iter_free
58
59 : layout-dim ( layout -- dim )
60     0 <int> 0 <int> [ pango_layout_get_pixel_size ] 2keep
61     [ *int ] bi@ 2array ;
62
63 : layout-extents ( layout -- ink-rect logical-rect )
64     "PangoRectangle" <c-object>
65     "PangoRectangle" <c-object>
66     [ pango_layout_get_pixel_extents ] 2keep
67     [ PangoRectangle>rect ] bi@ ;
68
69 : layout-baseline ( layout -- baseline )
70     pango_layout_get_iter &pango_layout_iter_free
71     pango_layout_iter_get_baseline
72     PANGO_SCALE /f ;
73
74 : set-layout-font ( str layout -- )
75     swap pango_layout_set_font_description ;
76
77 : set-layout-text ( str layout -- )
78     #! Replace nulls with something else since Pango uses null-terminated
79     #! strings
80     swap { { 0 CHAR: zero-width-no-break-space } } substitute
81     -1 pango_layout_set_text ;
82
83 : <PangoLayout> ( text font -- layout )
84     dummy-cairo pango_cairo_create_layout |g_object_unref
85     [ set-layout-font ] keep
86     [ set-layout-text ] keep ;
87
88 : set-foreground ( cr font -- )
89     foreground>> set-source-color ;
90
91 : fill-background ( cr font dim -- )
92     [ background>> set-source-color ]
93     [ [ 0 0 ] dip first2 cairo_rectangle ] bi-curry*
94     [ cairo_fill ]
95     tri ;
96
97 :: fill-selection-background ( cr loc dim layout string -- )
98     ;
99
100 : set-text-position ( cr loc -- )
101     first2 cairo_move_to ;
102
103 : layout-metrics ( dim baseline -- metrics )
104     metrics new
105         swap >>ascent
106         swap first2 [ >>width ] [ >>height ] bi*
107         dup [ height>> ] [ ascent>> ] bi - >>descent ;
108
109 TUPLE: layout font layout metrics image loc dim disposed ;
110
111 :: <layout> ( font string -- line )
112     [
113         ! TODO: metrics and loc
114         [let* | open-font [ font cache-font-description ]
115                 layout [ string open-font <PangoLayout> ]
116                 logical-rect [ layout layout-extents ] ink-rect [ ]
117                 baseline [ layout layout-baseline ]
118                 logical-loc [ logical-rect loc>> ]
119                 logical-dim [ logical-rect dim>> ]
120                 ink-loc [ ink-rect loc>> ]
121                 ink-dim [ ink-rect dim>> ]
122                 metrics [ logical-dim baseline layout-metrics ] |
123             open-font layout metrics
124             ink-dim [
125                 {
126                     [ layout pango_cairo_update_layout ]
127                     [ font ink-dim fill-background ]
128                     [ font set-foreground ]
129                     [ ink-loc ink-dim layout string fill-selection-background ]
130                     [ logical-loc ink-loc v- set-text-position ]
131                     [ layout pango_cairo_show_layout ]
132                 } cleave
133             ] make-bitmap-image
134             logical-loc ink-loc v-
135             logical-dim
136         ]
137         f layout boa
138     ] with-destructors ;
139
140 M: layout dispose* layout>> g_object_unref ;
141
142 SYMBOL: cached-layouts
143
144 : cached-layout ( font string -- layout )
145     cached-layouts get [ <layout> ] 2cache ;
146
147 : cached-line ( font string -- line )
148     cached-layout layout>> 0 pango_layout_get_line_readonly ;
149
150 [ <cache-assoc> cached-layouts set-global ] "pango.layouts" add-init-hook