Index: tests/GpuDrawPathTest.cpp |
diff --git a/tests/GpuDrawPathTest.cpp b/tests/GpuDrawPathTest.cpp |
index f23f5ef8dcee4d5864f9dc1646eccd7340fb1633..3702a7cc3b03ee45e2c4673efa7b73b43155a2bc 100644 |
--- a/tests/GpuDrawPathTest.cpp |
+++ b/tests/GpuDrawPathTest.cpp |
@@ -15,6 +15,8 @@ |
#include "SkCanvas.h" |
#include "SkColor.h" |
#include "SkPaint.h" |
+#include "SkPath.h" |
+#include "SkDashPathEffect.h" |
#include "SkRRect.h" |
#include "SkRect.h" |
#include "SkSurface.h" |
@@ -23,11 +25,12 @@ |
static void test_drawPathEmpty(skiatest::Reporter*, SkCanvas* canvas) { |
// Filling an empty path should not crash. |
SkPaint paint; |
- canvas->drawRect(SkRect(), paint); |
+ SkRect emptyRect = SkRect::MakeEmpty(); |
+ canvas->drawRect(emptyRect, paint); |
canvas->drawPath(SkPath(), paint); |
- canvas->drawOval(SkRect(), paint); |
- canvas->drawRect(SkRect(), paint); |
- canvas->drawRRect(SkRRect(), paint); |
+ canvas->drawOval(emptyRect, paint); |
+ canvas->drawRect(emptyRect, paint); |
+ canvas->drawRRect(SkRRect::MakeRect(emptyRect), paint); |
// Stroking an empty path should not crash. |
paint.setAntiAlias(true); |
@@ -35,15 +38,44 @@ static void test_drawPathEmpty(skiatest::Reporter*, SkCanvas* canvas) { |
paint.setColor(SK_ColorGRAY); |
paint.setStrokeWidth(SkIntToScalar(20)); |
paint.setStrokeJoin(SkPaint::kRound_Join); |
- canvas->drawRect(SkRect(), paint); |
+ canvas->drawRect(emptyRect, paint); |
canvas->drawPath(SkPath(), paint); |
- canvas->drawOval(SkRect(), paint); |
- canvas->drawRect(SkRect(), paint); |
- canvas->drawRRect(SkRRect(), paint); |
+ canvas->drawOval(emptyRect, paint); |
+ canvas->drawRect(emptyRect, paint); |
+ canvas->drawRRect(SkRRect::MakeRect(emptyRect), paint); |
} |
+static void fill_and_stroke(SkCanvas* canvas, const SkPath& p1, const SkPath& p2, |
+ SkPathEffect* effect) { |
+ SkPaint paint; |
+ paint.setAntiAlias(true); |
+ paint.setPathEffect(effect); |
+ |
+ canvas->drawPath(p1, paint); |
+ canvas->drawPath(p2, paint); |
+ |
+ paint.setStyle(SkPaint::kStroke_Style); |
+ canvas->drawPath(p1, paint); |
+ canvas->drawPath(p2, paint); |
+} |
+ |
+static void test_drawSameRectOvals(skiatest::Reporter*, SkCanvas* canvas) { |
+ // Drawing ovals with similar bounds but different points order should not crash. |
+ |
+ SkPath oval1, oval2; |
+ const SkRect rect = SkRect::MakeWH(100, 50); |
+ oval1.addOval(rect, SkPath::kCW_Direction); |
+ oval2.addOval(rect, SkPath::kCCW_Direction); |
+ |
+ fill_and_stroke(canvas, oval1, oval2, nullptr); |
+ |
+ const SkScalar intervals[] = { 1, 1 }; |
+ SkAutoTUnref<SkPathEffect> dashEffect(SkDashPathEffect::Create(intervals, 2, 0)); |
+ fill_and_stroke(canvas, oval1, oval2, dashEffect); |
+} |
DEF_GPUTEST(GpuDrawPath, reporter, factory) { |
+ // https://bugs.chromium.org/p/skia/issues/detail?id=4581 |
return; |
for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) { |
@@ -66,4 +98,16 @@ DEF_GPUTEST(GpuDrawPath, reporter, factory) { |
} |
} |
+DEF_GPUTEST(GpuDrawPathSameRectOvals, reporter, factory) { |
+ GrContext* grContext = factory->get(GrContextFactory::kNVPR_GLContextType); |
+ if (!grContext) { |
+ return; |
+ } |
+ |
+ SkAutoTUnref<SkSurface> surface( |
+ SkSurface::NewRenderTarget(grContext, SkSurface::kNo_Budgeted, |
+ SkImageInfo::MakeN32Premul(255, 255), 4)); |
+ test_drawSameRectOvals(reporter, surface->getCanvas()); |
+} |
+ |
#endif |