     [ f CTLineGetOffsetForStringIndex round ] bi-curry@ bi
     [ drop nip 0 ] [ swap - swap second ] 3bi <CGRect> ;
 
+: CGRect-translate-x ( CGRect x -- CGRect' )
+    [ dup CGRect-x ] dip - over set-CGRect-x ;
+
 :: fill-selection-background ( context loc dim line string -- )
     string selection? [
         context string color>> >rgba-components CGContextSetRGBFillColor
         context dim line string selection-rect
-        dup CGRect-x loc first - over set-CGRect-x
+        loc first CGRect-translate-x
         CGContextFillRect
     ] when ;
 

                ext [ (loc) (dim) [ + ceiling ] 2map ]
                dim [ ext loc [ - >integer ] 2map ]
                metrics [ open-font line compute-line-metrics ] |
            open-font line metrics
            dim [
                {
                    [ font dim fill-background ]

        CTLineCreateWithAttributedString
    ] with-destructors ;

TUPLE: line line metrics image loc dim disposed ;

: typographic-bounds ( line -- width ascent descent leading )
    0 <CGFloat> 0 <CGFloat> 0 <CGFloat>
