aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bench/PathTextBench.cpp2
-rw-r--r--bench/SkGlyphCacheBench.cpp2
-rw-r--r--samplecode/SamplePathText.cpp2
-rw-r--r--src/core/SkGlyphCache.cpp36
-rw-r--r--src/core/SkGlyphCache.h33
-rw-r--r--src/core/SkPaint.cpp27
-rw-r--r--src/core/SkTextToPathIter.h19
-rw-r--r--src/gpu/text/GrAtlasTextBlob.cpp13
-rw-r--r--src/gpu/text/GrAtlasTextBlob.h12
-rw-r--r--src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp3
-rw-r--r--src/gpu/text/GrAtlasTextContext.cpp144
-rw-r--r--src/gpu/text/GrTextUtils.cpp2
-rw-r--r--src/xps/SkXPSDevice.cpp6
13 files changed, 159 insertions, 142 deletions
diff --git a/bench/PathTextBench.cpp b/bench/PathTextBench.cpp
index 4e83d33119..8920223c35 100644
--- a/bench/PathTextBench.cpp
+++ b/bench/PathTextBench.cpp
@@ -47,7 +47,7 @@ private:
void onDelayedSetup() override {
SkPaint defaultPaint;
SkAutoGlyphCache agc(defaultPaint, nullptr, &SkMatrix::I());
- SkGlyphCache* cache = agc.get();
+ SkGlyphCache* cache = agc.getCache();
for (int i = 0; i < kNumGlyphs; ++i) {
SkGlyphID id = cache->unicharToGlyph(kGlyphs[i]);
cache->getScalerContext()->getPath(SkPackedGlyphID(id), &fGlyphs[i]);
diff --git a/bench/SkGlyphCacheBench.cpp b/bench/SkGlyphCacheBench.cpp
index c760eb5583..1cc257fd3f 100644
--- a/bench/SkGlyphCacheBench.cpp
+++ b/bench/SkGlyphCacheBench.cpp
@@ -21,7 +21,7 @@ static void do_font_stuff(SkPaint* paint) {
for (SkScalar i = 8; i < 64; i++) {
paint->setTextSize(i);
SkAutoGlyphCacheNoGamma autoCache(*paint, nullptr, nullptr);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
uint16_t glyphs['z'];
for (int c = ' '; c < 'z'; c++) {
glyphs[c] = cache->unicharToGlyph(c);
diff --git a/samplecode/SamplePathText.cpp b/samplecode/SamplePathText.cpp
index c6c07ee14c..b6a730f6d7 100644
--- a/samplecode/SamplePathText.cpp
+++ b/samplecode/SamplePathText.cpp
@@ -25,7 +25,7 @@ public:
PathText() {
SkPaint defaultPaint;
SkAutoGlyphCache agc(defaultPaint, nullptr, &SkMatrix::I());
- SkGlyphCache* cache = agc.get();
+ SkGlyphCache* cache = agc.getCache();
SkPath glyphPaths[52];
for (int i = 0; i < 52; ++i) {
// I and l are rects on OS X ...
diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp
index 668f0e49b2..9bb43604a6 100644
--- a/src/core/SkGlyphCache.cpp
+++ b/src/core/SkGlyphCache.cpp
@@ -505,23 +505,6 @@ 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);
}
@@ -803,3 +786,22 @@ void SkGraphics::PurgeFontCache() {
size_t SkGraphics::GetTLSFontCacheLimit() { return 0; }
void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { }
+SkGlyphCache* SkGlyphCache::DetachCache(
+ SkTypeface* typeface, const SkScalerContextEffects& effects, const SkDescriptor* desc)
+{
+ auto cache = FindOrCreateStrikeExclusive(*desc, effects, *typeface);
+ 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 a161f6f448..8c335af859 100644
--- a/src/core/SkGlyphCache.h
+++ b/src/core/SkGlyphCache.h
@@ -148,12 +148,6 @@ 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)
@@ -173,6 +167,22 @@ public:
return SkExclusiveStrikePtr(new SkGlyphCache(desc, std::move(context)));
}
+ /** Detach a strike from the global cache matching the specified descriptor. Once detached,
+ it can be queried/modified by the current thread, and when finished, be reattached to the
+ global cache with AttachCache(). While detached, if another request is made with the same
+ descriptor, a different strike will be generated. This is fine. It does mean we can have
+ more than 1 strike for the same descriptor, but that will eventually get purged, and the
+ win is that different thread will never block each other while a strike is being used.
+ DEPRECATED
+ */
+ 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
@@ -286,17 +296,20 @@ private:
class SkAutoGlyphCache : public SkExclusiveStrikePtr {
public:
+ /** deprecated: use get() */
+ SkGlyphCache* getCache() const { return this->get(); }
SkAutoGlyphCache() = default;
SkAutoGlyphCache(SkGlyphCache* cache) : INHERITED(cache) {}
SkAutoGlyphCache(SkTypeface* typeface, const SkScalerContextEffects& effects,
const SkDescriptor* desc)
- : INHERITED(SkGlyphCache::FindOrCreateStrikeExclusive(*desc, effects, *typeface)) {}
+ : INHERITED(SkGlyphCache::DetachCache(typeface, effects, desc))
+ {}
/** deprecated: always enables fake gamma */
SkAutoGlyphCache(const SkPaint& paint,
const SkSurfaceProps* surfaceProps,
const SkMatrix* matrix)
: INHERITED(
- SkGlyphCache::FindOrCreateStrikeExclusive(
+ SkGlyphCache::DetachCacheUsingPaint(
paint, surfaceProps,
SkScalerContextFlags::kFakeGammaAndBoostContrast, matrix))
{}
@@ -305,8 +318,8 @@ public:
SkScalerContextFlags scalerContextFlags,
const SkMatrix* matrix)
: INHERITED(
- SkGlyphCache::FindOrCreateStrikeExclusive(
- paint, surfaceProps, scalerContextFlags, matrix)) {}
+ SkGlyphCache::DetachCacheUsingPaint(paint, surfaceProps, scalerContextFlags, matrix))
+ {}
private:
using INHERITED = SkExclusiveStrikePtr;
};
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 210b8e5a3a..e3680713b5 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -431,7 +431,7 @@ int SkPaint::textToGlyphs(const void* textData, size_t byteLength, uint16_t glyp
}
SkAutoGlyphCache autoCache(*this, nullptr, nullptr);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
const char* text = (const char*)textData;
const char* stop = text + byteLength;
@@ -489,7 +489,7 @@ bool SkPaint::containsText(const void* textData, size_t byteLength) const {
}
SkAutoGlyphCache autoCache(*this, nullptr, nullptr);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
switch (this->getTextEncoding()) {
case SkPaint::kUTF8_TextEncoding: {
@@ -539,7 +539,7 @@ void SkPaint::glyphsToUnichars(const uint16_t glyphs[], int count, SkUnichar tex
SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
SkAutoGlyphCache autoCache(*this, &props, nullptr);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
for (int index = 0; index < count; index++) {
textData[index] = cache->glyphToUnichar(glyphs[index]);
@@ -805,7 +805,7 @@ SkScalar SkPaint::measureText(const void* textData, size_t length, SkRect* bound
SkScalar scale = canon.getScale();
SkAutoGlyphCache autoCache(paint, nullptr, nullptr);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
SkScalar width = 0;
@@ -859,7 +859,7 @@ size_t SkPaint::breakText(const void* textD, size_t length, SkScalar maxWidth,
}
SkAutoGlyphCache autoCache(paint, nullptr, nullptr);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(paint.getTextEncoding(),
paint.isDevKernText(),
@@ -965,7 +965,7 @@ int SkPaint::getTextWidths(const void* textData, size_t byteLength,
SkScalar scale = canon.getScale();
SkAutoGlyphCache autoCache(paint, nullptr, nullptr);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(paint.getTextEncoding(),
paint.isDevKernText(),
nullptr != bounds);
@@ -1748,8 +1748,9 @@ SkTextBaseIter::SkTextBaseIter(const char text[], size_t length,
}
// SRGBTODO: Is this correct?
- fCache = SkGlyphCache::FindOrCreateStrikeExclusive(
- fPaint, nullptr, SkScalerContextFlags::kFakeGammaAndBoostContrast, nullptr);
+ fCache = SkGlyphCache::DetachCacheUsingPaint(fPaint, nullptr,
+ SkScalerContextFlags::kFakeGammaAndBoostContrast,
+ nullptr);
SkPaint::Style style = SkPaint::kFill_Style;
sk_sp<SkPathEffect> pe;
@@ -1767,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.get(), text, length, &count, nullptr) * fScale;
+ SkScalar width = fPaint.measure_text(fCache, text, length, &count, nullptr) * fScale;
if (paint.getTextAlign() == SkPaint::kCenter_Align) {
width = SkScalarHalf(width);
}
@@ -1782,9 +1783,13 @@ 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.get(), &fText);
+ const SkGlyph& glyph = fGlyphCacheProc(fCache, &fText);
fXPos += (fPrevAdvance + fAutoKern.adjust(glyph)) * fScale;
fPrevAdvance = advance(glyph, fXYIndex); // + fPaint.getTextTracking();
@@ -1807,7 +1812,7 @@ bool SkTextToPathIter::next(const SkPath** path, SkScalar* xpos) {
}
bool SkTextInterceptsIter::next(SkScalar* array, int* count) {
- const SkGlyph& glyph = fGlyphCacheProc(fCache.get(), &fText);
+ const SkGlyph& glyph = fGlyphCacheProc(fCache, &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 8bcbc21b4d..6de12a84ce 100644
--- a/src/core/SkTextToPathIter.h
+++ b/src/core/SkTextToPathIter.h
@@ -9,21 +9,22 @@
#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);
-
- SkExclusiveStrikePtr fCache;
- SkPaint fPaint;
- SkScalar fScale;
- SkScalar fPrevAdvance;
- const char* fText;
- const char* fStop;
+ ~SkTextBaseIter();
+
+ SkGlyphCache* fCache;
+ SkPaint fPaint;
+ SkScalar fScale;
+ SkScalar fPrevAdvance;
+ const char* fText;
+ const char* fStop;
SkPaint::GlyphCacheProc fGlyphCacheProc;
SkScalar fXPos; // accumulated xpos, returned in next
@@ -73,7 +74,7 @@ public:
if (TextType::kPosText == fTextType
&& fPaint.getTextAlign() != SkPaint::kLeft_Align) { // need to measure first
const char* text = fText;
- const SkGlyph& glyph = fGlyphCacheProc(fCache.get(), &text);
+ const SkGlyph& glyph = fGlyphCacheProc(fCache, &text);
SkScalar width = (&glyph.fAdvanceX)[0] * fScale;
if (fPaint.getTextAlign() == SkPaint::kCenter_Align) {
width = SkScalarHalf(width);
diff --git a/src/gpu/text/GrAtlasTextBlob.cpp b/src/gpu/text/GrAtlasTextBlob.cpp
index dfe3312f99..b4404c3ef9 100644
--- a/src/gpu/text/GrAtlasTextBlob.cpp
+++ b/src/gpu/text/GrAtlasTextBlob.cpp
@@ -55,11 +55,11 @@ sk_sp<GrAtlasTextBlob> GrAtlasTextBlob::Make(GrMemoryPool* pool, int glyphCount,
return cacheBlob;
}
-SkExclusiveStrikePtr GrAtlasTextBlob::setupCache(int runIndex,
- const SkSurfaceProps& props,
- SkScalerContextFlags scalerContextFlags,
- const SkPaint& skPaint,
- const SkMatrix* viewMatrix) {
+SkGlyphCache* GrAtlasTextBlob::setupCache(int runIndex,
+ const SkSurfaceProps& props,
+ SkScalerContextFlags scalerContextFlags,
+ const SkPaint& skPaint,
+ const SkMatrix* viewMatrix) {
GrAtlasTextBlob::Run* run = &fRuns[runIndex];
// if we have an override descriptor for the run, then we should use that
@@ -71,8 +71,7 @@ SkExclusiveStrikePtr GrAtlasTextBlob::setupCache(int runIndex,
run->fTypeface = SkPaintPriv::RefTypefaceOrDefault(skPaint);
run->fPathEffect = sk_ref_sp(effects.fPathEffect);
run->fMaskFilter = sk_ref_sp(effects.fMaskFilter);
- return SkGlyphCache::FindOrCreateStrikeExclusive(
- *desc->getDesc(), effects, *run->fTypeface.get());
+ return SkGlyphCache::DetachCache(run->fTypeface.get(), effects, desc->getDesc());
}
void GrAtlasTextBlob::appendGlyph(int runIndex,
diff --git a/src/gpu/text/GrAtlasTextBlob.h b/src/gpu/text/GrAtlasTextBlob.h
index e5a931d3cf..b4a11a496d 100644
--- a/src/gpu/text/GrAtlasTextBlob.h
+++ b/src/gpu/text/GrAtlasTextBlob.h
@@ -170,11 +170,11 @@ public:
run.fOverrideDescriptor.reset(new SkAutoDescriptor);
}
- SkExclusiveStrikePtr setupCache(int runIndex,
- const SkSurfaceProps& props,
- SkScalerContextFlags scalerContextFlags,
- const SkPaint& skPaint,
- const SkMatrix* viewMatrix);
+ SkGlyphCache* setupCache(int runIndex,
+ const SkSurfaceProps& props,
+ SkScalerContextFlags scalerContextFlags,
+ const SkPaint& skPaint,
+ const SkMatrix* viewMatrix);
// Appends a glyph to the blob. If the glyph is too large, the glyph will be appended
// as a path.
@@ -607,7 +607,7 @@ private:
GrDeferredUploadTarget* fUploadTarget;
GrGlyphCache* fGlyphCache;
GrAtlasManager* fFullAtlasManager;
- SkExclusiveStrikePtr* fLazyCache;
+ SkAutoGlyphCache* fLazyCache;
Run* fRun;
Run::SubRunInfo* fSubRun;
GrColor fColor;
diff --git a/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp b/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp
index 188f34c461..296df22f51 100644
--- a/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp
+++ b/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp
@@ -244,8 +244,7 @@ Regenerator::Result Regenerator::doRegen() {
SkScalerContextEffects effects;
effects.fPathEffect = fRun->fPathEffect.get();
effects.fMaskFilter = fRun->fMaskFilter.get();
- *fLazyCache =
- SkGlyphCache::FindOrCreateStrikeExclusive(*desc, effects, *fRun->fTypeface.get());
+ fLazyCache->reset(SkGlyphCache::DetachCache(fRun->fTypeface.get(), effects, desc));
}
if (regenGlyphs) {
diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp
index 72f5b5b1f7..ad708d7d7f 100644
--- a/src/gpu/text/GrAtlasTextContext.cpp
+++ b/src/gpu/text/GrAtlasTextContext.cpp
@@ -386,18 +386,20 @@ void GrAtlasTextContext::DrawBmpText(GrAtlasTextBlob* blob, int runIndex,
return;
}
- sk_sp<GrTextStrike> currStrike = nullptr;
- auto cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix);
+ sk_sp<GrTextStrike> currStrike;
+ SkGlyphCache* cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix);
SkFindAndPlaceGlyph::ProcessText(paint.skPaint().getTextEncoding(), text, byteLength, {x, y},
- viewMatrix, paint.skPaint().getTextAlign(), cache.get(),
+ viewMatrix, paint.skPaint().getTextAlign(), cache,
[&](const SkGlyph& glyph, SkPoint position, SkPoint rounding) {
position += rounding;
BmpAppendGlyph(blob, runIndex, glyphCache, &currStrike,
glyph, SkScalarFloorToScalar(position.fX),
SkScalarFloorToScalar(position.fY),
- paint.filteredPremulColor(), cache.get(),
+ paint.filteredPremulColor(), cache,
SK_Scalar1);
});
+
+ SkGlyphCache::AttachCache(cache);
}
void GrAtlasTextContext::DrawBmpPosText(GrAtlasTextBlob* blob, int runIndex,
@@ -424,19 +426,20 @@ void GrAtlasTextContext::DrawBmpPosText(GrAtlasTextBlob* blob, int runIndex,
return;
}
- sk_sp<GrTextStrike> currStrike = nullptr;
-
- auto cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix);
+ sk_sp<GrTextStrike> currStrike;
+ SkGlyphCache* cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix);
SkFindAndPlaceGlyph::ProcessPosText(
paint.skPaint().getTextEncoding(), text, byteLength, offset, viewMatrix, pos,
- scalarsPerPosition, paint.skPaint().getTextAlign(), cache.get(),
+ scalarsPerPosition, paint.skPaint().getTextAlign(), cache,
[&](const SkGlyph& glyph, SkPoint position, SkPoint rounding) {
position += rounding;
BmpAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph,
SkScalarFloorToScalar(position.fX),
SkScalarFloorToScalar(position.fY),
- paint.filteredPremulColor(), cache.get(), SK_Scalar1);
+ paint.filteredPremulColor(), cache, SK_Scalar1);
});
+
+ SkGlyphCache::AttachCache(cache);
}
void GrAtlasTextContext::DrawBmpTextAsPaths(GrAtlasTextBlob* blob, int runIndex,
@@ -505,7 +508,7 @@ void GrAtlasTextContext::DrawBmpPosTextAsPaths(GrAtlasTextBlob* blob, int runInd
pathPaint.isDevKernText(),
true);
SkAutoGlyphCache autoCache(pathPaint, &props, nullptr);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
const char* stop = text + byteLength;
const char* lastText = text;
@@ -690,48 +693,41 @@ void GrAtlasTextContext::drawDFText(GrAtlasTextBlob* blob, int runIndex,
// passed-in scaler context flags. (It's only used when we fall-back to bitmap text).
SkScalerContext::CreateDescriptorAndEffectsUsingPaint(
skPaint, &props, SkScalerContextFlags::kNone, nullptr, &desc, &effects);
+ auto typeface = SkPaintPriv::GetTypefaceOrDefault(skPaint);
+ SkGlyphCache* origPaintCache =
+ SkGlyphCache::DetachCache(typeface, effects, desc.getDesc());
SkTArray<SkScalar> positions;
+
+ const char* textPtr = text;
SkScalar stopX = 0;
SkScalar stopY = 0;
- {
- auto tf = SkPaintPriv::GetTypefaceOrDefault(skPaint);
- auto origPaintCache = SkGlyphCache::FindOrCreateStrikeExclusive(
- *desc.getDesc(), effects, *tf);
-
-
- const char* textPtr = text;
- SkScalar origin = 0;
- switch (skPaint.getTextAlign()) {
- case SkPaint::kRight_Align:
- origin = SK_Scalar1;
- break;
- case SkPaint::kCenter_Align:
- origin = SK_ScalarHalf;
- break;
- case SkPaint::kLeft_Align:
- origin = 0;
- break;
- }
+ SkScalar origin = 0;
+ switch (skPaint.getTextAlign()) {
+ case SkPaint::kRight_Align: origin = SK_Scalar1; break;
+ case SkPaint::kCenter_Align: origin = SK_ScalarHalf; break;
+ case SkPaint::kLeft_Align: origin = 0; break;
+ }
- SkAutoKern autokern;
- const char* stop = text + byteLength;
- while (textPtr < stop) {
- // don't need x, y here, since all subpixel variants will have the
- // same advance
- const SkGlyph& glyph = glyphCacheProc(origPaintCache.get(), &textPtr);
+ SkAutoKern autokern;
+ const char* stop = text + byteLength;
+ while (textPtr < stop) {
+ // don't need x, y here, since all subpixel variants will have the
+ // same advance
+ const SkGlyph& glyph = glyphCacheProc(origPaintCache, &textPtr);
- SkScalar width = SkFloatToScalar(glyph.fAdvanceX) + autokern.adjust(glyph);
- positions.push_back(stopX + origin * width);
+ SkScalar width = SkFloatToScalar(glyph.fAdvanceX) + autokern.adjust(glyph);
+ positions.push_back(stopX + origin * width);
- SkScalar height = SkFloatToScalar(glyph.fAdvanceY);
- positions.push_back(stopY + origin * height);
+ SkScalar height = SkFloatToScalar(glyph.fAdvanceY);
+ positions.push_back(stopY + origin * height);
- stopX += width;
- stopY += height;
- }
- SkASSERT(textPtr == stop);
+ stopX += width;
+ stopY += height;
}
+ SkASSERT(textPtr == stop);
+
+ SkGlyphCache::AttachCache(origPaintCache);
// now adjust starting point depending on alignment
SkScalar alignX = stopX;
@@ -782,40 +778,40 @@ void GrAtlasTextContext::drawDFPosText(GrAtlasTextBlob* blob, int runIndex,
// We apply the fake-gamma by altering the distance in the shader, so we ignore the
// passed-in scaler context flags. (It's only used when we fall-back to bitmap text).
- {
- auto cache =
+ SkGlyphCache* cache =
blob->setupCache(runIndex, props, SkScalerContextFlags::kNone, dfPaint, nullptr);
- SkPaint::GlyphCacheProc glyphCacheProc =
+ SkPaint::GlyphCacheProc glyphCacheProc =
SkPaint::GetGlyphCacheProc(dfPaint.getTextEncoding(), dfPaint.isDevKernText(), true);
- const char* stop = text + byteLength;
+ const char* stop = text + byteLength;
- SkPaint::Align align = dfPaint.getTextAlign();
- SkScalar alignMul = SkPaint::kCenter_Align == align ? SK_ScalarHalf :
- (SkPaint::kRight_Align == align ? SK_Scalar1 : 0);
- while (text < stop) {
- const char* lastText = text;
- // the last 2 parameters are ignored
- const SkGlyph& glyph = glyphCacheProc(cache.get(), &text);
-
- if (glyph.fWidth) {
- SkPoint glyphPos(offset);
- glyphPos.fX += pos[0] - SkFloatToScalar(glyph.fAdvanceX) * alignMul * textRatio;
- glyphPos.fY += (2 == scalarsPerPosition ? pos[1] : 0) -
- SkFloatToScalar(glyph.fAdvanceY) * alignMul * textRatio;
-
- if (glyph.fMaskFormat != SkMask::kARGB32_Format) {
- DfAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, glyphPos.fX,
- glyphPos.fY, paint.filteredPremulColor(), cache.get(), textRatio);
- } else {
- // can't append color glyph to SDF batch, send to fallback
- fallbackTextHelper.appendText(glyph, SkToInt(text - lastText), lastText,
- glyphPos);
- }
- pos += scalarsPerPosition;
+ SkPaint::Align align = dfPaint.getTextAlign();
+ SkScalar alignMul = SkPaint::kCenter_Align == align ? SK_ScalarHalf :
+ (SkPaint::kRight_Align == align ? SK_Scalar1 : 0);
+ while (text < stop) {
+ const char* lastText = text;
+ // the last 2 parameters are ignored
+ const SkGlyph& glyph = glyphCacheProc(cache, &text);
+
+ if (glyph.fWidth) {
+ SkPoint glyphPos(offset);
+ glyphPos.fX += pos[0] - SkFloatToScalar(glyph.fAdvanceX) * alignMul * textRatio;
+ glyphPos.fY += (2 == scalarsPerPosition ? pos[1] : 0) -
+ SkFloatToScalar(glyph.fAdvanceY) * alignMul * textRatio;
+
+ if (glyph.fMaskFormat != SkMask::kARGB32_Format) {
+ DfAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, glyphPos.fX,
+ glyphPos.fY, paint.filteredPremulColor(), cache, textRatio);
+ } else {
+ // can't append color glyph to SDF batch, send to fallback
+ fallbackTextHelper.appendText(glyph, SkToInt(text - lastText), lastText, glyphPos);
}
}
+ pos += scalarsPerPosition;
}
+
+ SkGlyphCache::AttachCache(cache);
+
fallbackTextHelper.drawText(blob, runIndex, glyphCache, props, paint, scalerContextFlags);
}
@@ -887,7 +883,7 @@ void GrAtlasTextContext::FallbackTextHelper::drawText(GrAtlasTextBlob* blob, int
if (fFallbackTxt.count()) {
blob->initOverride(runIndex);
blob->setHasBitmap();
- SkExclusiveStrikePtr cache;
+ SkGlyphCache* cache = nullptr;
const SkPaint& skPaint = paint.skPaint();
SkPaint::GlyphCacheProc glyphCacheProc =
SkPaint::GetGlyphCacheProc(skPaint.getTextEncoding(),
@@ -917,12 +913,14 @@ void GrAtlasTextContext::FallbackTextHelper::drawText(GrAtlasTextBlob* blob, int
const char* stop = text + fFallbackTxt.count();
SkPoint* glyphPos = fFallbackPos.begin();
while (text < stop) {
- const SkGlyph& glyph = glyphCacheProc(cache.get(), &text);
+ const SkGlyph& glyph = glyphCacheProc(cache, &text);
GrAtlasTextContext::BmpAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph,
glyphPos->fX, glyphPos->fY, textColor,
- cache.get(), textRatio);
+ cache, textRatio);
glyphPos++;
}
+
+ SkGlyphCache::AttachCache(cache);
}
}
diff --git a/src/gpu/text/GrTextUtils.cpp b/src/gpu/text/GrTextUtils.cpp
index 7d693d1e29..680e262766 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.get(), &fText);
+ const SkGlyph& glyph = fGlyphCacheProc(fCache, &fText);
fXPos += (fPrevAdvance + fAutoKern.adjust(glyph)) * fScale;
SkASSERT(0 == fXYIndex || 1 == fXYIndex);
diff --git a/src/xps/SkXPSDevice.cpp b/src/xps/SkXPSDevice.cpp
index b8387b9206..9f1a9609c1 100644
--- a/src/xps/SkXPSDevice.cpp
+++ b/src/xps/SkXPSDevice.cpp
@@ -1877,7 +1877,7 @@ HRESULT SkXPSDevice::CreateTypefaceUse(const SkPaint& paint,
newTypefaceUse.xpsFont = xpsFontResource.release();
SkAutoGlyphCache agc(paint, &this->surfaceProps(), &SkMatrix::I());
- SkGlyphCache* glyphCache = agc.get();
+ SkGlyphCache* glyphCache = agc.getCache();
unsigned int glyphCount = glyphCache->getGlyphCount();
newTypefaceUse.glyphsUsed = new SkBitSet(glyphCount);
@@ -2064,7 +2064,7 @@ void SkXPSDevice::drawText(const void* text, size_t byteLen,
const SkMatrix& matrix = SkMatrix::I();
SkAutoGlyphCache autoCache(paint, &this->surfaceProps(), &matrix);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
// Advance width and offsets for glyphs measured in hundredths of the font em size
// (XPS Spec 5.1.3).
@@ -2122,7 +2122,7 @@ void SkXPSDevice::drawPosText(const void* text, size_t byteLen,
const SkMatrix& matrix = SkMatrix::I();
SkAutoGlyphCache autoCache(paint, &this->surfaceProps(), &matrix);
- SkGlyphCache* cache = autoCache.get();
+ SkGlyphCache* cache = autoCache.getCache();
// Advance width and offsets for glyphs measured in hundredths of the font em size
// (XPS Spec 5.1.3).