1a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon/*
2a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon * Copyright 2016 Google Inc.
3a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon *
4a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon * Use of this source code is governed by a BSD-style license that can be
5a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon * found in the LICENSE file.
6a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon */
7a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
8a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon#include "gm.h"
9a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon#include "SkGradientShader.h"
10a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
11a7d85ba138ee09739defbd277b04c479fdef82a6bsalomonnamespace skiagm {
12a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
13a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon// Draw stroked rects (both AA and nonAA) with all the types of joins:
14a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon//    bevel, miter, miter-limited-to-bevel, round
15a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon// and as a hairline.
16a7d85ba138ee09739defbd277b04c479fdef82a6bsalomonDEF_SIMPLE_GM(stroke_rect_shader, canvas, 690, 300) {
17dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    constexpr SkRect kRect {0, 0, 100, 100};
18dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    constexpr SkPoint kPts[] {{kRect.fLeft, kRect.fTop}, {kRect.fRight, kRect.fBottom}};
19dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    constexpr SkColor kColors[] {SK_ColorRED, SK_ColorBLUE};
20a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon    SkPaint paint;
21a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon    sk_sp<SkShader> shader = SkGradientShader::MakeLinear(kPts, kColors, nullptr, 2,
22a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon                                                          SkShader::kClamp_TileMode);
23a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon    paint.setShader(std::move(shader));
24a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon    paint.setStyle(SkPaint::kStroke_Style);
25a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon    // Do a large initial translate so that local coords disagree with device coords significantly
26a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon    // for the first rect drawn.
27a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon    canvas->translate(kRect.centerX(), kRect.centerY());
28dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    constexpr SkScalar kPad = 20;
29a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon    for (auto aa : {false, true}) {
30a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        paint.setAntiAlias(aa);
31a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->save();
32a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
33dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr SkScalar kStrokeWidth = 10;
34a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        paint.setStrokeWidth(kStrokeWidth);
35a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
36a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        paint.setStrokeJoin(SkPaint::kBevel_Join);
37a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->drawRect(kRect, paint);
38a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->translate(kRect.width() + kPad, 0);
39a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
40a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        paint.setStrokeJoin(SkPaint::kMiter_Join);
41a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->drawRect(kRect, paint);
42a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->translate(kRect.width() + kPad, 0);
43a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
44a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        // This miter limit should effectively produce a bevel join.
45a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        paint.setStrokeMiter(0.01f);
46a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->drawRect(kRect, paint);
47a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->translate(kRect.width() + kPad, 0);
48a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
49a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        paint.setStrokeJoin(SkPaint::kRound_Join);
50a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->drawRect(kRect, paint);
51a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->translate(kRect.width() + kPad, 0);
52a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
53a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        paint.setStrokeWidth(0);
54a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->drawRect(kRect, paint);
55a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
56a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->restore();
57a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon        canvas->translate(0, kRect.height() + kPad);
58a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon    }
59a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon}
60a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon
61a7d85ba138ee09739defbd277b04c479fdef82a6bsalomon}
62