Separate cache lookup from run font setup
Seperate concerns so that cache lookup and run setup are different code.
This will allow the common code in painter to do the caache lookup.
Change-Id: I30a208ebc715c07f5720a7a8fc8240aabfda869d
Reviewed-on: https://skia-review.googlesource.com/c/180928
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Herb Derby <herb@google.com>
diff --git a/src/core/SkGlyphRunPainter.cpp b/src/core/SkGlyphRunPainter.cpp
index 0057823..60088ff 100644
--- a/src/core/SkGlyphRunPainter.cpp
+++ b/src/core/SkGlyphRunPainter.cpp
@@ -674,15 +674,17 @@
SkExclusiveStrikePtr fallbackCache ;
sk_sp<GrTextStrike> strike;
{
- BothCaches both = fRun->setupCache(fallbackPaint,
- fallbackFont,
- fProps,
- fScalerContextFlags,
- glyphCacheMatrix,
- fGlyphCache);
+ BothCaches both = fRun->lookupCache(fallbackPaint,
+ fallbackFont,
+ fProps,
+ fScalerContextFlags,
+ glyphCacheMatrix,
+ fGlyphCache);
fallbackCache = std::move(both.skCache);
strike = std::move(both.grCache);
}
+ fRun->setupFont(fallbackPaint, fallbackFont, fallbackCache->getDescriptor());
+
SkASSERT(strike != nullptr);
subRun->setStrike(strike);
const SkPoint* glyphPos = positions.data();
@@ -745,14 +747,15 @@
SkExclusiveStrikePtr cache;
sk_sp<GrTextStrike> currStrike;
{
- BothCaches both = run->setupCache(distanceFieldPaint,
- distanceFieldFont,
- props,
- flags,
- SkMatrix::I(),
- glyphCache);
+ BothCaches both = run->lookupCache(distanceFieldPaint,
+ distanceFieldFont,
+ props,
+ flags,
+ SkMatrix::I(),
+ glyphCache);
cache = std::move(both.skCache);
currStrike = std::move(both.grCache);
+ run->setupFont(distanceFieldPaint, distanceFieldFont, cache->getDescriptor());
}
auto perEmpty = [](const SkGlyph&, SkPoint) {};
@@ -819,14 +822,16 @@
SkExclusiveStrikePtr cache;
sk_sp<GrTextStrike> currStrike;
{
- BothCaches both = run->setupCache(runPaint,
- runFont,
- props,
- scalerContextFlags,
- viewMatrix,
- glyphCache);
+ BothCaches both = run->lookupCache(runPaint,
+ runFont,
+ props,
+ scalerContextFlags,
+ viewMatrix,
+ glyphCache);
cache = std::move(both.skCache);
currStrike = std::move(both.grCache);
+ run->setupFont(runPaint, runFont, cache->getDescriptor());
+
}
auto perEmpty = [](const SkGlyph&, SkPoint) {};
diff --git a/src/gpu/text/GrTextBlob.cpp b/src/gpu/text/GrTextBlob.cpp
index ad3bf1a..73a47fe 100644
--- a/src/gpu/text/GrTextBlob.cpp
+++ b/src/gpu/text/GrTextBlob.cpp
@@ -58,27 +58,32 @@
return blob;
}
-GrTextBlob::BothCaches GrTextBlob::Run::setupCache(const SkPaint& paint,
- const SkFont& font,
- const SkSurfaceProps& props,
- SkScalerContextFlags scalerContextFlags,
- const SkMatrix& viewMatrix,
- GrGlyphCache* grGlyphCache) {
- // if we have an override descriptor for the run, then we should use that
- SkAutoDescriptor* desc = fARGBFallbackDescriptor.get() ? fARGBFallbackDescriptor.get() : &fDescriptor;
- SkScalerContextEffects effects;
- SkScalerContext::CreateDescriptorAndEffectsUsingPaint(
- font, paint, props, scalerContextFlags, viewMatrix, desc, &effects);
- fTypeface = SkFontPriv::RefTypefaceOrDefault(font);
- fPathEffect = sk_ref_sp(effects.fPathEffect);
- fMaskFilter = sk_ref_sp(effects.fMaskFilter);
-
- SkExclusiveStrikePtr skCache =
- SkStrikeCache::FindOrCreateStrikeExclusive(*desc->getDesc(), effects, *fTypeface);
+GrTextBlob::BothCaches GrTextBlob::Run::lookupCache(const SkPaint& skPaint,
+ const SkFont& skFont,
+ const SkSurfaceProps& props,
+ SkScalerContextFlags scalerContextFlags,
+ const SkMatrix& viewMatrix,
+ GrGlyphCache* grGlyphCache) {
+ auto skCache = SkStrikeCache::FindOrCreateStrikeExclusive(
+ skFont, skPaint, props, scalerContextFlags, viewMatrix);
sk_sp<GrTextStrike> grCache = grGlyphCache->getStrike(skCache.get());
return {std::move(skCache), std::move(grCache)};
}
+void GrTextBlob::Run::setupFont(const SkPaint& skPaint,
+ const SkFont& skFont,
+ const SkDescriptor& cacheDescriptor) {
+ fTypeface = SkFontPriv::RefTypefaceOrDefault(skFont);
+ SkScalerContextEffects effects{skPaint};
+ fPathEffect = sk_ref_sp(effects.fPathEffect);
+ fMaskFilter = sk_ref_sp(effects.fMaskFilter);
+ // if we have an override descriptor for the run, then we should use that
+ SkAutoDescriptor* desc =
+ fARGBFallbackDescriptor.get() ? fARGBFallbackDescriptor.get() : &fDescriptor;
+ // Set up the descriptor for possible cache lookups during regen.
+ desc->reset(cacheDescriptor);
+}
+
void GrTextBlob::Run::appendPathGlyph(const SkPath& path, SkPoint position,
SkScalar scale, bool preTransformed) {
fPathGlyphs.push_back(PathGlyph(path, position.x(), position.y(), scale, preTransformed));
diff --git a/src/gpu/text/GrTextBlob.h b/src/gpu/text/GrTextBlob.h
index 3361db0..73b7129 100644
--- a/src/gpu/text/GrTextBlob.h
+++ b/src/gpu/text/GrTextBlob.h
@@ -449,12 +449,16 @@
SkPoint origin,
SkScalar textScale);
- BothCaches setupCache(const SkPaint& skPaint,
- const SkFont& skFont,
- const SkSurfaceProps& props,
- SkScalerContextFlags scalerContextFlags,
- const SkMatrix& viewMatrix,
- GrGlyphCache* grGlyphCache);
+ BothCaches lookupCache(const SkPaint& skPaint,
+ const SkFont& skFont,
+ const SkSurfaceProps& props,
+ SkScalerContextFlags scalerContextFlags,
+ const SkMatrix& viewMatrix,
+ GrGlyphCache* grGlyphCache);
+
+ void setupFont(const SkPaint& skPaint,
+ const SkFont& skFont,
+ const SkDescriptor& skCache);
void setRunFontAntiAlias(bool aa) {
fAntiAlias = aa;