blob: 7cd912927e0262a60dcb65d08c8827d3d07dfff1 [file] [log] [blame]
sugoi@google.come3b4c502013-04-05 13:47:09 +00001/*
2 * Copyright 2013 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 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkCanvas.h"
10#include "include/core/SkColor.h"
11#include "include/core/SkMatrix.h"
12#include "include/core/SkPaint.h"
13#include "include/core/SkRect.h"
14#include "include/core/SkRefCnt.h"
15#include "include/core/SkScalar.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "include/core/SkShader.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040017#include "include/core/SkSize.h"
18#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050019#include "include/effects/SkPerlinNoiseShader.h"
Florin Malita14d54c22017-05-18 11:52:59 -040020
Ben Wagner7fde8e12019-05-01 17:28:53 -040021#include <utility>
22
Florin Malita14d54c22017-05-18 11:52:59 -040023namespace {
24
25enum class Type {
26 kFractalNoise,
27 kTurbulence,
28};
29
30} // anonymous ns
sugoi@google.come3b4c502013-04-05 13:47:09 +000031
reed@google.coma501a642014-05-12 17:18:45 +000032class PerlinNoiseGM : public skiagm::GM {
sugoi@google.come3b4c502013-04-05 13:47:09 +000033public:
34 PerlinNoiseGM() {
35 this->setBGColor(0xFF000000);
36 fSize = SkISize::Make(80, 80);
37 }
38
39protected:
40 virtual SkString onShortName() {
41 return SkString("perlinnoise");
42 }
43
44 virtual SkISize onISize() {
reed@google.coma501a642014-05-12 17:18:45 +000045 return SkISize::Make(200, 500);
sugoi@google.come3b4c502013-04-05 13:47:09 +000046 }
47
senorblancoce6a3542014-06-12 11:24:19 -070048 void drawRect(SkCanvas* canvas, int x, int y, const SkPaint& paint, const SkISize& size) {
sugoi@google.come3b4c502013-04-05 13:47:09 +000049 canvas->save();
senorblancoce6a3542014-06-12 11:24:19 -070050 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
51 SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()),
52 SkIntToScalar(size.height()));
sugoi@google.come3b4c502013-04-05 13:47:09 +000053 canvas->drawRect(r, paint);
54 canvas->restore();
55 }
56
Florin Malita14d54c22017-05-18 11:52:59 -040057 void test(SkCanvas* canvas, int x, int y, Type type,
sugoi@google.come3b4c502013-04-05 13:47:09 +000058 float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed,
sugoi@google.com4775cba2013-04-17 13:46:56 +000059 bool stitchTiles) {
senorblancoce6a3542014-06-12 11:24:19 -070060 SkISize tileSize = SkISize::Make(fSize.width() / 2, fSize.height() / 2);
Florin Malita14d54c22017-05-18 11:52:59 -040061 sk_sp<SkShader> shader = (type == Type::kFractalNoise) ?
reedfe630452016-03-25 09:08:00 -070062 SkPerlinNoiseShader::MakeFractalNoise(baseFrequencyX, baseFrequencyY, numOctaves,
63 seed, stitchTiles ? &tileSize : nullptr) :
64 SkPerlinNoiseShader::MakeTurbulence(baseFrequencyX, baseFrequencyY, numOctaves,
halcanary96fcdcc2015-08-27 07:41:13 -070065 seed, stitchTiles ? &tileSize : nullptr);
sugoi@google.come3b4c502013-04-05 13:47:09 +000066 SkPaint paint;
reedfe630452016-03-25 09:08:00 -070067 paint.setShader(std::move(shader));
senorblancoce6a3542014-06-12 11:24:19 -070068 if (stitchTiles) {
69 drawRect(canvas, x, y, paint, tileSize);
70 x += tileSize.width();
71 drawRect(canvas, x, y, paint, tileSize);
72 y += tileSize.width();
73 drawRect(canvas, x, y, paint, tileSize);
74 x -= tileSize.width();
75 drawRect(canvas, x, y, paint, tileSize);
76 } else {
77 drawRect(canvas, x, y, paint, fSize);
78 }
sugoi@google.come3b4c502013-04-05 13:47:09 +000079 }
80
81 virtual void onDraw(SkCanvas* canvas) {
senorblanco16b254a2015-04-09 11:13:24 -070082 canvas->clear(SK_ColorBLACK);
Florin Malita14d54c22017-05-18 11:52:59 -040083 test(canvas, 0, 0, Type::kFractalNoise,
commit-bot@chromium.orgc2a0ea62013-11-06 10:08:38 +000084 0.1f, 0.1f, 0, 0, false);
Florin Malita14d54c22017-05-18 11:52:59 -040085 test(canvas, 100, 0, Type::kTurbulence,
commit-bot@chromium.orgc2a0ea62013-11-06 10:08:38 +000086 0.1f, 0.1f, 0, 0, false);
skia.committer@gmail.comcff02432013-04-06 07:01:10 +000087
Florin Malita14d54c22017-05-18 11:52:59 -040088 test(canvas, 0, 100, Type::kFractalNoise,
sugoi@google.come3b4c502013-04-05 13:47:09 +000089 0.1f, 0.1f, 2, 0, false);
Florin Malita14d54c22017-05-18 11:52:59 -040090 test(canvas, 100, 100, Type::kFractalNoise,
senorblancoce6a3542014-06-12 11:24:19 -070091 0.05f, 0.1f, 1, 0, true);
sugoi@google.come3b4c502013-04-05 13:47:09 +000092
Florin Malita14d54c22017-05-18 11:52:59 -040093 test(canvas, 0, 200, Type::kTurbulence,
senorblancoce6a3542014-06-12 11:24:19 -070094 0.1f, 0.1f, 1, 0, true);
Florin Malita14d54c22017-05-18 11:52:59 -040095 test(canvas, 100, 200, Type::kTurbulence,
sugoi@google.come3b4c502013-04-05 13:47:09 +000096 0.2f, 0.4f, 5, 0, false);
sugoi@google.come3b4c502013-04-05 13:47:09 +000097
Florin Malita14d54c22017-05-18 11:52:59 -040098 test(canvas, 0, 300, Type::kFractalNoise,
sugoi@google.come3b4c502013-04-05 13:47:09 +000099 0.1f, 0.1f, 3, 1, false);
Florin Malita14d54c22017-05-18 11:52:59 -0400100 test(canvas, 100, 300, Type::kFractalNoise,
sugoi@google.come3b4c502013-04-05 13:47:09 +0000101 0.1f, 0.1f, 3, 4, false);
sugoi@google.come3b4c502013-04-05 13:47:09 +0000102
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000103 canvas->scale(0.75f, 1.0f);
sugoi@google.come3b4c502013-04-05 13:47:09 +0000104
Florin Malita14d54c22017-05-18 11:52:59 -0400105 test(canvas, 0, 400, Type::kFractalNoise,
sugoi@google.come3b4c502013-04-05 13:47:09 +0000106 0.1f, 0.1f, 2, 0, false);
Florin Malita14d54c22017-05-18 11:52:59 -0400107 test(canvas, 100, 400, Type::kFractalNoise,
senorblancoce6a3542014-06-12 11:24:19 -0700108 0.1f, 0.05f, 1, 0, true);
sugoi@google.come3b4c502013-04-05 13:47:09 +0000109 }
110
111private:
112 typedef GM INHERITED;
113 SkISize fSize;
114};
115
reed@google.coma501a642014-05-12 17:18:45 +0000116class PerlinNoiseGM2 : public skiagm::GM {
117public:
118 PerlinNoiseGM2() {
119 fSize = SkISize::Make(80, 80);
120 }
skia.committer@gmail.come92c68f2014-05-13 03:06:05 +0000121
reed@google.coma501a642014-05-12 17:18:45 +0000122protected:
123 virtual SkString onShortName() {
124 return SkString("perlinnoise_localmatrix");
125 }
skia.committer@gmail.come92c68f2014-05-13 03:06:05 +0000126
reed@google.coma501a642014-05-12 17:18:45 +0000127 virtual SkISize onISize() {
128 return SkISize::Make(640, 480);
129 }
skia.committer@gmail.come92c68f2014-05-13 03:06:05 +0000130
Florin Malita14d54c22017-05-18 11:52:59 -0400131 void install(SkPaint* paint, Type type,
reed@google.coma501a642014-05-12 17:18:45 +0000132 float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed,
133 bool stitchTiles) {
Florin Malita14d54c22017-05-18 11:52:59 -0400134 sk_sp<SkShader> shader = (type == Type::kFractalNoise) ?
reedfe630452016-03-25 09:08:00 -0700135 SkPerlinNoiseShader::MakeFractalNoise(baseFrequencyX, baseFrequencyY, numOctaves,
136 seed, stitchTiles ? &fSize : nullptr) :
137 SkPerlinNoiseShader::MakeTurbulence(baseFrequencyX, baseFrequencyY, numOctaves,
138 seed, stitchTiles ? &fSize : nullptr);
139 paint->setShader(std::move(shader));
reed@google.coma501a642014-05-12 17:18:45 +0000140 }
skia.committer@gmail.come92c68f2014-05-13 03:06:05 +0000141
reed@google.coma501a642014-05-12 17:18:45 +0000142 virtual void onDraw(SkCanvas* canvas) {
143 canvas->translate(10, 10);
144
145 SkPaint paint;
Robert Phillipsbee27322018-01-23 09:58:18 -0500146 this->install(&paint, Type::kFractalNoise, 0.1f, 0.1f, 2, 0, false);
reed@google.coma501a642014-05-12 17:18:45 +0000147
148 const SkScalar w = SkIntToScalar(fSize.width());
149 const SkScalar h = SkIntToScalar(fSize.height());
150
151 SkRect r = SkRect::MakeWH(w, h);
152 canvas->drawRect(r, paint);
153
154 canvas->save();
155 canvas->translate(w * 5/4, 0);
156 canvas->drawRect(r, paint);
157 canvas->restore();
158
159 canvas->save();
160 canvas->translate(0, h + 10);
161 canvas->scale(2, 2);
162 canvas->drawRect(r, paint);
163 canvas->restore();
skia.committer@gmail.come92c68f2014-05-13 03:06:05 +0000164
reed@google.coma501a642014-05-12 17:18:45 +0000165 canvas->save();
166 canvas->translate(w + 100, h + 10);
167 canvas->scale(2, 2);
168 canvas->drawRect(r, paint);
169 canvas->restore();
170
171 // The next row should draw the same as the previous, even though we are using a local
172 // matrix instead of the canvas.
173
174 canvas->translate(0, h * 2 + 10);
175
176 SkMatrix lm;
177 lm.setScale(2, 2);
reed150835e2016-03-10 06:36:49 -0800178 paint.setShader(paint.getShader()->makeWithLocalMatrix(lm));
reed@google.coma501a642014-05-12 17:18:45 +0000179 r.fRight += r.width();
180 r.fBottom += r.height();
181
182 canvas->save();
183 canvas->translate(0, h + 10);
184 canvas->drawRect(r, paint);
185 canvas->restore();
skia.committer@gmail.come92c68f2014-05-13 03:06:05 +0000186
reed@google.coma501a642014-05-12 17:18:45 +0000187 canvas->save();
188 canvas->translate(w + 100, h + 10);
189 canvas->drawRect(r, paint);
190 canvas->restore();
191 }
skia.committer@gmail.come92c68f2014-05-13 03:06:05 +0000192
reed@google.coma501a642014-05-12 17:18:45 +0000193private:
194 typedef GM INHERITED;
195 SkISize fSize;
196};
197
sugoi@google.come3b4c502013-04-05 13:47:09 +0000198//////////////////////////////////////////////////////////////////////////////
199
reed@google.coma501a642014-05-12 17:18:45 +0000200DEF_GM( return new PerlinNoiseGM; )
201DEF_GM( return new PerlinNoiseGM2; )