Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2013 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 "SkOffsetImageFilter.h"
     10 #include "SkBitmapSource.h"
     11 
     12 #define WIDTH 400
     13 #define HEIGHT 100
     14 #define MARGIN 12
     15 
     16 namespace skiagm {
     17 
     18 class OffsetImageFilterGM : public GM {
     19 public:
     20     OffsetImageFilterGM() : fInitialized(false) {
     21         this->setBGColor(0xFF000000);
     22     }
     23 
     24 protected:
     25     virtual SkString onShortName() {
     26         return SkString("offsetimagefilter");
     27     }
     28 
     29     void make_bitmap() {
     30         fBitmap.setConfig(SkBitmap::kARGB_8888_Config, 80, 80);
     31         fBitmap.allocPixels();
     32         SkBitmapDevice device(fBitmap);
     33         SkCanvas canvas(&device);
     34         canvas.clear(0x00000000);
     35         SkPaint paint;
     36         paint.setAntiAlias(true);
     37         paint.setColor(0xD000D000);
     38         paint.setTextSize(SkIntToScalar(96));
     39         const char* str = "e";
     40         canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(65), paint);
     41     }
     42 
     43     void make_checkerboard() {
     44         fCheckerboard.setConfig(SkBitmap::kARGB_8888_Config, 80, 80);
     45         fCheckerboard.allocPixels();
     46         SkBitmapDevice device(fCheckerboard);
     47         SkCanvas canvas(&device);
     48         canvas.clear(0x00000000);
     49         SkPaint darkPaint;
     50         darkPaint.setColor(0xFF404040);
     51         SkPaint lightPaint;
     52         lightPaint.setColor(0xFFA0A0A0);
     53         for (int y = 0; y < 80; y += 16) {
     54           for (int x = 0; x < 80; x += 16) {
     55             canvas.save();
     56             canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
     57             canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
     58             canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
     59             canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
     60             canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
     61             canvas.restore();
     62           }
     63         }
     64     }
     65 
     66     virtual SkISize onISize() {
     67         return make_isize(WIDTH, HEIGHT);
     68     }
     69 
     70     void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint,
     71                            SkScalar x, SkScalar y) {
     72         canvas->save();
     73         canvas->clipRect(SkRect::MakeXYWH(x, y,
     74             SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())));
     75         canvas->drawBitmap(bitmap, x, y, &paint);
     76         canvas->restore();
     77     }
     78 
     79     virtual void onDraw(SkCanvas* canvas) {
     80         if (!fInitialized) {
     81             make_bitmap();
     82             make_checkerboard();
     83             fInitialized = true;
     84         }
     85         canvas->clear(0x00000000);
     86         SkPaint paint;
     87 
     88         int x = 0, y = 0;
     89         for (size_t i = 0; i < 4; i++) {
     90             SkBitmap* bitmap = (i & 0x01) ? &fCheckerboard : &fBitmap;
     91             SkIRect cropRect = SkIRect::MakeXYWH(x + i * 12,
     92                                                  y + i * 8,
     93                                                  bitmap->width() - i * 8,
     94                                                  bitmap->height() - i * 12);
     95             SkImageFilter::CropRect rect(SkRect::Make(cropRect));
     96             SkAutoTUnref<SkImageFilter> tileInput(SkNEW_ARGS(SkBitmapSource, (*bitmap)));
     97             SkScalar dx = SkIntToScalar(i*5);
     98             SkScalar dy = SkIntToScalar(i*10);
     99             SkAutoTUnref<SkImageFilter> filter(SkNEW_ARGS(
    100                 SkOffsetImageFilter, (dx, dy, tileInput, &rect)));
    101             paint.setImageFilter(filter);
    102             drawClippedBitmap(canvas, *bitmap, paint, SkIntToScalar(x), SkIntToScalar(y));
    103             x += bitmap->width() + MARGIN;
    104             if (x + bitmap->width() > WIDTH) {
    105                 x = 0;
    106                 y += bitmap->height() + MARGIN;
    107             }
    108         }
    109     }
    110 private:
    111     typedef GM INHERITED;
    112     SkBitmap fBitmap, fCheckerboard;
    113     bool fInitialized;
    114 };
    115 
    116 //////////////////////////////////////////////////////////////////////////////
    117 
    118 static GM* MyFactory(void*) { return new OffsetImageFilterGM; }
    119 static GMRegistry reg(MyFactory);
    120 
    121 }
    122