Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2014 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 "SkMatrixImageFilter.h"
     11 
     12 namespace skiagm {
     13 
     14 class MatrixImageFilterGM : public GM {
     15 public:
     16     MatrixImageFilterGM() {
     17         this->setBGColor(0x00000000);
     18     }
     19 
     20 protected:
     21     virtual SkString onShortName() {
     22         return SkString("matriximagefilter");
     23     }
     24 
     25     void draw(SkCanvas* canvas, const SkRect& rect, const SkBitmap& bitmap,
     26               const SkMatrix& matrix, SkPaint::FilterLevel filterLevel) {
     27         SkAutoTUnref<SkImageFilter> imageFilter(
     28             SkMatrixImageFilter::Create(matrix, filterLevel));
     29         SkPaint paint;
     30         paint.setImageFilter(imageFilter.get());
     31         canvas->saveLayer(&rect, &paint);
     32         canvas->drawBitmap(bitmap, 0, 0);
     33         canvas->restore();
     34     }
     35 
     36     virtual SkISize onISize() {
     37         return SkISize::Make(420, 100);
     38     }
     39 
     40     void make_checkerboard(SkBitmap* bitmap) {
     41         bitmap->allocN32Pixels(64, 64);
     42         SkCanvas canvas(*bitmap);
     43         SkPaint darkPaint;
     44         darkPaint.setColor(0xFF404040);
     45         SkPaint lightPaint;
     46         lightPaint.setColor(0xFFA0A0A0);
     47         for (int y = 0; y < 64; y += 32) {
     48             for (int x = 0; x < 64; x += 32) {
     49                 canvas.save();
     50                 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
     51                 canvas.drawRect(SkRect::MakeXYWH(0, 0, 16, 16), darkPaint);
     52                 canvas.drawRect(SkRect::MakeXYWH(16, 0, 16, 16), lightPaint);
     53                 canvas.drawRect(SkRect::MakeXYWH(0, 16, 16, 16), lightPaint);
     54                 canvas.drawRect(SkRect::MakeXYWH(16, 16, 16, 16), darkPaint);
     55                 canvas.restore();
     56             }
     57         }
     58     }
     59 
     60     virtual void onDraw(SkCanvas* canvas) {
     61         canvas->clear(0x00000000);
     62         SkMatrix matrix;
     63         SkScalar margin = SkIntToScalar(10);
     64         matrix.setSkew(SkDoubleToScalar(0.5), SkDoubleToScalar(0.2));
     65         SkBitmap checkerboard;
     66         make_checkerboard(&checkerboard);
     67 
     68         SkRect srcRect = SkRect::MakeWH(96, 96);
     69 
     70         canvas->translate(margin, margin);
     71         draw(canvas, srcRect, checkerboard, matrix, SkPaint::kNone_FilterLevel);
     72 
     73         canvas->translate(srcRect.width() + margin, 0);
     74         draw(canvas, srcRect, checkerboard, matrix, SkPaint::kLow_FilterLevel);
     75 
     76 #if 0
     77         // This may be causing Mac 10.6 to barf.
     78         canvas->translate(srcRect.width() + margin, 0);
     79         draw(canvas, srcRect, checkerboard, matrix, SkPaint::kMedium_FilterLevel);
     80 
     81         canvas->translate(srcRect.width() + margin, 0);
     82         draw(canvas, srcRect, checkerboard, matrix, SkPaint::kHigh_FilterLevel);
     83 #endif
     84     }
     85 
     86 private:
     87     typedef GM INHERITED;
     88 };
     89 
     90 //////////////////////////////////////////////////////////////////////////////
     91 
     92 static GM* MyFactory(void*) { return new MatrixImageFilterGM; }
     93 static GMRegistry reg(MyFactory);
     94 
     95 }
     96