Chromium Code Reviews| Index: src/gpu/GrStencilAndCoverTextContext.cpp |
| diff --git a/src/gpu/GrStencilAndCoverTextContext.cpp b/src/gpu/GrStencilAndCoverTextContext.cpp |
| index a2abfa7fa98bb8df5ab0e680d83392071a35bac4..87dfbdef060ec7f42b2af6bd4ea0cbb7543c7250 100644 |
| --- a/src/gpu/GrStencilAndCoverTextContext.cpp |
| +++ b/src/gpu/GrStencilAndCoverTextContext.cpp |
| @@ -55,8 +55,10 @@ bool GrStencilAndCoverTextContext::canDraw(const GrRenderTarget* rt, |
| if (skPaint.getMaskFilter()) { |
| return false; |
| } |
| - if (skPaint.getPathEffect()) { |
| - return false; |
| + if (SkPathEffect* pe = skPaint.getPathEffect()) { |
| + if (pe->asADash(NULL) != SkPathEffect::kDash_DashType) { |
| + return false; |
| + } |
| } |
| // No hairlines unless we can map the 1 px width to the object space. |
| @@ -220,26 +222,25 @@ void GrStencilAndCoverTextContext::onDrawPosText(GrRenderTarget* rt, |
| static GrPathRange* get_gr_glyphs(GrContext* ctx, |
| const SkTypeface* typeface, |
| const SkDescriptor* desc, |
| - const SkStrokeRec& stroke) { |
| - static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); |
| - GrUniqueKey key; |
| - GrUniqueKey::Builder builder(&key, kDomain, 4); |
| - struct GlyphKey { |
| - uint32_t fChecksum; |
| - uint32_t fTypeface; |
| - uint64_t fStroke; |
| - }; |
| - GlyphKey* glyphKey = reinterpret_cast<GlyphKey*>(&builder[0]); |
| - glyphKey->fChecksum = desc ? desc->getChecksum() : 0; |
| - glyphKey->fTypeface = typeface ? typeface->uniqueID() : 0; |
| - glyphKey->fStroke = GrPath::ComputeStrokeKey(stroke); |
| + const GrStrokeInfo& stroke) { |
| + |
| + static const GrUniqueKey::Domain kPathGlyphDomain = GrUniqueKey::GenerateDomain(); |
| + GrUniqueKey glyphKey; |
| + GrUniqueKey::Builder builder(&glyphKey, kPathGlyphDomain, |
| + 2 + stroke.computeUniqueKeyFragmentData32Cnt()); |
| + reinterpret_cast<uint32_t&>(builder[0]) = desc ? desc->getChecksum() : 0; |
| + reinterpret_cast<uint32_t&>(builder[1]) = typeface ? typeface->uniqueID() : 0; |
| + stroke.asUniqueKeyFragment(&builder[2]); |
|
egdaniel
2015/05/15 15:28:53
Same with asserting computeUKFD32C is not zero
Kimmo Kinnunen
2015/05/18 06:48:40
Done.
|
| builder.finish(); |
| SkAutoTUnref<GrPathRange> glyphs( |
| - static_cast<GrPathRange*>(ctx->resourceProvider()->findAndRefResourceByUniqueKey(key))); |
| - if (NULL == glyphs || (NULL != desc && !glyphs->isEqualTo(*desc))) { |
| + static_cast<GrPathRange*>( |
| + ctx->resourceProvider()->findAndRefResourceByUniqueKey(glyphKey))); |
| + if (NULL == glyphs) { |
| glyphs.reset(ctx->getGpu()->pathRendering()->createGlyphs(typeface, desc, stroke)); |
| - ctx->resourceProvider()->assignUniqueKeyToResource(key, glyphs); |
| + ctx->resourceProvider()->assignUniqueKeyToResource(glyphKey, glyphs); |
| + } else { |
| + SkASSERT(NULL == desc || glyphs->isEqualTo(*desc)); |
| } |
| return glyphs.detach(); |
| @@ -273,7 +274,7 @@ void GrStencilAndCoverTextContext::init(GrRenderTarget* rt, |
| // The whole shape (including stroke) will be baked into the glyph outlines. Make |
| // NVPR just fill the baked shapes. |
| - fStroke = SkStrokeRec(SkStrokeRec::kFill_InitStyle); |
| + fStroke = GrStrokeInfo(SkStrokeRec::kFill_InitStyle); |
| fTextRatio = fTextInverseRatio = 1.0f; |
| @@ -298,7 +299,7 @@ void GrStencilAndCoverTextContext::init(GrRenderTarget* rt, |
| } else { |
| // Don't bake strokes into the glyph outlines. We will stroke the glyphs |
| // using the GPU instead. This is the fast path. |
| - fStroke = SkStrokeRec(fSkPaint); |
| + fStroke = GrStrokeInfo(fSkPaint); |
| fSkPaint.setStyle(SkPaint::kFill_Style); |
| if (fStroke.isHairlineStyle()) { |
| @@ -327,8 +328,8 @@ void GrStencilAndCoverTextContext::init(GrRenderTarget* rt, |
| } |
| bool canUseRawPaths; |
| - |
| - if (otherBackendsWillDrawAsPaths || kMaxPerformance_RenderMode == renderMode) { |
| + if (!fStroke.isDashed() && (otherBackendsWillDrawAsPaths || |
| + kMaxPerformance_RenderMode == renderMode)) { |
| // We can draw the glyphs from canonically sized paths. |
| fTextRatio = fSkPaint.getTextSize() / SkPaint::kCanonicalTextSizeForPaths; |
| fTextInverseRatio = SkPaint::kCanonicalTextSizeForPaths / fSkPaint.getTextSize(); |