1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker /* 9*c8dee2aaSAndroid Build Coastguard Worker * This GM presents different gradients with an increasing number of 10*c8dee2aaSAndroid Build Coastguard Worker * hardstops, from 1 to 100. 11*c8dee2aaSAndroid Build Coastguard Worker */ 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker const int kWidth = 1000; 30*c8dee2aaSAndroid Build Coastguard Worker const int kHeight = 2000; 31*c8dee2aaSAndroid Build Coastguard Worker const int kNumRows = 100; 32*c8dee2aaSAndroid Build Coastguard Worker const int kCellHeight = kHeight / kNumRows; 33*c8dee2aaSAndroid Build Coastguard Worker const int kPadHeight = 1; 34*c8dee2aaSAndroid Build Coastguard Worker const int kRectHeight = kCellHeight - (2 * kPadHeight); 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker class HardstopGradientsManyGM : public skiagm::GM { 37*c8dee2aaSAndroid Build Coastguard Worker public: HardstopGradientsManyGM()38*c8dee2aaSAndroid Build Coastguard Worker HardstopGradientsManyGM() {} 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker protected: getName() const41*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("hardstop_gradients_many"); } 42*c8dee2aaSAndroid Build Coastguard Worker getISize()43*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(kWidth, kHeight); } 44*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)45*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 46*c8dee2aaSAndroid Build Coastguard Worker static constexpr SkPoint points[] = { 47*c8dee2aaSAndroid Build Coastguard Worker SkPoint::Make(0, kRectHeight / 2), 48*c8dee2aaSAndroid Build Coastguard Worker SkPoint::Make(kWidth, kRectHeight / 2), 49*c8dee2aaSAndroid Build Coastguard Worker }; 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker std::vector<SkColor> colors; 52*c8dee2aaSAndroid Build Coastguard Worker std::vector<SkScalar> positions; 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker for (int row = 1; row <= kNumRows; ++row) { 55*c8dee2aaSAndroid Build Coastguard Worker // Assemble a gradient containing a blue-to-white blend, repeated N times per row. 56*c8dee2aaSAndroid Build Coastguard Worker colors.push_back(SK_ColorBLUE); 57*c8dee2aaSAndroid Build Coastguard Worker colors.push_back(SK_ColorWHITE); 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker positions = {0.0f}; 60*c8dee2aaSAndroid Build Coastguard Worker for (int pos = 1; pos < row; ++pos) { 61*c8dee2aaSAndroid Build Coastguard Worker float place = SkScalar(pos) / SkScalar(row); 62*c8dee2aaSAndroid Build Coastguard Worker positions.push_back(place); 63*c8dee2aaSAndroid Build Coastguard Worker positions.push_back(place); 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker positions.push_back(1.0f); 66*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(positions.size() == colors.size()); 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker // Draw it. 69*c8dee2aaSAndroid Build Coastguard Worker auto shader = SkGradientShader::MakeLinear(points, 70*c8dee2aaSAndroid Build Coastguard Worker colors.data(), 71*c8dee2aaSAndroid Build Coastguard Worker positions.data(), 72*c8dee2aaSAndroid Build Coastguard Worker colors.size(), 73*c8dee2aaSAndroid Build Coastguard Worker SkTileMode::kClamp, 74*c8dee2aaSAndroid Build Coastguard Worker /*flags=*/0, 75*c8dee2aaSAndroid Build Coastguard Worker /*localMatrix=*/nullptr); 76*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 77*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(shader); 78*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(SkRect::MakeXYWH(0, kPadHeight, kWidth, kRectHeight), paint); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, kCellHeight); 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker private: 85*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM; 86*c8dee2aaSAndroid Build Coastguard Worker }; 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new HardstopGradientsManyGM;) 89