Index: gm/perlinnoise.cpp |
=================================================================== |
--- gm/perlinnoise.cpp (revision 0) |
+++ gm/perlinnoise.cpp (revision 0) |
@@ -0,0 +1,114 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "gm.h" |
+#include "SkPerlinNoiseShader.h" |
+ |
+namespace skiagm { |
+ |
+class PerlinNoiseGM : public GM { |
+public: |
+ PerlinNoiseGM() { |
+ this->setBGColor(0xFF000000); |
+ fSize = SkISize::Make(80, 80); |
+ } |
+ |
+protected: |
+ virtual SkString onShortName() { |
+ return SkString("perlinnoise"); |
+ } |
+ |
+ virtual SkISize onISize() { |
+ return make_isize(500, 400); |
+ } |
+ |
+ void drawClippedRect(SkCanvas* canvas, int x, int y, const SkPaint& paint) { |
+ canvas->save(); |
+ canvas->clipRect(SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y), |
+ SkIntToScalar(fSize.width()), SkIntToScalar(fSize.height()))); |
+ SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y), |
+ SkIntToScalar(fSize.width()), |
+ SkIntToScalar(fSize.height())); |
+ canvas->drawRect(r, paint); |
+ canvas->restore(); |
+ } |
+ |
+ void test(SkCanvas* canvas, int x, int y, SkPerlinNoiseShader::Type type, |
+ float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, |
+ bool stitchTiles) |
+ { |
+ SkShader* shader = (type == SkPerlinNoiseShader::kFractalNoise_Type) ? |
+ SkPerlinNoiseShader::CreateFractalNoise(baseFrequencyX, baseFrequencyY, numOctaves, |
+ seed, stitchTiles ? &fSize : NULL) : |
+ SkPerlinNoiseShader::CreateTubulence(baseFrequencyX, baseFrequencyY, numOctaves, |
+ seed, stitchTiles ? &fSize : NULL); |
+ SkPaint paint; |
+ paint.setShader(shader)->unref(); |
+ drawClippedRect(canvas, x, y, paint); |
+ } |
+ |
+ virtual void onDraw(SkCanvas* canvas) { |
+ canvas->clear(0x00000000); |
+ |
+ test(canvas, 0, 0, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.1f, 0.1f, 2, 0, false); |
+ test(canvas, 100, 0, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.4f, 0.2f, 3, 0, true); |
+ test(canvas, 200, 0, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.3f, 0.6f, 4, 0, false); |
+ test(canvas, 300, 0, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.2f, 0.4f, 5, 0, true); |
+ test(canvas, 400, 0, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.5f, 0.8f, 6, 0, false); |
+ |
+ test(canvas, 0, 100, SkPerlinNoiseShader::kTurbulence_Type, |
+ 0.1f, 0.1f, 2, 0, true); |
+ test(canvas, 100, 100, SkPerlinNoiseShader::kTurbulence_Type, |
+ 0.4f, 0.2f, 3, 0, false); |
+ test(canvas, 200, 100, SkPerlinNoiseShader::kTurbulence_Type, |
+ 0.3f, 0.6f, 4, 0, true); |
+ test(canvas, 300, 100, SkPerlinNoiseShader::kTurbulence_Type, |
+ 0.2f, 0.4f, 5, 0, false); |
+ test(canvas, 400, 100, SkPerlinNoiseShader::kTurbulence_Type, |
+ 0.5f, 0.8f, 6, 0, true); |
+ |
+ test(canvas, 0, 200, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.1f, 0.1f, 3, 1, false); |
+ test(canvas, 100, 200, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.1f, 0.1f, 3, 2, false); |
+ test(canvas, 200, 200, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.1f, 0.1f, 3, 3, false); |
+ test(canvas, 300, 200, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.1f, 0.1f, 3, 4, false); |
+ test(canvas, 400, 200, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.1f, 0.1f, 3, 5, false); |
+ |
+ canvas->scale(SkFloatToScalar(0.75f), SkFloatToScalar(1.0f)); |
+ |
+ test(canvas, 0, 300, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.1f, 0.1f, 2, 0, false); |
+ test(canvas, 100, 300, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.4f, 0.2f, 3, 0, true); |
+ test(canvas, 200, 300, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.3f, 0.6f, 4, 0, false); |
+ test(canvas, 300, 300, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.2f, 0.4f, 5, 0, true); |
+ test(canvas, 400, 300, SkPerlinNoiseShader::kFractalNoise_Type, |
+ 0.5f, 0.8f, 6, 0, false); |
+ } |
+ |
+private: |
+ typedef GM INHERITED; |
+ SkISize fSize; |
+}; |
+ |
+////////////////////////////////////////////////////////////////////////////// |
+ |
+static GM* MyFactory(void*) { return new PerlinNoiseGM; } |
+static GMRegistry reg(MyFactory); |
+ |
+} |