|  | /* | 
|  | * Copyright 2021 Google LLC | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * This GM presents different gradients with an increasing number of | 
|  | * hardstops, from 1 to 100. | 
|  | */ | 
|  |  | 
|  | #include "gm/gm.h" | 
|  | #include "include/core/SkCanvas.h" | 
|  | #include "include/core/SkColor.h" | 
|  | #include "include/core/SkPaint.h" | 
|  | #include "include/core/SkPoint.h" | 
|  | #include "include/core/SkRect.h" | 
|  | #include "include/core/SkRefCnt.h" | 
|  | #include "include/core/SkScalar.h" | 
|  | #include "include/core/SkShader.h" | 
|  | #include "include/core/SkSize.h" | 
|  | #include "include/core/SkString.h" | 
|  | #include "include/core/SkTileMode.h" | 
|  | #include "include/effects/SkGradientShader.h" | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | const int kWidth  = 1000; | 
|  | const int kHeight = 2000; | 
|  | const int kNumRows = 100; | 
|  | const int kCellHeight = kHeight / kNumRows; | 
|  | const int kPadHeight = 1; | 
|  | const int kRectHeight = kCellHeight - (2 * kPadHeight); | 
|  |  | 
|  | class HardstopGradientsManyGM : public skiagm::GM { | 
|  | public: | 
|  | HardstopGradientsManyGM() {} | 
|  |  | 
|  | protected: | 
|  | SkString getName() const override { return SkString("hardstop_gradients_many"); } | 
|  |  | 
|  | SkISize getISize() override { return SkISize::Make(kWidth, kHeight); } | 
|  |  | 
|  | void onDraw(SkCanvas* canvas) override { | 
|  | static constexpr SkPoint points[] = { | 
|  | SkPoint::Make(0,      kRectHeight / 2), | 
|  | SkPoint::Make(kWidth, kRectHeight / 2), | 
|  | }; | 
|  |  | 
|  | std::vector<SkColor> colors; | 
|  | std::vector<SkScalar> positions; | 
|  |  | 
|  | for (int row = 1; row <= kNumRows; ++row) { | 
|  | // Assemble a gradient containing a blue-to-white blend, repeated N times per row. | 
|  | colors.push_back(SK_ColorBLUE); | 
|  | colors.push_back(SK_ColorWHITE); | 
|  |  | 
|  | positions = {0.0f}; | 
|  | for (int pos = 1; pos < row; ++pos) { | 
|  | float place = SkScalar(pos) / SkScalar(row); | 
|  | positions.push_back(place); | 
|  | positions.push_back(place); | 
|  | } | 
|  | positions.push_back(1.0f); | 
|  | SkASSERT(positions.size() == colors.size()); | 
|  |  | 
|  | // Draw it. | 
|  | auto shader = SkGradientShader::MakeLinear(points, | 
|  | colors.data(), | 
|  | positions.data(), | 
|  | colors.size(), | 
|  | SkTileMode::kClamp, | 
|  | /*flags=*/0, | 
|  | /*localMatrix=*/nullptr); | 
|  | SkPaint paint; | 
|  | paint.setShader(shader); | 
|  | canvas->drawRect(SkRect::MakeXYWH(0, kPadHeight, kWidth, kRectHeight), paint); | 
|  |  | 
|  | canvas->translate(0, kCellHeight); | 
|  | } | 
|  | } | 
|  |  | 
|  | private: | 
|  | using INHERITED = skiagm::GM; | 
|  | }; | 
|  |  | 
|  | DEF_GM(return new HardstopGradientsManyGM;) |