blob: 7d1a3f08c3dd39a0ff47d3ea1ccd6fe81b5fcf4b [file] [log] [blame]
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +00001/*
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"
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +00009#include "SkColorMatrixFilter.h"
10#include "SkColorFilterImageFilter.h"
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000011#include "SkTileImageFilter.h"
12#include "SkBitmapSource.h"
13
14#define WIDTH 400
15#define HEIGHT 100
16#define MARGIN 12
17
18namespace skiagm {
19
20class TileImageFilterGM : public GM {
21public:
22 TileImageFilterGM() : fInitialized(false) {
23 this->setBGColor(0xFF000000);
24 }
25
26protected:
27 virtual SkString onShortName() {
28 return SkString("tileimagefilter");
29 }
30
31 void make_bitmap() {
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000032 fBitmap.allocN32Pixels(50, 50);
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000033 SkCanvas canvas(fBitmap);
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000034 canvas.clear(0xFF000000);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000035 SkPaint paint;
36 paint.setAntiAlias(true);
Cary Clark992c7b02014-07-31 08:58:44 -040037 sk_tool_utils::set_portable_typeface(&paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000038 paint.setColor(0xD000D000);
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000039 paint.setTextSize(SkIntToScalar(50));
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000040 const char* str = "e";
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000041 canvas.drawText(str, strlen(str), SkIntToScalar(10), SkIntToScalar(45), paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000042 }
43
44 void make_checkerboard() {
reed@google.comeb9a46c2014-01-25 16:46:20 +000045 fCheckerboard.allocN32Pixels(80, 80);
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000046 SkCanvas canvas(fCheckerboard);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000047 canvas.clear(0x00000000);
48 SkPaint darkPaint;
49 darkPaint.setColor(0xFF404040);
50 SkPaint lightPaint;
51 lightPaint.setColor(0xFFA0A0A0);
52 for (int y = 0; y < 80; y += 16) {
53 for (int x = 0; x < 80; x += 16) {
54 canvas.save();
55 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
56 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
57 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
58 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
59 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
60 canvas.restore();
61 }
62 }
63 }
64
65 virtual SkISize onISize() {
tfarinaf5393182014-06-09 23:59:03 -070066 return SkISize::Make(WIDTH, HEIGHT);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000067 }
68
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000069 virtual void onDraw(SkCanvas* canvas) {
70 if (!fInitialized) {
71 make_bitmap();
72 make_checkerboard();
73 fInitialized = true;
74 }
75 canvas->clear(0x00000000);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000076
77 int x = 0, y = 0;
78 for (size_t i = 0; i < 4; i++) {
79 SkBitmap* bitmap = (i & 0x01) ? &fCheckerboard : &fBitmap;
80 SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(bitmap->width()/4),
81 SkIntToScalar(bitmap->height()/4),
82 SkIntToScalar(bitmap->width()/(i+1)),
83 SkIntToScalar(bitmap->height()/(i+1)));
84 SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(i * 8),
85 SkIntToScalar(i * 4),
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000086 SkIntToScalar(bitmap->width() - i * 12),
87 SkIntToScalar(bitmap->height()) - i * 12);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000088 SkAutoTUnref<SkImageFilter> tileInput(SkBitmapSource::Create(*bitmap));
89 SkAutoTUnref<SkImageFilter> filter(
90 SkTileImageFilter::Create(srcRect, dstRect, tileInput));
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000091 canvas->save();
92 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000093 SkPaint paint;
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000094 paint.setImageFilter(filter);
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000095 canvas->drawBitmap(fBitmap, 0, 0, &paint);
96 canvas->restore();
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000097 x += bitmap->width() + MARGIN;
98 if (x + bitmap->width() > WIDTH) {
99 x = 0;
100 y += bitmap->height() + MARGIN;
101 }
102 }
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +0000103
104 SkScalar matrix[20] = { SK_Scalar1, 0, 0, 0, 0,
105 0, SK_Scalar1, 0, 0, 0,
106 0, 0, SK_Scalar1, 0, 0,
107 0, 0, 0, SK_Scalar1, 0 };
108
109 SkRect srcRect = SkRect::MakeWH(SkIntToScalar(fBitmap.width()),
110 SkIntToScalar(fBitmap.height()));
111 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(fBitmap.width() * 2),
112 SkIntToScalar(fBitmap.height() * 2));
113 SkAutoTUnref<SkImageFilter> tile(SkTileImageFilter::Create(srcRect, dstRect, NULL));
114 SkAutoTUnref<SkColorFilter> cf(SkColorMatrixFilter::Create(matrix));
115
116 SkAutoTUnref<SkImageFilter> cfif(SkColorFilterImageFilter::Create(cf, tile.get()));
117 SkPaint paint;
118 paint.setImageFilter(cfif);
119 canvas->save();
120 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
121 canvas->clipRect(dstRect);
122 canvas->saveLayer(&dstRect, &paint);
123 canvas->drawBitmap(fBitmap, 0, 0);
124 canvas->restore();
125 canvas->restore();
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000126 }
127private:
128 typedef GM INHERITED;
129 SkBitmap fBitmap, fCheckerboard;
130 bool fInitialized;
131};
132
133//////////////////////////////////////////////////////////////////////////////
134
135static GM* MyFactory(void*) { return new TileImageFilterGM; }
136static GMRegistry reg(MyFactory);
137
138}