]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/text/text.factor
ebf4b9cce0b9ed8b8ba4d524b7ab6373ec9778ee
[factor.git] / basis / ui / text / text.factor
1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel arrays sequences math math.order opengl opengl.gl
4 strings fonts colors accessors namespaces ui.gadgets.worlds ;
5 IN: ui.text
6
7 <PRIVATE
8
9 SYMBOL: font-renderer
10
11 HOOK: init-text-rendering font-renderer ( world -- )
12
13 : world-text-handle ( world -- handle )
14     dup text-handle>> [ dup init-text-rendering ] unless
15     text-handle>> ;
16
17 HOOK: flush-layout-cache font-renderer ( -- )
18
19 [ flush-layout-cache ] flush-layout-cache-hook set-global
20
21 HOOK: string-dim font-renderer ( font string -- dim )
22
23 HOOK: string-width font-renderer ( font string -- w )
24
25 HOOK: string-height font-renderer ( font string -- h )
26
27 M: object string-dim [ string-width ] [ string-height ] 2bi 2array ;
28
29 M: object string-width string-dim first ;
30
31 M: object string-height string-dim second ;
32
33 HOOK: draw-string font-renderer ( font string -- )
34
35 HOOK: free-fonts font-renderer ( world -- )
36
37 : combine-text-dim ( dim1 dim2 -- dim3 )
38     [ [ first ] bi@ max ]
39     [ [ second ] bi@ + ]
40     2bi 2array ;
41
42 PRIVATE>
43
44 HOOK: x>offset font-renderer ( x font string -- n )
45
46 HOOK: offset>x font-renderer ( n font string -- x )
47
48 GENERIC: text-dim ( font text -- dim )
49
50 M: string text-dim string-dim ;
51
52 M: array text-dim
53     [ { 0 0 } ] 2dip [ string-dim combine-text-dim ] with each ;
54
55 : text-width ( font text -- w ) text-dim first ;
56
57 : text-height ( font text -- h ) text-dim second ;
58
59 HOOK: font-metrics font-renderer ( font -- metrics )
60
61 HOOK: line-metrics font-renderer ( font string -- metrics )
62
63 GENERIC: draw-text ( font text -- )
64
65 M: string draw-text draw-string ;
66
67 M: selection draw-text draw-string ;
68
69 M: array draw-text
70     GL_MODELVIEW [
71         [
72             [ draw-string ]
73             [ [ 0.0 ] 2dip string-height 0.0 glTranslated ] 2bi
74         ] with each
75     ] do-matrix ;
76
77 USING: vocabs.loader namespaces system combinators ;
78
79 "ui-backend" get [
80     {
81         { [ os macosx? ] [ "core-text" ] }
82         { [ os windows? ] [ "pango" ] }
83         { [ os unix? ] [ "pango" ] }
84     } cond
85 ] unless* "ui.text." prepend require