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