<div>
                    Hi,
                </div><div><br></div><div>I'm having some difficulty with breaking lines with kerning on. Let me explain.</div><div><br></div><div>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.</div><div><br></div><div><font face="Courier New">shapes = hb_shape(text)</font></div><div><font face="Courier New">foreach segment in </font><span style="font-family: 'Courier New'; ">find_line_breaks(shapes)</span></div><div><font face="Courier New">    if line.width + segment.x_advance > text.width</font></div><div><font face="Courier New">        start_a_new_line()</font></div><div><font face="Courier New">    line.add(segment)</font></div><div><br></div><div>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).</div><div><br></div><div>Consider the following:</div><div><br></div><div><font face="Courier New">Input text is "MM 1T MM 2T"</font></div><div><font face="Courier New">Width of each glyph, including space is 1000 units</font></div><div><font face="Courier New">Kerning between "T" and "space" is -50 units</font></div><div><font face="Courier New">Text width is 4990 units</font></div><div><br></div><div>If I layout the text without kerning, the lines will look like this:</div><div><br></div><div><font face="Courier New">"MM " -- width: 2000 (+1000 for the space)</font></div><div><font face="Courier New">"1T " -- width: 2000 (+1000 for the space)</font></div><div><font face="Courier New">"MM " -- width: 2000 (+1000 for the space)</font></div><div><font face="Courier New">"2T"  -- width: 2000</font></div><div><br></div><div>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):</div><div><br></div><div><font face="Courier New">"MM 1T " -- width 4950 (+1000 for the space)</font></div><div><font face="Courier New">"MM "    -- width 2000 (+1000 for the space)</font></div><div><font face="Courier New">"2T"     -- width 2000</font></div><div><br></div><div>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.</div><div><br></div><div><div><font face="Courier New">shapes = hb_shape(text)</font></div><div><font face="Courier New">foreach segment in </font><span style="font-family: 'Courier New'; ">find_line_breaks</span><span style="font-family: 'Courier New'; ">(shapes)</span></div><div><span style="font-family: 'Courier New'; ">    if line.width + segment.x_advance > text.width</span></div><div><font face="Courier New">        start_a_new_line()</font></div><div><font face="Courier New">    else</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">     </span>segment_without-kerning = </font><span style="font-family: 'Courier New'; ">hb_shape_without_kerning_at_the_end(segment)</span></div><div><font face="Courier New">        if line.width + segment_without_kerning.x_advance > text.width</font></div><div><font face="Courier New">            start_a_new_line()</font></div><div><div><font face="Courier New">    line.add(segment)</font></div></div></div><div><font face="Courier New"><br></font></div><div>This could work, but I would basically have to shape the whole text twice. That doesn't sound right. Or does it?</div><div><br></div><div>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.</div><div><br></div><div>I feel like I'm on the wrong track here. Am I missing something obvious?</div><div><br></div><div><div>-- </div><div>Thanks,</div><div>Lorant</div><div><br></div></div>