Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(263)

Unified Diff: src/gpu/GrStencilAndCoverTextContext.cpp

Issue 1116123003: Improve caching of dashed paths in GrStencilAndCoverPathRenderer (Closed) Base URL: https://skia.googlesource.com/skia.git@dashing-nvpr-01
Patch Set: . Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/GrStencilAndCoverTextContext.cpp
diff --git a/src/gpu/GrStencilAndCoverTextContext.cpp b/src/gpu/GrStencilAndCoverTextContext.cpp
index a2abfa7fa98bb8df5ab0e680d83392071a35bac4..ed7236888db74d97d73beb7ad5c1e3f4e46c4a7b 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,7 +222,7 @@ void GrStencilAndCoverTextContext::onDrawPosText(GrRenderTarget* rt,
static GrPathRange* get_gr_glyphs(GrContext* ctx,
const SkTypeface* typeface,
const SkDescriptor* desc,
- const SkStrokeRec& stroke) {
+ const GrStrokeInfo& stroke) {
static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
GrUniqueKey key;
GrUniqueKey::Builder builder(&key, kDomain, 4);
@@ -273,7 +275,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,21 +300,22 @@ 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);
+ SkStrokeRec* strokeRec = fStroke.getStrokeRecPtr();
fSkPaint.setStyle(SkPaint::kFill_Style);
- if (fStroke.isHairlineStyle()) {
+ if (strokeRec->isHairlineStyle()) {
// Approximate hairline stroke.
SkScalar strokeWidth = SK_Scalar1 /
(SkVector::Make(fContextInitialMatrix.getScaleX(),
fContextInitialMatrix.getSkewY()).length());
- fStroke.setStrokeStyle(strokeWidth, false /*strokeAndFill*/);
+ strokeRec->setStrokeStyle(strokeWidth, false /*strokeAndFill*/);
} else if (fSkPaint.isFakeBoldText() &&
#ifdef SK_USE_FREETYPE_EMBOLDEN
kMaxPerformance_RenderMode == renderMode &&
#endif
- SkStrokeRec::kStroke_Style != fStroke.getStyle()) {
+ SkStrokeRec::kStroke_Style != strokeRec->getStyle()) {
// Instead of baking fake bold into the glyph outlines, do it with the GPU stroke.
SkScalar fakeBoldScale = SkScalarInterpFunc(fSkPaint.getTextSize(),
@@ -320,23 +323,22 @@ void GrStencilAndCoverTextContext::init(GrRenderTarget* rt,
kStdFakeBoldInterpValues,
kStdFakeBoldInterpLength);
SkScalar extra = SkScalarMul(fSkPaint.getTextSize(), fakeBoldScale);
- fStroke.setStrokeStyle(fStroke.needToApply() ? fStroke.getWidth() + extra : extra,
+ strokeRec->setStrokeStyle(strokeRec->needToApply() ? strokeRec->getWidth() + extra : extra,
true /*strokeAndFill*/);
fSkPaint.setFakeBoldText(false);
}
bool canUseRawPaths;
-
- if (otherBackendsWillDrawAsPaths || kMaxPerformance_RenderMode == renderMode) {
+ if (!fStroke.isDashed() && (otherBackendsWillDrawAsPaths || kMaxPerformance_RenderMode == renderMode)) {
egdaniel 2015/05/05 19:48:44 100 chars
Kimmo Kinnunen 2015/05/06 08:30:25 Done.
// We can draw the glyphs from canonically sized paths.
fTextRatio = fSkPaint.getTextSize() / SkPaint::kCanonicalTextSizeForPaths;
fTextInverseRatio = SkPaint::kCanonicalTextSizeForPaths / fSkPaint.getTextSize();
// Compensate for the glyphs being scaled by fTextRatio.
- if (!fStroke.isFillStyle()) {
- fStroke.setStrokeStyle(fStroke.getWidth() / fTextRatio,
- SkStrokeRec::kStrokeAndFill_Style == fStroke.getStyle());
+ if (!strokeRec->isFillStyle()) {
+ strokeRec->setStrokeStyle(strokeRec->getWidth() / fTextRatio,
+ SkStrokeRec::kStrokeAndFill_Style == strokeRec->getStyle());
}
fSkPaint.setLinearText(true);
@@ -448,7 +450,7 @@ void GrStencilAndCoverTextContext::flush() {
SkPaint skPaintFallback(fSkPaint);
if (!fUsingDeviceSpaceGlyphs) {
- fStroke.applyToPaint(&skPaintFallback);
+ fStroke.getStrokeRecPtr()->applyToPaint(&skPaintFallback);
}
skPaintFallback.setTextAlign(SkPaint::kLeft_Align); // Align has already been accounted for.
skPaintFallback.setTextEncoding(SkPaint::kGlyphID_TextEncoding);

Powered by Google App Engine
This is Rietveld 408576698