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