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"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
108926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkCanvas.h"
118926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkColorFilter.h"
128926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkColorPriv.h"
1360aaeb2b551d5e3e90baacac315e899e26f758f1Cary Clark#include "SkImageFilterPriv.h"
148926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkShader.h"
158926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
168926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com#include "SkBlurImageFilter.h"
1744888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org#include "SkColorFilterImageFilter.h"
18f44fcdca01722959c3be335f44e88b59dbb33a10junov@chromium.org#include "SkDropShadowImageFilter.h"
194ba94e26106a4ecab4d3841d702b57487b82334erobertphillips#include "SkSpecialImage.h"
208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
218926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comclass FailImageFilter : public SkImageFilter {
228926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.compublic:
237daaaa4425ea083df437eea95ba6b38315ce98adreed    class Registrar {
247daaaa4425ea083df437eea95ba6b38315ce98adreed    public:
257daaaa4425ea083df437eea95ba6b38315ce98adreed        Registrar() {
267daaaa4425ea083df437eea95ba6b38315ce98adreed            SkFlattenable::Register("FailImageFilter",
273b37545bc594a96de45eba62dea0ce478750f2a9mtklein                                    FailImageFilter::CreateProc,
283b37545bc594a96de45eba62dea0ce478750f2a9mtklein                                    FailImageFilter::GetFlattenableType());
297daaaa4425ea083df437eea95ba6b38315ce98adreed        }
307daaaa4425ea083df437eea95ba6b38315ce98adreed    };
3143c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips    static sk_sp<SkImageFilter> Make() {
3243c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips        return sk_sp<SkImageFilter>(new FailImageFilter);
3343c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips    }
34ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
35f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips    SK_TO_STRING_OVERRIDE()
36ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(FailImageFilter)
379fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed
388926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprotected:
3943c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips    FailImageFilter() : INHERITED(nullptr, 0, nullptr) {}
409fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed
414ba94e26106a4ecab4d3841d702b57487b82334erobertphillips    sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
424ba94e26106a4ecab4d3841d702b57487b82334erobertphillips                                        SkIPoint* offset) const override {
434ba94e26106a4ecab4d3841d702b57487b82334erobertphillips        return nullptr;
448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
4562745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett    sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override {
4662745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett        return nullptr;
4762745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett    }
48d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
498926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprivate:
508926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    typedef SkImageFilter INHERITED;
518926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com};
528926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
537daaaa4425ea083df437eea95ba6b38315ce98adreedstatic FailImageFilter::Registrar gReg0;
547daaaa4425ea083df437eea95ba6b38315ce98adreed
5560c9b58b3214b0154c931656e91e39b230e987d8reedsk_sp<SkFlattenable> FailImageFilter::CreateProc(SkReadBuffer& buffer) {
569fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
5743c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips    return FailImageFilter::Make();
589fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed}
59ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
60f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips#ifndef SK_IGNORE_TO_STRING
61f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillipsvoid FailImageFilter::toString(SkString* str) const {
62f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips    str->appendf("FailImageFilter: (");
63f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips    str->append(")");
64f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips}
65f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips#endif
66f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips
678926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comclass IdentityImageFilter : public SkImageFilter {
688926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.compublic:
697daaaa4425ea083df437eea95ba6b38315ce98adreed    class Registrar {
707daaaa4425ea083df437eea95ba6b38315ce98adreed    public:
717daaaa4425ea083df437eea95ba6b38315ce98adreed        Registrar() {
727daaaa4425ea083df437eea95ba6b38315ce98adreed            SkFlattenable::Register("IdentityImageFilter",
733b37545bc594a96de45eba62dea0ce478750f2a9mtklein                                    IdentityImageFilter::CreateProc,
743b37545bc594a96de45eba62dea0ce478750f2a9mtklein                                    IdentityImageFilter::GetFlattenableType());
757daaaa4425ea083df437eea95ba6b38315ce98adreed        }
767daaaa4425ea083df437eea95ba6b38315ce98adreed    };
7743c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips    static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> input) {
7843c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips        return sk_sp<SkImageFilter>(new IdentityImageFilter(std::move(input)));
79cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
808926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
81f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips    SK_TO_STRING_OVERRIDE()
82ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(IdentityImageFilter)
839fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed
8443c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillipsprotected:
854ba94e26106a4ecab4d3841d702b57487b82334erobertphillips    sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
864ba94e26106a4ecab4d3841d702b57487b82334erobertphillips                                        SkIPoint* offset) const override {
87f7efa502d62af80bd15b03e1131603fb6577c3dfcommit-bot@chromium.org        offset->set(0, 0);
884ba94e26106a4ecab4d3841d702b57487b82334erobertphillips        return sk_ref_sp<SkSpecialImage>(source);
898926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
9062745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett    sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override {
9162745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett        return sk_ref_sp(const_cast<IdentityImageFilter*>(this));
9262745a8bba20d7ca91167915eb459339bcfb8862Matt Sarett    }
938926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
948926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprivate:
9543c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips    IdentityImageFilter(sk_sp<SkImageFilter> input) : INHERITED(&input, 1, nullptr) {}
9643c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips
978926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    typedef SkImageFilter INHERITED;
988926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com};
998926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1007daaaa4425ea083df437eea95ba6b38315ce98adreedstatic IdentityImageFilter::Registrar gReg1;
1017daaaa4425ea083df437eea95ba6b38315ce98adreed
10260c9b58b3214b0154c931656e91e39b230e987d8reedsk_sp<SkFlattenable> IdentityImageFilter::CreateProc(SkReadBuffer& buffer) {
1039fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
10443c2ad4e8f9ed84f46caa57e0b471f7393f1280arobertphillips    return IdentityImageFilter::Make(common.getInput(0));
1059fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed}
106ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
107f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips#ifndef SK_IGNORE_TO_STRING
108f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillipsvoid IdentityImageFilter::toString(SkString* str) const {
109f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips    str->appendf("IdentityImageFilter: (");
110f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips    str->append(")");
111f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips}
112f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips#endif
113f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips
1148926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com///////////////////////////////////////////////////////////////////////////////
1158926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1165605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_paint(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
1178926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1185605b56afa5bd89f3148b397318b616fccfd4004robertphillips    paint.setImageFilter(std::move(imf));
1198926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorGREEN);
1208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->save();
1218926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->clipRect(r);
1228926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawPaint(paint);
1238926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->restore();
1248926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1258926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1265605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_line(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
1278926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1288926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorBLUE);
1298926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
1308926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setStrokeWidth(r.width()/10);
1318926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
1328926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1338926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1345605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_rect(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
1358926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1368926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorYELLOW);
1378926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
1388926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkRect rr(r);
1398926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    rr.inset(r.width()/10, r.height()/10);
1408926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawRect(rr, paint);
1418926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1428926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1435605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_path(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
1448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1458926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorMAGENTA);
1468926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
1478926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setAntiAlias(true);
1488926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint);
1498926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1508926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1515605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_text(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
1528926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1538926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setImageFilter(imf);
1548926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setColor(SK_ColorCYAN);
1558926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setAntiAlias(true);
1561818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark    sk_tool_utils::set_portable_typeface(&paint);
1578926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setTextSize(r.height()/2);
1588926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    paint.setTextAlign(SkPaint::kCenter_Align);
1592a475eae622adc1e8fa29206be1eaf862c23548eCary Clark    canvas->drawString("Text", r.centerX(), r.centerY(), paint);
1608926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1618926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1625605b56afa5bd89f3148b397318b616fccfd4004robertphillipsstatic void draw_bitmap(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
1638926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkPaint paint;
1645605b56afa5bd89f3148b397318b616fccfd4004robertphillips    paint.setImageFilter(std::move(imf));
165d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1668926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkIRect bounds;
1678926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    r.roundOut(&bounds);
168d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1698926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkBitmap bm;
170eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm.allocN32Pixels(bounds.width(), bounds.height());
171dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm.eraseColor(SK_ColorTRANSPARENT);
1728926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    SkCanvas c(bm);
17396fcdcc219d2a0d3579719b84b28bede76efba64halcanary    draw_path(&c, r, nullptr);
174d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1758926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    canvas->drawBitmap(bm, 0, 0, &paint);
1768926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com}
1778926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1788926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com///////////////////////////////////////////////////////////////////////////////
1798926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1808926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comclass ImageFiltersBaseGM : public skiagm::GM {
1818926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.compublic:
1828926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    ImageFiltersBaseGM () {}
1838926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1848926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprotected:
18536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
1868926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        return SkString("imagefiltersbase");
1878926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
1888926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
18936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override { return SkISize::Make(700, 500); }
1908926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
1918926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    void draw_frame(SkCanvas* canvas, const SkRect& r) {
1928926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkPaint paint;
1938926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
1948926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        paint.setColor(SK_ColorRED);
1958926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        canvas->drawRect(r, paint);
1968926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
1978926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
19836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
1995605b56afa5bd89f3148b397318b616fccfd4004robertphillips        void (*drawProc[])(SkCanvas*, const SkRect&, sk_sp<SkImageFilter>) = {
2008926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            draw_paint,
2018926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            draw_line, draw_rect, draw_path, draw_text,
2028926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            draw_bitmap,
2038926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        };
204d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2057d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed        auto cf = SkColorFilter::MakeModeFilter(SK_ColorRED, SkBlendMode::kSrcIn);
2065605b56afa5bd89f3148b397318b616fccfd4004robertphillips        sk_sp<SkImageFilter> filters[] = {
20796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            nullptr,
2085605b56afa5bd89f3148b397318b616fccfd4004robertphillips            IdentityImageFilter::Make(nullptr),
2095605b56afa5bd89f3148b397318b616fccfd4004robertphillips            FailImageFilter::Make(),
2105605b56afa5bd89f3148b397318b616fccfd4004robertphillips            SkColorFilterImageFilter::Make(std::move(cf), nullptr),
2114fafedd33add9948db1147c60d681ed9340984fdHerb Derby            // The strage 0.29 value tickles an edge case where crop rect calculates
2124fafedd33add9948db1147c60d681ed9340984fdHerb Derby            // a small border, but the blur really needs no border. This tickels
2134fafedd33add9948db1147c60d681ed9340984fdHerb Derby            // an msan uninitialized value bug.
2144fafedd33add9948db1147c60d681ed9340984fdHerb Derby            SkBlurImageFilter::Make(12.0f, 0.29f, nullptr),
215c416912da4840af0c49bd8cdcf00044ed39500f6robertphillips            SkDropShadowImageFilter::Make(
2165605b56afa5bd89f3148b397318b616fccfd4004robertphillips                                    10.0f, 5.0f, 3.0f, 3.0f, SK_ColorBLUE,
217c416912da4840af0c49bd8cdcf00044ed39500f6robertphillips                                    SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
218c416912da4840af0c49bd8cdcf00044ed39500f6robertphillips                                    nullptr),
2198926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        };
2208926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2218926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
2228926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkScalar MARGIN = SkIntToScalar(16);
2238926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkScalar DX = r.width() + MARGIN;
2248926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        SkScalar DY = r.height() + MARGIN;
2258926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2268926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        canvas->translate(MARGIN, MARGIN);
2278926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(drawProc); ++i) {
2288926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            canvas->save();
2298926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            for (size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) {
2308926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                drawProc[i](canvas, r, filters[j]);
231d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2328926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                draw_frame(canvas, r);
2338926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com                canvas->translate(0, DY);
2348926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            }
2358926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            canvas->restore();
2368926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com            canvas->translate(DX, 0);
2378926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com        }
2388926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    }
2398926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2408926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.comprivate:
2418926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com    typedef GM INHERITED;
2428926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com};
2438dc0ccb8d33d1af7dd13228509e61fe915bc7705reedDEF_GM( return new ImageFiltersBaseGM; )
2448926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2458926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com///////////////////////////////////////////////////////////////////////////////
2468926b169f6a0dfa4c2129a98ec2aee205f0c8527reed@google.com
2478dc0ccb8d33d1af7dd13228509e61fe915bc7705reed/*
2488dc0ccb8d33d1af7dd13228509e61fe915bc7705reed *  Want to test combos of filter and LCD text, to be sure we disable LCD in the presence of
2498dc0ccb8d33d1af7dd13228509e61fe915bc7705reed *  a filter.
2508dc0ccb8d33d1af7dd13228509e61fe915bc7705reed */
2518dc0ccb8d33d1af7dd13228509e61fe915bc7705reedclass ImageFiltersTextBaseGM : public skiagm::GM {
2528dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    SkString fSuffix;
2538dc0ccb8d33d1af7dd13228509e61fe915bc7705reedpublic:
2548dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    ImageFiltersTextBaseGM(const char suffix[]) : fSuffix(suffix) {}
2558dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
2568dc0ccb8d33d1af7dd13228509e61fe915bc7705reedprotected:
25736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
2588dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        SkString name;
2598dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        name.printf("%s_%s", "textfilter", fSuffix.c_str());
2608dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        return name;
2618dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    }
2628dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
26336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override { return SkISize::Make(512, 342); }
2648dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
2658dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    void drawWaterfall(SkCanvas* canvas, const SkPaint& origPaint) {
2668dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        const uint32_t flags[] = {
2678dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            0,
2688dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            SkPaint::kAntiAlias_Flag,
2698dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            SkPaint::kAntiAlias_Flag | SkPaint::kLCDRenderText_Flag,
2708dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        };
2718dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        SkPaint paint(origPaint);
2721818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&paint);
2738dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        paint.setTextSize(30);
2748dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
2758dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        SkAutoCanvasRestore acr(canvas, true);
2768dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        for (size_t i = 0; i < SK_ARRAY_COUNT(flags); ++i) {
2778dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            paint.setFlags(flags[i]);
2782a475eae622adc1e8fa29206be1eaf862c23548eCary Clark            canvas->drawString("Hamburgefon", 0, 0, paint);
2798dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            canvas->translate(0, 40);
2808dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        }
2818dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    }
2828dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
2838dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    virtual void installFilter(SkPaint* paint) = 0;
2848dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
28536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
2868dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        SkPaint paint;
2878dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
2888dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        canvas->translate(20, 40);
2898dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
2908dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        for (int doSaveLayer = 0; doSaveLayer <= 1; ++doSaveLayer) {
2918dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            SkAutoCanvasRestore acr(canvas, true);
2928dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            for (int useFilter = 0; useFilter <= 1; ++useFilter) {
2938dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                SkAutoCanvasRestore acr2(canvas, true);
2948dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
2958dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                SkPaint paint;
2968dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                if (useFilter) {
2978dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                    this->installFilter(&paint);
2988dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                }
2998dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                if (doSaveLayer) {
30096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                    canvas->saveLayer(nullptr, &paint);
30196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                    paint.setImageFilter(nullptr);
3028dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                }
3038dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                this->drawWaterfall(canvas, paint);
3048dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
3058dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                acr2.restore();
3068dc0ccb8d33d1af7dd13228509e61fe915bc7705reed                canvas->translate(250, 0);
3078dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            }
3088dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            acr.restore();
3098dc0ccb8d33d1af7dd13228509e61fe915bc7705reed            canvas->translate(0, 200);
3108dc0ccb8d33d1af7dd13228509e61fe915bc7705reed        }
3118dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    }
3129d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
3138dc0ccb8d33d1af7dd13228509e61fe915bc7705reedprivate:
3148dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    typedef GM INHERITED;
3158dc0ccb8d33d1af7dd13228509e61fe915bc7705reed};
3168dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
3178dc0ccb8d33d1af7dd13228509e61fe915bc7705reedclass ImageFiltersText_IF : public ImageFiltersTextBaseGM {
3188dc0ccb8d33d1af7dd13228509e61fe915bc7705reedpublic:
3198dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    ImageFiltersText_IF() : ImageFiltersTextBaseGM("image") {}
3208dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
32136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void installFilter(SkPaint* paint) override {
3226e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips        paint->setImageFilter(SkBlurImageFilter::Make(1.5f, 1.5f, nullptr));
3238dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    }
3248dc0ccb8d33d1af7dd13228509e61fe915bc7705reed};
3258dc0ccb8d33d1af7dd13228509e61fe915bc7705reedDEF_GM( return new ImageFiltersText_IF; )
3268dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
3278dc0ccb8d33d1af7dd13228509e61fe915bc7705reedclass ImageFiltersText_CF : public ImageFiltersTextBaseGM {
3288dc0ccb8d33d1af7dd13228509e61fe915bc7705reedpublic:
3298dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    ImageFiltersText_CF() : ImageFiltersTextBaseGM("color") {}
3308dc0ccb8d33d1af7dd13228509e61fe915bc7705reed
33136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void installFilter(SkPaint* paint) override {
3327d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed        paint->setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorBLUE, SkBlendMode::kSrcIn));
3338dc0ccb8d33d1af7dd13228509e61fe915bc7705reed    }
3348dc0ccb8d33d1af7dd13228509e61fe915bc7705reed};
3358dc0ccb8d33d1af7dd13228509e61fe915bc7705reedDEF_GM( return new ImageFiltersText_CF; )
336