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