diff options
author | Herb Derby <herb@google.com> | 2018-03-09 11:35:47 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-03-09 17:45:40 +0000 |
commit | 33cb22cb2b60255a2755cc88072490fe8d05b0b9 (patch) | |
tree | 1d68ad9fba801d28f065b3055a3d1d808f89e131 | |
parent | 41a3b87846553e9d77e0e113bfaf4ec74a068e96 (diff) |
Remove one use of AttachCache, and a paint variant of FindOrCreate...
This is a point change to see if it causes bad draws using config
gldft. Checked with skdiff on that config.
Change-Id: Ibee4630df21456ba9dccf28480bded82d1d9bf47
Reviewed-on: https://skia-review.googlesource.com/113204
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Herb Derby <herb@google.com>
-rw-r--r-- | src/core/SkGlyphCache.cpp | 29 | ||||
-rw-r--r-- | src/core/SkGlyphCache.h | 20 | ||||
-rw-r--r-- | src/core/SkPaint.cpp | 16 | ||||
-rw-r--r-- | src/core/SkTextToPathIter.h | 20 | ||||
-rw-r--r-- | src/gpu/text/GrTextUtils.cpp | 2 |
5 files changed, 43 insertions, 44 deletions
diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp index 9bb43604a6..f16de64ea3 100644 --- a/src/core/SkGlyphCache.cpp +++ b/src/core/SkGlyphCache.cpp @@ -505,6 +505,23 @@ SkExclusiveStrikePtr SkGlyphCache::FindOrCreateStrikeExclusive( return FindOrCreateStrikeExclusive(desc, creator); } +SkExclusiveStrikePtr SkGlyphCache::FindOrCreateStrikeExclusive( + const SkPaint& paint, + const SkSurfaceProps* surfaceProps, + SkScalerContextFlags scalerContextFlags, + const SkMatrix* deviceMatrix) +{ + SkAutoDescriptor ad; + SkScalerContextEffects effects; + + auto desc = SkScalerContext::CreateDescriptorAndEffectsUsingPaint( + paint, surfaceProps, scalerContextFlags, deviceMatrix, &ad, &effects); + + auto tf = SkPaintPriv::GetTypefaceOrDefault(paint); + + return FindOrCreateStrikeExclusive(*desc, effects, *tf); +} + void SkGlyphCache::AttachCache(SkGlyphCache* cache) { SkGlyphCache_Globals::AttachCache(cache); } @@ -793,15 +810,3 @@ SkGlyphCache* SkGlyphCache::DetachCache( return cache.release(); } -SkGlyphCache* SkGlyphCache::DetachCacheUsingPaint(const SkPaint& paint, - const SkSurfaceProps* surfaceProps, - SkScalerContextFlags scalerContextFlags, - const SkMatrix* deviceMatrix) { - SkAutoDescriptor ad; - SkScalerContextEffects effects; - - auto desc = SkScalerContext::CreateDescriptorAndEffectsUsingPaint( - paint, surfaceProps, scalerContextFlags, deviceMatrix, &ad, &effects); - - return SkGlyphCache::DetachCache(SkPaintPriv::GetTypefaceOrDefault(paint), effects, desc); -} diff --git a/src/core/SkGlyphCache.h b/src/core/SkGlyphCache.h index 8c335af859..aad1fa4fbb 100644 --- a/src/core/SkGlyphCache.h +++ b/src/core/SkGlyphCache.h @@ -148,6 +148,12 @@ public: const SkScalerContextEffects& effects, const SkTypeface& typeface); + static SkExclusiveStrikePtr FindOrCreateStrikeExclusive( + const SkPaint& paint, + const SkSurfaceProps* surfaceProps, + SkScalerContextFlags scalerContextFlags, + const SkMatrix* deviceMatrix); + template <typename ScalerContextCreator> static SkExclusiveStrikePtr CreateStrikeExclusive( const SkDescriptor& desc, ScalerContextCreator creator) @@ -178,11 +184,6 @@ public: static SkGlyphCache* DetachCache( SkTypeface* typeface, const SkScalerContextEffects& effects, const SkDescriptor* desc); - static SkGlyphCache* DetachCacheUsingPaint(const SkPaint& paint, - const SkSurfaceProps* surfaceProps, - SkScalerContextFlags scalerContextFlags, - const SkMatrix* deviceMatrix); - static void Dump(); /** Dump memory usage statistics of all the attaches caches in the process using the @@ -302,14 +303,13 @@ public: SkAutoGlyphCache(SkGlyphCache* cache) : INHERITED(cache) {} SkAutoGlyphCache(SkTypeface* typeface, const SkScalerContextEffects& effects, const SkDescriptor* desc) - : INHERITED(SkGlyphCache::DetachCache(typeface, effects, desc)) - {} + : INHERITED(SkGlyphCache::FindOrCreateStrikeExclusive(*desc, effects, *typeface)) {} /** deprecated: always enables fake gamma */ SkAutoGlyphCache(const SkPaint& paint, const SkSurfaceProps* surfaceProps, const SkMatrix* matrix) : INHERITED( - SkGlyphCache::DetachCacheUsingPaint( + SkGlyphCache::FindOrCreateStrikeExclusive( paint, surfaceProps, SkScalerContextFlags::kFakeGammaAndBoostContrast, matrix)) {} @@ -318,8 +318,8 @@ public: SkScalerContextFlags scalerContextFlags, const SkMatrix* matrix) : INHERITED( - SkGlyphCache::DetachCacheUsingPaint(paint, surfaceProps, scalerContextFlags, matrix)) - {} + SkGlyphCache::FindOrCreateStrikeExclusive( + paint, surfaceProps, scalerContextFlags, matrix)) {} private: using INHERITED = SkExclusiveStrikePtr; }; diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 1fd3bf55db..f059fc3474 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -1748,9 +1748,9 @@ SkTextBaseIter::SkTextBaseIter(const char text[], size_t length, } // SRGBTODO: Is this correct? - fCache = SkGlyphCache::DetachCacheUsingPaint(fPaint, nullptr, - SkScalerContextFlags::kFakeGammaAndBoostContrast, - nullptr); + fCache = SkGlyphCache::FindOrCreateStrikeExclusive( + fPaint, nullptr, + SkScalerContextFlags::kFakeGammaAndBoostContrast, nullptr); SkPaint::Style style = SkPaint::kFill_Style; sk_sp<SkPathEffect> pe; @@ -1768,7 +1768,7 @@ SkTextBaseIter::SkTextBaseIter(const char text[], size_t length, SkScalar xOffset = 0; if (paint.getTextAlign() != SkPaint::kLeft_Align) { // need to measure first int count; - SkScalar width = fPaint.measure_text(fCache, text, length, &count, nullptr) * fScale; + SkScalar width = fPaint.measure_text(fCache.get(), text, length, &count, nullptr) * fScale; if (paint.getTextAlign() == SkPaint::kCenter_Align) { width = SkScalarHalf(width); } @@ -1783,13 +1783,9 @@ SkTextBaseIter::SkTextBaseIter(const char text[], size_t length, fXYIndex = paint.isVerticalText() ? 1 : 0; } -SkTextBaseIter::~SkTextBaseIter() { - SkGlyphCache::AttachCache(fCache); -} - bool SkTextToPathIter::next(const SkPath** path, SkScalar* xpos) { if (fText < fStop) { - const SkGlyph& glyph = fGlyphCacheProc(fCache, &fText); + const SkGlyph& glyph = fGlyphCacheProc(fCache.get(), &fText); fXPos += (fPrevAdvance + fAutoKern.adjust(glyph)) * fScale; fPrevAdvance = advance(glyph, fXYIndex); // + fPaint.getTextTracking(); @@ -1812,7 +1808,7 @@ bool SkTextToPathIter::next(const SkPath** path, SkScalar* xpos) { } bool SkTextInterceptsIter::next(SkScalar* array, int* count) { - const SkGlyph& glyph = fGlyphCacheProc(fCache, &fText); + const SkGlyph& glyph = fGlyphCacheProc(fCache.get(), &fText); fXPos += (fPrevAdvance + fAutoKern.adjust(glyph)) * fScale; fPrevAdvance = advance(glyph, fXYIndex); // + fPaint.getTextTracking(); if (fCache->findPath(glyph)) { diff --git a/src/core/SkTextToPathIter.h b/src/core/SkTextToPathIter.h index 6de12a84ce..219833468c 100644 --- a/src/core/SkTextToPathIter.h +++ b/src/core/SkTextToPathIter.h @@ -9,22 +9,20 @@ #define SkTextToPathIter_DEFINED #include "SkAutoKern.h" +#include "SkGlyphCache.h" #include "SkPaint.h" -class SkGlyphCache; - class SkTextBaseIter { protected: SkTextBaseIter(const char text[], size_t length, const SkPaint& paint, bool applyStrokeAndPathEffects); - ~SkTextBaseIter(); - - SkGlyphCache* fCache; - SkPaint fPaint; - SkScalar fScale; - SkScalar fPrevAdvance; - const char* fText; - const char* fStop; + + SkExclusiveStrikePtr fCache; + SkPaint fPaint; + SkScalar fScale; + SkScalar fPrevAdvance; + const char* fText; + const char* fStop; SkPaint::GlyphCacheProc fGlyphCacheProc; SkScalar fXPos; // accumulated xpos, returned in next @@ -74,7 +72,7 @@ public: if (TextType::kPosText == fTextType && fPaint.getTextAlign() != SkPaint::kLeft_Align) { // need to measure first const char* text = fText; - const SkGlyph& glyph = fGlyphCacheProc(fCache, &text); + const SkGlyph& glyph = fGlyphCacheProc(fCache.get(), &text); SkScalar width = (&glyph.fAdvanceX)[0] * fScale; if (fPaint.getTextAlign() == SkPaint::kCenter_Align) { width = SkScalarHalf(width); diff --git a/src/gpu/text/GrTextUtils.cpp b/src/gpu/text/GrTextUtils.cpp index 680e262766..7d693d1e29 100644 --- a/src/gpu/text/GrTextUtils.cpp +++ b/src/gpu/text/GrTextUtils.cpp @@ -81,7 +81,7 @@ bool GrTextUtils::PathTextIter::next(const SkGlyph** skGlyph, const SkPath** pat SkASSERT(path); SkASSERT(xpos); if (fText < fStop) { - const SkGlyph& glyph = fGlyphCacheProc(fCache, &fText); + const SkGlyph& glyph = fGlyphCacheProc(fCache.get(), &fText); fXPos += (fPrevAdvance + fAutoKern.adjust(glyph)) * fScale; SkASSERT(0 == fXYIndex || 1 == fXYIndex); |