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 
make0()24 static SkImageFilter* make0() { return SkDownSampleImageFilter::Create(SK_Scalar1 / 5); }
make1()25 static SkImageFilter* make1() { return SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16)); }
make2()26 static SkImageFilter* make2() {
27     SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorBLUE,
28                                                         SkXfermode::kSrcIn_Mode);
29     SkAutoUnref aur(cf);
30     return SkColorFilterImageFilter::Create(cf);
31 }
make3()32 static SkImageFilter* make3() {
33     return SkBlurImageFilter::Create(8, 0);
34 }
35 
make4()36 static 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 }
make5()43 static 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 
make6()51 static 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 
make7()68 static 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 
draw0(SkCanvas * canvas)85 static 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 
94 class TestImageFiltersGM : public skiagm::GM {
95 public:
TestImageFiltersGM()96     TestImageFiltersGM () {}
97 
98 protected:
99 
onShortName()100     SkString onShortName() override {
101         return SkString("testimagefilters");
102     }
103 
onISize()104     SkISize onISize() override { return SkISize::Make(700, 460); }
105 
onDraw(SkCanvas * canvas)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 
138 private:
139     typedef GM INHERITED;
140 };
141 
142 //////////////////////////////////////////////////////////////////////////////
143 
MyFactory(void *)144 static skiagm::GM* MyFactory(void*) { return new TestImageFiltersGM; }
145 static skiagm::GMRegistry reg(MyFactory);
146