Index: Source/platform/fonts/shaping/SimpleShaper.cpp |
diff --git a/Source/platform/fonts/shaping/SimpleShaper.cpp b/Source/platform/fonts/shaping/SimpleShaper.cpp |
index 1aa396453f5d943ec1e5b26d767095c1d448a11f..ec269e37c470c53182b08b82d3cc3aea22430b24 100644 |
--- a/Source/platform/fonts/shaping/SimpleShaper.cpp |
+++ b/Source/platform/fonts/shaping/SimpleShaper.cpp |
@@ -38,15 +38,14 @@ using namespace Unicode; |
namespace blink { |
SimpleShaper::SimpleShaper(const Font* font, const TextRun& run, |
- HashSet<const SimpleFontData*>* fallbackFonts, GlyphBounds* bounds, |
- bool forTextEmphasis) |
+ HashSet<const SimpleFontData*>* fallbackFonts, FloatRect* bounds, bool forTextEmphasis) |
: m_font(font) |
, m_run(run) |
, m_currentCharacter(0) |
, m_runWidthSoFar(0) |
, m_isAfterExpansion(!run.allowsLeadingExpansion()) |
, m_fallbackFonts(fallbackFonts) |
- , m_bounds(bounds) |
+ , m_glyphBoundingBox(bounds) |
, m_forTextEmphasis(forTextEmphasis) |
{ |
// If the padding is non-zero, count the number of spaces in the run |
@@ -139,19 +138,6 @@ float SimpleShaper::adjustSpacing(float width, const CharacterData& charData) |
return width; |
} |
-void SimpleShaper::updateGlyphBounds(const GlyphData& glyphData, float width, bool firstCharacter) |
-{ |
- ASSERT(glyphData.fontData); |
- FloatRect bounds = glyphData.fontData->boundsForGlyph(glyphData.glyph); |
- |
- ASSERT(m_bounds); |
- if (firstCharacter) |
- m_bounds->firstGlyphOverflow = std::max<float>(0, -bounds.x()); |
- m_bounds->lastGlyphOverflow = std::max<float>(0, bounds.maxX() - width); |
- m_bounds->maxGlyphBoundingBoxY = std::max(m_bounds->maxGlyphBoundingBoxY, bounds.maxY()); |
- m_bounds->minGlyphBoundingBoxY = std::min(m_bounds->minGlyphBoundingBoxY, bounds.y()); |
-} |
- |
template <typename TextIterator> |
unsigned SimpleShaper::advanceInternal(TextIterator& textIterator, GlyphBuffer* glyphBuffer) |
{ |
@@ -161,6 +147,8 @@ unsigned SimpleShaper::advanceInternal(TextIterator& textIterator, GlyphBuffer* |
const SimpleFontData* primaryFont = m_font->primaryFont(); |
const SimpleFontData* lastFontData = primaryFont; |
bool normalizeSpace = m_run.normalizeSpace(); |
+ FloatPoint glyphOrigin; |
+ FloatRect glyphBounds; |
CharacterData charData; |
while (textIterator.consume(charData.character, charData.clusterLength)) { |
@@ -193,8 +181,12 @@ unsigned SimpleShaper::advanceInternal(TextIterator& textIterator, GlyphBuffer* |
if (hasExtraSpacing && !spaceUsedAsZeroWidthSpace) |
width = adjustSpacing(width, charData); |
- if (m_bounds) |
- updateGlyphBounds(glyphData, width, !charData.characterOffset); |
+ if (m_glyphBoundingBox) { |
+ ASSERT(glyphData.fontData); |
+ glyphBounds = glyphData.fontData->boundsForGlyph(glyphData.glyph); |
+ glyphBounds.move(glyphOrigin.x(), glyphOrigin.y()); |
+ m_glyphBoundingBox->unite(glyphBounds); |
+ } |
if (m_forTextEmphasis) { |
if (!Character::canReceiveTextEmphasis(charData.character)) |
@@ -211,6 +203,8 @@ unsigned SimpleShaper::advanceInternal(TextIterator& textIterator, GlyphBuffer* |
// Advance past the character we just dealt with. |
textIterator.advance(charData.clusterLength); |
m_runWidthSoFar += width; |
+ // We are handling simple text run here, so Y-Offset will be zero. |
+ glyphOrigin += FloatSize(width, 0); |
} |
unsigned consumedCharacters = textIterator.currentCharacter() - m_currentCharacter; |