Add gm that tests shaded stroked rectangles.

Fix GPU handling of previously untested cases.

Move rect->path fallback from SkGpuDevice to GrDrawContext.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2125663003

Review-Url: https://codereview.chromium.org/2125663003
diff --git a/gm/stroke_rect_shader.cpp b/gm/stroke_rect_shader.cpp
new file mode 100644
index 0000000..0eb09e9
--- /dev/null
+++ b/gm/stroke_rect_shader.cpp
@@ -0,0 +1,61 @@
+/*
+ * 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 "gm.h"
+#include "SkGradientShader.h"
+
+namespace skiagm {
+
+// Draw stroked rects (both AA and nonAA) with all the types of joins:
+//    bevel, miter, miter-limited-to-bevel, round
+// and as a hairline.
+DEF_SIMPLE_GM(stroke_rect_shader, canvas, 690, 300) {
+    static constexpr SkRect kRect {0, 0, 100, 100};
+    static constexpr SkPoint kPts[] {{kRect.fLeft, kRect.fTop}, {kRect.fRight, kRect.fBottom}};
+    static constexpr SkColor kColors[] {SK_ColorRED, SK_ColorBLUE};
+    SkPaint paint;
+    sk_sp<SkShader> shader = SkGradientShader::MakeLinear(kPts, kColors, nullptr, 2,
+                                                          SkShader::kClamp_TileMode);
+    paint.setShader(std::move(shader));
+    paint.setStyle(SkPaint::kStroke_Style);
+    // Do a large initial translate so that local coords disagree with device coords significantly
+    // for the first rect drawn.
+    canvas->translate(kRect.centerX(), kRect.centerY());
+    static constexpr SkScalar kPad = 20;
+    for (auto aa : {false, true}) {
+        paint.setAntiAlias(aa);
+        canvas->save();
+
+        static constexpr SkScalar kStrokeWidth = 10;
+        paint.setStrokeWidth(kStrokeWidth);
+
+        paint.setStrokeJoin(SkPaint::kBevel_Join);
+        canvas->drawRect(kRect, paint);
+        canvas->translate(kRect.width() + kPad, 0);
+
+        paint.setStrokeJoin(SkPaint::kMiter_Join);
+        canvas->drawRect(kRect, paint);
+        canvas->translate(kRect.width() + kPad, 0);
+
+        // This miter limit should effectively produce a bevel join.
+        paint.setStrokeMiter(0.01f);
+        canvas->drawRect(kRect, paint);
+        canvas->translate(kRect.width() + kPad, 0);
+
+        paint.setStrokeJoin(SkPaint::kRound_Join);
+        canvas->drawRect(kRect, paint);
+        canvas->translate(kRect.width() + kPad, 0);
+
+        paint.setStrokeWidth(0);
+        canvas->drawRect(kRect, paint);
+
+        canvas->restore();
+        canvas->translate(0, kRect.height() + kPad);
+    }
+}
+
+}