Contour cache must be sensitive to size.

(While we scale the contours afterwards, font hint
data is size-sensitive so the contours are already
size-specific.)

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18014
This commit is contained in:
Jeff Young 2024-05-15 23:36:30 +01:00
parent f735c9bdc2
commit 98f4e60b90
1 changed files with 4 additions and 2 deletions

View File

@ -259,6 +259,7 @@ VECTOR2I OUTLINE_FONT::getTextAsGlyphs( BOX2I* aBBox, std::vector<std::unique_pt
struct GLYPH_CACHE_KEY { struct GLYPH_CACHE_KEY {
FT_Face face; FT_Face face;
hb_codepoint_t codepoint; hb_codepoint_t codepoint;
double scaler;
bool fakeItalic; bool fakeItalic;
bool fakeBold; bool fakeBold;
bool mirror; bool mirror;
@ -266,7 +267,7 @@ struct GLYPH_CACHE_KEY {
bool operator==(const GLYPH_CACHE_KEY& rhs ) const bool operator==(const GLYPH_CACHE_KEY& rhs ) const
{ {
return face == rhs.face && codepoint == rhs.codepoint return face == rhs.face && codepoint == rhs.codepoint && scaler == rhs.scaler
&& fakeItalic == rhs.fakeItalic && fakeBold == rhs.fakeBold && fakeItalic == rhs.fakeItalic && fakeBold == rhs.fakeBold
&& mirror == rhs.mirror && angle == rhs.angle; && mirror == rhs.mirror && angle == rhs.angle;
} }
@ -280,6 +281,7 @@ namespace std
std::size_t operator()( const GLYPH_CACHE_KEY& k ) const std::size_t operator()( const GLYPH_CACHE_KEY& k ) const
{ {
return hash<const void*>()( k.face ) ^ hash<unsigned>()( k.codepoint ) return hash<const void*>()( k.face ) ^ hash<unsigned>()( k.codepoint )
^ hash<double>()( k.scaler )
^ hash<int>()( k.fakeItalic ) ^ hash<int>()( k.fakeBold ) ^ hash<int>()( k.fakeItalic ) ^ hash<int>()( k.fakeBold )
^ hash<int>()( k.mirror ) ^ hash<int>()( k.angle.AsTenthsOfADegree() ); ^ hash<int>()( k.mirror ) ^ hash<int>()( k.angle.AsTenthsOfADegree() );
} }
@ -339,7 +341,7 @@ VECTOR2I OUTLINE_FONT::getTextAsGlyphsUnlocked( BOX2I* aBBox,
if( aGlyphs ) if( aGlyphs )
{ {
GLYPH_CACHE_KEY key = { face, glyphInfo[i].codepoint, m_fakeItal, m_fakeBold, GLYPH_CACHE_KEY key = { face, glyphInfo[i].codepoint, scaler, m_fakeItal, m_fakeBold,
aMirror, aAngle }; aMirror, aAngle };
GLYPH_DATA& glyphData = s_glyphCache[ key ]; GLYPH_DATA& glyphData = s_glyphCache[ key ];