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 218d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic SkImageFilter* make_blur(float amount, SkImageFilter* input = NULL) { 22cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org return SkBlurImageFilter::Create(amount, amount, input); 238d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org} 248d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 258d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic SkImageFilter* make_brightness(float amount, SkImageFilter* input = NULL) { 264b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org SkScalar amount255 = SkScalarMul(amount, SkIntToScalar(255)); 278d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkScalar matrix[20] = { 1, 0, 0, 0, amount255, 288d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 0, 1, 0, 0, amount255, 298d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 0, 0, 1, 0, amount255, 308d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 0, 0, 0, 1, 0 }; 31727a352f7412753d2a3e4d30eab6500a1a4de135commit-bot@chromium.org SkAutoTUnref<SkColorFilter> filter(SkColorMatrixFilter::Create(matrix)); 32cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org return SkColorFilterImageFilter::Create(filter, input); 338d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org} 348d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 358d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic SkImageFilter* make_grayscale(SkImageFilter* input = NULL) { 368d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkScalar matrix[20]; 378d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org memset(matrix, 0, 20 * sizeof(SkScalar)); 384b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org matrix[0] = matrix[5] = matrix[10] = 0.2126f; 394b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org matrix[1] = matrix[6] = matrix[11] = 0.7152f; 404b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org matrix[2] = matrix[7] = matrix[12] = 0.0722f; 414b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org matrix[18] = 1.0f; 42727a352f7412753d2a3e4d30eab6500a1a4de135commit-bot@chromium.org SkAutoTUnref<SkColorFilter> filter(SkColorMatrixFilter::Create(matrix)); 43cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org return SkColorFilterImageFilter::Create(filter, input); 448d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org} 458d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 468d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic SkImageFilter* make_mode_blue(SkImageFilter* input = NULL) { 478d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkColorFilter> filter( 488d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode)); 49cd9f55989e680b7f52fa21766dde0ac67ac9911fsenorblanco@chromium.org return SkColorFilterImageFilter::Create(filter, input); 508d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org} 518d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 528d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgclass ColorFilterImageFilterGM : public skiagm::GM { 538d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgpublic: 548d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org ColorFilterImageFilterGM () {} 558d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 568d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgprotected: 578d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 588d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org virtual SkString onShortName() { 598d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org return SkString("colorfilterimagefilter"); 608d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org } 618d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 628d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org void drawClippedRect(SkCanvas* canvas, const SkRect& r, const SkPaint& paint, float outset = 0.0f) { 638d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->save(); 648d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkRect clip(r); 654b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org clip.outset(outset, outset); 668d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->clipRect(clip); 678d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->drawRect(r, paint); 688d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->restore(); 698d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org } 708d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 718d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org virtual SkISize onISize() { return SkISize::Make(400, 100); } 728d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 738d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org virtual void onDraw(SkCanvas* canvas) { 74f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 758d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT); 768d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkPaint paint; 778d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org paint.setColor(SK_ColorRED); 788d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->save(); 798d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.2f) { 808d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> dim(make_brightness(-brightness)); 818d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> bright(make_brightness(brightness, dim)); 828d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org paint.setImageFilter(bright); 838d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org drawClippedRect(canvas, r, paint); 848d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->translate(FILTER_WIDTH + MARGIN, 0); 858d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org } 868d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->restore(); 878d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->translate(0, FILTER_HEIGHT + MARGIN); 888d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org { 898d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f)); 908d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> grayscale(make_grayscale(brightness)); 918d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org paint.setImageFilter(grayscale); 928d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org drawClippedRect(canvas, r, paint); 938d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->translate(FILTER_WIDTH + MARGIN, 0); 948d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org } 958d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org { 968d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> grayscale(make_grayscale()); 978d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f, grayscale)); 988d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org paint.setImageFilter(brightness); 998d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org drawClippedRect(canvas, r, paint); 1008d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->translate(FILTER_WIDTH + MARGIN, 0); 1018d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org } 1028d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org { 1038d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> blue(make_mode_blue()); 1048d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f, blue)); 1058d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org paint.setImageFilter(brightness); 1068d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org drawClippedRect(canvas, r, paint); 1078d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->translate(FILTER_WIDTH + MARGIN, 0); 1088d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org } 1098d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org { 1108d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f)); 1118d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> blue(make_mode_blue(brightness)); 1128d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org paint.setImageFilter(blue); 1138d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org drawClippedRect(canvas, r, paint); 1148d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->translate(FILTER_WIDTH + MARGIN, 0); 1158d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org } 1168d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org { 1178d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> blur(make_blur(3.0f)); 1188d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.5f, blur)); 1198d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org paint.setImageFilter(brightness); 1208d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org drawClippedRect(canvas, r, paint, 3); 1218d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org canvas->translate(FILTER_WIDTH + MARGIN, 0); 1228d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org } 1238d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org } 1248d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 1258d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgprivate: 1268d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org typedef GM INHERITED; 1278d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}; 1288d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 1298d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org////////////////////////////////////////////////////////////////////////////// 1308d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org 1318d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic skiagm::GM* MyFactory(void*) { return new ColorFilterImageFilterGM; } 1328d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.orgstatic skiagm::GMRegistry reg(MyFactory); 133