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