imagefiltersclipped.cpp revision cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977
1/*
2 * Copyright 2014 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 "SkColor.h"
10#include "SkBitmapSource.h"
11#include "SkBlurImageFilter.h"
12#include "SkDisplacementMapEffect.h"
13#include "SkDropShadowImageFilter.h"
14#include "SkGradientShader.h"
15#include "SkMorphologyImageFilter.h"
16#include "SkOffsetImageFilter.h"
17#include "SkPerlinNoiseShader.h"
18#include "SkRectShaderImageFilter.h"
19#include "SkResizeImageFilter.h"
20#include "SkScalar.h"
21
22#define RESIZE_FACTOR_X SkIntToScalar(2)
23#define RESIZE_FACTOR_Y SkIntToScalar(5)
24
25namespace skiagm {
26
27class ImageFiltersClippedGM : public GM {
28public:
29    ImageFiltersClippedGM() : fInitialized(false) {
30        this->setBGColor(0x00000000);
31    }
32
33protected:
34    virtual SkString onShortName() {
35        return SkString("imagefiltersclipped");
36    }
37
38    virtual SkISize onISize() {
39        return make_isize(860, 500);
40    }
41
42    void make_checkerboard() {
43        fCheckerboard.allocN32Pixels(64, 64);
44        SkCanvas canvas(fCheckerboard);
45        canvas.clear(0x00000000);
46        SkPaint darkPaint;
47        darkPaint.setColor(0xFF404040);
48        SkPaint lightPaint;
49        lightPaint.setColor(0xFFA0A0A0);
50        for (int y = 0; y < 64; y += 16) {
51          for (int x = 0; x < 64; x += 16) {
52            canvas.save();
53            canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
54            canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
55            canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
56            canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
57            canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
58            canvas.restore();
59          }
60        }
61    }
62
63    void make_gradient_circle(int width, int height) {
64        SkScalar x = SkIntToScalar(width / 2);
65        SkScalar y = SkIntToScalar(height / 2);
66        SkScalar radius = SkMinScalar(x, y) * 0.8f;
67        fGradientCircle.allocN32Pixels(width, height);
68        SkCanvas canvas(fGradientCircle);
69        canvas.clear(0x00000000);
70        SkColor colors[2];
71        colors[0] = SK_ColorWHITE;
72        colors[1] = SK_ColorBLACK;
73        SkAutoTUnref<SkShader> shader(
74            SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2,
75                                           SkShader::kClamp_TileMode)
76        );
77        SkPaint paint;
78        paint.setShader(shader);
79        canvas.drawCircle(x, y, radius, paint);
80    }
81
82    virtual void onDraw(SkCanvas* canvas) {
83        if (!fInitialized) {
84            this->make_checkerboard();
85            this->make_gradient_circle(64, 64);
86            fInitialized = true;
87        }
88        canvas->clear(0x00000000);
89
90        SkAutoTUnref<SkImageFilter> gradient(SkBitmapSource::Create(fGradientCircle));
91        SkAutoTUnref<SkImageFilter> checkerboard(SkBitmapSource::Create(fCheckerboard));
92        SkAutoTUnref<SkShader> noise(SkPerlinNoiseShader::CreateFractalNoise(
93            SkDoubleToScalar(0.1), SkDoubleToScalar(0.05), 1, 0));
94
95        SkImageFilter* filters[] = {
96            SkBlurImageFilter::Create(SkIntToScalar(12), SkIntToScalar(12)),
97            SkDropShadowImageFilter::Create(SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3),
98                                            SK_ColorGREEN),
99            SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType,
100                                            SkDisplacementMapEffect::kR_ChannelSelectorType,
101                                            SkIntToScalar(12),
102                                            gradient.get(),
103                                            checkerboard.get()),
104            SkDilateImageFilter::Create(2, 2, checkerboard.get()),
105            SkErodeImageFilter::Create(2, 2, checkerboard.get()),
106            SkOffsetImageFilter::Create(SkIntToScalar(-16), SkIntToScalar(32)),
107            SkResizeImageFilter::Create(RESIZE_FACTOR_X, RESIZE_FACTOR_Y, SkPaint::kNone_FilterLevel),
108            SkRectShaderImageFilter::Create(noise),
109        };
110
111        SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
112        SkScalar margin = SkIntToScalar(16);
113        SkRect bounds = r;
114        bounds.outset(margin, margin);
115
116        for (int xOffset = 0; xOffset < 80; xOffset += 16) {
117            canvas->save();
118            bounds.fLeft = SkIntToScalar(xOffset);
119            for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
120                SkPaint paint;
121                paint.setColor(SK_ColorWHITE);
122                paint.setImageFilter(filters[i]);
123                paint.setAntiAlias(true);
124                canvas->save();
125                canvas->clipRect(bounds);
126                if (5 == i) {
127                    canvas->translate(SkIntToScalar(16), SkIntToScalar(-32));
128                } else if (6 == i) {
129                    canvas->scale(SkScalarInvert(RESIZE_FACTOR_X),
130                                  SkScalarInvert(RESIZE_FACTOR_Y));
131                }
132                canvas->drawCircle(r.centerX(), r.centerY(),
133                                   SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint);
134                canvas->restore();
135                canvas->translate(r.width() + margin, 0);
136            }
137            canvas->restore();
138            canvas->translate(0, r.height() + margin);
139        }
140
141        for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
142            SkSafeUnref(filters[i]);
143        }
144    }
145
146private:
147    bool fInitialized;
148    SkBitmap fCheckerboard;
149    SkBitmap fGradientCircle;
150    typedef GM INHERITED;
151};
152
153//////////////////////////////////////////////////////////////////////////////
154
155static GM* MyFactory(void*) { return new ImageFiltersClippedGM; }
156static GMRegistry reg(MyFactory);
157
158}
159