Index: Source/platform/fonts/harfbuzz/FontHarfBuzz.cpp |
diff --git a/Source/platform/fonts/harfbuzz/FontHarfBuzz.cpp b/Source/platform/fonts/harfbuzz/FontHarfBuzz.cpp |
index 2fd38bf7a7bd3210200522549f47e7364be4ac10..c776c1f033d3bdb4a56213c842bcca9997c3b10d 100644 |
--- a/Source/platform/fonts/harfbuzz/FontHarfBuzz.cpp |
+++ b/Source/platform/fonts/harfbuzz/FontHarfBuzz.cpp |
@@ -157,7 +157,7 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font, |
pos[i].set( |
x + SkIntToScalar(lroundf(translations[i].x())), |
y + -SkIntToScalar(-lroundf(currentWidth - translations[i].y()))); |
- currentWidth += glyphBuffer.advanceAt(from + glyphIndex).width(); |
+ currentWidth += glyphBuffer.advanceAt(from + glyphIndex); |
} |
horizontalOffset += currentWidth; |
paintGlyphs(gc, font, glyphs, chunkLength, pos, textRect); |
@@ -167,35 +167,35 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font, |
return; |
} |
- if (!glyphBuffer.hasVerticalAdvances()) { |
+ if (!glyphBuffer.hasOffsets()) { |
SkAutoSTMalloc<64, SkScalar> storage(numGlyphs); |
SkScalar* xpos = storage.get(); |
- const FloatSize* adv = glyphBuffer.advances(from); |
+ const float* adv = glyphBuffer.advances(from); |
for (unsigned i = 0; i < numGlyphs; i++) { |
xpos[i] = x; |
- x += SkFloatToScalar(adv[i].width()); |
+ x += SkFloatToScalar(adv[i]); |
} |
const Glyph* glyphs = glyphBuffer.glyphs(from); |
paintGlyphsHorizontal(gc, font, glyphs, numGlyphs, xpos, SkFloatToScalar(y), textRect); |
return; |
} |
- // FIXME: text rendering speed: |
- // Android has code in their WebCore fork to special case when the |
- // GlyphBuffer has no advances other than the defaults. In that case the |
- // text drawing can proceed faster. However, it's unclear when those |
- // patches may be upstreamed to WebKit so we always use the slower path |
- // here. |
+ ASSERT(glyphBuffer.hasOffsets()); |
+ const GlyphBufferWithOffsets& glyphBufferWithOffsets = |
+ static_cast<const GlyphBufferWithOffsets&>(glyphBuffer); |
SkAutoSTMalloc<32, SkPoint> storage(numGlyphs); |
SkPoint* pos = storage.get(); |
- const FloatSize* adv = glyphBuffer.advances(from); |
+ const FloatSize* offsets = glyphBufferWithOffsets.offsets(from); |
+ const float* advances = glyphBufferWithOffsets.advances(from); |
+ SkScalar advanceSoFar = SkFloatToScalar(0); |
for (unsigned i = 0; i < numGlyphs; i++) { |
- pos[i].set(x, y); |
- x += SkFloatToScalar(adv[i].width()); |
- y += SkFloatToScalar(adv[i].height()); |
+ pos[i].set( |
+ x + SkFloatToScalar(offsets[i].width()) + advanceSoFar, |
+ y + SkFloatToScalar(offsets[i].height())); |
+ advanceSoFar += SkFloatToScalar(advances[i]); |
} |
- const Glyph* glyphs = glyphBuffer.glyphs(from); |
+ const Glyph* glyphs = glyphBufferWithOffsets.glyphs(from); |
paintGlyphs(gc, font, glyphs, numGlyphs, pos, textRect); |
} |
@@ -231,13 +231,12 @@ float Font::drawComplexText(GraphicsContext* gc, const TextRunPaintInfo& runInfo |
if (!fill && !stroke) |
return 0; |
- GlyphBuffer glyphBuffer; |
+ GlyphBufferWithOffsets glyphBuffer; |
HarfBuzzShaper shaper(this, runInfo.run); |
shaper.setDrawRange(runInfo.from, runInfo.to); |
if (!shaper.shape(&glyphBuffer) || glyphBuffer.isEmpty()) |
return 0; |
- FloatPoint adjustedPoint = shaper.adjustStartPoint(point); |
- return drawGlyphBuffer(gc, runInfo, glyphBuffer, adjustedPoint); |
+ return drawGlyphBuffer(gc, runInfo, glyphBuffer, point); |
} |
void Font::drawEmphasisMarksForComplexText(GraphicsContext* context, const TextRunPaintInfo& runInfo, const AtomicString& mark, const FloatPoint& point) const |
@@ -302,7 +301,6 @@ PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, float initia |
// FIXME: Except for setupPaint, this is not specific to FontHarfBuzz. |
// FIXME: Also implement the more general full-positioning path. |
- ASSERT(!glyphBuffer.hasVerticalAdvances()); |
jbroman
2014/09/26 13:02:11
Mind putting the equivalent assertion back here?
|
SkTextBlobBuilder builder; |
SkScalar x = SkFloatToScalar(initialAdvance); |
@@ -340,10 +338,10 @@ PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, float initia |
const uint16_t* glyphs = glyphBuffer.glyphs(start); |
std::copy(glyphs, glyphs + count, buffer.glyphs); |
- const FloatSize* advances = glyphBuffer.advances(start); |
+ const float* advances = glyphBuffer.advances(start); |
for (unsigned j = 0; j < count; j++) { |
buffer.pos[j] = x; |
- x += SkFloatToScalar(advances[j].width()); |
+ x += SkFloatToScalar(advances[j]); |
} |
} |