blob: 9eb4e71a9bd357635e2e12939bf395bcfbb7307c [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
Mike Kleinc0bd9f92019-04-23 12:05:21 -05007#include "include/core/SkCanvas.h"
8#include "include/effects/SkGradientShader.h"
9#include "samplecode/Sample.h"
reed@android.coma3c05882009-04-02 20:49:39 +000010
reed8a21c9f2016-03-08 18:50:00 -080011static sk_sp<SkShader> setgrad(const SkRect& r, SkColor c0, SkColor c1) {
reed@android.com1c12abe2009-07-02 15:01:02 +000012 SkColor colors[] = { c0, c1 };
13 SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fTop } };
Mike Reedfae8fce2019-04-03 10:27:45 -040014 return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
reed@android.com1c12abe2009-07-02 15:01:02 +000015}
16
17static void test_alphagradients(SkCanvas* canvas) {
18 SkRect r;
Mike Reed92b33352019-08-24 19:39:13 -040019 r.setLTRB(10, 10, 410, 30);
reed@android.com1c12abe2009-07-02 15:01:02 +000020 SkPaint p, p2;
21 p2.setStyle(SkPaint::kStroke_Style);
rmistry@google.comae933ce2012-08-23 18:19:56 +000022
reed8a21c9f2016-03-08 18:50:00 -080023 p.setShader(setgrad(r, 0xFF00FF00, 0x0000FF00));
reed@android.com1c12abe2009-07-02 15:01:02 +000024 canvas->drawRect(r, p);
25 canvas->drawRect(r, p2);
rmistry@google.comae933ce2012-08-23 18:19:56 +000026
reed@android.com1c12abe2009-07-02 15:01:02 +000027 r.offset(0, r.height() + SkIntToScalar(4));
reed8a21c9f2016-03-08 18:50:00 -080028 p.setShader(setgrad(r, 0xFF00FF00, 0x00000000));
reed@android.com1c12abe2009-07-02 15:01:02 +000029 canvas->drawRect(r, p);
30 canvas->drawRect(r, p2);
rmistry@google.comae933ce2012-08-23 18:19:56 +000031
reed@android.com1c12abe2009-07-02 15:01:02 +000032 r.offset(0, r.height() + SkIntToScalar(4));
reed8a21c9f2016-03-08 18:50:00 -080033 p.setShader(setgrad(r, 0xFF00FF00, 0x00FF0000));
reed@android.com1c12abe2009-07-02 15:01:02 +000034 canvas->drawRect(r, p);
35 canvas->drawRect(r, p2);
36}
37
38///////////////////////////////////////////////////////////////////////////////
39
reed@android.coma3c05882009-04-02 20:49:39 +000040struct GradData {
41 int fCount;
42 const SkColor* fColors;
43 const SkScalar* fPos;
44};
45
46static const SkColor gColors[] = {
47 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
48};
49static const SkScalar gPos0[] = { 0, SK_Scalar1 };
50static const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
51static const SkScalar gPos2[] = {
52 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1
53};
54
55static const GradData gGradData[] = {
halcanary96fcdcc2015-08-27 07:41:13 -070056 { 2, gColors, nullptr },
reed@android.coma3c05882009-04-02 20:49:39 +000057 { 2, gColors, gPos0 },
58 { 2, gColors, gPos1 },
halcanary96fcdcc2015-08-27 07:41:13 -070059 { 5, gColors, nullptr },
reed@android.coma3c05882009-04-02 20:49:39 +000060 { 5, gColors, gPos2 }
61};
62
Mike Reedfae8fce2019-04-03 10:27:45 -040063static sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data, SkTileMode tm) {
reed8a21c9f2016-03-08 18:50:00 -080064 return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos, data.fCount, tm);
reed@android.coma3c05882009-04-02 20:49:39 +000065}
rmistry@google.comae933ce2012-08-23 18:19:56 +000066
Mike Reedfae8fce2019-04-03 10:27:45 -040067static sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data, SkTileMode tm) {
reed@android.coma3c05882009-04-02 20:49:39 +000068 SkPoint center;
69 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
70 SkScalarAve(pts[0].fY, pts[1].fY));
reed8a21c9f2016-03-08 18:50:00 -080071 return SkGradientShader::MakeRadial(center, center.fX, data.fColors,
72 data.fPos, data.fCount, tm);
reed@android.coma3c05882009-04-02 20:49:39 +000073}
74
Mike Reedfae8fce2019-04-03 10:27:45 -040075static sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data, SkTileMode tm) {
reed@android.coma3c05882009-04-02 20:49:39 +000076 SkPoint center;
77 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
78 SkScalarAve(pts[0].fY, pts[1].fY));
reed8a21c9f2016-03-08 18:50:00 -080079 return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount);
reed@android.coma3c05882009-04-02 20:49:39 +000080}
81
Mike Reedfae8fce2019-04-03 10:27:45 -040082static sk_sp<SkShader> Make2Conical(const SkPoint pts[2], const GradData& data, SkTileMode tm) {
reed@android.com8e2af7e2009-09-22 20:14:42 +000083 SkPoint center0, center1;
84 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
85 SkScalarAve(pts[0].fY, pts[1].fY));
86 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
87 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reed8a21c9f2016-03-08 18:50:00 -080088 return SkGradientShader::MakeTwoPointConical(
reed@android.com8e2af7e2009-09-22 20:14:42 +000089 center1, (pts[1].fX - pts[0].fX) / 7,
90 center0, (pts[1].fX - pts[0].fX) / 2,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +000091 data.fColors, data.fPos, data.fCount, tm);
reed@android.com8e2af7e2009-09-22 20:14:42 +000092}
93
reed8a21c9f2016-03-08 18:50:00 -080094static sk_sp<SkShader> Make2ConicalConcentric(const SkPoint pts[2], const GradData& data,
Mike Reedfae8fce2019-04-03 10:27:45 -040095 SkTileMode tm) {
bsalomon@google.comdc66c422011-04-06 19:35:37 +000096 SkPoint center;
97 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
98 SkScalarAve(pts[0].fY, pts[1].fY));
reed8a21c9f2016-03-08 18:50:00 -080099 return SkGradientShader::MakeTwoPointConical(
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000100 center, (pts[1].fX - pts[0].fX) / 7,
101 center, (pts[1].fX - pts[0].fX) / 2,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000102 data.fColors, data.fPos, data.fCount, tm);
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000103}
104
Mike Reedfae8fce2019-04-03 10:27:45 -0400105typedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data, SkTileMode tm);
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000106
reed@android.coma3c05882009-04-02 20:49:39 +0000107static const GradMaker gGradMakers[] = {
reed71a6cbf2015-05-04 08:32:51 -0700108 MakeLinear, MakeRadial, MakeSweep, Make2Conical, Make2ConicalConcentric
reed@android.coma3c05882009-04-02 20:49:39 +0000109};
110
111///////////////////////////////////////////////////////////////////////////////
112
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400113class GradientsView : public Sample {
reed@android.coma3c05882009-04-02 20:49:39 +0000114public:
rmistry@google.comae933ce2012-08-23 18:19:56 +0000115 GradientsView() {
reed@google.comf2183392011-04-22 14:10:48 +0000116 this->setBGColor(0xFFDDDDDD);
117 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000118
reed@android.coma3c05882009-04-02 20:49:39 +0000119protected:
Hal Canary8a027312019-07-03 10:55:44 -0400120 SkString name() override { return SkString("Gradients"); }
reed@android.coma3c05882009-04-02 20:49:39 +0000121
reed8a21c9f2016-03-08 18:50:00 -0800122 void onDrawContent(SkCanvas* canvas) override {
reed@android.coma3c05882009-04-02 20:49:39 +0000123 SkPoint pts[2] = {
124 { 0, 0 },
125 { SkIntToScalar(100), SkIntToScalar(100) }
126 };
reed@android.coma3c05882009-04-02 20:49:39 +0000127 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
128 SkPaint paint;
reed@android.com32a42492009-07-10 03:33:52 +0000129 paint.setDither(true);
reed@android.com1c12abe2009-07-02 15:01:02 +0000130
131 canvas->save();
reed@android.com8e2af7e2009-09-22 20:14:42 +0000132 canvas->translate(SkIntToScalar(20), SkIntToScalar(10));
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000133
Mike Reedfae8fce2019-04-03 10:27:45 -0400134 for (int tm = 0; tm < kSkTileModeCount; ++tm) {
reed@android.coma3c05882009-04-02 20:49:39 +0000135 canvas->save();
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000136 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
137 canvas->save();
138 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
Mike Reedfae8fce2019-04-03 10:27:45 -0400139 paint.setShader(gGradMakers[j](pts, gGradData[i], (SkTileMode)tm));
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000140 canvas->drawRect(r, paint);
141 canvas->translate(0, SkIntToScalar(120));
142 }
143 canvas->restore();
144 canvas->translate(SkIntToScalar(120), 0);
reed@android.coma3c05882009-04-02 20:49:39 +0000145 }
146 canvas->restore();
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000147 canvas->translate(SK_ARRAY_COUNT(gGradData)*SkIntToScalar(120), 0);
reed@android.coma3c05882009-04-02 20:49:39 +0000148 }
reed@android.com1c12abe2009-07-02 15:01:02 +0000149 canvas->restore();
rmistry@google.comae933ce2012-08-23 18:19:56 +0000150
reed@android.com1c12abe2009-07-02 15:01:02 +0000151 canvas->translate(0, SkIntToScalar(370));
caryclark@google.com02939ce2012-06-06 12:09:51 +0000152 if (false) { // avoid bit rot, suppress warning
153 test_alphagradients(canvas);
154 }
reed@android.coma3c05882009-04-02 20:49:39 +0000155 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000156
reed@android.coma3c05882009-04-02 20:49:39 +0000157private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400158 typedef Sample INHERITED;
reed@android.coma3c05882009-04-02 20:49:39 +0000159};
160
161///////////////////////////////////////////////////////////////////////////////
162
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400163DEF_SAMPLE( return new GradientsView(); )