From 40ef48580b8bd47355ccf05e43d8032c10a77bbe Mon Sep 17 00:00:00 2001 From: bsalomon Date: Mon, 2 May 2016 13:22:13 -0700 Subject: When filling nested rect path check for empty inner and empty outer rects BUG=skia:5221 GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1936073003 Review-Url: https://codereview.chromium.org/1936073003 --- src/gpu/GrDrawContext.cpp | 7 +++--- src/gpu/batches/GrAAStrokeRectBatch.cpp | 39 +++++++++++++++++---------------- src/gpu/batches/GrAAStrokeRectBatch.h | 11 ++++------ src/gpu/batches/GrRectBatchFactory.cpp | 11 +++++++--- 4 files changed, 36 insertions(+), 32 deletions(-) (limited to 'src/gpu') diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp index af04f74fcf..6c80f52bba 100644 --- a/src/gpu/GrDrawContext.cpp +++ b/src/gpu/GrDrawContext.cpp @@ -822,9 +822,10 @@ void GrDrawContext::drawPath(const GrClip& clip, if (is_nested_rects(viewMatrix, path, strokeInfo, rects)) { SkAutoTUnref batch(GrRectBatchFactory::CreateAAFillNestedRects( paint.getColor(), viewMatrix, rects)); - - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); - this->getDrawTarget()->drawBatch(pipelineBuilder, batch); + if (batch) { + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget.get(), clip); + this->getDrawTarget()->drawBatch(pipelineBuilder, batch); + } return; } } diff --git a/src/gpu/batches/GrAAStrokeRectBatch.cpp b/src/gpu/batches/GrAAStrokeRectBatch.cpp index e4c40624cf..cc5440871f 100644 --- a/src/gpu/batches/GrAAStrokeRectBatch.cpp +++ b/src/gpu/batches/GrAAStrokeRectBatch.cpp @@ -580,15 +580,14 @@ static void compute_rects(SkRect* devOutside, SkRect* devOutsideAssist, SkRect* namespace GrAAStrokeRectBatch { -GrDrawBatch* Create(GrColor color, - const SkMatrix& viewMatrix, - const SkRect& devOutside, - const SkRect& devOutsideAssist, - const SkRect& devInside, - bool miterStroke, - bool degenerate) { - AAStrokeRectBatch* batch = AAStrokeRectBatch::Create(viewMatrix, miterStroke); - batch->append(color, devOutside, devOutsideAssist, devInside, degenerate); +GrDrawBatch* CreateFillBetweenRects(GrColor color, + const SkMatrix& viewMatrix, + const SkRect& devOutside, + const SkRect& devInside) { + SkASSERT(!devOutside.isEmpty()) + SkASSERT(!devInside.isEmpty()) + AAStrokeRectBatch* batch = AAStrokeRectBatch::Create(viewMatrix, true); + batch->append(color, devOutside, devOutside, devInside, false); batch->init(); return batch; } @@ -643,19 +642,21 @@ bool Append(GrBatch* origBatch, DRAW_BATCH_TEST_DEFINE(AAStrokeRectBatch) { bool miterStroke = random->nextBool(); - // Create mock stroke rect - SkRect outside = GrTest::TestRect(random); - SkScalar minDim = SkMinScalar(outside.width(), outside.height()); - SkScalar strokeWidth = minDim * 0.1f; - SkRect outsideAssist = outside; - outsideAssist.outset(strokeWidth, strokeWidth); - SkRect inside = outside; - inside.inset(strokeWidth, strokeWidth); + // Create either a empty rect or a non-empty rect. + SkRect rect = random->nextBool() ? SkRect::MakeXYWH(10, 10, 50, 40) : + SkRect::MakeXYWH(6, 7, 0, 0); + SkScalar minDim = SkMinScalar(rect.width(), rect.height()); + SkScalar strokeWidth = random->nextUScalar1() * minDim; GrColor color = GrRandomColor(random); - return GrAAStrokeRectBatch::Create(color, GrTest::TestMatrix(random), outside, outsideAssist, - inside, miterStroke, inside.isFinite() && inside.isEmpty()); + SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); + rec.setStrokeStyle(strokeWidth); + rec.setStrokeParams(SkPaint::kButt_Cap, + miterStroke ? SkPaint::kMiter_Join : SkPaint::kBevel_Join, + 1.f); + SkMatrix matrix = GrTest::TestMatrixRectStaysRect(random); + return GrAAStrokeRectBatch::Create(color, matrix, rect, rec); } #endif diff --git a/src/gpu/batches/GrAAStrokeRectBatch.h b/src/gpu/batches/GrAAStrokeRectBatch.h index 4959232bab..e0069a1feb 100644 --- a/src/gpu/batches/GrAAStrokeRectBatch.h +++ b/src/gpu/batches/GrAAStrokeRectBatch.h @@ -19,13 +19,10 @@ class SkStrokeRec; namespace GrAAStrokeRectBatch { -GrDrawBatch* Create(GrColor color, - const SkMatrix& viewMatrix, - const SkRect& devOutside, - const SkRect& devOutsideAssist, - const SkRect& devInside, - bool miterStroke, - bool degenerate); +GrDrawBatch* CreateFillBetweenRects(GrColor color, + const SkMatrix& viewMatrix, + const SkRect& devOutside, + const SkRect& devInside); GrDrawBatch* Create(GrColor color, const SkMatrix& viewMatrix, diff --git a/src/gpu/batches/GrRectBatchFactory.cpp b/src/gpu/batches/GrRectBatchFactory.cpp index f144d1b532..d2ba7f4442 100644 --- a/src/gpu/batches/GrRectBatchFactory.cpp +++ b/src/gpu/batches/GrRectBatchFactory.cpp @@ -22,9 +22,14 @@ GrDrawBatch* CreateAAFillNestedRects(GrColor color, SkRect devOutside, devInside; viewMatrix.mapRect(&devOutside, rects[0]); viewMatrix.mapRect(&devInside, rects[1]); - - return GrAAStrokeRectBatch::Create(color, viewMatrix, devOutside, devOutside, devInside, true, - devInside.isEmpty()); + if (devInside.isEmpty()) { + if (devOutside.isEmpty()) { + return nullptr; + } + return GrAAFillRectBatch::Create(color, viewMatrix, devOutside, devOutside); + } + + return GrAAStrokeRectBatch::CreateFillBetweenRects(color, viewMatrix, devOutside, devInside); } }; -- cgit v1.2.3