From a7d85ba138ee09739defbd277b04c479fdef82a6 Mon Sep 17 00:00:00 2001 From: bsalomon Date: Wed, 6 Jul 2016 11:54:59 -0700 Subject: 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 --- gm/stroke_rect_shader.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 gm/stroke_rect_shader.cpp (limited to 'gm/stroke_rect_shader.cpp') diff --git a/gm/stroke_rect_shader.cpp b/gm/stroke_rect_shader.cpp new file mode 100644 index 0000000000..0eb09e9a6f --- /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 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); + } +} + +} -- cgit v1.2.3