<div dir="ltr">Hi,<div><br></div><div>I have tracked down the issue, the difference in size come from the kerning being calculated in different font resolutions.</div><div><br></div><div>If we trace the execution: </div><div><br></div><div><div style="font-size:12.8px">  osg::ref_ptr<osgText::Text> text0 = new osgText::Text;</div><div style="font-size:12.8px">  text0->setFont(font_path);</div><div style="font-size:12.8px">  text0->setFontResolution(128, 128);</div><div style="font-size:12.8px">  text0->setText("V");</div><div style="font-size:12.8px">  text0->setText("a");</div></div><div><br></div><div>Here we generate the glyph for char 'V' and 'a' with the resolution (128, 128).</div><div><br></div><div><div style="font-size:12.8px">  osg::ref_ptr<osgText::Text> text1 = new osgText::Text;</div><div style="font-size:12.8px">  text1->setFont(font_path);</div><div style="font-size:12.8px">  text1->setText("p");</div></div><div><br></div><div>We generate a dummy glyph that set FreeType face resolution to (32, 32)</div><div><br></div><div><div style="font-size:12.8px">  text0->setText("Va");</div><div style="font-size:12.8px">  float first_call = text0->getBoundingBox().xMax();</div></div><div><br></div><div>(1) Since the glyph for char 'V' and 'a' are already generated for resolution (128, 128), we use the glyph in the cache (see Font::GetGlyph) *without modifying FreeType face resolution*.</div><div>We also get kerning from FreeType but we *don't* change the face resolution, thus the kerning is calculated in (32, 32) resolution.</div><div><br></div><div><div>  text0->setText("c");</div></div><div><br class="">We generate a dummy glyph (that isn't in the cache) that set FreeType face resolution to (128, 128).<br></div><div><br></div><div><div style="font-size:12.8px">  text0->setText("Va");</div><div style="font-size:12.8px">  float second_call = text0->getBoundingBox().xMax();</div></div><div><br></div><div>Same as (1) but FreeType face resolution is (128, 128) while calculating the kerning.</div><div><br></div><div><br></div><div><br class="">This isn't a big issue, but it breaks our tests depending of the order of execution...<br></div><div><br></div><div>The issue can be resolved if Font::getKerning ask for font resolution, or if we set font resolution at the start of Text::computeGlyphRepresentation (not exposed in Font).</div><div><br></div><div>What do you think ?</div><div><br></div><div>Regards,</div><div>Romain Ouabdelkader.</div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote">2016-01-06 19:16 GMT+01:00 Romain Ouabdelkader <span dir="ltr"><<a href="mailto:romain.ouabdelkader@gmail.com" target="_blank">romain.ouabdelkader@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,<div><br></div><div>I have discovered an issue with osgText: under certain conditions, Text::getBoundingBox() returns different values with the same text, font, font resolution, etc.</div><div><br></div><div>You can reproduce the issue with this example:</div><div><br></div><div><div>int main() {</div><div>  const char *font_path = "museo500.ttf";</div><div><br></div><div>  osg::ref_ptr<osgText::Text> text0 = new osgText::Text;</div><div>  text0->setFont(font_path);</div><div>  text0->setFontResolution(128, 128);</div><div>  text0->setText("V");</div><div>  text0->setText("a");</div><div><br></div><div>  osg::ref_ptr<osgText::Text> text1 = new osgText::Text;</div><div>  text1->setFont(font_path);</div><div>  text1->setText("p");</div><div><br></div><div>  text0->setText("Va");</div><div>  float first_call = text0->getBoundingBox().xMax();</div><div><br></div><div>  text0->setText("c");</div><div><br></div><div>  text0->setText("Va");</div><div>  float second_call = text0->getBoundingBox().xMax();</div><div><br></div><div>  std::cout << first_call << std::endl;</div><div>  std::cout << second_call << std::endl;</div><div>  if (first_call != second_call) {</div><div>    std::cout << "Error!" << std::endl;</div><div>    return 1;</div><div>  }</div><div><br></div><div>  return 0;</div><div>}</div></div><div><br></div><div>Output:</div><div><div>36.4961</div><div>35.9961</div><div>Error!</div></div><div><br></div><div>The issue seems to be very specific, if I remove any of these lines the issue doesn't appear.<br></div><div><br></div><div>I've attached the font <span style="color:rgb(0,0,0);white-space:pre-wrap">if you want to reproduce it</span>.</div><div><br></div><div>Regards,</div><div>Romain Ouabdelkader.</div><div><br></div></div>
</blockquote></div><br></div></div>