blob: 2c4f6b2b2c80023128c456a1ea47ca69acc9740d [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
halcanaryb0cce2c2015-01-26 12:49:00 -08008#include "sk_tool_utils.h"
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +00009#include "SkBitmapSource.h"
halcanary878fa022015-01-26 11:24:32 -080010#include "SkColorFilterImageFilter.h"
11#include "SkColorMatrixFilter.h"
12#include "SkTileImageFilter.h"
13#include "gm.h"
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000014
15#define WIDTH 400
16#define HEIGHT 100
17#define MARGIN 12
18
19namespace skiagm {
20
21class TileImageFilterGM : public GM {
22public:
23 TileImageFilterGM() : fInitialized(false) {
24 this->setBGColor(0xFF000000);
25 }
26
27protected:
28 virtual SkString onShortName() {
29 return SkString("tileimagefilter");
30 }
31
32 void make_bitmap() {
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000033 fBitmap.allocN32Pixels(50, 50);
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000034 SkCanvas canvas(fBitmap);
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000035 canvas.clear(0xFF000000);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000036 SkPaint paint;
37 paint.setAntiAlias(true);
Cary Clark992c7b02014-07-31 08:58:44 -040038 sk_tool_utils::set_portable_typeface(&paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000039 paint.setColor(0xD000D000);
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000040 paint.setTextSize(SkIntToScalar(50));
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000041 const char* str = "e";
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000042 canvas.drawText(str, strlen(str), SkIntToScalar(10), SkIntToScalar(45), paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000043 }
44
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000045 virtual SkISize onISize() {
tfarinaf5393182014-06-09 23:59:03 -070046 return SkISize::Make(WIDTH, HEIGHT);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000047 }
48
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000049 virtual void onDraw(SkCanvas* canvas) {
50 if (!fInitialized) {
51 make_bitmap();
halcanary878fa022015-01-26 11:24:32 -080052
53 fCheckerboard.allocN32Pixels(80, 80);
54 SkCanvas checkerboardCanvas(fCheckerboard);
halcanaryb0cce2c2015-01-26 12:49:00 -080055 sk_tool_utils::draw_checkerboard(&checkerboardCanvas, 0xFFA0A0A0, 0xFF404040, 8);
halcanary878fa022015-01-26 11:24:32 -080056
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000057 fInitialized = true;
58 }
senorblanco16b254a2015-04-09 11:13:24 -070059 canvas->clear(SK_ColorBLACK);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000060
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),
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000070 SkIntToScalar(bitmap->width() - i * 12),
71 SkIntToScalar(bitmap->height()) - i * 12);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000072 SkAutoTUnref<SkImageFilter> tileInput(SkBitmapSource::Create(*bitmap));
73 SkAutoTUnref<SkImageFilter> filter(
74 SkTileImageFilter::Create(srcRect, dstRect, tileInput));
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000075 canvas->save();
76 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000077 SkPaint paint;
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000078 paint.setImageFilter(filter);
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000079 canvas->drawBitmap(fBitmap, 0, 0, &paint);
80 canvas->restore();
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000081 x += bitmap->width() + MARGIN;
82 if (x + bitmap->width() > WIDTH) {
83 x = 0;
84 y += bitmap->height() + MARGIN;
85 }
86 }
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000087
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();
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000110 }
111private:
112 typedef GM INHERITED;
113 SkBitmap fBitmap, fCheckerboard;
114 bool fInitialized;
115};
116
117//////////////////////////////////////////////////////////////////////////////
118
119static GM* MyFactory(void*) { return new TileImageFilterGM; }
120static GMRegistry reg(MyFactory);
121
122}