1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: assocs accessors alien core-graphics.types core-text
4 core-text.fonts kernel hashtables namespaces sequences
5 ui.gadgets.worlds ui.text ui.text.private opengl opengl.gl destructors
6 combinators core-foundation core-foundation.strings memoize math
7 math.vectors init colors ;
10 SINGLETON: core-text-renderer
12 M: core-text-renderer string-dim
13 [ " " string-dim { 0 1 } v* ] [ swap cached-line dim>> ] if-empty ;
15 TUPLE: rendered-line line texture display-list age disposed ;
17 : make-line-display-list ( line texture -- dlist )
21 GL_TEXTURE_COORD_ARRAY [
23 GL_TEXTURE_2D swap glBindTexture
24 init-texture rect-texture-coords
25 dim>> fill-rect-vertices (gl-fill-rect)
26 GL_TEXTURE_2D 0 glBindTexture
27 ] do-enabled-client-state
32 : make-core-graphics-texture ( dim bitmap -- texture )
33 GL_BGRA_EXT GL_UNSIGNED_INT_8_8_8_8_REV make-texture ;
35 : <rendered-line> ( line -- texture )
36 #! Note: we only ref-line if make-texture and make-line-display-list
39 dup [ dim>> ] [ bitmap>> ] bi make-core-graphics-texture
40 2dup make-line-display-list
41 0 f \ rendered-line boa
44 M: rendered-line dispose*
46 [ texture>> delete-texture ]
47 [ display-list>> delete-dlist ] tri ;
49 : rendered-line ( string font -- rendered-line )
51 [ cached-line <rendered-line> ] 2cache 0 >>age ;
53 : age-rendered-lines ( world -- )
54 [ [ age ] age-assoc ] change-fonts drop ;
56 M: core-text-renderer finish-text-rendering
57 age-rendered-lines age-lines ;
59 M: core-text-renderer draw-string ( font string loc -- )
62 display-list>> glCallList
65 M: core-text-renderer x>offset ( x font string -- n )
67 swap cached-line line>>
68 swap 0 <CGPoint> CTLineGetStringIndexForPosition
71 M: core-text-renderer offset>x ( n font string -- x )
72 swap cached-line line>> swap f
73 CTLineGetOffsetForStringIndex ;
75 M: core-text-renderer free-fonts ( fonts -- )
78 core-text-renderer font-renderer set-global