blob: bde26121664012adc317f0d6ef35741ca00f58ff [file] [log] [blame]
reed@google.com8926b162012-03-23 15:36:36 +00001/*
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 "SkTestImageFilters.h"
16
17class FailImageFilter : public SkImageFilter {
18public:
19 FailImageFilter() {}
20 virtual Factory getFactory() SK_OVERRIDE { return CreateProc; };
21
22protected:
23 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
24 SkBitmap* result, SkIPoint* offset) {
25 return false;
26 }
27
28 FailImageFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
29
30private:
31 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
32 return new FailImageFilter(buffer);
33 }
34
35 typedef SkImageFilter INHERITED;
36};
37
38class IdentityImageFilter : public SkImageFilter {
39public:
40 IdentityImageFilter() {}
41 virtual Factory getFactory() SK_OVERRIDE { return CreateProc; };
42
43protected:
44 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
45 SkBitmap* result, SkIPoint* offset) {
46 *result = src;
47 return true;
48 }
49
50 IdentityImageFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
51
52private:
53 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
54 return new IdentityImageFilter(buffer);
55 }
56
57 typedef SkImageFilter INHERITED;
58};
59
60///////////////////////////////////////////////////////////////////////////////
61
62static void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
63 SkPaint paint;
64 paint.setImageFilter(imf);
65 paint.setColor(SK_ColorGREEN);
66 canvas->save();
67 canvas->clipRect(r);
68 canvas->drawPaint(paint);
69 canvas->restore();
70}
71
72static void draw_line(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
73 SkPaint paint;
74 paint.setColor(SK_ColorBLUE);
75 paint.setImageFilter(imf);
76 paint.setStrokeWidth(r.width()/10);
77 canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
78}
79
80static void draw_rect(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
81 SkPaint paint;
82 paint.setColor(SK_ColorYELLOW);
83 paint.setImageFilter(imf);
84 SkRect rr(r);
85 rr.inset(r.width()/10, r.height()/10);
86 canvas->drawRect(rr, paint);
87}
88
89static void draw_path(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
90 SkPaint paint;
91 paint.setColor(SK_ColorMAGENTA);
92 paint.setImageFilter(imf);
93 paint.setAntiAlias(true);
94 canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint);
95}
96
97static void draw_text(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
98 SkPaint paint;
99 paint.setImageFilter(imf);
100 paint.setColor(SK_ColorCYAN);
101 paint.setAntiAlias(true);
102 paint.setTextSize(r.height()/2);
103 paint.setTextAlign(SkPaint::kCenter_Align);
104 canvas->drawText("Text", 4, r.centerX(), r.centerY(), paint);
105}
106
107static void draw_bitmap(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
108 SkPaint paint;
109 paint.setImageFilter(imf);
110
111 SkIRect bounds;
112 r.roundOut(&bounds);
113
114 SkBitmap bm;
115 bm.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), bounds.height());
116 bm.allocPixels();
117 bm.eraseColor(0);
118 SkCanvas c(bm);
119 draw_path(&c, r, NULL);
120
121 canvas->drawBitmap(bm, 0, 0, &paint);
122}
123
124static void draw_sprite(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
125 SkPaint paint;
126 paint.setImageFilter(imf);
127
128 SkIRect bounds;
129 r.roundOut(&bounds);
130
131 SkBitmap bm;
132 bm.setConfig(SkBitmap::kARGB_8888_Config, bounds.width(), bounds.height());
133 bm.allocPixels();
134 bm.eraseColor(0);
135 SkCanvas c(bm);
136 draw_path(&c, r, NULL);
137
138 SkPoint loc = { r.fLeft, r.fTop };
139 canvas->getTotalMatrix().mapPoints(&loc, 1);
140 canvas->drawSprite(bm,
141 SkScalarRoundToInt(loc.fX), SkScalarRoundToInt(loc.fY),
142 &paint);
143}
144
145///////////////////////////////////////////////////////////////////////////////
146
147class ImageFiltersBaseGM : public skiagm::GM {
148public:
149 ImageFiltersBaseGM () {}
150
151protected:
152
153 virtual SkString onShortName() {
154 return SkString("imagefiltersbase");
155 }
156
157 virtual SkISize onISize() { return SkISize::Make(700, 460); }
158
159 void draw_frame(SkCanvas* canvas, const SkRect& r) {
160 SkPaint paint;
161 paint.setStyle(SkPaint::kStroke_Style);
162 paint.setColor(SK_ColorRED);
163 canvas->drawRect(r, paint);
164 }
165
166 virtual void onDraw(SkCanvas* canvas) {
167 void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = {
168 draw_paint,
169 draw_line, draw_rect, draw_path, draw_text,
170 draw_bitmap,
171 draw_sprite
172 };
173
174 SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorRED,
175 SkXfermode::kSrcIn_Mode);
176 SkImageFilter* filters[] = {
177#if 1
178 NULL,
179 new IdentityImageFilter,
180 new FailImageFilter,
181 new SkColorFilterImageFilter(cf),
182#endif
183 new SkBlurImageFilter(12.0f, 0.0f),
184 };
185 cf->unref();
186
187 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
188 SkScalar MARGIN = SkIntToScalar(16);
189 SkScalar DX = r.width() + MARGIN;
190 SkScalar DY = r.height() + MARGIN;
191
192 canvas->translate(MARGIN, MARGIN);
193 for (size_t i = 0; i < SK_ARRAY_COUNT(drawProc); ++i) {
194 canvas->save();
195 for (size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) {
196 drawProc[i](canvas, r, filters[j]);
197
198 draw_frame(canvas, r);
199 canvas->translate(0, DY);
200 }
201 canvas->restore();
202 canvas->translate(DX, 0);
203 }
204 }
205
206private:
207 typedef GM INHERITED;
208};
209
210///////////////////////////////////////////////////////////////////////////////
211
212static skiagm::GM* MyFactory(void*) { return new ImageFiltersBaseGM; }
213static skiagm::GMRegistry reg(MyFactory);
214
215