colorfilterimagefilter.cpp revision 3061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1
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"
168d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
178d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#define FILTER_WIDTH    SkIntToScalar(30)
188d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#define FILTER_HEIGHT   SkIntToScalar(30)
198d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org#define MARGIN          SkIntToScalar(10)
208d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
213061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic SkColorFilter* cf_make_brightness(float brightness) {
223061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkScalar amount255 = SkScalarMul(brightness, SkIntToScalar(255));
233061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkScalar matrix[20] = {
243061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        1, 0, 0, 0, amount255,
253061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        0, 1, 0, 0, amount255,
263061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        0, 0, 1, 0, amount255,
273061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        0, 0, 0, 1, 0 };
283061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return SkColorMatrixFilter::Create(matrix);
293061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
303061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
313061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic SkColorFilter* cf_make_grayscale() {
323061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkScalar matrix[20];
333061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    memset(matrix, 0, 20 * sizeof(SkScalar));
343061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    matrix[0] = matrix[5] = matrix[10] = 0.2126f;
353061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    matrix[1] = matrix[6] = matrix[11] = 0.7152f;
363061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    matrix[2] = matrix[7] = matrix[12] = 0.0722f;
373061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    matrix[18] = 1.0f;
383061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return SkColorMatrixFilter::Create(matrix);
393061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
403061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
413061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic SkColorFilter* cf_make_colorize(SkColor color) {
423061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return SkColorFilter::CreateModeFilter(color, SkXfermode::kSrc_Mode);
433061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
443061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
453061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic const SkTDArray<SkColorFilter*>& sk_gm_get_colorfilters() {
463061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    static SkTDArray<SkColorFilter*> gColorFilters;
473061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
483061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    if (gColorFilters.count() == 0) {
493061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        *gColorFilters.append() = cf_make_brightness(0.5f);
503061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        *gColorFilters.append() = cf_make_grayscale();
513061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        *gColorFilters.append() = cf_make_colorize(SK_ColorBLUE);
523061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    }
533061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return gColorFilters;
543061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
553061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
563061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed///////////////////////////////////////////////////////////////////////////////////////////////////
573061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed#include "SkGradientShader.h"
583061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed#include "SkImage.h"
593061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed#include "Resources.h"
603061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
613061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic SkShader* sh_make_lineargradient0() {
623061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
633061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
643061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return SkGradientShader::CreateLinear(pts, colors, nullptr, 3, SkShader::kRepeat_TileMode);
653061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
663061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
673061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic SkShader* sh_make_lineargradient1() {
683061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
693061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkColor colors[] = { SK_ColorRED, 0x0000FF00, SK_ColorBLUE };
703061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return SkGradientShader::CreateLinear(pts, colors, nullptr, 3, SkShader::kRepeat_TileMode);
713061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
723061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
733061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic SkShader* sh_make_image() {
743061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkAutoTUnref<SkImage> image(GetResourceAsImage("mandrill_128.png"));
753061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return image->newShader(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
763061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
773061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
783061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic const SkTDArray<SkShader*>& sk_gm_get_shaders() {
793061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    static SkTDArray<SkShader*> gShaders;
803061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
813061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    if (gShaders.count() == 0) {
823061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        *gShaders.append() = sh_make_lineargradient0();
833061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        *gShaders.append() = sh_make_lineargradient1();
843061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        *gShaders.append() = sh_make_image();
853061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    }
863061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return gShaders;
873061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
883061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
893061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed///////////////////////////////////////////////////////////////////////////////////////////////////
903061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
9196fcdcc219d2a0d3579719b84b28bede76efba64halcanarystatic SkImageFilter* make_blur(float amount, SkImageFilter* input = nullptr) {
92cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    return SkBlurImageFilter::Create(amount, amount, input);
938d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
948d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
9596fcdcc219d2a0d3579719b84b28bede76efba64halcanarystatic SkImageFilter* make_brightness(float amount, SkImageFilter* input = nullptr) {
963061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkAutoTUnref<SkColorFilter> filter(cf_make_brightness(amount));
97cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org    return SkColorFilterImageFilter::Create(filter, input);
988d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
998d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
10096fcdcc219d2a0d3579719b84b28bede76efba64halcanarystatic SkImageFilter* make_grayscale(SkImageFilter* input = nullptr) {
1013061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkAutoTUnref<SkColorFilter> filter(cf_make_grayscale());
102cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org    return SkColorFilterImageFilter::Create(filter, input);
1038d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
1048d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
10596fcdcc219d2a0d3579719b84b28bede76efba64halcanarystatic SkImageFilter* make_mode_blue(SkImageFilter* input = nullptr) {
1063061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkAutoTUnref<SkColorFilter> filter(cf_make_colorize(SK_ColorBLUE));
107cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org    return SkColorFilterImageFilter::Create(filter, input);
1088d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
1098d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
1102a24338c777462e04a2b26295f9c034155ee8f3ehalcanarystatic void drawClippedRect(SkCanvas* canvas,
1112a24338c777462e04a2b26295f9c034155ee8f3ehalcanary                            const SkRect& r,
1122a24338c777462e04a2b26295f9c034155ee8f3ehalcanary                            const SkPaint& paint,
1132a24338c777462e04a2b26295f9c034155ee8f3ehalcanary                            float outset = 0.0f) {
1148d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->save();
1158d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkRect clip(r);
1164b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        clip.outset(outset, outset);
1178d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->clipRect(clip);
1188d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->drawRect(r, paint);
1198d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->restore();
1202a24338c777462e04a2b26295f9c034155ee8f3ehalcanary}
121f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
1222a24338c777462e04a2b26295f9c034155ee8f3ehalcanaryDEF_SIMPLE_GM(colorfilterimagefilter, canvas, 400, 100){
1238d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
1248d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkPaint paint;
1258d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        paint.setColor(SK_ColorRED);
1268d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->save();
1278d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.2f) {
1288d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> dim(make_brightness(-brightness));
1298d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> bright(make_brightness(brightness, dim));
1308d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(bright);
1318d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1328d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1338d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1348d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->restore();
1358d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->translate(0, FILTER_HEIGHT + MARGIN);
1368d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1378d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f));
1388d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale(brightness));
1398d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(grayscale);
1408d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1418d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1428d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1438d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1448d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale());
1458d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f, grayscale));
1468d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(brightness);
1478d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1488d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1498d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1508d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1518d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
1528d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f, blue));
1538d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(brightness);
1548d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1558d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1568d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1578d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1588d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f));
1598d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> blue(make_mode_blue(brightness));
1608d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(blue);
1618d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1628d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1638d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1648d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1658d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> blur(make_blur(3.0f));
1668d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.5f, blur));
1678d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(brightness);
1688d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint, 3);
1698d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1708d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1710abdf766d395ed3b7059511425f431589eca05f6senorblanco        {
1720abdf766d395ed3b7059511425f431589eca05f6senorblanco            SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
1730abdf766d395ed3b7059511425f431589eca05f6senorblanco            paint.setImageFilter(blue.get());
1740abdf766d395ed3b7059511425f431589eca05f6senorblanco            drawClippedRect(canvas, r, paint, 5);
1750abdf766d395ed3b7059511425f431589eca05f6senorblanco            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1760abdf766d395ed3b7059511425f431589eca05f6senorblanco        }
1772a24338c777462e04a2b26295f9c034155ee8f3ehalcanary}
178287d22d9999f340d485e1db4dd19930f76f40230halcanary
179287d22d9999f340d485e1db4dd19930f76f40230halcanaryDEF_SIMPLE_GM(colorfilterimagefilter_layer, canvas, 32, 32) {
180287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkAutoCanvasRestore autoCanvasRestore(canvas, false);
181287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkColorMatrix cm;
182287d22d9999f340d485e1db4dd19930f76f40230halcanary    cm.setSaturation(0.0f);
183287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkAutoTUnref<SkColorFilter> cf(SkColorMatrixFilter::Create(cm));
184287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkAutoTUnref<SkImageFilter> imf(SkColorFilterImageFilter::Create(cf));
185287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkPaint p;
186287d22d9999f340d485e1db4dd19930f76f40230halcanary    p.setImageFilter(imf);
187287d22d9999f340d485e1db4dd19930f76f40230halcanary    canvas->saveLayer(NULL, &p);
188287d22d9999f340d485e1db4dd19930f76f40230halcanary    canvas->clear(SK_ColorRED);
189287d22d9999f340d485e1db4dd19930f76f40230halcanary}
1903061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
1913061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed///////////////////////////////////////////////////////////////////////////////////////////////////
1923061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
1933061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedDEF_SIMPLE_GM(colorfiltershader, canvas, 800, 800) {
1943061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkTDArray<SkColorFilter*>& filters = sk_gm_get_colorfilters();
1953061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkTDArray<SkShader*>& shaders = sk_gm_get_shaders();
1963061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
1973061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkPaint paint;
1983061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkRect r = SkRect::MakeWH(120, 120);
1993061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
2003061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    canvas->translate(20, 20);
2013061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    for (int y = 0; y < shaders.count(); ++y) {
2023061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        SkShader* shader = shaders[y];
2033061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
2043061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        canvas->save();
2053061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        for (int x = -1; x < filters.count(); ++x) {
2063061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            SkColorFilter* filter = x >= 0 ? filters[x] : nullptr;
2073061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
2083061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            paint.setShader(shader->newWithColorFilter(filter))->unref();
2093061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            canvas->drawRect(r, paint);
2103061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            canvas->translate(150, 0);
2113061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        }
2123061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        canvas->restore();
2133061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        canvas->translate(0, 150);
2143061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    }
2153061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
216