Skip to content

Commit

Permalink
ui.gadgets.paragraphs: cache the wrapped paragraph for performance.
Browse files Browse the repository at this point in the history
  • Loading branch information
mrjbq7 committed Sep 17, 2012
1 parent 5371a8d commit 300ee84
Showing 1 changed file with 11 additions and 13 deletions.
24 changes: 11 additions & 13 deletions basis/ui/gadgets/paragraphs/paragraphs.factor
Expand Up @@ -18,7 +18,7 @@ M: word-break-gadget draw-gadget* drop ;
INSTANCE: word-break-gadget word-break

! A gadget that arranges its children in a word-wrap style.
TUPLE: paragraph < gadget margin ;
TUPLE: paragraph < gadget margin wrapped ;

: <paragraph> ( margin -- gadget )
paragraph new
Expand All @@ -30,15 +30,19 @@ TUPLE: paragraph < gadget margin ;
: gadget>word ( gadget -- word )
[ ] [ pref-dim first ] [ word-break? ] tri <word> ;

TUPLE: line words height ;
TUPLE: line words height baseline ;

: <line> ( words -- line )
dup [ key>> ] map dup pref-dims measure-height line boa ;
dup [ key>> ] map dup pref-dims
[ measure-height ] [ measure-metrics drop ] 2bi line boa ;

: wrap-paragraph ( paragraph -- wrapped-paragraph )
[ children>> [ gadget>word ] map ] [ margin>> ] bi
dup wrap-words [ <line> ] map ;

M: paragraph children<<
[ call-next-method ] [ [ wrap-paragraph ] keep wrapped<< ] bi ;

: line-width ( wrapped-line -- n )
[ break?>> ] trim-tail-slice [ width>> ] map-sum ;

Expand All @@ -49,7 +53,7 @@ TUPLE: line words height ;
[ height>> ] map-sum ;

M: paragraph pref-dim*
wrap-paragraph [ max-line-width ] [ sum-line-heights ] bi 2array ;
wrapped>> [ max-line-width ] [ sum-line-heights ] bi 2array ;

: line-y-coordinates ( wrapped-paragraph -- ys )
0 [ height>> + ] accumulate nip ;
Expand All @@ -69,17 +73,11 @@ M: paragraph pref-dim*
] dip '[ _ + layout-word ] 3each ;

M: paragraph layout*
wrap-paragraph dup line-y-coordinates
[ layout-line ] 2each ;
wrapped>> dup line-y-coordinates [ layout-line ] 2each ;

M: paragraph baseline
wrap-paragraph [ f ] [
first words>>
[ key>> ] map
dup [ pref-dim ] map
measure-metrics drop
] if-empty ;
wrapped>> [ f ] [ first baseline>> ] if-empty ;

M: paragraph cap-height pack-cap-height ;

PRIVATE>

0 comments on commit 300ee84

Please sign in to comment.