15faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org/* 25faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Copyright 2012 Google Inc. 35faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * 45faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 55faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * found in the LICENSE file. 65faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org */ 75faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 85faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "gm.h" 93bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org#include "SkColor.h" 105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkMatrixConvolutionImageFilter.h" 113bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org#include "SkGradientShader.h" 125faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgnamespace skiagm { 145faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgclass MatrixConvolutionGM : public GM { 165faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgpublic: 175faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org MatrixConvolutionGM() : fInitialized(false) { 185faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org this->setBGColor(0x00000000); 195faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 205faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 215faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprotected: 22a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 23a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 24a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 25a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 265faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org virtual SkString onShortName() { 275faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org return SkString("matrixconvolution"); 285faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 295faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 305faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org void make_bitmap() { 31eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com fBitmap.allocN32Pixels(80, 80); 32c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org SkCanvas canvas(fBitmap); 335faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org canvas.clear(0x00000000); 345faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkPaint paint; 355faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org paint.setAntiAlias(true); 365faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org paint.setColor(0xFFFFFFFF); 375faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org paint.setTextSize(SkIntToScalar(180)); 383bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org SkPoint pts[2] = { SkPoint::Make(0, 0), 393bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org SkPoint::Make(0, SkIntToScalar(80)) }; 403bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org SkColor colors[2] = { 0xFFFFFFFF, 0x40404040 }; 413bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org SkScalar pos[2] = { 0, SkIntToScalar(80) }; 423bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org paint.setShader(SkGradientShader::CreateLinear( 433bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org pts, colors, pos, 2, SkShader::kClamp_TileMode))->unref(); 445faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org const char* str = "e"; 455faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org canvas.drawText(str, strlen(str), SkIntToScalar(-10), SkIntToScalar(80), paint); 465faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 475faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 485faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org virtual SkISize onISize() { 49f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(500, 300); 505faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 515faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 5284cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org void draw(SkCanvas* canvas, int x, int y, const SkIPoint& kernelOffset, 537938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org SkMatrixConvolutionImageFilter::TileMode tileMode, bool convolveAlpha, 547938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org const SkImageFilter::CropRect* cropRect = NULL) { 555faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkScalar kernel[9] = { 565faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 575faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), 585faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 595faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org }; 605faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkISize kernelSize = SkISize::Make(3, 3); 614b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org SkScalar gain = 0.3f, bias = SkIntToScalar(100); 625faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkPaint paint; 637938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org SkAutoTUnref<SkImageFilter> filter( 64cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkMatrixConvolutionImageFilter::Create(kernelSize, 65cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org kernel, 66cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org gain, 67cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org bias, 6884cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org kernelOffset, 69cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org tileMode, 70cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org convolveAlpha, 71cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org NULL, 72cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org cropRect)); 735faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org paint.setImageFilter(filter); 74ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org canvas->save(); 757938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 767938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()), 777938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org SkIntToScalar(fBitmap.height()))); 787938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org canvas->drawBitmap(fBitmap, 0, 0, &paint); 79ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org canvas->restore(); 805faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 815faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 827938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org typedef SkMatrixConvolutionImageFilter MCIF; 837938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org 845faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org virtual void onDraw(SkCanvas* canvas) { 855faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org if (!fInitialized) { 865faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org make_bitmap(); 875faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org fInitialized = true; 885faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 895faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org canvas->clear(0x00000000); 9084cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org SkIPoint kernelOffset = SkIPoint::Make(1, 0); 913bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org for (int x = 10; x < 310; x += 100) { 9284cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, x, 10, kernelOffset, MCIF::kClamp_TileMode, true); 9384cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, x, 110, kernelOffset, MCIF::kClampToBlack_TileMode, true); 9484cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, x, 210, kernelOffset, MCIF::kRepeat_TileMode, true); 9584cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org kernelOffset.fY++; 965faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 9784cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org kernelOffset.fY = 1; 982a4223c783e35f1c6095c4736a9246884e51a48dsenorblanco@chromium.org SkImageFilter::CropRect rect(SkRect::MakeXYWH(10, 5, 60, 60)); 9984cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 310, 10, kernelOffset, MCIF::kClamp_TileMode, true, &rect); 10084cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 310, 110, kernelOffset, MCIF::kClampToBlack_TileMode, true, &rect); 10184cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 310, 210, kernelOffset, MCIF::kRepeat_TileMode, true, &rect); 1027938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org 10384cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 410, 10, kernelOffset, MCIF::kClamp_TileMode, false); 10484cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 410, 110, kernelOffset, MCIF::kClampToBlack_TileMode, false); 10584cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 410, 210, kernelOffset, MCIF::kRepeat_TileMode, false); 1065faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 1075faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 1085faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprivate: 1095faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org typedef GM INHERITED; 1105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkBitmap fBitmap; 1115faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org bool fInitialized; 1125faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org}; 1135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 1145faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org////////////////////////////////////////////////////////////////////////////// 1155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 1165faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstatic GM* MyFactory(void*) { return new MatrixConvolutionGM; } 1175faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstatic GMRegistry reg(MyFactory); 1185faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 1195faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org} 120