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