2 * Copyright 2011 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
10 #include "SkColorFilter.h"
11 #include "SkColorPriv.h"
14 #include "SkBlurImageFilter.h"
15 #include "SkColorFilterImageFilter.h"
16 #include "SkDropShadowImageFilter.h"
17 #include "SkTestImageFilters.h"
19 class FailImageFilter : public SkImageFilter {
24 SkFlattenable::Register("FailImageFilter",
25 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
26 FailImageFilter::DeepCreateProc,
28 FailImageFilter::CreateProc,
30 FailImageFilter::GetFlattenableType());
33 static FailImageFilter* Create() {
34 return SkNEW(FailImageFilter);
37 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(FailImageFilter)
40 FailImageFilter() : INHERITED(0, NULL) {}
42 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
43 SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE {
47 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
48 FailImageFilter(SkReadBuffer& buffer) : INHERITED(0, buffer) {}
52 typedef SkImageFilter INHERITED;
55 static FailImageFilter::Registrar gReg0;
57 SkFlattenable* FailImageFilter::CreateProc(SkReadBuffer& buffer) {
58 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
59 return FailImageFilter::Create();
62 class IdentityImageFilter : public SkImageFilter {
67 SkFlattenable::Register("IdentityImageFilter",
68 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
69 IdentityImageFilter::DeepCreateProc,
71 IdentityImageFilter::CreateProc,
73 IdentityImageFilter::GetFlattenableType());
76 static IdentityImageFilter* Create(SkImageFilter* input = NULL) {
77 return SkNEW_ARGS(IdentityImageFilter, (input));
80 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(IdentityImageFilter)
82 IdentityImageFilter(SkImageFilter* input) : INHERITED(1, &input) {}
84 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
85 SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE {
91 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
92 IdentityImageFilter(SkReadBuffer& buffer) : INHERITED(1, buffer) {}
96 typedef SkImageFilter INHERITED;
99 static IdentityImageFilter::Registrar gReg1;
101 SkFlattenable* IdentityImageFilter::CreateProc(SkReadBuffer& buffer) {
102 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
103 return IdentityImageFilter::Create(common.getInput(0));
106 ///////////////////////////////////////////////////////////////////////////////
108 static void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
110 paint.setImageFilter(imf);
111 paint.setColor(SK_ColorGREEN);
114 canvas->drawPaint(paint);
118 static void draw_line(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
120 paint.setColor(SK_ColorBLUE);
121 paint.setImageFilter(imf);
122 paint.setStrokeWidth(r.width()/10);
123 canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
126 static void draw_rect(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
128 paint.setColor(SK_ColorYELLOW);
129 paint.setImageFilter(imf);
131 rr.inset(r.width()/10, r.height()/10);
132 canvas->drawRect(rr, paint);
135 static void draw_path(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
137 paint.setColor(SK_ColorMAGENTA);
138 paint.setImageFilter(imf);
139 paint.setAntiAlias(true);
140 canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint);
143 static void draw_text(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
145 paint.setImageFilter(imf);
146 paint.setColor(SK_ColorCYAN);
147 paint.setAntiAlias(true);
148 sk_tool_utils::set_portable_typeface(&paint);
149 paint.setTextSize(r.height()/2);
150 paint.setTextAlign(SkPaint::kCenter_Align);
151 canvas->drawText("Text", 4, r.centerX(), r.centerY(), paint);
154 static void draw_bitmap(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
156 paint.setImageFilter(imf);
162 bm.allocN32Pixels(bounds.width(), bounds.height());
163 bm.eraseColor(SK_ColorTRANSPARENT);
165 draw_path(&c, r, NULL);
167 canvas->drawBitmap(bm, 0, 0, &paint);
170 static void draw_sprite(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
172 paint.setImageFilter(imf);
178 bm.allocN32Pixels(bounds.width(), bounds.height());
179 bm.eraseColor(SK_ColorTRANSPARENT);
181 draw_path(&c, r, NULL);
183 SkPoint loc = { r.fLeft, r.fTop };
184 canvas->getTotalMatrix().mapPoints(&loc, 1);
185 canvas->drawSprite(bm,
186 SkScalarRoundToInt(loc.fX), SkScalarRoundToInt(loc.fY),
190 ///////////////////////////////////////////////////////////////////////////////
192 class ImageFiltersBaseGM : public skiagm::GM {
194 ImageFiltersBaseGM () {}
197 virtual SkString onShortName() {
198 return SkString("imagefiltersbase");
201 virtual SkISize onISize() { return SkISize::Make(700, 500); }
203 void draw_frame(SkCanvas* canvas, const SkRect& r) {
205 paint.setStyle(SkPaint::kStroke_Style);
206 paint.setColor(SK_ColorRED);
207 canvas->drawRect(r, paint);
210 virtual uint32_t onGetFlags() const {
211 // Because of the use of drawSprite, this test is excluded
212 // from scaled replay tests because drawSprite ignores the
213 // reciprocal scale that is applied at record time, which is
214 // the intended behavior of drawSprite.
215 return kSkipScaledReplay_Flag | kSkipTiled_Flag;
218 virtual void onDraw(SkCanvas* canvas) {
219 void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = {
221 draw_line, draw_rect, draw_path, draw_text,
226 SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorRED,
227 SkXfermode::kSrcIn_Mode);
228 SkImageFilter* filters[] = {
230 IdentityImageFilter::Create(),
231 FailImageFilter::Create(),
232 SkColorFilterImageFilter::Create(cf),
233 SkBlurImageFilter::Create(12.0f, 0.0f),
234 SkDropShadowImageFilter::Create(10.0f, 5.0f, 3.0f, 3.0f, SK_ColorBLUE),
238 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
239 SkScalar MARGIN = SkIntToScalar(16);
240 SkScalar DX = r.width() + MARGIN;
241 SkScalar DY = r.height() + MARGIN;
243 canvas->translate(MARGIN, MARGIN);
244 for (size_t i = 0; i < SK_ARRAY_COUNT(drawProc); ++i) {
246 for (size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) {
247 drawProc[i](canvas, r, filters[j]);
249 draw_frame(canvas, r);
250 canvas->translate(0, DY);
253 canvas->translate(DX, 0);
256 for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) {
257 SkSafeUnref(filters[j]);
262 typedef GM INHERITED;
265 ///////////////////////////////////////////////////////////////////////////////
267 static skiagm::GM* MyFactory(void*) { return new ImageFiltersBaseGM; }
268 static skiagm::GMRegistry reg(MyFactory);