diff options
author | 2016-04-11 07:51:07 -0700 | |
---|---|---|
committer | 2016-04-11 07:51:07 -0700 | |
commit | c79172857c3f69cc46837e1beeae0c1ead377bb2 (patch) | |
tree | 4e6eebf5b3b09e91c58287875d24f75d62850818 /src/core/SkScalerContext.cpp | |
parent | 6dc14aab5ea6be87b5b10f17a19737f586708768 (diff) |
Pass effects directly to fontcache
BUG=skia:5176
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1863013003
Review URL: https://codereview.chromium.org/1863013003
Diffstat (limited to 'src/core/SkScalerContext.cpp')
-rw-r--r-- | src/core/SkScalerContext.cpp | 55 |
1 files changed, 18 insertions, 37 deletions
diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp index cf4098bbdd..ad753dfd21 100644 --- a/src/core/SkScalerContext.cpp +++ b/src/core/SkScalerContext.cpp @@ -62,30 +62,14 @@ void SkGlyph::zeroMetrics() { #define DUMP_RECx #endif -static SkFlattenable* load_flattenable(const SkDescriptor* desc, uint32_t tag, - SkFlattenable::Type ft) { - SkFlattenable* obj = nullptr; - uint32_t len; - const void* data = desc->findEntry(tag, &len); - - if (data) { - SkReadBuffer buffer(data, len); - obj = buffer.readFlattenable(ft); - SkASSERT(buffer.offset() == buffer.size()); - } - return obj; -} - -SkScalerContext::SkScalerContext(SkTypeface* typeface, const SkDescriptor* desc) +SkScalerContext::SkScalerContext(SkTypeface* typeface, const SkScalerContextEffects& effects, + const SkDescriptor* desc) : fRec(*static_cast<const Rec*>(desc->findEntry(kRec_SkDescriptorTag, nullptr))) - , fTypeface(SkRef(typeface)) - , fPathEffect(static_cast<SkPathEffect*>(load_flattenable(desc, kPathEffect_SkDescriptorTag, - SkFlattenable::kSkPathEffect_Type))) - , fMaskFilter(static_cast<SkMaskFilter*>(load_flattenable(desc, kMaskFilter_SkDescriptorTag, - SkFlattenable::kSkMaskFilter_Type))) - , fRasterizer(static_cast<SkRasterizer*>(load_flattenable(desc, kRasterizer_SkDescriptorTag, - SkFlattenable::kSkRasterizer_Type))) + , fTypeface(sk_ref_sp(typeface)) + , fPathEffect(sk_ref_sp(effects.fPathEffect)) + , fMaskFilter(sk_ref_sp(effects.fMaskFilter)) + , fRasterizer(sk_ref_sp(effects.fRasterizer)) // Initialize based on our settings. Subclasses can also force this. , fGenerateImageFromPath(fRec.fFrameWidth > 0 || fPathEffect != nullptr || fRasterizer != nullptr) @@ -109,11 +93,7 @@ SkScalerContext::SkScalerContext(SkTypeface* typeface, const SkDescriptor* desc) #endif } -SkScalerContext::~SkScalerContext() { - SkSafeUnref(fPathEffect); - SkSafeUnref(fMaskFilter); - SkSafeUnref(fRasterizer); -} +SkScalerContext::~SkScalerContext() {} void SkScalerContext::getAdvance(SkGlyph* glyph) { // mark us as just having a valid advance @@ -156,7 +136,7 @@ void SkScalerContext::getMetrics(SkGlyph* glyph) { SkMask mask; if (fRasterizer->rasterize(fillPath, fillToDevMatrix, nullptr, - fMaskFilter, &mask, + fMaskFilter.get(), &mask, SkMask::kJustComputeBounds_CreateMode)) { glyph->fLeft = mask.fBounds.fLeft; glyph->fTop = mask.fBounds.fTop; @@ -485,10 +465,9 @@ void SkScalerContext::getImage(const SkGlyph& origGlyph) { tmpGlyph.initGlyphIdFrom(origGlyph); // need the original bounds, sans our maskfilter - SkMaskFilter* mf = fMaskFilter; - fMaskFilter = nullptr; // temp disable + SkMaskFilter* mf = fMaskFilter.release(); // temp disable this->getMetrics(&tmpGlyph); - fMaskFilter = mf; // restore + fMaskFilter = sk_sp<SkMaskFilter>(mf); // restore // we need the prefilter bounds to be <= filter bounds SkASSERT(tmpGlyph.fWidth <= origGlyph.fWidth); @@ -516,7 +495,7 @@ void SkScalerContext::getImage(const SkGlyph& origGlyph) { sk_bzero(glyph->fImage, mask.computeImageSize()); if (!fRasterizer->rasterize(fillPath, fillToDevMatrix, nullptr, - fMaskFilter, &mask, + fMaskFilter.get(), &mask, SkMask::kJustRenderImage_CreateMode)) { return; } @@ -851,8 +830,9 @@ SkAxisAlignment SkScalerContext::computeAxisAlignmentForHText() { class SkScalerContext_Empty : public SkScalerContext { public: - SkScalerContext_Empty(SkTypeface* face, const SkDescriptor* desc) - : SkScalerContext(face, desc) {} + SkScalerContext_Empty(SkTypeface* typeface, const SkScalerContextEffects& effects, + const SkDescriptor* desc) + : SkScalerContext(typeface, effects, desc) {} protected: unsigned generateGlyphCount() override { @@ -878,12 +858,13 @@ protected: extern SkScalerContext* SkCreateColorScalerContext(const SkDescriptor* desc); -SkScalerContext* SkTypeface::createScalerContext(const SkDescriptor* desc, +SkScalerContext* SkTypeface::createScalerContext(const SkScalerContextEffects& effects, + const SkDescriptor* desc, bool allowFailure) const { - SkScalerContext* c = this->onCreateScalerContext(desc); + SkScalerContext* c = this->onCreateScalerContext(effects, desc); if (!c && !allowFailure) { - c = new SkScalerContext_Empty(const_cast<SkTypeface*>(this), desc); + c = new SkScalerContext_Empty(const_cast<SkTypeface*>(this), effects, desc); } return c; } |