const GlyphInfo& firstGlyph = *( glyphsBuffer + glyphIndex );
Text::FontMetrics fontMetrics;
- metrics->GetFontMetrics( firstGlyph.fontId, fontMetrics );
+ if( 0u != firstGlyph.fontId )
+ {
+ metrics->GetFontMetrics( firstGlyph.fontId, fontMetrics );
+ }
+ else if( 0u != firstGlyph.index )
+ {
+ // It may be an embedded image.
+ fontMetrics.ascender = firstGlyph.height;
+ fontMetrics.descender = 0.f;
+ fontMetrics.height = fontMetrics.ascender;
+ }
+
+ const bool isItalicFont = metrics->HasItalicStyle( firstGlyph.fontId );
glyphMetrics.fontId = firstGlyph.fontId;
glyphMetrics.fontHeight = fontMetrics.height;
glyphMetrics.ascender = fontMetrics.ascender;
glyphMetrics.xBearing = firstGlyph.xBearing;
- for( unsigned int i = 1u; i < numberOfGlyphs; ++i )
+ if( 1u < numberOfGlyphs )
{
- const GlyphInfo& glyphInfo = *( glyphsBuffer + glyphIndex + i );
+ float maxWidthEdge = firstGlyph.xBearing + firstGlyph.width;
+
+ for( unsigned int i = 1u; i < numberOfGlyphs; ++i )
+ {
+ const GlyphInfo& glyphInfo = *( glyphsBuffer + glyphIndex + i );
+
+ // update the initial xBearing if smaller.
+ glyphMetrics.xBearing = std::min( glyphMetrics.xBearing, glyphMetrics.advance + glyphInfo.xBearing );
+
+ // update the max width edge if bigger.
+ const float currentMaxGlyphWidthEdge = glyphMetrics.advance + glyphInfo.xBearing + glyphInfo.width;
+ maxWidthEdge = std::max( maxWidthEdge, currentMaxGlyphWidthEdge );
- glyphMetrics.advance += glyphInfo.advance;
- glyphMetrics.width += glyphInfo.width;
+ glyphMetrics.advance += glyphInfo.advance;
+ }
+
+ glyphMetrics.width = maxWidthEdge - glyphMetrics.xBearing;
}
+
+ glyphMetrics.width += ( firstGlyph.isItalicRequired && !isItalicFont ) ? TextAbstraction::FontClient::DEFAULT_ITALIC_ANGLE * firstGlyph.height : 0.f;
}
} // namespace Text