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

Unified Diff: src/gpu/GrStencilAndCoverPathRenderer.cpp

Issue 22686002: Implement path cover with nv_path_rendering (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebased to issue 23537028 Created 7 years, 3 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/GrStencilAndCoverPathRenderer.cpp
diff --git a/src/gpu/GrStencilAndCoverPathRenderer.cpp b/src/gpu/GrStencilAndCoverPathRenderer.cpp
index f7330a81f649246530ff3fa56162d83ecf3f854f..c59082c1ee6a651c1c29d686432419418647dad7 100644
--- a/src/gpu/GrStencilAndCoverPathRenderer.cpp
+++ b/src/gpu/GrStencilAndCoverPathRenderer.cpp
@@ -40,6 +40,7 @@ bool GrStencilAndCoverPathRenderer::canDrawPath(const SkPath& path,
bool antiAlias) const {
return stroke.isFillStyle() &&
!antiAlias && // doesn't do per-path AA, relies on the target having MSAA
+ !target->getDrawState().willEffectReadDstColor() && // not supported yet
Chris Dalton 2013/09/13 19:49:58 I don't think we need this constraint anymore. Wit
bsalomon 2013/09/13 20:25:28 Really? I think onDrawPath will have to handle thi
Kimmo Kinnunen 2013/09/18 07:52:38 I don't think there's code for this yet.. Left as
target->getDrawState().getStencil().isDisabled();
}
@@ -70,27 +71,24 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const SkPath& path,
SkAutoTUnref<GrPath> p(fGpu->createPath(path));
- SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(path.getFillType());
- target->stencilPath(p, stroke, nonInvertedFill);
-
- // TODO: Use built in cover operation rather than a rect draw. This will require making our
- // fragment shaders be able to eat varyings generated by a matrix.
-
- // fill the path, zero out the stencil
- SkRect bounds = p->getBounds();
- SkScalar bloat = drawState->getViewMatrix().getMaxStretch() * SK_ScalarHalf;
- GrDrawState::AutoViewMatrixRestore avmr;
-
- if (nonInvertedFill == path.getFillType()) {
+ if (!path.isInverseFillType()) {
GR_STATIC_CONST_SAME_STENCIL(kStencilPass,
- kZero_StencilOp,
- kZero_StencilOp,
- kNotEqual_StencilFunc,
- 0xffff,
- 0x0000,
- 0xffff);
+ kZero_StencilOp,
+ kZero_StencilOp,
+ kNotEqual_StencilFunc,
+ 0xffff,
+ 0x0000,
+ 0xffff);
+
*drawState->stencil() = kStencilPass;
+
+ target->drawPath(p, stroke, path.getFillType());
} else {
+ SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(path.getFillType());
+ target->stencilPath(p, stroke, nonInvertedFill);
+
+ GrDrawState::AutoViewMatrixRestore avmr;
+
GR_STATIC_CONST_SAME_STENCIL(kInvertedStencilPass,
kZero_StencilOp,
kZero_StencilOp,
@@ -101,23 +99,25 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const SkPath& path,
0xffff,
0x0000,
0xffff);
+
+
SkMatrix vmi;
- bounds.setLTRB(0, 0,
- SkIntToScalar(drawState->getRenderTarget()->width()),
- SkIntToScalar(drawState->getRenderTarget()->height()));
+ SkRect bounds = SkRect::MakeLTRB(0, 0,
+ SkIntToScalar(drawState->getRenderTarget()->width()),
+ SkIntToScalar(drawState->getRenderTarget()->height()));
// mapRect through persp matrix may not be correct
if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewInverse(&vmi)) {
vmi.mapRect(&bounds);
// theoretically could set bloat = 0, instead leave it because of matrix inversion
// precision.
+ SkScalar bloat = drawState->getViewMatrix().getMaxStretch() * SK_ScalarHalf;
+ bounds.outset(bloat, bloat);
} else {
avmr.setIdentity(drawState);
- bloat = 0;
}
*drawState->stencil() = kInvertedStencilPass;
+ target->drawSimpleRect(bounds, NULL);
}
- bounds.outset(bloat, bloat);
- target->drawSimpleRect(bounds, NULL);
target->drawState()->stencil()->setDisabled();
return true;
}

Powered by Google App Engine
This is Rietveld 408576698