Hi, 

I'm having some difficulty with breaking lines with kerning on. Let me explain.

My current implementation of breaking lines simply shapes the whole paragraph 
with HarfBuzz, then finds line-break opportunities, and then jams as many 
segments into a line as possible.

shapes = hb_shape(text)
foreach segment in find_line_breaks(shapes)
    if line.width + segment.x_advance > text.width
        start_a_new_line()
    line.add(segment)

But I see a problem with glyphs kerned with spaces at the end of a line (sorry 
if I'm stating the obvious here, or if I'm completely mistaking something).

Consider the following:

Input text is "MM 1T MM 2T"
Width of each glyph, including space is 1000 units
Kerning between "T" and "space" is -50 units
Text width is 4990 units

If I layout the text without kerning, the lines will look like this:

"MM " -- width: 2000 (+1000 for the space)
"1T " -- width: 2000 (+1000 for the space)
"MM " -- width: 2000 (+1000 for the space)
"2T"  -- width: 2000

However, if I enable kerning, because of the kerning at the end of the first 
line between "T" and "space", it would look like this (with my naive algorithm 
at least):

"MM 1T " -- width 4950 (+1000 for the space)
"MM "    -- width 2000 (+1000 for the space)
"2T"     -- width 2000

Now this is surely not good, having two pieces of identical text laid out in 
different ways. So my idea is that before deciding if a piece of text fits, I 
should get it shaped without kerning at the end as well.

shapes = hb_shape(text)
foreach segment in find_line_breaks(shapes)
    if line.width + segment.x_advance > text.width
        start_a_new_line()
    else
segment_without-kerning = hb_shape_without_kerning_at_the_end(segment)
        if line.width + segment_without_kerning.x_advance > text.width
            start_a_new_line()
    line.add(segment)



This could work, but I would basically have to shape the whole text twice. That 
doesn't sound right. Or does it?

Another issue is, say, there is a context-sensitive substitution that applies 
only if there is a space before "1". When I shape the whole text, the lookup 
will trigger for the "1" in "1T", because it has a space before. But when I 
re-shape only "1T" at the end of the line, the lookup won't be applied.

I feel like I'm on the wrong track here. Am I missing something obvious?

-- 
Thanks,
Lorant

_______________________________________________
HarfBuzz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to