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