1/*
2 * Copyright 2011 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 "SkCanvas.h"
10#include "SkColorFilter.h"
11#include "SkColorPriv.h"
12#include "SkShader.h"
13
14#include "SkBlurImageFilter.h"
15#include "SkColorFilterImageFilter.h"
16#include "SkComposeImageFilter.h"
17#include "SkMergeImageFilter.h"
18#include "SkOffsetImageFilter.h"
19#include "SkTestImageFilters.h"
20
21#define FILTER_WIDTH    SkIntToScalar(150)
22#define FILTER_HEIGHT   SkIntToScalar(200)
23
24static SkImageFilter* make0() { return SkDownSampleImageFilter::Create(SK_Scalar1 / 5); }
25static SkImageFilter* make1() { return SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16)); }
26static SkImageFilter* make2() {
27    SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorBLUE,
28                                                        SkXfermode::kSrcIn_Mode);
29    SkAutoUnref aur(cf);
30    return SkColorFilterImageFilter::Create(cf);
31}
32static SkImageFilter* make3() {
33    return SkBlurImageFilter::Create(8, 0);
34}
35
36static SkImageFilter* make4() {
37    SkImageFilter* outer = SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16));
38    SkImageFilter* inner = SkDownSampleImageFilter::Create(SK_Scalar1 / 5);
39    SkAutoUnref aur0(outer);
40    SkAutoUnref aur1(inner);
41    return SkComposeImageFilter::Create(outer, inner);
42}
43static SkImageFilter* make5() {
44    SkImageFilter* first = SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16));
45    SkImageFilter* second = SkDownSampleImageFilter::Create(SK_Scalar1 / 5);
46    SkAutoUnref aur0(first);
47    SkAutoUnref aur1(second);
48    return SkMergeImageFilter::Create(first, second);
49}
50
51static SkImageFilter* make6() {
52    SkImageFilter* outer = SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16));
53    SkImageFilter* inner = SkDownSampleImageFilter::Create(SK_Scalar1 / 5);
54    SkAutoUnref aur0(outer);
55    SkAutoUnref aur1(inner);
56    SkImageFilter* compose = SkComposeImageFilter::Create(outer, inner);
57    SkAutoUnref aur2(compose);
58
59    SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF,
60                                                        SkXfermode::kSrcIn_Mode);
61    SkAutoUnref aur3(cf);
62    SkImageFilter* blue = SkColorFilterImageFilter::Create(cf);
63    SkAutoUnref aur4(blue);
64
65    return SkMergeImageFilter::Create(compose, blue);
66}
67
68static SkImageFilter* make7() {
69    SkImageFilter* outer = SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16));
70    SkImageFilter* inner = make3();
71    SkAutoUnref aur0(outer);
72    SkAutoUnref aur1(inner);
73    SkImageFilter* compose = SkComposeImageFilter::Create(outer, inner);
74    SkAutoUnref aur2(compose);
75
76    SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF,
77                                                        SkXfermode::kSrcIn_Mode);
78    SkAutoUnref aur3(cf);
79    SkImageFilter* blue = SkColorFilterImageFilter::Create(cf);
80    SkAutoUnref aur4(blue);
81
82    return SkMergeImageFilter::Create(compose, blue);
83}
84
85static void draw0(SkCanvas* canvas) {
86    SkPaint p;
87    p.setAntiAlias(true);
88    SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
89    r.inset(SK_Scalar1 * 12, SK_Scalar1 * 12);
90    p.setColor(SK_ColorRED);
91    canvas->drawOval(r, p);
92}
93
94class TestImageFiltersGM : public skiagm::GM {
95public:
96    TestImageFiltersGM () {}
97
98protected:
99
100    SkString onShortName() override {
101        return SkString("testimagefilters");
102    }
103
104    SkISize onISize() override { return SkISize::Make(700, 460); }
105
106    void onDraw(SkCanvas* canvas) override {
107//        this->drawSizeBounds(canvas, 0xFFCCCCCC);
108
109        static SkImageFilter* (*gFilterProc[])() = {
110            make0, make1, make2, make3, make4, make5, make6, make7
111        };
112
113        const SkRect bounds = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
114
115        const SkScalar dx = bounds.width() * 8 / 7;
116        const SkScalar dy = bounds.height() * 8 / 7;
117
118        canvas->translate(SkIntToScalar(8), SkIntToScalar(8));
119
120        for (int i = 0; i < (int)SK_ARRAY_COUNT(gFilterProc); ++i) {
121            int ix = i % 4;
122            int iy = i / 4;
123
124            SkAutoCanvasRestore acr(canvas, true);
125            canvas->translate(ix * dx, iy * dy);
126
127            SkPaint p;
128            p.setStyle(SkPaint::kStroke_Style);
129            canvas->drawRect(bounds, p);
130
131            SkPaint paint;
132            paint.setImageFilter(gFilterProc[i]())->unref();
133            canvas->saveLayer(&bounds, &paint);
134            draw0(canvas);
135        }
136    }
137
138private:
139    typedef GM INHERITED;
140};
141
142//////////////////////////////////////////////////////////////////////////////
143
144static skiagm::GM* MyFactory(void*) { return new TestImageFiltersGM; }
145static skiagm::GMRegistry reg(MyFactory);
146