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); 36992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(&paint); 375faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org paint.setColor(0xFFFFFFFF); 385faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org paint.setTextSize(SkIntToScalar(180)); 393bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org SkPoint pts[2] = { SkPoint::Make(0, 0), 403bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org SkPoint::Make(0, SkIntToScalar(80)) }; 413bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org SkColor colors[2] = { 0xFFFFFFFF, 0x40404040 }; 423bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org SkScalar pos[2] = { 0, SkIntToScalar(80) }; 433bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org paint.setShader(SkGradientShader::CreateLinear( 443bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org pts, colors, pos, 2, SkShader::kClamp_TileMode))->unref(); 455faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org const char* str = "e"; 465faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org canvas.drawText(str, strlen(str), SkIntToScalar(-10), SkIntToScalar(80), paint); 475faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 485faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 495faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org virtual SkISize onISize() { 50f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(500, 300); 515faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 525faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 5384cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org void draw(SkCanvas* canvas, int x, int y, const SkIPoint& kernelOffset, 547938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org SkMatrixConvolutionImageFilter::TileMode tileMode, bool convolveAlpha, 557938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org const SkImageFilter::CropRect* cropRect = NULL) { 565faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkScalar kernel[9] = { 575faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 585faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), 595faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 605faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org }; 615faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkISize kernelSize = SkISize::Make(3, 3); 624b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org SkScalar gain = 0.3f, bias = SkIntToScalar(100); 635faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkPaint paint; 647938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org SkAutoTUnref<SkImageFilter> filter( 65cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkMatrixConvolutionImageFilter::Create(kernelSize, 66cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org kernel, 67cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org gain, 68cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org bias, 6984cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org kernelOffset, 70cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org tileMode, 71cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org convolveAlpha, 72cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org NULL, 73cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org cropRect)); 745faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org paint.setImageFilter(filter); 75ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org canvas->save(); 767938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 777938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()), 787938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org SkIntToScalar(fBitmap.height()))); 797938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org canvas->drawBitmap(fBitmap, 0, 0, &paint); 80ff06af20fde68aa737b540dc6e42924532873b22junov@chromium.org canvas->restore(); 815faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 825faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 837938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org typedef SkMatrixConvolutionImageFilter MCIF; 847938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org 855faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org virtual void onDraw(SkCanvas* canvas) { 865faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org if (!fInitialized) { 875faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org make_bitmap(); 885faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org fInitialized = true; 895faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 905faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org canvas->clear(0x00000000); 9184cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org SkIPoint kernelOffset = SkIPoint::Make(1, 0); 923bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org for (int x = 10; x < 310; x += 100) { 9384cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, x, 10, kernelOffset, MCIF::kClamp_TileMode, true); 9484cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, x, 110, kernelOffset, MCIF::kClampToBlack_TileMode, true); 9584cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, x, 210, kernelOffset, MCIF::kRepeat_TileMode, true); 9684cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org kernelOffset.fY++; 975faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 9884cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org kernelOffset.fY = 1; 992a4223c783e35f1c6095c4736a9246884e51a48dsenorblanco@chromium.org SkImageFilter::CropRect rect(SkRect::MakeXYWH(10, 5, 60, 60)); 10084cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 310, 10, kernelOffset, MCIF::kClamp_TileMode, true, &rect); 10184cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 310, 110, kernelOffset, MCIF::kClampToBlack_TileMode, true, &rect); 10284cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 310, 210, kernelOffset, MCIF::kRepeat_TileMode, true, &rect); 1037938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org 10484cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 410, 10, kernelOffset, MCIF::kClamp_TileMode, false); 10584cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 410, 110, kernelOffset, MCIF::kClampToBlack_TileMode, false); 10684cd099704b3896ca66081a96508572a924f850ccommit-bot@chromium.org this->draw(canvas, 410, 210, kernelOffset, MCIF::kRepeat_TileMode, false); 1075faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org } 1085faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 1095faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprivate: 1105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org typedef GM INHERITED; 1115faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkBitmap fBitmap; 1125faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org bool fInitialized; 1135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org}; 1145faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 1155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org////////////////////////////////////////////////////////////////////////////// 1165faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 1175faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstatic GM* MyFactory(void*) { return new MatrixConvolutionGM; } 1185faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstatic GMRegistry reg(MyFactory); 1195faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 1205faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org} 121