18926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com/*
28926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * Copyright 2011 Google Inc.
38926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com *
48926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * Use of this source code is governed by a BSD-style license that can be
58926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com * found in the LICENSE file.
68926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com */
78926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
88926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "gm.h"
98926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkCanvas.h"
108926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkColorFilter.h"
118926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkColorPriv.h"
128926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkShader.h"
138926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
148926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkBlurImageFilter.h"
1544888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org#include "SkColorFilterImageFilter.h"
16f44fcdca01722959c3be335f44e88b59dbb33a10junov@chromium.org#include "SkDropShadowImageFilter.h"
178926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkTestImageFilters.h"
188926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
198926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comclass FailImageFilter : public SkImageFilter {
208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.compublic:
217daaaa4425ea083df437eea95ba6b38315ce98adreed    class Registrar {
227daaaa4425ea083df437eea95ba6b38315ce98adreed    public:
237daaaa4425ea083df437eea95ba6b38315ce98adreed        Registrar() {
247daaaa4425ea083df437eea95ba6b38315ce98adreed            SkFlattenable::Register("FailImageFilter",
257daaaa4425ea083df437eea95ba6b38315ce98adreed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
267daaaa4425ea083df437eea95ba6b38315ce98adreed                                    FailImageFilter::DeepCreateProc,
277daaaa4425ea083df437eea95ba6b38315ce98adreed#else
287daaaa4425ea083df437eea95ba6b38315ce98adreed                                    FailImageFilter::CreateProc,
297daaaa4425ea083df437eea95ba6b38315ce98adreed#endif
307daaaa4425ea083df437eea95ba6b38315ce98adreed                                    FailImageFilter::GetFlattenableType());
317daaaa4425ea083df437eea95ba6b38315ce98adreed        }
327daaaa4425ea083df437eea95ba6b38315ce98adreed    };
33cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static FailImageFilter* Create() {
34cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        return SkNEW(FailImageFilter);
35cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
36ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
37ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(FailImageFilter)
389fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed
398926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprotected:
407daaaa4425ea083df437eea95ba6b38315ce98adreed    FailImageFilter() : INHERITED(0, NULL) {}
419fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed
424cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
43f7efa502d62af80bd15b03e1131603fb6577c3dfcommit-bot@chromium.org                               SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE {
448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        return false;
458926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
46d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
479fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
489fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    FailImageFilter(SkReadBuffer& buffer) : INHERITED(0, buffer) {}
499fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
508926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
518926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprivate:
528926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    typedef SkImageFilter INHERITED;
538926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com};
548926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
557daaaa4425ea083df437eea95ba6b38315ce98adreedstatic FailImageFilter::Registrar gReg0;
567daaaa4425ea083df437eea95ba6b38315ce98adreed
579fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedSkFlattenable* FailImageFilter::CreateProc(SkReadBuffer& buffer) {
589fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
599fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    return FailImageFilter::Create();
609fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed}
61ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
628926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comclass IdentityImageFilter : public SkImageFilter {
638926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.compublic:
647daaaa4425ea083df437eea95ba6b38315ce98adreed    class Registrar {
657daaaa4425ea083df437eea95ba6b38315ce98adreed    public:
667daaaa4425ea083df437eea95ba6b38315ce98adreed        Registrar() {
677daaaa4425ea083df437eea95ba6b38315ce98adreed            SkFlattenable::Register("IdentityImageFilter",
687daaaa4425ea083df437eea95ba6b38315ce98adreed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
697daaaa4425ea083df437eea95ba6b38315ce98adreed                                    IdentityImageFilter::DeepCreateProc,
707daaaa4425ea083df437eea95ba6b38315ce98adreed#else
717daaaa4425ea083df437eea95ba6b38315ce98adreed                                    IdentityImageFilter::CreateProc,
727daaaa4425ea083df437eea95ba6b38315ce98adreed#endif
737daaaa4425ea083df437eea95ba6b38315ce98adreed                                    IdentityImageFilter::GetFlattenableType());
747daaaa4425ea083df437eea95ba6b38315ce98adreed        }
757daaaa4425ea083df437eea95ba6b38315ce98adreed    };
769ea3d57fde28a5fe4487a111dc3dd49418235e5esenorblanco    static IdentityImageFilter* Create(SkImageFilter* input = NULL) {
779ea3d57fde28a5fe4487a111dc3dd49418235e5esenorblanco        return SkNEW_ARGS(IdentityImageFilter, (input));
78cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
798926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
80ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(IdentityImageFilter)
818926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprotected:
827daaaa4425ea083df437eea95ba6b38315ce98adreed    IdentityImageFilter(SkImageFilter* input) : INHERITED(1, &input) {}
839fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed
844cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
85f7efa502d62af80bd15b03e1131603fb6577c3dfcommit-bot@chromium.org                               SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE {
868926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        *result = src;
87f7efa502d62af80bd15b03e1131603fb6577c3dfcommit-bot@chromium.org        offset->set(0, 0);
888926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        return true;
898926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
908926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
919fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
929fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    IdentityImageFilter(SkReadBuffer& buffer) : INHERITED(1, buffer) {}
939fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
948926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
958926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprivate:
968926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    typedef SkImageFilter INHERITED;
978926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com};
988926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
997daaaa4425ea083df437eea95ba6b38315ce98adreedstatic IdentityImageFilter::Registrar gReg1;
1007daaaa4425ea083df437eea95ba6b38315ce98adreed
1019fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedSkFlattenable* IdentityImageFilter::CreateProc(SkReadBuffer& buffer) {
1029fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
1039fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    return IdentityImageFilter::Create(common.getInput(0));
1049fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed}
105ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
1068926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com///////////////////////////////////////////////////////////////////////////////
1078926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1088926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comstatic void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
1098926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1108926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
1118926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorGREEN);
1128926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->save();
1138926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->clipRect(r);
1148926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawPaint(paint);
1158926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->restore();
1168926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1178926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1188926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comstatic void draw_line(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
1198926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorBLUE);
1218926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
1228926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setStrokeWidth(r.width()/10);
1238926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
1248926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1258926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1268926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comstatic void draw_rect(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
1278926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1288926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorYELLOW);
1298926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
1308926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkRect rr(r);
1318926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    rr.inset(r.width()/10, r.height()/10);
1328926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawRect(rr, paint);
1338926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1348926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1358926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comstatic void draw_path(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
1368926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1378926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorMAGENTA);
1388926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
1398926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setAntiAlias(true);
1408926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint);
1418926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1428926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1438926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comstatic void draw_text(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
1448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1458926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
1468926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorCYAN);
1478926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setAntiAlias(true);
148992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    sk_tool_utils::set_portable_typeface(&paint);
1498926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setTextSize(r.height()/2);
1508926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setTextAlign(SkPaint::kCenter_Align);
1518926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawText("Text", 4, r.centerX(), r.centerY(), paint);
1528926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1538926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1548926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comstatic void draw_bitmap(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
1558926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1568926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
157d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1588926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkIRect bounds;
1598926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    r.roundOut(&bounds);
160d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1618926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkBitmap bm;
162eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm.allocN32Pixels(bounds.width(), bounds.height());
163dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm.eraseColor(SK_ColorTRANSPARENT);
1648926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkCanvas c(bm);
1658926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    draw_path(&c, r, NULL);
166d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1678926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawBitmap(bm, 0, 0, &paint);
1688926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1698926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1708926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comstatic void draw_sprite(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
1718926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1728926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
173d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1748926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkIRect bounds;
1758926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    r.roundOut(&bounds);
176d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1778926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkBitmap bm;
178eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm.allocN32Pixels(bounds.width(), bounds.height());
179dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm.eraseColor(SK_ColorTRANSPARENT);
1808926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkCanvas c(bm);
1818926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    draw_path(&c, r, NULL);
1828926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1838926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPoint loc = { r.fLeft, r.fTop };
1848926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->getTotalMatrix().mapPoints(&loc, 1);
1858926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawSprite(bm,
1868926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                       SkScalarRoundToInt(loc.fX), SkScalarRoundToInt(loc.fY),
1878926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                       &paint);
1888926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1898926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1908926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com///////////////////////////////////////////////////////////////////////////////
1918926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1928926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comclass ImageFiltersBaseGM : public skiagm::GM {
1938926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.compublic:
1948926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    ImageFiltersBaseGM () {}
1958926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1968926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprotected:
1978926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    virtual SkString onShortName() {
1988926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        return SkString("imagefiltersbase");
1998926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
2008926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
201f44fcdca01722959c3be335f44e88b59dbb33a10junov@chromium.org    virtual SkISize onISize() { return SkISize::Make(700, 500); }
2028926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2038926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    void draw_frame(SkCanvas* canvas, const SkRect& r) {
2048926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkPaint paint;
2058926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
2068926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        paint.setColor(SK_ColorRED);
2078926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        canvas->drawRect(r, paint);
2088926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
2098926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
210ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org    virtual uint32_t onGetFlags() const {
211ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        // Because of the use of drawSprite, this test is excluded
212ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        // from scaled replay tests because drawSprite ignores the
213ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        // reciprocal scale that is applied at record time, which is
214ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org        // the intended behavior of drawSprite.
215a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipScaledReplay_Flag | kSkipTiled_Flag;
216ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org    }
217ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org
2188926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    virtual void onDraw(SkCanvas* canvas) {
2198926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = {
2208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            draw_paint,
2218926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            draw_line, draw_rect, draw_path, draw_text,
2228926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            draw_bitmap,
2238926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            draw_sprite
2248926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        };
225d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2268926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorRED,
2278926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                                                     SkXfermode::kSrcIn_Mode);
2288926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkImageFilter* filters[] = {
2298926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            NULL,
230cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            IdentityImageFilter::Create(),
231cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            FailImageFilter::Create(),
232cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org            SkColorFilterImageFilter::Create(cf),
233cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkBlurImageFilter::Create(12.0f, 0.0f),
234bc9845bb60cd883e7ddabb21f04997602145a1adsenorblanco            SkDropShadowImageFilter::Create(10.0f, 5.0f, 3.0f, 3.0f, SK_ColorBLUE),
2358926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        };
2368926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        cf->unref();
2378926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2388926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
2398926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkScalar MARGIN = SkIntToScalar(16);
2408926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkScalar DX = r.width() + MARGIN;
2418926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkScalar DY = r.height() + MARGIN;
2428926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2438926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        canvas->translate(MARGIN, MARGIN);
2448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(drawProc); ++i) {
2458926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            canvas->save();
2468926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            for (size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) {
2478926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                drawProc[i](canvas, r, filters[j]);
248d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2498926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                draw_frame(canvas, r);
2508926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                canvas->translate(0, DY);
2518926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            }
2528926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            canvas->restore();
2538926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            canvas->translate(DX, 0);
2548926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        }
255d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2564bca84d3cf94da5e2c2fd3ea04bba7f96d57171ereed@google.com        for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) {
2574bca84d3cf94da5e2c2fd3ea04bba7f96d57171ereed@google.com            SkSafeUnref(filters[j]);
2584bca84d3cf94da5e2c2fd3ea04bba7f96d57171ereed@google.com        }
2598926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
2608926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2618926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprivate:
2628926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    typedef GM INHERITED;
2638926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com};
2648926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2658926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com///////////////////////////////////////////////////////////////////////////////
2668926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2678926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comstatic skiagm::GM* MyFactory(void*) { return new ImageFiltersBaseGM; }
2688926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comstatic skiagm::GMRegistry reg(MyFactory);
269