18d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org/*
28d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org * Copyright 2012 Google Inc.
38d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org *
48d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
58d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org * found in the LICENSE file.
68d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org */
78d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
88d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "gm.h"
98d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkCanvas.h"
108d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkColorMatrixFilter.h"
118d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkColorPriv.h"
128d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkShader.h"
138d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
148d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkBlurImageFilter.h"
158d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#include "SkColorFilterImageFilter.h"
1633d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "SkTDArray.h"
178d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
188d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#define FILTER_WIDTH    SkIntToScalar(30)
198d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#define FILTER_HEIGHT   SkIntToScalar(30)
208d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#define MARGIN          SkIntToScalar(10)
218d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
22d053ce9c54d4e5937a142278359e5a4cde18095ereedstatic sk_sp<SkColorFilter> cf_make_brightness(float brightness) {
23df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed    SkScalar amount255 = brightness * 255;
243061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkScalar matrix[20] = {
253061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        1, 0, 0, 0, amount255,
263061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        0, 1, 0, 0, amount255,
273061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        0, 0, 1, 0, amount255,
283061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        0, 0, 0, 1, 0 };
29d053ce9c54d4e5937a142278359e5a4cde18095ereed    return SkColorFilter::MakeMatrixFilterRowMajor255(matrix);
303061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
313061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
32d053ce9c54d4e5937a142278359e5a4cde18095ereedstatic sk_sp<SkColorFilter> cf_make_grayscale() {
333061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkScalar matrix[20];
343061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    memset(matrix, 0, 20 * sizeof(SkScalar));
353061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    matrix[0] = matrix[5] = matrix[10] = 0.2126f;
363061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    matrix[1] = matrix[6] = matrix[11] = 0.7152f;
373061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    matrix[2] = matrix[7] = matrix[12] = 0.0722f;
383061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    matrix[18] = 1.0f;
39d053ce9c54d4e5937a142278359e5a4cde18095ereed    return SkColorFilter::MakeMatrixFilterRowMajor255(matrix);
403061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
413061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
42d053ce9c54d4e5937a142278359e5a4cde18095ereedstatic sk_sp<SkColorFilter> cf_make_colorize(SkColor color) {
437d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    return SkColorFilter::MakeModeFilter(color, SkBlendMode::kSrc);
443061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
453061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
46d053ce9c54d4e5937a142278359e5a4cde18095ereedstatic void sk_gm_get_colorfilters(SkTArray<sk_sp<SkColorFilter>>* array) {
47d053ce9c54d4e5937a142278359e5a4cde18095ereed    array->push_back(cf_make_brightness(0.5f));
48d053ce9c54d4e5937a142278359e5a4cde18095ereed    array->push_back(cf_make_grayscale());
49d053ce9c54d4e5937a142278359e5a4cde18095ereed    array->push_back(cf_make_colorize(SK_ColorBLUE));
503061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
513061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
523061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed///////////////////////////////////////////////////////////////////////////////////////////////////
533061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed#include "SkGradientShader.h"
543061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed#include "SkImage.h"
553061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed#include "Resources.h"
563061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
572ad1aa67c6894696cdd65ec56057f81031d1c24areedstatic sk_sp<SkShader> sh_make_lineargradient0() {
583061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
593061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
602ad1aa67c6894696cdd65ec56057f81031d1c24areed    return SkGradientShader::MakeLinear(pts, colors, nullptr, 3, SkShader::kRepeat_TileMode);
613061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
623061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
632ad1aa67c6894696cdd65ec56057f81031d1c24areedstatic sk_sp<SkShader> sh_make_lineargradient1() {
643061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
653061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkColor colors[] = { SK_ColorRED, 0x0000FF00, SK_ColorBLUE };
662ad1aa67c6894696cdd65ec56057f81031d1c24areed    return SkGradientShader::MakeLinear(pts, colors, nullptr, 3, SkShader::kRepeat_TileMode);
673061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
683061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
692ad1aa67c6894696cdd65ec56057f81031d1c24areedstatic sk_sp<SkShader> sh_make_image() {
709ce9d6772df650ceb0511f275e1a83dffa78ff72reed    sk_sp<SkImage> image(GetResourceAsImage("mandrill_128.png"));
71dfe3e5052260e087d32326976183b58c36694ffdbsalomon    if (!image) {
72dfe3e5052260e087d32326976183b58c36694ffdbsalomon        return nullptr;
73dfe3e5052260e087d32326976183b58c36694ffdbsalomon    }
745671c5b9124f17d33bc14b6d347cdc6fe5d19dc8reed    return image->makeShader(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
753061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
763061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
7757fa241d6f43557e4243a46f8b5a4ed447ccb8d2reedstatic void sk_gm_get_shaders(SkTDArray<SkShader*>* array) {
782ad1aa67c6894696cdd65ec56057f81031d1c24areed    if (auto shader = sh_make_lineargradient0()) {
792ad1aa67c6894696cdd65ec56057f81031d1c24areed        *array->append() = shader.release();
80dfe3e5052260e087d32326976183b58c36694ffdbsalomon    }
812ad1aa67c6894696cdd65ec56057f81031d1c24areed    if (auto shader = sh_make_lineargradient1()) {
822ad1aa67c6894696cdd65ec56057f81031d1c24areed        *array->append() = shader.release();
83dfe3e5052260e087d32326976183b58c36694ffdbsalomon    }
842ad1aa67c6894696cdd65ec56057f81031d1c24areed    if (auto shader = sh_make_image()) {
852ad1aa67c6894696cdd65ec56057f81031d1c24areed        *array->append() = shader.release();
86dfe3e5052260e087d32326976183b58c36694ffdbsalomon    }
873061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
883061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
893061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed///////////////////////////////////////////////////////////////////////////////////////////////////
903061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
916e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillipsstatic sk_sp<SkImageFilter> make_blur(float amount, sk_sp<SkImageFilter> input) {
926e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips    return SkBlurImageFilter::Make(amount, amount, std::move(input));
938d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
948d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
956e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillipsstatic sk_sp<SkImageFilter> make_brightness(float amount, sk_sp<SkImageFilter> input) {
965605b56afa5bd89f3148b397318b616fccfd4004robertphillips    return SkColorFilterImageFilter::Make(cf_make_brightness(amount), std::move(input));
978d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
988d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
996e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillipsstatic sk_sp<SkImageFilter> make_grayscale(sk_sp<SkImageFilter> input) {
1005605b56afa5bd89f3148b397318b616fccfd4004robertphillips    return SkColorFilterImageFilter::Make(cf_make_grayscale(), std::move(input));
1018d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
1028d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
1036e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillipsstatic sk_sp<SkImageFilter> make_mode_blue(sk_sp<SkImageFilter> input) {
1045605b56afa5bd89f3148b397318b616fccfd4004robertphillips    return SkColorFilterImageFilter::Make(cf_make_colorize(SK_ColorBLUE), std::move(input));
1058d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
1068d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
1076e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillipsstatic void draw_clipped_rect(SkCanvas* canvas,
1086e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips                              const SkRect& r,
1096e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips                              const SkPaint& paint,
1106e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips                              float outset = 0.0f) {
1115605b56afa5bd89f3148b397318b616fccfd4004robertphillips    canvas->save();
1125605b56afa5bd89f3148b397318b616fccfd4004robertphillips    SkRect clip(r);
1135605b56afa5bd89f3148b397318b616fccfd4004robertphillips    clip.outset(outset, outset);
1145605b56afa5bd89f3148b397318b616fccfd4004robertphillips    canvas->clipRect(clip);
1155605b56afa5bd89f3148b397318b616fccfd4004robertphillips    canvas->drawRect(r, paint);
1165605b56afa5bd89f3148b397318b616fccfd4004robertphillips    canvas->restore();
1172a24338c777462e04a2b26295f9c034155ee8f3ehalcanary}
118f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
1192a24338c777462e04a2b26295f9c034155ee8f3ehalcanaryDEF_SIMPLE_GM(colorfilterimagefilter, canvas, 400, 100){
1208d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
1218d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkPaint paint;
1228d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        paint.setColor(SK_ColorRED);
1238d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->save();
1248d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.2f) {
1256e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> dim(make_brightness(-brightness, nullptr));
1266e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> bright(make_brightness(brightness, std::move(dim)));
1276e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            paint.setImageFilter(std::move(bright));
1286e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            draw_clipped_rect(canvas, r, paint);
1298d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1308d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1318d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->restore();
1328d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->translate(0, FILTER_HEIGHT + MARGIN);
1338d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1346e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> brightness(make_brightness(0.9f, nullptr));
1356e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> grayscale(make_grayscale(std::move(brightness)));
1366e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            paint.setImageFilter(std::move(grayscale));
1376e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            draw_clipped_rect(canvas, r, paint);
1388d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1398d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1408d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1416e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> grayscale(make_grayscale(nullptr));
1426e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> brightness(make_brightness(0.9f, std::move(grayscale)));
1436e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            paint.setImageFilter(std::move(brightness));
1446e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            draw_clipped_rect(canvas, r, paint);
1458d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1468d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1478d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1486e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> blue(make_mode_blue(nullptr));
1496e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> brightness(make_brightness(1.0f, std::move(blue)));
1506e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            paint.setImageFilter(std::move(brightness));
1516e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            draw_clipped_rect(canvas, r, paint);
1528d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1538d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1548d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1556e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> brightness(make_brightness(1.0f, nullptr));
1566e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> blue(make_mode_blue(std::move(brightness)));
1576e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            paint.setImageFilter(std::move(blue));
1586e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            draw_clipped_rect(canvas, r, paint);
1598d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1608d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1618d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1626e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> blur(make_blur(3.0f, nullptr));
1636e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> brightness(make_brightness(0.5f, std::move(blur)));
1646e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            paint.setImageFilter(std::move(brightness));
1656e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            draw_clipped_rect(canvas, r, paint, 3);
1668d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1678d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1680abdf766d395ed3b7059511425f431589eca05f6senorblanco        {
1696e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            sk_sp<SkImageFilter> blue(make_mode_blue(nullptr));
1706e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            paint.setImageFilter(std::move(blue));
1716e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1robertphillips            draw_clipped_rect(canvas, r, paint, 5);
1720abdf766d395ed3b7059511425f431589eca05f6senorblanco            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1730abdf766d395ed3b7059511425f431589eca05f6senorblanco        }
1742a24338c777462e04a2b26295f9c034155ee8f3ehalcanary}
175287d22d9999f340d485e1db4dd19930f76f40230halcanary
176287d22d9999f340d485e1db4dd19930f76f40230halcanaryDEF_SIMPLE_GM(colorfilterimagefilter_layer, canvas, 32, 32) {
177287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkAutoCanvasRestore autoCanvasRestore(canvas, false);
178287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkColorMatrix cm;
179287d22d9999f340d485e1db4dd19930f76f40230halcanary    cm.setSaturation(0.0f);
1805605b56afa5bd89f3148b397318b616fccfd4004robertphillips    sk_sp<SkColorFilter> cf(SkColorFilter::MakeMatrixFilterRowMajor255(cm.fMat));
181287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkPaint p;
1825605b56afa5bd89f3148b397318b616fccfd4004robertphillips    p.setImageFilter(SkColorFilterImageFilter::Make(std::move(cf), nullptr));
183287d22d9999f340d485e1db4dd19930f76f40230halcanary    canvas->saveLayer(NULL, &p);
184287d22d9999f340d485e1db4dd19930f76f40230halcanary    canvas->clear(SK_ColorRED);
185287d22d9999f340d485e1db4dd19930f76f40230halcanary}
1863061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
1873061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed///////////////////////////////////////////////////////////////////////////////////////////////////
1883061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
18957fa241d6f43557e4243a46f8b5a4ed447ccb8d2reedtemplate <typename T> class SkTRefArray : public SkTDArray<T> {
19057fa241d6f43557e4243a46f8b5a4ed447ccb8d2reedpublic:
19157fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    ~SkTRefArray() { this->unrefAll(); }
19257fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed};
19357fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed
1946dc14aab5ea6be87b5b10f17a19737f586708768reedDEF_SIMPLE_GM(colorfiltershader, canvas, 610, 450) {
195d053ce9c54d4e5937a142278359e5a4cde18095ereed    SkTArray<sk_sp<SkColorFilter>> filters;
19657fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    sk_gm_get_colorfilters(&filters);
19757fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed
19857fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    SkTRefArray<SkShader*> shaders;
19957fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    sk_gm_get_shaders(&shaders);
2003061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
2013061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkPaint paint;
2023061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkRect r = SkRect::MakeWH(120, 120);
2033061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
2043061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    canvas->translate(20, 20);
2053061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    for (int y = 0; y < shaders.count(); ++y) {
2063061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        SkShader* shader = shaders[y];
207dfe3e5052260e087d32326976183b58c36694ffdbsalomon
2083061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        canvas->save();
2093061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        for (int x = -1; x < filters.count(); ++x) {
210d053ce9c54d4e5937a142278359e5a4cde18095ereed            sk_sp<SkColorFilter> filter = x >= 0 ? filters[x] : nullptr;
2113061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
212150835e779ceb24e2b540f58958cbff2a0ab9942reed            paint.setShader(shader->makeWithColorFilter(filter));
2133061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            canvas->drawRect(r, paint);
2143061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            canvas->translate(150, 0);
2153061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        }
2163061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        canvas->restore();
2173061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        canvas->translate(0, 150);
2183061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    }
2193061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
220