Force clients to specify font when requesting strikecache Bug: skia: Change-Id: If56222039239df085d6c40e835060e91fe70940b Reviewed-on: https://skia-review.googlesource.com/c/173166 Reviewed-by: Herb Derby <herb@google.com> Commit-Queue: Mike Reed <reed@google.com>
diff --git a/bench/PathTextBench.cpp b/bench/PathTextBench.cpp index 9bc69e7..565b3ff 100644 --- a/bench/PathTextBench.cpp +++ b/bench/PathTextBench.cpp
@@ -45,8 +45,8 @@ SkIPoint onGetSize() override { return SkIPoint::Make(kScreenWidth, kScreenHeight); } void onDelayedSetup() override { - SkPaint defaultPaint; - auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(defaultPaint); + SkFont defaultFont; + auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(defaultFont); for (int i = 0; i < kNumGlyphs; ++i) { SkPackedGlyphID id(cache->unicharToGlyph(kGlyphs[i])); sk_ignore_unused_variable(cache->getScalerContext()->getPath(id, &fGlyphs[i]));
diff --git a/bench/SkGlyphCacheBench.cpp b/bench/SkGlyphCacheBench.cpp index be99c9c..bb1f493 100644 --- a/bench/SkGlyphCacheBench.cpp +++ b/bench/SkGlyphCacheBench.cpp
@@ -17,11 +17,12 @@ #include "sk_tool_utils.h" -static void do_font_stuff(SkPaint* paint) { +static void do_font_stuff(SkFont* font) { + SkPaint defaultPaint; for (SkScalar i = 8; i < 64; i++) { - paint->setTextSize(i); + font->setSize(i); auto cache = SkStrikeCache::FindOrCreateStrikeExclusive( - *paint, SkSurfaceProps(0, kUnknown_SkPixelGeometry), + *font, defaultPaint, SkSurfaceProps(0, kUnknown_SkPixelGeometry), SkScalerContextFlags::kNone, SkMatrix::I()); uint16_t glyphs['z']; for (int c = ' '; c < 'z'; c++) { @@ -54,13 +55,13 @@ void onDraw(int loops, SkCanvas*) override { size_t oldCacheLimitSize = SkGraphics::GetFontCacheLimit(); SkGraphics::SetFontCacheLimit(fCacheSize); - SkPaint paint; - paint.setAntiAlias(true); - paint.setSubpixelText(true); - paint.setTypeface(sk_tool_utils::create_portable_typeface("serif", SkFontStyle::Italic())); + SkFont font; + font.setEdging(SkFont::Edging::kAntiAlias); + font.setSubpixel(true); + font.setTypeface(sk_tool_utils::create_portable_typeface("serif", SkFontStyle::Italic())); for (int work = 0; work < loops; work++) { - do_font_stuff(&paint); + do_font_stuff(&font); } SkGraphics::SetFontCacheLimit(oldCacheLimitSize); } @@ -94,11 +95,11 @@ for (int work = 0; work < loops; work++) { SkTaskGroup().batch(16, [&](int threadIndex) { - SkPaint paint; - paint.setAntiAlias(true); - paint.setSubpixelText(true); - paint.setTypeface(typefaces[threadIndex % 2]); - do_font_stuff(&paint); + SkFont font; + font.setEdging(SkFont::Edging::kAntiAlias); + font.setSubpixel(true); + font.setTypeface(typefaces[threadIndex % 2]); + do_font_stuff(&font); }); } SkGraphics::SetFontCacheLimit(oldCacheLimitSize);
diff --git a/samplecode/SamplePathText.cpp b/samplecode/SamplePathText.cpp index b56131d..72fa77b 100644 --- a/samplecode/SamplePathText.cpp +++ b/samplecode/SamplePathText.cpp
@@ -32,8 +32,8 @@ } void onOnceBeforeDraw() final { - SkPaint defaultPaint; - auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(defaultPaint); + SkFont defaultFont; + auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(defaultFont); SkPath glyphPaths[52]; for (int i = 0; i < 52; ++i) { // I and l are rects on OS X ...
diff --git a/src/core/SkGlyphRun.cpp b/src/core/SkGlyphRun.cpp index 7043de8d..5415719 100644 --- a/src/core/SkGlyphRun.cpp +++ b/src/core/SkGlyphRun.cpp
@@ -368,7 +368,8 @@ if (!glyphIDs.empty()) { fScratchAdvances.resize(runSize); { - auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(runPaint); + const SkFont font = SkFont::LEGACY_ExtractFromPaint(runPaint); + auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(font, runPaint); cache->getAdvances(glyphIDs, fScratchAdvances.data()); }
diff --git a/src/core/SkGlyphRunPainter.cpp b/src/core/SkGlyphRunPainter.cpp index 60c1c91..19c3c83 100644 --- a/src/core/SkGlyphRunPainter.cpp +++ b/src/core/SkGlyphRunPainter.cpp
@@ -180,7 +180,8 @@ SkScalar textScale = pathPaint.setupForAsPaths(); auto pathCache = SkStrikeCache::FindOrCreateStrikeExclusive( - pathPaint, props, fScalerContextFlags, SkMatrix::I()); + SkFont::LEGACY_ExtractFromPaint(pathPaint), pathPaint, props, + fScalerContextFlags, SkMatrix::I()); SkTDArray<PathAndPos> pathsAndPositions; pathsAndPositions.setReserve(runSize); @@ -204,7 +205,8 @@ paint); } else { auto cache = SkStrikeCache::FindOrCreateStrikeExclusive( - paint, props, fScalerContextFlags, deviceMatrix); + SkFont::LEGACY_ExtractFromPaint(paint), paint, props, + fScalerContextFlags, deviceMatrix); // Add rounding and origin. SkMatrix matrix = deviceMatrix; @@ -740,7 +742,8 @@ SkScalar textScale = pathPaint.setupForAsPaths(); auto pathCache = SkStrikeCache::FindOrCreateStrikeExclusive( - pathPaint, props, scalerContextFlags, SkMatrix::I()); + SkFont::LEGACY_ExtractFromPaint(pathPaint), pathPaint, props, + scalerContextFlags, SkMatrix::I()); // Given a glyph that is not ARGB, draw it. auto perPath = [textScale, run, &pathCache]
diff --git a/src/core/SkOverdrawCanvas.cpp b/src/core/SkOverdrawCanvas.cpp index 29339e2..9c1f38f 100644 --- a/src/core/SkOverdrawCanvas.cpp +++ b/src/core/SkOverdrawCanvas.cpp
@@ -73,7 +73,8 @@ SkSurfaceProps props(0, kUnknown_SkPixelGeometry); this->getProps(&props); auto cache = SkStrikeCache::FindOrCreateStrikeExclusive( - paint, props, SkScalerContextFlags::kNone, this->getTotalMatrix()); + SkFont::LEGACY_ExtractFromPaint(paint), paint, props, + SkScalerContextFlags::kNone, this->getTotalMatrix()); SkFindAndPlaceGlyph::ProcessPosText(paint.getTextEncoding(), (const char*) text, byteLength, SkPoint::Make(0, 0), SkMatrix(), (const SkScalar*) pos, 2, cache.get(), processBounds);
diff --git a/src/core/SkPaint_text.cpp b/src/core/SkPaint_text.cpp index 3a8dd8d..91e92f7 100644 --- a/src/core/SkPaint_text.cpp +++ b/src/core/SkPaint_text.cpp
@@ -85,9 +85,10 @@ SkASSERT(glyphs != nullptr); SkASSERT(textData != nullptr); + SkFont font = SkFont::LEGACY_ExtractFromPaint(*this); SkSurfaceProps props(0, kUnknown_SkPixelGeometry); auto cache = SkStrikeCache::FindOrCreateStrikeExclusive( - *this, props, SkScalerContextFlags::kFakeGammaAndBoostContrast, SkMatrix::I()); + font, *this, props, SkScalerContextFlags::kFakeGammaAndBoostContrast, SkMatrix::I()); for (int index = 0; index < count; index++) { textData[index] = cache->glyphToUnichar(glyphs[index]); @@ -319,7 +320,8 @@ const SkPaint& paint = canon.getPaint(); SkScalar scale = canon.getScale(); - auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(paint); + const SkFont font = SkFont::LEGACY_ExtractFromPaint(paint); + auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(font, paint); SkScalar width = 0; @@ -372,7 +374,8 @@ maxWidth /= scale; } - auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(paint); + const SkFont font = SkFont::LEGACY_ExtractFromPaint(paint); + auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(font, paint); SkFontPriv::GlyphCacheProc glyphCacheProc = SkFontPriv::GetGlyphCacheProc( static_cast<SkTextEncoding>(paint.getTextEncoding()), false); @@ -618,7 +621,8 @@ } // SRGBTODO: Is this correct? - fCache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(fPaint); + const SkFont font = SkFont::LEGACY_ExtractFromPaint(fPaint); + fCache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(font, fPaint); SkPaint::Style style = SkPaint::kFill_Style; sk_sp<SkPathEffect> pe;
diff --git a/src/core/SkStrikeCache.cpp b/src/core/SkStrikeCache.cpp index 3e71a1a..943ddb0 100644 --- a/src/core/SkStrikeCache.cpp +++ b/src/core/SkStrikeCache.cpp
@@ -160,6 +160,7 @@ } SkExclusiveStrikePtr SkStrikeCache::FindOrCreateStrikeExclusive( + const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags, @@ -167,18 +168,20 @@ { return SkExclusiveStrikePtr( GlobalStrikeCache()->findOrCreateStrike( - paint, surfaceProps, scalerContextFlags,deviceMatrix)); + font, paint, surfaceProps, scalerContextFlags,deviceMatrix)); } SkGlyphCacheInterface* SkStrikeCache::findOrCreateGlyphCache( + const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags, const SkMatrix& deviceMatrix) { - return findOrCreateStrike(paint, surfaceProps, scalerContextFlags, deviceMatrix); + return findOrCreateStrike(font, paint, surfaceProps, scalerContextFlags, deviceMatrix); } auto SkStrikeCache::findOrCreateStrike( + const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags, @@ -188,17 +191,13 @@ SkScalerContextEffects effects; auto desc = SkScalerContext::CreateDescriptorAndEffectsUsingPaint( - paint, surfaceProps, scalerContextFlags, deviceMatrix, &ad, &effects); + font, paint, surfaceProps, scalerContextFlags, deviceMatrix, &ad, &effects); - auto tf = SkPaintPriv::GetTypefaceOrDefault(paint); + auto tf = SkFontPriv::GetTypefaceOrDefault(font); return this->findOrCreateStrike(*desc, effects, *tf); } -SkExclusiveStrikePtr SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(const SkPaint& paint) { - return FindOrCreateStrikeWithNoDeviceExclusive(SkFont::LEGACY_ExtractFromPaint(paint), paint); -} - SkExclusiveStrikePtr SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(const SkFont& font) { return FindOrCreateStrikeWithNoDeviceExclusive(font, SkPaint()); }
diff --git a/src/core/SkStrikeCache.h b/src/core/SkStrikeCache.h index d6b2d89..183ed6a 100644 --- a/src/core/SkStrikeCache.h +++ b/src/core/SkStrikeCache.h
@@ -115,25 +115,27 @@ bool desperationSearchForPath(const SkDescriptor& desc, SkGlyphID glyphID, SkPath* path); static ExclusiveStrikePtr FindOrCreateStrikeExclusive( + const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags, const SkMatrix& deviceMatrix); SkGlyphCacheInterface* findOrCreateGlyphCache( + const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags, const SkMatrix& deviceMatrix); Node* findOrCreateStrike( + const SkFont& font, const SkPaint& paint, const SkSurfaceProps& surfaceProps, SkScalerContextFlags scalerContextFlags, const SkMatrix& deviceMatrix); - static ExclusiveStrikePtr FindOrCreateStrikeWithNoDeviceExclusive(const SkPaint& paint); - + // cons up a default paint, which is only needed for patheffects/maskfilter static ExclusiveStrikePtr FindOrCreateStrikeWithNoDeviceExclusive(const SkFont&); static ExclusiveStrikePtr FindOrCreateStrikeWithNoDeviceExclusive(const SkFont& font,
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp index 67ee9a9..d3f3457 100644 --- a/src/pdf/SkPDFFont.cpp +++ b/src/pdf/SkPDFFont.cpp
@@ -8,6 +8,7 @@ #include "SkPDFFont.h" #include "SkData.h" +#include "SkFont.h" #include "SkGlyphCache.h" #include "SkImagePriv.h" #include "SkMacros.h" @@ -31,9 +32,9 @@ #include "SkUTF.h" SkExclusiveStrikePtr SkPDFFont::MakeVectorCache(SkTypeface* face, int* size) { - SkPaint tmpPaint; - tmpPaint.setHinting(kNo_SkFontHinting); - tmpPaint.setTypeface(sk_ref_sp(face)); + SkFont font; + font.setHinting(kNo_SkFontHinting); + font.setTypeface(sk_ref_sp(face)); int unitsPerEm = face->getUnitsPerEm(); if (unitsPerEm <= 0) { unitsPerEm = 1024; @@ -41,10 +42,10 @@ if (size) { *size = unitsPerEm; } - tmpPaint.setTextSize((SkScalar)unitsPerEm); + font.setSize((SkScalar)unitsPerEm); const SkSurfaceProps props(0, kUnknown_SkPixelGeometry); return SkStrikeCache::FindOrCreateStrikeExclusive( - tmpPaint, props, SkScalerContextFlags::kFakeGammaAndBoostContrast, SkMatrix::I()); + font, SkPaint(), props, SkScalerContextFlags::kFakeGammaAndBoostContrast, SkMatrix::I()); } namespace {