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
4557fa241d6f43557e4243a46f8b5a4ed447ccb8d2reedstatic void sk_gm_get_colorfilters(SkTDArray<SkColorFilter*>* array) {
4657fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    *array->append() = cf_make_brightness(0.5f);
4757fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    *array->append() = cf_make_grayscale();
4857fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    *array->append() = cf_make_colorize(SK_ColorBLUE);
493061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
503061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
513061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed///////////////////////////////////////////////////////////////////////////////////////////////////
523061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed#include "SkGradientShader.h"
533061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed#include "SkImage.h"
543061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed#include "Resources.h"
553061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
563061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic SkShader* sh_make_lineargradient0() {
573061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
583061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
593061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return SkGradientShader::CreateLinear(pts, colors, nullptr, 3, SkShader::kRepeat_TileMode);
603061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
613061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
623061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic SkShader* sh_make_lineargradient1() {
633061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkPoint pts[] = { { 0, 0 }, { 100, 100 } };
643061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    const SkColor colors[] = { SK_ColorRED, 0x0000FF00, SK_ColorBLUE };
653061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return SkGradientShader::CreateLinear(pts, colors, nullptr, 3, SkShader::kRepeat_TileMode);
663061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
673061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
683061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedstatic SkShader* sh_make_image() {
693061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkAutoTUnref<SkImage> image(GetResourceAsImage("mandrill_128.png"));
70dfe3e5052260e087d32326976183b58c36694ffdbsalomon    if (!image) {
71dfe3e5052260e087d32326976183b58c36694ffdbsalomon        return nullptr;
72dfe3e5052260e087d32326976183b58c36694ffdbsalomon    }
733061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    return image->newShader(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
743061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
753061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
7657fa241d6f43557e4243a46f8b5a4ed447ccb8d2reedstatic void sk_gm_get_shaders(SkTDArray<SkShader*>* array) {
77dfe3e5052260e087d32326976183b58c36694ffdbsalomon    if (SkShader* shader = sh_make_lineargradient0()) {
78dfe3e5052260e087d32326976183b58c36694ffdbsalomon        *array->append() = shader;
79dfe3e5052260e087d32326976183b58c36694ffdbsalomon    }
80dfe3e5052260e087d32326976183b58c36694ffdbsalomon    if (SkShader* shader = sh_make_lineargradient1()) {
81dfe3e5052260e087d32326976183b58c36694ffdbsalomon        *array->append() = shader;
82dfe3e5052260e087d32326976183b58c36694ffdbsalomon    }
83dfe3e5052260e087d32326976183b58c36694ffdbsalomon    if (SkShader* shader = sh_make_image()) {
84dfe3e5052260e087d32326976183b58c36694ffdbsalomon        *array->append() = shader;
85dfe3e5052260e087d32326976183b58c36694ffdbsalomon    }
863061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
873061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
883061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed///////////////////////////////////////////////////////////////////////////////////////////////////
893061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
9096fcdcc219d2a0d3579719b84b28bede76efba64halcanarystatic SkImageFilter* make_blur(float amount, SkImageFilter* input = nullptr) {
91cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    return SkBlurImageFilter::Create(amount, amount, input);
928d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
938d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
9496fcdcc219d2a0d3579719b84b28bede76efba64halcanarystatic SkImageFilter* make_brightness(float amount, SkImageFilter* input = nullptr) {
953061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkAutoTUnref<SkColorFilter> filter(cf_make_brightness(amount));
96cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org    return SkColorFilterImageFilter::Create(filter, input);
978d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
988d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
9996fcdcc219d2a0d3579719b84b28bede76efba64halcanarystatic SkImageFilter* make_grayscale(SkImageFilter* input = nullptr) {
1003061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkAutoTUnref<SkColorFilter> filter(cf_make_grayscale());
101cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org    return SkColorFilterImageFilter::Create(filter, input);
1028d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
1038d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
10496fcdcc219d2a0d3579719b84b28bede76efba64halcanarystatic SkImageFilter* make_mode_blue(SkImageFilter* input = nullptr) {
1053061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkAutoTUnref<SkColorFilter> filter(cf_make_colorize(SK_ColorBLUE));
106cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org    return SkColorFilterImageFilter::Create(filter, input);
1078d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
1088d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
1092a24338c777462e04a2b26295f9c034155ee8f3ehalcanarystatic void drawClippedRect(SkCanvas* canvas,
1102a24338c777462e04a2b26295f9c034155ee8f3ehalcanary                            const SkRect& r,
1112a24338c777462e04a2b26295f9c034155ee8f3ehalcanary                            const SkPaint& paint,
1122a24338c777462e04a2b26295f9c034155ee8f3ehalcanary                            float outset = 0.0f) {
1138d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->save();
1148d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkRect clip(r);
1154b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        clip.outset(outset, outset);
1168d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->clipRect(clip);
1178d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->drawRect(r, paint);
1188d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->restore();
1192a24338c777462e04a2b26295f9c034155ee8f3ehalcanary}
120f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
1212a24338c777462e04a2b26295f9c034155ee8f3ehalcanaryDEF_SIMPLE_GM(colorfilterimagefilter, canvas, 400, 100){
1228d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
1238d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        SkPaint paint;
1248d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        paint.setColor(SK_ColorRED);
1258d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->save();
1268d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.2f) {
1278d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> dim(make_brightness(-brightness));
1288d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> bright(make_brightness(brightness, dim));
1298d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(bright);
1308d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1318d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1328d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1338d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->restore();
1348d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        canvas->translate(0, FILTER_HEIGHT + MARGIN);
1358d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1368d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f));
1378d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale(brightness));
1388d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(grayscale);
1398d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1408d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1418d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1428d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1438d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale());
1448d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f, grayscale));
1458d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(brightness);
1468d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1478d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1488d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1498d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1508d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
1518d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f, blue));
1528d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(brightness);
1538d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1548d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1558d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1568d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1578d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f));
1588d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> blue(make_mode_blue(brightness));
1598d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(blue);
1608d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint);
1618d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1628d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1638d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        {
1648d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> blur(make_blur(3.0f));
1658d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.5f, blur));
1668d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            paint.setImageFilter(brightness);
1678d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            drawClippedRect(canvas, r, paint, 3);
1688d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1698d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org        }
1700abdf766d395ed3b7059511425f431589eca05f6senorblanco        {
1710abdf766d395ed3b7059511425f431589eca05f6senorblanco            SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
1720abdf766d395ed3b7059511425f431589eca05f6senorblanco            paint.setImageFilter(blue.get());
1730abdf766d395ed3b7059511425f431589eca05f6senorblanco            drawClippedRect(canvas, r, paint, 5);
1740abdf766d395ed3b7059511425f431589eca05f6senorblanco            canvas->translate(FILTER_WIDTH + MARGIN, 0);
1750abdf766d395ed3b7059511425f431589eca05f6senorblanco        }
1762a24338c777462e04a2b26295f9c034155ee8f3ehalcanary}
177287d22d9999f340d485e1db4dd19930f76f40230halcanary
178287d22d9999f340d485e1db4dd19930f76f40230halcanaryDEF_SIMPLE_GM(colorfilterimagefilter_layer, canvas, 32, 32) {
179287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkAutoCanvasRestore autoCanvasRestore(canvas, false);
180287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkColorMatrix cm;
181287d22d9999f340d485e1db4dd19930f76f40230halcanary    cm.setSaturation(0.0f);
182287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkAutoTUnref<SkColorFilter> cf(SkColorMatrixFilter::Create(cm));
183287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkAutoTUnref<SkImageFilter> imf(SkColorFilterImageFilter::Create(cf));
184287d22d9999f340d485e1db4dd19930f76f40230halcanary    SkPaint p;
185287d22d9999f340d485e1db4dd19930f76f40230halcanary    p.setImageFilter(imf);
186287d22d9999f340d485e1db4dd19930f76f40230halcanary    canvas->saveLayer(NULL, &p);
187287d22d9999f340d485e1db4dd19930f76f40230halcanary    canvas->clear(SK_ColorRED);
188287d22d9999f340d485e1db4dd19930f76f40230halcanary}
1893061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
1903061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed///////////////////////////////////////////////////////////////////////////////////////////////////
1913061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
19257fa241d6f43557e4243a46f8b5a4ed447ccb8d2reedtemplate <typename T> class SkTRefArray : public SkTDArray<T> {
19357fa241d6f43557e4243a46f8b5a4ed447ccb8d2reedpublic:
19457fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    ~SkTRefArray() { this->unrefAll(); }
19557fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed};
19657fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed
1973061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reedDEF_SIMPLE_GM(colorfiltershader, canvas, 800, 800) {
19857fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    SkTRefArray<SkColorFilter*> filters;
19957fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    sk_gm_get_colorfilters(&filters);
20057fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed
20157fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    SkTRefArray<SkShader*> shaders;
20257fa241d6f43557e4243a46f8b5a4ed447ccb8d2reed    sk_gm_get_shaders(&shaders);
2033061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
2043061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkPaint paint;
2053061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    SkRect r = SkRect::MakeWH(120, 120);
2063061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
2073061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    canvas->translate(20, 20);
2083061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    for (int y = 0; y < shaders.count(); ++y) {
2093061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        SkShader* shader = shaders[y];
210dfe3e5052260e087d32326976183b58c36694ffdbsalomon
2113061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        canvas->save();
2123061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        for (int x = -1; x < filters.count(); ++x) {
2133061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            SkColorFilter* filter = x >= 0 ? filters[x] : nullptr;
2143061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed
2153061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            paint.setShader(shader->newWithColorFilter(filter))->unref();
2163061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            canvas->drawRect(r, paint);
2173061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed            canvas->translate(150, 0);
2183061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        }
2193061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        canvas->restore();
2203061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed        canvas->translate(0, 150);
2213061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed    }
2223061af4a5f2b8ef00fc4a34b04cf99dfb780f1a1reed}
223