Fix a crash on stroking empty paths with nv_path_rendering enabled
Fix the crash by defining that GrPathRenderer::drawPath and
GrPathRenderer::stencilPath are called only with non-empty paths.
Adds a new test "GpuDrawPath" and tests the condition.
BUG=1477
R=bsalomon@google.com
Author: kkinnunen@nvidia.com
Review URL: https://chromiumcodereview.appspot.com/22173002
git-svn-id: http://skia.googlecode.com/svn/trunk@10528 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/GpuDrawPathTest.cpp b/tests/GpuDrawPathTest.cpp
new file mode 100644
index 0000000..3ec87d4
--- /dev/null
+++ b/tests/GpuDrawPathTest.cpp
@@ -0,0 +1,78 @@
+
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#if SK_SUPPORT_GPU
+
+#include "GrContext.h"
+#include "GrContextFactory.h"
+#include "SkBitmap.h"
+#include "SkCanvas.h"
+#include "SkColor.h"
+#include "SkGpuDevice.h"
+#include "SkPaint.h"
+#include "SkRect.h"
+#include "SkRRect.h"
+#include "Test.h"
+
+static void test_drawPathEmpty(skiatest::Reporter*, SkCanvas* canvas)
+{
+ // Filling an empty path should not crash.
+ SkPaint paint;
+ canvas->drawRect(SkRect(), paint);
+ canvas->drawPath(SkPath(), paint);
+ canvas->drawOval(SkRect(), paint);
+ canvas->drawRect(SkRect(), paint);
+ canvas->drawRRect(SkRRect(), paint);
+
+ // Stroking an empty path should not crash.
+ paint.setAntiAlias(true);
+ paint.setStyle(SkPaint::kStroke_Style);
+ paint.setColor(SK_ColorGRAY);
+ paint.setStrokeWidth(SkIntToScalar(20));
+ paint.setStrokeJoin(SkPaint::kRound_Join);
+ canvas->drawRect(SkRect(), paint);
+ canvas->drawPath(SkPath(), paint);
+ canvas->drawOval(SkRect(), paint);
+ canvas->drawRect(SkRect(), paint);
+ canvas->drawRRect(SkRRect(), paint);
+}
+
+
+static void TestGpuDrawPath(skiatest::Reporter* reporter, GrContextFactory* factory) {
+ for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) {
+ GrContextFactory::GLContextType glType = static_cast<GrContextFactory::GLContextType>(type);
+
+ GrContext* grContext = factory->get(glType);
+ if (NULL == grContext) {
+ continue;
+ }
+ static const int sampleCounts[] = { 0, 4, 16 };
+
+ for (size_t i = 0; i < SK_ARRAY_COUNT(sampleCounts); ++i) {
+ const int W = 255;
+ const int H = 255;
+
+ GrTextureDesc desc;
+ desc.fConfig = kSkia8888_GrPixelConfig;
+ desc.fFlags = kRenderTarget_GrTextureFlagBit;
+ desc.fWidth = W;
+ desc.fHeight = H;
+ desc.fSampleCnt = sampleCounts[i];
+ SkAutoTUnref<GrTexture> texture(grContext->createUncachedTexture(desc, NULL, 0));
+ SkAutoTUnref<SkGpuDevice> device(SkNEW_ARGS(SkGpuDevice, (grContext, texture.get())));
+ SkCanvas drawingCanvas(device.get());
+
+ test_drawPathEmpty(reporter, &drawingCanvas);
+ }
+ }
+}
+
+#include "TestClassDef.h"
+DEFINE_GPUTESTCLASS("GpuDrawPath", TestGpuDrawPathClass, TestGpuDrawPath)
+
+#endif