1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "gm.h" 9 #include "SkColor.h" 10 #include "SkMatrixConvolutionImageFilter.h" 11 #include "SkGradientShader.h" 12 13 namespace skiagm { 14 15 class MatrixConvolutionGM : public GM { 16 public: MatrixConvolutionGM()17 MatrixConvolutionGM() { 18 this->setBGColor(0x00000000); 19 } 20 21 protected: 22 onShortName()23 SkString onShortName() override { 24 return SkString("matrixconvolution"); 25 } 26 makeBitmap()27 void makeBitmap() { 28 fBitmap.allocN32Pixels(80, 80); 29 SkCanvas canvas(fBitmap); 30 canvas.clear(0x00000000); 31 SkPaint paint; 32 paint.setAntiAlias(true); 33 sk_tool_utils::set_portable_typeface(&paint); 34 paint.setColor(0xFFFFFFFF); 35 paint.setTextSize(SkIntToScalar(180)); 36 SkPoint pts[2] = { SkPoint::Make(0, 0), 37 SkPoint::Make(0, SkIntToScalar(80)) }; 38 SkColor colors[2] = { 0xFFFFFFFF, 0x40404040 }; 39 SkScalar pos[2] = { 0, SkIntToScalar(80) }; 40 paint.setShader(SkGradientShader::CreateLinear( 41 pts, colors, pos, 2, SkShader::kClamp_TileMode))->unref(); 42 const char* str = "e"; 43 canvas.drawText(str, strlen(str), SkIntToScalar(-10), SkIntToScalar(80), paint); 44 } 45 onISize()46 SkISize onISize() override { 47 return SkISize::Make(500, 300); 48 } 49 draw(SkCanvas * canvas,int x,int y,const SkIPoint & kernelOffset,SkMatrixConvolutionImageFilter::TileMode tileMode,bool convolveAlpha,const SkImageFilter::CropRect * cropRect=nullptr)50 void draw(SkCanvas* canvas, int x, int y, const SkIPoint& kernelOffset, 51 SkMatrixConvolutionImageFilter::TileMode tileMode, bool convolveAlpha, 52 const SkImageFilter::CropRect* cropRect = nullptr) { 53 SkScalar kernel[9] = { 54 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 55 SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), 56 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), 57 }; 58 SkISize kernelSize = SkISize::Make(3, 3); 59 SkScalar gain = 0.3f, bias = SkIntToScalar(100); 60 SkPaint paint; 61 SkAutoTUnref<SkImageFilter> filter( 62 SkMatrixConvolutionImageFilter::Create(kernelSize, 63 kernel, 64 gain, 65 bias, 66 kernelOffset, 67 tileMode, 68 convolveAlpha, 69 nullptr, 70 cropRect)); 71 paint.setImageFilter(filter); 72 canvas->save(); 73 canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 74 canvas->clipRect(SkRect::MakeWH(SkIntToScalar(fBitmap.width()), 75 SkIntToScalar(fBitmap.height()))); 76 canvas->drawBitmap(fBitmap, 0, 0, &paint); 77 canvas->restore(); 78 } 79 80 typedef SkMatrixConvolutionImageFilter MCIF; 81 onOnceBeforeDraw()82 void onOnceBeforeDraw() override { 83 this->makeBitmap(); 84 } 85 onDraw(SkCanvas * canvas)86 void onDraw(SkCanvas* canvas) override { 87 canvas->clear(SK_ColorBLACK); 88 SkIPoint kernelOffset = SkIPoint::Make(1, 0); 89 SkImageFilter::CropRect rect(SkRect::Make(fBitmap.bounds())); 90 for (int x = 10; x < 310; x += 100) { 91 this->draw(canvas, x, 10, kernelOffset, MCIF::kClamp_TileMode, true, &rect); 92 this->draw(canvas, x, 110, kernelOffset, MCIF::kClampToBlack_TileMode, true, &rect); 93 this->draw(canvas, x, 210, kernelOffset, MCIF::kRepeat_TileMode, true, &rect); 94 kernelOffset.fY++; 95 } 96 kernelOffset.fY = 1; 97 SkImageFilter::CropRect smallRect(SkRect::MakeXYWH(10, 5, 60, 60)); 98 this->draw(canvas, 310, 10, kernelOffset, MCIF::kClamp_TileMode, true, &smallRect); 99 this->draw(canvas, 310, 110, kernelOffset, MCIF::kClampToBlack_TileMode, true, &smallRect); 100 this->draw(canvas, 310, 210, kernelOffset, MCIF::kRepeat_TileMode, true, &smallRect); 101 102 this->draw(canvas, 410, 10, kernelOffset, MCIF::kClamp_TileMode, false, &rect); 103 this->draw(canvas, 410, 110, kernelOffset, MCIF::kClampToBlack_TileMode, false, &rect); 104 this->draw(canvas, 410, 210, kernelOffset, MCIF::kRepeat_TileMode, false, &rect); 105 } 106 107 private: 108 SkBitmap fBitmap; 109 110 typedef GM INHERITED; 111 }; 112 113 ////////////////////////////////////////////////////////////////////////////// 114 115 DEF_GM(return new MatrixConvolutionGM;) 116 117 } 118