]> gitweb.factorcode.org Git - factor.git/commitdiff
core-text: lazy text render (inspired by klazuka).
authorJohn Benediktsson <mrjbq7@gmail.com>
Sat, 27 Aug 2011 05:21:47 +0000 (22:21 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Sun, 28 Aug 2011 00:33:21 +0000 (17:33 -0700)
basis/core-text/core-text.factor
basis/ui/text/core-text/core-text.factor

index 014956aba26c616f76bc859c4bbbc6fd7f926425..d409bd9b0f89221cf75c358f91c975271220a92b 100644 (file)
@@ -47,7 +47,10 @@ ERROR: not-a-string object ;
         CTLineCreateWithAttributedString
     ] with-destructors ;
 
-TUPLE: line < disposable line metrics image loc dim ;
+TUPLE: line < disposable line metrics image loc dim render-info ;
+
+TUPLE: render-info font string loc dim ;
+C: <render-info> render-info
 
 : typographic-bounds ( line -- width ascent descent leading )
     { CGFloat CGFloat CGFloat }
@@ -126,22 +129,34 @@ TUPLE: line < disposable line metrics image loc dim ;
 
         line >>line
 
-        metrics >>metrics
+        font string loc dim <render-info> >>render-info
 
-        dim [
-            {
-                [ font dim fill-background ]
-                [ loc dim line string fill-selection-background ]
-                [ loc set-text-position ]
-                [ [ line ] dip CTLineDraw ]
-            } cleave
-        ] make-bitmap-image >>image
+        metrics >>metrics
 
         metrics loc dim line-loc >>loc
 
         metrics metrics>dim >>dim
     ] with-destructors ;
 
+:: render ( line -- line image )
+    line line>> :> ctline
+    line render-info>> string>> :> string
+    line render-info>> font>> :> font
+    line render-info>> loc>> :> loc
+    line render-info>> dim>> :> dim
+
+    line dim [
+        {
+            [ font dim fill-background ]
+            [ loc dim ctline string fill-selection-background ]
+            [ loc set-text-position ]
+            [ [ ctline ] dip CTLineDraw ]
+        } cleave
+    ] make-bitmap-image ;
+
+: line>image ( line -- image )
+    dup image>> [ render >>image ] unless image>> ;
+
 M: line dispose* line>> CFRelease ;
 
 SYMBOL: cached-lines
index db8e43cde585bccb2948780b28e2eeedce7813fc..e864c828e8634a6a4a5162c3bfbfc6cb2e690434 100644 (file)
@@ -18,7 +18,7 @@ M: core-text-renderer flush-layout-cache
     cached-lines get purge-cache ;
 
 M: core-text-renderer string>image ( font string -- image loc )
-    cached-line [ image>> ] [ loc>> ] bi ;
+    cached-line [ line>image ] [ loc>> ] bi ;
 
 M: core-text-renderer x>offset ( x font string -- n )
     [ 2drop 0 ] [
@@ -38,4 +38,4 @@ M: core-text-renderer line-metrics ( font string -- metrics )
     [ cached-line metrics>> ]
     if-empty ;
 
-core-text-renderer font-renderer set-global
\ No newline at end of file
+core-text-renderer font-renderer set-global