diff options
-rw-r--r-- | src/gpu/GrDrawContext.cpp | 7 | ||||
-rw-r--r-- | src/gpu/batches/GrAAStrokeRectBatch.cpp | 39 | ||||
-rw-r--r-- | src/gpu/batches/GrAAStrokeRectBatch.h | 11 | ||||
-rw-r--r-- | src/gpu/batches/GrRectBatchFactory.cpp | 11 | ||||
-rw-r--r-- | tests/skbug5221.cpp | 33 |
5 files changed, 69 insertions, 32 deletions
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<GrDrawBatch> 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); } }; diff --git a/tests/skbug5221.cpp b/tests/skbug5221.cpp new file mode 100644 index 0000000000..45847eeac1 --- /dev/null +++ b/tests/skbug5221.cpp @@ -0,0 +1,33 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "Test.h" +#include "SkCanvas.h" +#include "SkSurface.h" + +// This passes by not crashing. +static void test(SkCanvas* canvas) { + SkPaint paint; + paint.setAntiAlias(true); + canvas->scale(63, 0); + static const char kTxt[] = "A"; + canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt), 50, 50, paint); +} + +DEF_TEST(skbug5221, r) { + sk_sp<SkSurface> surface(SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(256, 256))); + test(surface->getCanvas()); +} + +#if SK_SUPPORT_GPU +DEF_GPUTEST_FOR_ALL_CONTEXTS(skbug5221_GPU, r, contextInfo) { + sk_sp<SkSurface> surface(SkSurface::MakeRenderTarget(contextInfo.fGrContext, SkBudgeted::kYes, + SkImageInfo::MakeN32Premul(256, 256), 0, + nullptr)); + test(surface->getCanvas()); +} +#endif |