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 "sk_tool_utils.h"
9 #include "SkBitmapSource.h"
10 #include "SkColorFilterImageFilter.h"
11 #include "SkColorMatrixFilter.h"
12 #include "SkTileImageFilter.h"
13 #include "gm.h"
14
15 #define WIDTH 400
16 #define HEIGHT 100
17 #define MARGIN 12
18
19 namespace skiagm {
20
21 class TileImageFilterGM : public GM {
22 public:
TileImageFilterGM()23 TileImageFilterGM() : fInitialized(false) {
24 this->setBGColor(0xFF000000);
25 }
26
27 protected:
onShortName()28 virtual SkString onShortName() {
29 return SkString("tileimagefilter");
30 }
31
make_bitmap()32 void make_bitmap() {
33 fBitmap.allocN32Pixels(50, 50);
34 SkCanvas canvas(fBitmap);
35 canvas.clear(0xFF000000);
36 SkPaint paint;
37 paint.setAntiAlias(true);
38 sk_tool_utils::set_portable_typeface(&paint);
39 paint.setColor(0xD000D000);
40 paint.setTextSize(SkIntToScalar(50));
41 const char* str = "e";
42 canvas.drawText(str, strlen(str), SkIntToScalar(10), SkIntToScalar(45), paint);
43 }
44
onISize()45 virtual SkISize onISize() {
46 return SkISize::Make(WIDTH, HEIGHT);
47 }
48
onDraw(SkCanvas * canvas)49 virtual void onDraw(SkCanvas* canvas) {
50 if (!fInitialized) {
51 make_bitmap();
52
53 fCheckerboard.allocN32Pixels(80, 80);
54 SkCanvas checkerboardCanvas(fCheckerboard);
55 sk_tool_utils::draw_checkerboard(&checkerboardCanvas, 0xFFA0A0A0, 0xFF404040, 8);
56
57 fInitialized = true;
58 }
59 canvas->clear(SK_ColorBLACK);
60
61 int x = 0, y = 0;
62 for (size_t i = 0; i < 4; i++) {
63 SkBitmap* bitmap = (i & 0x01) ? &fCheckerboard : &fBitmap;
64 SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(bitmap->width()/4),
65 SkIntToScalar(bitmap->height()/4),
66 SkIntToScalar(bitmap->width()/(i+1)),
67 SkIntToScalar(bitmap->height()/(i+1)));
68 SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(i * 8),
69 SkIntToScalar(i * 4),
70 SkIntToScalar(bitmap->width() - i * 12),
71 SkIntToScalar(bitmap->height()) - i * 12);
72 SkAutoTUnref<SkImageFilter> tileInput(SkBitmapSource::Create(*bitmap));
73 SkAutoTUnref<SkImageFilter> filter(
74 SkTileImageFilter::Create(srcRect, dstRect, tileInput));
75 canvas->save();
76 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
77 SkPaint paint;
78 paint.setImageFilter(filter);
79 canvas->drawBitmap(fBitmap, 0, 0, &paint);
80 canvas->restore();
81 x += bitmap->width() + MARGIN;
82 if (x + bitmap->width() > WIDTH) {
83 x = 0;
84 y += bitmap->height() + MARGIN;
85 }
86 }
87
88 SkScalar matrix[20] = { SK_Scalar1, 0, 0, 0, 0,
89 0, SK_Scalar1, 0, 0, 0,
90 0, 0, SK_Scalar1, 0, 0,
91 0, 0, 0, SK_Scalar1, 0 };
92
93 SkRect srcRect = SkRect::MakeWH(SkIntToScalar(fBitmap.width()),
94 SkIntToScalar(fBitmap.height()));
95 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(fBitmap.width() * 2),
96 SkIntToScalar(fBitmap.height() * 2));
97 SkAutoTUnref<SkImageFilter> tile(SkTileImageFilter::Create(srcRect, dstRect, NULL));
98 SkAutoTUnref<SkColorFilter> cf(SkColorMatrixFilter::Create(matrix));
99
100 SkAutoTUnref<SkImageFilter> cfif(SkColorFilterImageFilter::Create(cf, tile.get()));
101 SkPaint paint;
102 paint.setImageFilter(cfif);
103 canvas->save();
104 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
105 canvas->clipRect(dstRect);
106 canvas->saveLayer(&dstRect, &paint);
107 canvas->drawBitmap(fBitmap, 0, 0);
108 canvas->restore();
109 canvas->restore();
110 }
111 private:
112 typedef GM INHERITED;
113 SkBitmap fBitmap, fCheckerboard;
114 bool fInitialized;
115 };
116
117 //////////////////////////////////////////////////////////////////////////////
118
MyFactory(void *)119 static GM* MyFactory(void*) { return new TileImageFilterGM; }
120 static GMRegistry reg(MyFactory);
121
122 }
123