perlinnoise.cpp revision c2a0ea6418988d4bcc0719f99b1a110cecd08679
1/*
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
8#include "gm.h"
9#include "SkPerlinNoiseShader.h"
10
11namespace skiagm {
12
13class PerlinNoiseGM : public GM {
14public:
15    PerlinNoiseGM() {
16        this->setBGColor(0xFF000000);
17        fSize = SkISize::Make(80, 80);
18    }
19
20protected:
21    virtual SkString onShortName() {
22        return SkString("perlinnoise");
23    }
24
25    virtual SkISize onISize() {
26        return make_isize(200, 500);
27    }
28
29    void drawClippedRect(SkCanvas* canvas, int x, int y, const SkPaint& paint) {
30        canvas->save();
31        canvas->clipRect(SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y),
32                         SkIntToScalar(fSize.width()), SkIntToScalar(fSize.height())));
33        SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y),
34                                    SkIntToScalar(fSize.width()),
35                                    SkIntToScalar(fSize.height()));
36        canvas->drawRect(r, paint);
37        canvas->restore();
38    }
39
40    void test(SkCanvas* canvas, int x, int y, SkPerlinNoiseShader::Type type,
41              float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed,
42              bool stitchTiles) {
43        SkShader* shader = (type == SkPerlinNoiseShader::kFractalNoise_Type) ?
44            SkPerlinNoiseShader::CreateFractalNoise(baseFrequencyX, baseFrequencyY, numOctaves,
45                                                   seed, stitchTiles ? &fSize : NULL) :
46            SkPerlinNoiseShader::CreateTubulence(baseFrequencyX, baseFrequencyY, numOctaves,
47                                                seed, stitchTiles ? &fSize : NULL);
48        SkPaint paint;
49        paint.setShader(shader)->unref();
50        drawClippedRect(canvas, x, y, paint);
51    }
52
53    virtual void onDraw(SkCanvas* canvas) {
54        canvas->clear(0x00000000);
55        test(canvas,   0,   0, SkPerlinNoiseShader::kFractalNoise_Type,
56             0.1f, 0.1f, 0, 0, false);
57        test(canvas, 100,   0, SkPerlinNoiseShader::kTurbulence_Type,
58             0.1f, 0.1f, 0, 0, false);
59
60        test(canvas,   0, 100, SkPerlinNoiseShader::kFractalNoise_Type,
61             0.1f, 0.1f, 2, 0, false);
62        test(canvas, 100, 100, SkPerlinNoiseShader::kFractalNoise_Type,
63             0.2f, 0.4f, 5, 0, true);
64
65        test(canvas,   0, 200, SkPerlinNoiseShader::kTurbulence_Type,
66             0.1f, 0.1f, 2, 0, true);
67        test(canvas, 100, 200, SkPerlinNoiseShader::kTurbulence_Type,
68             0.2f, 0.4f, 5, 0, false);
69
70        test(canvas,   0, 300, SkPerlinNoiseShader::kFractalNoise_Type,
71             0.1f, 0.1f, 3, 1, false);
72        test(canvas, 100, 300, SkPerlinNoiseShader::kFractalNoise_Type,
73             0.1f, 0.1f, 3, 4, false);
74
75        canvas->scale(SkFloatToScalar(0.75f), SkFloatToScalar(1.0f));
76
77        test(canvas,   0, 400, SkPerlinNoiseShader::kFractalNoise_Type,
78             0.1f, 0.1f, 2, 0, false);
79        test(canvas, 100, 400, SkPerlinNoiseShader::kFractalNoise_Type,
80             0.2f, 0.4f, 5, 0, true);
81    }
82
83private:
84    typedef GM INHERITED;
85    SkISize fSize;
86};
87
88//////////////////////////////////////////////////////////////////////////////
89
90static GM* MyFactory(void*) { return new PerlinNoiseGM; }
91static GMRegistry reg(MyFactory);
92
93}
94