Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(763)

Unified Diff: sky/engine/platform/fonts/harfbuzz/FontHarfBuzz.cpp

Issue 859203002: Merge Blink code to cache SkTextBlob (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: hashmap Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/engine/platform/fonts/GlyphBufferTest.cpp ('k') | sky/engine/platform/fonts/harfbuzz/HarfBuzzShaper.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/engine/platform/fonts/harfbuzz/FontHarfBuzz.cpp
diff --git a/sky/engine/platform/fonts/harfbuzz/FontHarfBuzz.cpp b/sky/engine/platform/fonts/harfbuzz/FontHarfBuzz.cpp
index 998b38b0289eef42aa52bd5c58f7848114cf7a52..af34cba9124f84bf4f5ae863d4bb2dd2ee222946 100644
--- a/sky/engine/platform/fonts/harfbuzz/FontHarfBuzz.cpp
+++ b/sky/engine/platform/fonts/harfbuzz/FontHarfBuzz.cpp
@@ -31,7 +31,7 @@
#include "sky/engine/config.h"
#include "sky/engine/platform/fonts/Font.h"
-#include "sky/engine/platform/NotImplemented.h"
+#include "gen/sky/platform/RuntimeEnabledFeatures.h"
#include "sky/engine/platform/fonts/FontPlatformFeatures.h"
#include "sky/engine/platform/fonts/GlyphBuffer.h"
#include "sky/engine/platform/fonts/SimpleFontData.h"
@@ -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,13 +167,13 @@ 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);
@@ -188,11 +188,14 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
// here.
SkAutoSTMalloc<32, SkPoint> storage(numGlyphs);
SkPoint* pos = storage.get();
- const FloatSize* adv = glyphBuffer.advances(from);
+ const FloatSize* offsets = glyphBuffer.offsets(from);
+ const float* advances = glyphBuffer.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);
@@ -201,69 +204,24 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
void Font::drawTextBlob(GraphicsContext* gc, const SkTextBlob* blob, const SkPoint& origin) const
{
+ ASSERT(RuntimeEnabledFeatures::textBlobEnabled());
+
// FIXME: It would be good to move this to Font.cpp, if we're sure that none
// of the things in FontMac's setupPaint need to apply here.
// See also paintGlyphs.
TextDrawingModeFlags textMode = gc->textDrawingMode();
- if (textMode & TextModeFill) {
- SkPaint paint = gc->fillPaint();
- gc->adjustTextRenderMode(&paint);
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
- gc->drawTextBlob(blob, origin, paint);
- }
+ if (textMode & TextModeFill)
+ gc->drawTextBlob(blob, origin, gc->fillPaint());
if ((textMode & TextModeStroke) && gc->hasStroke()) {
SkPaint paint = gc->strokePaint();
- gc->adjustTextRenderMode(&paint);
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
if (textMode & TextModeFill)
paint.setLooper(0);
gc->drawTextBlob(blob, origin, paint);
}
}
-void Font::drawComplexText(GraphicsContext* gc, const TextRunPaintInfo& runInfo, const FloatPoint& point) const
-{
- if (!runInfo.run.length())
- return;
-
- TextDrawingModeFlags textMode = gc->textDrawingMode();
- bool fill = textMode & TextModeFill;
- bool stroke = (textMode & TextModeStroke) && gc->hasStroke();
-
- if (!fill && !stroke)
- return;
-
- GlyphBuffer glyphBuffer;
- HarfBuzzShaper shaper(this, runInfo.run);
- shaper.setDrawRange(runInfo.from, runInfo.to);
- if (!shaper.shape(&glyphBuffer) || glyphBuffer.isEmpty())
- return;
- FloatPoint adjustedPoint = shaper.adjustStartPoint(point);
- drawGlyphBuffer(gc, runInfo, glyphBuffer, adjustedPoint);
-}
-
-void Font::drawEmphasisMarksForComplexText(GraphicsContext* context, const TextRunPaintInfo& runInfo, const AtomicString& mark, const FloatPoint& point) const
-{
- GlyphBuffer glyphBuffer;
-
- float initialAdvance = getGlyphsAndAdvancesForComplexText(runInfo, glyphBuffer, ForTextEmphasis);
-
- if (glyphBuffer.isEmpty())
- return;
-
- drawEmphasisMarks(context, runInfo, glyphBuffer, mark, FloatPoint(point.x() + initialAdvance, point.y()));
-}
-
-float Font::getGlyphsAndAdvancesForComplexText(const TextRunPaintInfo& runInfo, GlyphBuffer& glyphBuffer, ForTextEmphasisOrNot forTextEmphasis) const
-{
- HarfBuzzShaper shaper(this, runInfo.run, HarfBuzzShaper::ForTextEmphasis);
- shaper.setDrawRange(runInfo.from, runInfo.to);
- shaper.shape(&glyphBuffer);
- return 0;
-}
-
float Font::floatWidthForComplexText(const TextRun& run, HashSet<const SimpleFontData*>* fallbackFonts, IntRectExtent* glyphBounds) const
{
HarfBuzzShaper shaper(this, run, HarfBuzzShaper::NotForTextEmphasis, fallbackFonts);
@@ -299,27 +257,23 @@ FloatRect Font::selectionRectForComplexText(const TextRun& run,
return shaper.selectionRect(point, height, from, to);
}
-PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, float initialAdvance, const FloatRect& bounds) const
-{
- // FIXME: Except for setupPaint, this is not specific to FontHarfBuzz.
- // FIXME: Also implement the more general full-positioning path.
- ASSERT(!glyphBuffer.hasVerticalAdvances());
-
- SkTextBlobBuilder builder;
- SkScalar x = SkFloatToScalar(initialAdvance);
- SkRect skBounds = bounds;
+namespace {
+template <bool hasOffsets>
+bool buildTextBlobInternal(const GlyphBuffer& glyphBuffer, SkScalar initialAdvance, SkTextBlobBuilder& builder)
+{
+ SkScalar x = initialAdvance;
unsigned i = 0;
while (i < glyphBuffer.size()) {
const SimpleFontData* fontData = glyphBuffer.fontDataAt(i);
// FIXME: Handle vertical text.
if (fontData->platformData().orientation() == Vertical)
- return nullptr;
+ return false;
// FIXME: Handle SVG fonts.
if (fontData->isSVGFont())
- return nullptr;
+ return false;
// FIXME: FontPlatformData makes some decisions on the device scale
// factor, which is found via the GraphicsContext. This should be fixed
@@ -333,19 +287,43 @@ PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, float initia
i++;
unsigned count = i - start;
- const SkTextBlobBuilder::RunBuffer& buffer = builder.allocRunPosH(paint, count, 0, &skBounds);
+ const SkTextBlobBuilder::RunBuffer& buffer = hasOffsets ?
+ builder.allocRunPos(paint, count) :
+ builder.allocRunPosH(paint, count, 0);
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);
+ const FloatSize* offsets = glyphBuffer.offsets(start);
for (unsigned j = 0; j < count; j++) {
- buffer.pos[j] = x;
- x += SkFloatToScalar(advances[j].width());
+ if (hasOffsets) {
+ const FloatSize& offset = offsets[j];
+ buffer.pos[2 * j] = x + offset.width();
+ buffer.pos[2 * j + 1] = offset.height();
+ } else {
+ buffer.pos[j] = x;
+ }
+ x += SkFloatToScalar(advances[j]);
}
}
+ return true;
+}
+
+} // namespace
+
+PassTextBlobPtr Font::buildTextBlob(const GlyphBuffer& glyphBuffer, float initialAdvance, const FloatRect& bounds) const
+{
+ ASSERT(RuntimeEnabledFeatures::textBlobEnabled());
- return adoptRef(builder.build());
+ SkTextBlobBuilder builder;
+ SkScalar advance = SkFloatToScalar(initialAdvance);
+
+ bool success = glyphBuffer.hasOffsets() ?
+ buildTextBlobInternal<true>(glyphBuffer, advance, builder) :
+ buildTextBlobInternal<false>(glyphBuffer, advance, builder);
+ return success ? adoptRef(builder.build()) : nullptr;
}
+
} // namespace blink
« no previous file with comments | « sky/engine/platform/fonts/GlyphBufferTest.cpp ('k') | sky/engine/platform/fonts/harfbuzz/HarfBuzzShaper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698