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