• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
OffsetImageFilterGM()20     OffsetImageFilterGM() : fInitialized(false) {
21         this->setBGColor(0xFF000000);
22     }
23 
24 protected:
onShortName()25     virtual SkString onShortName() {
26         return SkString("offsetimagefilter");
27     }
28 
make_bitmap()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 
make_checkerboard()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 
onISize()66     virtual SkISize onISize() {
67         return make_isize(WIDTH, HEIGHT);
68     }
69 
drawClippedBitmap(SkCanvas * canvas,const SkBitmap & bitmap,const SkPaint & paint,SkScalar x,SkScalar y)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 
onDraw(SkCanvas * canvas)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 
MyFactory(void *)118 static GM* MyFactory(void*) { return new OffsetImageFilterGM; }
119 static GMRegistry reg(MyFactory);
120 
121 }
122