1c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org/*
2c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * Copyright 2014 Google Inc.
3c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org *
4c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * found in the LICENSE file.
6c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org */
7c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
8c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "gm.h"
9c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkColor.h"
10c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkBitmapSource.h"
11c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkBlurImageFilter.h"
12c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkDisplacementMapEffect.h"
13c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkDropShadowImageFilter.h"
14c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkGradientShader.h"
15c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkMorphologyImageFilter.h"
16c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkOffsetImageFilter.h"
1747d98c8e85924effc651b09df72027e6801c92a1senorblanco@chromium.org#include "SkPerlinNoiseShader.h"
1847d98c8e85924effc651b09df72027e6801c92a1senorblanco@chromium.org#include "SkRectShaderImageFilter.h"
19fd0ec2c76a27ce26a62da23eb75017839959e7cbsenorblanco@chromium.org#include "SkMatrixImageFilter.h"
20c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkScalar.h"
21c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
22897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org#define RESIZE_FACTOR_X SkIntToScalar(2)
23897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org#define RESIZE_FACTOR_Y SkIntToScalar(5)
24897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org
25c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgnamespace skiagm {
26c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
27c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgclass ImageFiltersClippedGM : public GM {
28c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgpublic:
29c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    ImageFiltersClippedGM() : fInitialized(false) {
30c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        this->setBGColor(0x00000000);
31c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
32c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
33c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprotected:
34a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
35a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
36a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
37a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
38c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    virtual SkString onShortName() {
39c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        return SkString("imagefiltersclipped");
40c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
41c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
42c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    virtual SkISize onISize() {
43f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(860, 500);
44c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
45c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
46c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    void make_checkerboard() {
47c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        fCheckerboard.allocN32Pixels(64, 64);
48c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fCheckerboard);
49c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        canvas.clear(0x00000000);
50c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkPaint darkPaint;
51c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        darkPaint.setColor(0xFF404040);
52c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkPaint lightPaint;
53c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        lightPaint.setColor(0xFFA0A0A0);
54c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        for (int y = 0; y < 64; y += 16) {
55c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org          for (int x = 0; x < 64; x += 16) {
56c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas.save();
57c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
58c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
59c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
60c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
61c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
62c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas.restore();
63c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org          }
64c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        }
65c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
66c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
67c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    void make_gradient_circle(int width, int height) {
68c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkScalar x = SkIntToScalar(width / 2);
69c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkScalar y = SkIntToScalar(height / 2);
70c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkScalar radius = SkMinScalar(x, y) * 0.8f;
71c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        fGradientCircle.allocN32Pixels(width, height);
72c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        SkCanvas canvas(fGradientCircle);
73c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        canvas.clear(0x00000000);
74c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkColor colors[2];
75c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        colors[0] = SK_ColorWHITE;
76c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        colors[1] = SK_ColorBLACK;
77c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkAutoTUnref<SkShader> shader(
78c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2,
79c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                                           SkShader::kClamp_TileMode)
80c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        );
81c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkPaint paint;
82c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        paint.setShader(shader);
83c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        canvas.drawCircle(x, y, radius, paint);
84c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
85c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
86c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
87c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        if (!fInitialized) {
88c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            this->make_checkerboard();
89c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            this->make_gradient_circle(64, 64);
90c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            fInitialized = true;
91c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        }
92c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        canvas->clear(0x00000000);
93c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
94cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> gradient(SkBitmapSource::Create(fGradientCircle));
95cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> checkerboard(SkBitmapSource::Create(fCheckerboard));
9647d98c8e85924effc651b09df72027e6801c92a1senorblanco@chromium.org        SkAutoTUnref<SkShader> noise(SkPerlinNoiseShader::CreateFractalNoise(
9747d98c8e85924effc651b09df72027e6801c92a1senorblanco@chromium.org            SkDoubleToScalar(0.1), SkDoubleToScalar(0.05), 1, 0));
98fd0ec2c76a27ce26a62da23eb75017839959e7cbsenorblanco@chromium.org        SkMatrix resizeMatrix;
99fd0ec2c76a27ce26a62da23eb75017839959e7cbsenorblanco@chromium.org        resizeMatrix.setScale(RESIZE_FACTOR_X, RESIZE_FACTOR_Y);
100c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
101c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkImageFilter* filters[] = {
102cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkBlurImageFilter::Create(SkIntToScalar(12), SkIntToScalar(12)),
103bc9845bb60cd883e7ddabb21f04997602145a1adsenorblanco            SkDropShadowImageFilter::Create(SkIntToScalar(10), SkIntToScalar(10),
104bc9845bb60cd883e7ddabb21f04997602145a1adsenorblanco                                            SkIntToScalar(3), SkIntToScalar(3),
105cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                            SK_ColorGREEN),
106cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType,
107cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                            SkDisplacementMapEffect::kR_ChannelSelectorType,
108cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                            SkIntToScalar(12),
109cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                            gradient.get(),
110cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                            checkerboard.get()),
111cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDilateImageFilter::Create(2, 2, checkerboard.get()),
112cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkErodeImageFilter::Create(2, 2, checkerboard.get()),
113cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkOffsetImageFilter::Create(SkIntToScalar(-16), SkIntToScalar(32)),
114fd0ec2c76a27ce26a62da23eb75017839959e7cbsenorblanco@chromium.org            SkMatrixImageFilter::Create(resizeMatrix, SkPaint::kNone_FilterLevel),
11547d98c8e85924effc651b09df72027e6801c92a1senorblanco@chromium.org            SkRectShaderImageFilter::Create(noise),
116c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        };
117c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
118c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
119c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkScalar margin = SkIntToScalar(16);
120c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkRect bounds = r;
121c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        bounds.outset(margin, margin);
122c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
123c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        for (int xOffset = 0; xOffset < 80; xOffset += 16) {
124c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas->save();
125c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            bounds.fLeft = SkIntToScalar(xOffset);
126c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
127c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                SkPaint paint;
128c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                paint.setColor(SK_ColorWHITE);
129c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                paint.setImageFilter(filters[i]);
130c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                paint.setAntiAlias(true);
131c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                canvas->save();
132c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                canvas->clipRect(bounds);
133897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org                if (5 == i) {
134c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                    canvas->translate(SkIntToScalar(16), SkIntToScalar(-32));
135897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org                } else if (6 == i) {
136897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org                    canvas->scale(SkScalarInvert(RESIZE_FACTOR_X),
137897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org                                  SkScalarInvert(RESIZE_FACTOR_Y));
138c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                }
139c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                canvas->drawCircle(r.centerX(), r.centerY(),
140c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                                   SkScalarDiv(r.width()*2, SkIntToScalar(5)), paint);
141c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                canvas->restore();
142c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                canvas->translate(r.width() + margin, 0);
143c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            }
144c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas->restore();
145c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas->translate(0, r.height() + margin);
146c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        }
14767117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org
14867117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org        for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
14967117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org            SkSafeUnref(filters[i]);
15067117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org        }
151c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
152c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
153c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprivate:
154c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    bool fInitialized;
155c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    SkBitmap fCheckerboard;
156c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    SkBitmap fGradientCircle;
157c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    typedef GM INHERITED;
158c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org};
159c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
160c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
161c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
162c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgstatic GM* MyFactory(void*) { return new ImageFiltersClippedGM; }
163c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgstatic GMRegistry reg(MyFactory);
164c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
165c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org}
166