Home | History | Annotate | Download | only in gm
      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:
     17     MatrixConvolutionGM() : fInitialized(false) {
     18         this->setBGColor(0x00000000);
     19     }
     20 
     21 protected:
     22     virtual SkString onShortName() {
     23         return SkString("matrixconvolution");
     24     }
     25 
     26     void make_bitmap() {
     27         fBitmap.setConfig(SkBitmap::kARGB_8888_Config, 80, 80);
     28         fBitmap.allocPixels();
     29         SkDevice device(fBitmap);
     30         SkCanvas canvas(&device);
     31         canvas.clear(0x00000000);
     32         SkPaint paint;
     33         paint.setAntiAlias(true);
     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 
     46     virtual SkISize onISize() {
     47         return make_isize(400, 300);
     48     }
     49 
     50     void draw(SkCanvas* canvas, int x, int y, const SkIPoint& target, SkMatrixConvolutionImageFilter::TileMode tileMode, bool convolveAlpha) {
     51         SkScalar kernel[9] = {
     52             SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
     53             SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1),
     54             SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
     55         };
     56         SkISize kernelSize = SkISize::Make(3, 3);
     57         SkScalar gain = SkFloatToScalar(0.3f), bias = SkIntToScalar(100);
     58         SkPaint paint;
     59         SkAutoTUnref<SkImageFilter> filter(SkNEW_ARGS(SkMatrixConvolutionImageFilter, (kernelSize, kernel, gain, bias, target, tileMode, convolveAlpha)));
     60         paint.setImageFilter(filter);
     61         canvas->save();
     62         canvas->clipRect(SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y),
     63             SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
     64         canvas->drawBitmap(fBitmap, SkIntToScalar(x), SkIntToScalar(y), &paint);
     65         canvas->restore();
     66     }
     67 
     68     virtual void onDraw(SkCanvas* canvas) {
     69         if (!fInitialized) {
     70             make_bitmap();
     71             fInitialized = true;
     72         }
     73         canvas->clear(0x00000000);
     74         SkIPoint target = SkIPoint::Make(1, 0);
     75         for (int x = 10; x < 310; x += 100) {
     76             draw(canvas, x, 10, target, SkMatrixConvolutionImageFilter::kClamp_TileMode, true);
     77             draw(canvas, x, 110, target, SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, true);
     78             draw(canvas, x, 210, target, SkMatrixConvolutionImageFilter::kRepeat_TileMode, true);
     79             target.fY++;
     80         }
     81         target.fY = 1;
     82         draw(canvas, 310, 10, target, SkMatrixConvolutionImageFilter::kClamp_TileMode, false);
     83         draw(canvas, 310, 110, target, SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, false);
     84         draw(canvas, 310, 210, target, SkMatrixConvolutionImageFilter::kRepeat_TileMode, false);
     85     }
     86 
     87 private:
     88     typedef GM INHERITED;
     89     SkBitmap fBitmap;
     90     bool fInitialized;
     91 };
     92 
     93 //////////////////////////////////////////////////////////////////////////////
     94 
     95 static GM* MyFactory(void*) { return new MatrixConvolutionGM; }
     96 static GMRegistry reg(MyFactory);
     97 
     98 }
     99