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