diff options
Diffstat (limited to 'tests/GpuDrawPathTest.cpp')
-rw-r--r-- | tests/GpuDrawPathTest.cpp | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/tests/GpuDrawPathTest.cpp b/tests/GpuDrawPathTest.cpp index f23f5ef8dc..3702a7cc3b 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 |