Sniff out rects, ovals & rrects in SkGpuDevice::drawPath
Review URL: https://codereview.chromium.org/1468423002
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp
index 9da4ea8..b017b50 100644
--- a/src/gpu/GrDrawContext.cpp
+++ b/src/gpu/GrDrawContext.cpp
@@ -243,13 +243,8 @@
RETURN_IF_ABANDONED
SkDEBUGCODE(this->validate();)
- if (strokeInfo && strokeInfo->isDashed()) {
- SkPath path;
- path.setIsVolatile(true);
- path.addRect(rect);
- this->drawPath(clip, paint, viewMatrix, path, *strokeInfo);
- return;
- }
+ // Dashing should've been devolved to a path in SkGpuDevice
+ SkASSERT(!strokeInfo || !strokeInfo->isDashed());
AutoCheckFlush acf(fDrawingManager);
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index b8630e5..803f8a0 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -469,8 +469,7 @@
///////////////////////////////////////////////////////////////////////////////
-void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect,
- const SkPaint& paint) {
+void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect, const SkPaint& paint) {
GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawRect", fContext);
CHECK_FOR_ANNOTATION(paint);
@@ -488,7 +487,7 @@
(paint.getStrokeJoin() == SkPaint::kBevel_Join && rect.isEmpty()));
// a few other reasons we might need to call drawPath...
- if (paint.getMaskFilter() ||
+ if (paint.getMaskFilter() || paint.getPathEffect() ||
paint.getStyle() == SkPaint::kStrokeAndFill_Style) { // we can't both stroke and fill rects
usePath = true;
}
@@ -497,18 +496,14 @@
usePath = true;
}
- GrStrokeInfo strokeInfo(paint);
-
- const SkPathEffect* pe = paint.getPathEffect();
- if (!usePath && pe && !strokeInfo.isDashed()) {
- usePath = true;
- }
-
if (usePath) {
SkPath path;
path.setIsVolatile(true);
path.addRect(rect);
- this->drawPath(draw, path, paint, nullptr, true);
+ GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, fRenderTarget,
+ fClip, path, paint,
+ *draw.fMatrix, nullptr,
+ draw.fClip->getBounds(), true);
return;
}
@@ -517,6 +512,8 @@
return;
}
+ GrStrokeInfo strokeInfo(paint);
+
fDrawContext->drawRect(fClip, grPaint, *draw.fMatrix, rect, &strokeInfo);
}
@@ -564,14 +561,19 @@
}
}
-
}
if (paint.getMaskFilter() || paint.getPathEffect()) {
+ // The only mask filter the native rrect drawing code could've handle was taken
+ // care of above.
+ // A path effect will presumably transform this rrect into something else.
SkPath path;
path.setIsVolatile(true);
path.addRRect(rect);
- this->drawPath(draw, path, paint, nullptr, true);
+ GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, fRenderTarget,
+ fClip, path, paint,
+ *draw.fMatrix, nullptr,
+ draw.fClip->getBounds(), true);
return;
}
@@ -656,6 +658,24 @@
void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath,
const SkPaint& paint, const SkMatrix* prePathMatrix,
bool pathIsMutable) {
+ if (!origSrcPath.isInverseFillType() && !paint.getPathEffect() && !prePathMatrix) {
+ bool isClosed;
+ SkRect rect;
+ if (origSrcPath.isRect(&rect, &isClosed) && isClosed) {
+ this->drawRect(draw, rect, paint);
+ return;
+ }
+ if (origSrcPath.isOval(&rect)) {
+ this->drawOval(draw, rect, paint);
+ return;
+ }
+ SkRRect rrect;
+ if (origSrcPath.isRRect(&rrect)) {
+ this->drawRRect(draw, rrect, paint);
+ return;
+ }
+ }
+
CHECK_FOR_ANNOTATION(paint);
CHECK_SHOULD_DRAW(draw);
GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPath", fContext);