Fixups for clipstack, convexity test for paths.
Review URL http://codereview.appspot.com/4250056/
git-svn-id: http://skia.googlecode.com/svn/trunk@891 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrPathRenderer.cpp b/gpu/src/GrPathRenderer.cpp
index 3e2b4b3..6d7aabb 100644
--- a/gpu/src/GrPathRenderer.cpp
+++ b/gpu/src/GrPathRenderer.cpp
@@ -240,22 +240,22 @@
bool first = true;
- GrPathIter::Command cmd;
+ GrPathCmd cmd;
GrPoint pts[4];
- while ((cmd = path->next(pts)) != GrPathIter::kEnd_Command) {
+ while ((cmd = path->next(pts)) != kEnd_PathCmd) {
switch (cmd) {
- case GrPathIter::kLine_Command:
+ case kLine_PathCmd:
pointCount += 1;
break;
- case GrPathIter::kQuadratic_Command:
+ case kQuadratic_PathCmd:
pointCount += quadratic_point_count(pts, tol);
break;
- case GrPathIter::kCubic_Command:
+ case kCubic_PathCmd:
pointCount += cubic_point_count(pts, tol);
break;
- case GrPathIter::kMove_Command:
+ case kMove_PathCmd:
pointCount += 1;
if (!first) {
++(*subpaths);
@@ -269,21 +269,21 @@
return pointCount;
}
-static inline bool single_pass_path(const GrPathIter& path,
- GrPathFill fill,
- const GrDrawTarget& target) {
+static inline bool single_pass_path(const GrDrawTarget& target,
+ const GrPathIter& path,
+ GrPathFill fill) {
#if STENCIL_OFF
return true;
#else
if (kEvenOdd_PathFill == fill) {
- GrPathIter::ConvexHint hint = path.convexHint();
- return hint == GrPathIter::kConvex_ConvexHint ||
- hint == GrPathIter::kNonOverlappingConvexPieces_ConvexHint;
+ GrConvexHint hint = path.convexHint();
+ return hint == kConvex_ConvexHint ||
+ hint == kNonOverlappingConvexPieces_ConvexHint;
} else if (kWinding_PathFill == fill) {
- GrPathIter::ConvexHint hint = path.convexHint();
- return hint == GrPathIter::kConvex_ConvexHint ||
- hint == GrPathIter::kNonOverlappingConvexPieces_ConvexHint ||
- (hint == GrPathIter::kSameWindingConvexPieces_ConvexHint &&
+ GrConvexHint hint = path.convexHint();
+ return hint == kConvex_ConvexHint ||
+ hint == kNonOverlappingConvexPieces_ConvexHint ||
+ (hint == kSameWindingConvexPieces_ConvexHint &&
target.canDisableBlend() && !target.isDitherState());
}
@@ -291,6 +291,12 @@
#endif
}
+bool GrDefaultPathRenderer::requiresStencilPass(const GrDrawTarget* target,
+ GrPathIter* path,
+ GrPathFill fill) const {
+ return single_pass_path(*target, *path, fill);
+}
+
void GrDefaultPathRenderer::drawPathHelper(GrDrawTarget* target,
GrDrawTarget::StageBitfield stages,
GrPathIter* path,
@@ -358,18 +364,18 @@
if (stencilOnly) {
passes[0] = &gDirectToStencil;
} else {
- passes[0] = &GrStencilSettings::gDisabled;
+ passes[0] = NULL;
}
lastPassIsBounds = false;
drawFace[0] = GrDrawTarget::kBoth_DrawFace;
} else {
type = kTriangleFan_PrimitiveType;
- if (single_pass_path(*path, fill, *target)) {
+ if (single_pass_path(*target, *path, fill)) {
passCount = 1;
if (stencilOnly) {
passes[0] = &gDirectToStencil;
} else {
- passes[0] = &GrStencilSettings::gDisabled;
+ passes[0] = NULL;
}
drawFace[0] = GrDrawTarget::kBoth_DrawFace;
lastPassIsBounds = false;
@@ -446,9 +452,9 @@
int subpath = 0;
for (;;) {
- GrPathIter::Command cmd = path->next(pts);
+ GrPathCmd cmd = path->next(pts);
switch (cmd) {
- case GrPathIter::kMove_Command:
+ case kMove_PathCmd:
if (!first) {
subpathVertCount[subpath] = vert-subpathBase;
subpathBase = vert;
@@ -457,25 +463,25 @@
*vert = pts[0];
vert++;
break;
- case GrPathIter::kLine_Command:
+ case kLine_PathCmd:
*vert = pts[1];
vert++;
break;
- case GrPathIter::kQuadratic_Command: {
+ case kQuadratic_PathCmd: {
generate_quadratic_points(pts[0], pts[1], pts[2],
tolSqd, &vert,
quadratic_point_count(pts, tol));
break;
}
- case GrPathIter::kCubic_Command: {
+ case kCubic_PathCmd: {
generate_cubic_points(pts[0], pts[1], pts[2], pts[3],
tolSqd, &vert,
cubic_point_count(pts, tol));
break;
}
- case GrPathIter::kClose_Command:
+ case kClose_PathCmd:
break;
- case GrPathIter::kEnd_Command:
+ case kEnd_PathCmd:
subpathVertCount[subpath] = vert-subpathBase;
++subpath; // this could be only in debug
goto FINISHED;
@@ -519,7 +525,9 @@
for (int p = 0; p < passCount; ++p) {
target->setDrawFace(drawFace[p]);
- target->setStencil(*passes[p]);
+ if (NULL != passes[p]) {
+ target->setStencil(*passes[p]);
+ }
if (lastPassIsBounds && (p == passCount-1)) {
if (!colorWritesWereDisabled) {