blob: 58542b7598b40d121b26c57a46c8c676934674d6 [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"
halcanary878fa022015-01-26 11:24:32 -08009#include "SkColorFilterImageFilter.h"
10#include "SkColorMatrixFilter.h"
fmalita5598b632015-09-15 11:26:13 -070011#include "SkImage.h"
12#include "SkImageSource.h"
halcanary878fa022015-01-26 11:24:32 -080013#include "SkTileImageFilter.h"
14#include "gm.h"
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000015
16#define WIDTH 400
senorblancof2700292016-04-01 09:24:48 -070017#define HEIGHT 200
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000018#define MARGIN 12
19
20namespace skiagm {
21
22class TileImageFilterGM : public GM {
23public:
robertphillips63195182015-06-08 06:21:14 -070024 TileImageFilterGM() {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000025 this->setBGColor(0xFF000000);
26 }
27
28protected:
robertphillips63195182015-06-08 06:21:14 -070029 SkString onShortName() override {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000030 return SkString("tileimagefilter");
31 }
32
robertphillips63195182015-06-08 06:21:14 -070033 SkISize onISize() override{
tfarinaf5393182014-06-09 23:59:03 -070034 return SkISize::Make(WIDTH, HEIGHT);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000035 }
36
robertphillips63195182015-06-08 06:21:14 -070037 void onOnceBeforeDraw() override {
reed9ce9d672016-03-17 10:51:11 -070038 fBitmap = SkImage::MakeFromBitmap(
39 sk_tool_utils::create_string_bitmap(50, 50, 0xD000D000, 10, 45, 50, "e"));
halcanary878fa022015-01-26 11:24:32 -080040
reed9ce9d672016-03-17 10:51:11 -070041 fCheckerboard = SkImage::MakeFromBitmap(
fmalita5598b632015-09-15 11:26:13 -070042 sk_tool_utils::create_checkerboard_bitmap(80, 80,
43 sk_tool_utils::color_to_565(0xFFA0A0A0),
44 sk_tool_utils::color_to_565(0xFF404040),
reed9ce9d672016-03-17 10:51:11 -070045 8));
robertphillips63195182015-06-08 06:21:14 -070046 }
halcanary878fa022015-01-26 11:24:32 -080047
robertphillips63195182015-06-08 06:21:14 -070048 void onDraw(SkCanvas* canvas) override {
senorblanco16b254a2015-04-09 11:13:24 -070049 canvas->clear(SK_ColorBLACK);
senorblancoa9fbd162016-01-11 14:09:09 -080050 SkPaint red;
51 red.setColor(SK_ColorRED);
52 red.setStyle(SkPaint::kStroke_Style);
53 SkPaint blue;
54 blue.setColor(SK_ColorBLUE);
55 blue.setStyle(SkPaint::kStroke_Style);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000056
57 int x = 0, y = 0;
58 for (size_t i = 0; i < 4; i++) {
robertphillips549c8992016-04-01 09:28:51 -070059 sk_sp<SkImage> image = (i & 0x01) ? fCheckerboard : fBitmap;
fmalita5598b632015-09-15 11:26:13 -070060 SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(image->width()/4),
61 SkIntToScalar(image->height()/4),
62 SkIntToScalar(image->width()/(i+1)),
63 SkIntToScalar(image->height()/(i+1)));
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000064 SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(i * 8),
65 SkIntToScalar(i * 4),
fmalita5598b632015-09-15 11:26:13 -070066 SkIntToScalar(image->width() - i * 12),
67 SkIntToScalar(image->height()) - i * 12);
robertphillips549c8992016-04-01 09:28:51 -070068 sk_sp<SkImageFilter> tileInput(SkImageSource::Make(image));
robertphillips534c2702016-04-15 07:57:40 -070069 sk_sp<SkImageFilter> filter(SkTileImageFilter::Make(srcRect,
70 dstRect,
71 std::move(tileInput)));
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000072 canvas->save();
73 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000074 SkPaint paint;
robertphillips549c8992016-04-01 09:28:51 -070075 paint.setImageFilter(std::move(filter));
reed9ce9d672016-03-17 10:51:11 -070076 canvas->drawImage(fBitmap.get(), 0, 0, &paint);
senorblancoa9fbd162016-01-11 14:09:09 -080077 canvas->drawRect(srcRect, red);
78 canvas->drawRect(dstRect, blue);
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000079 canvas->restore();
fmalita5598b632015-09-15 11:26:13 -070080 x += image->width() + MARGIN;
81 if (x + image->width() > WIDTH) {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000082 x = 0;
fmalita5598b632015-09-15 11:26:13 -070083 y += image->height() + MARGIN;
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000084 }
85 }
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000086
87 SkScalar matrix[20] = { SK_Scalar1, 0, 0, 0, 0,
88 0, SK_Scalar1, 0, 0, 0,
89 0, 0, SK_Scalar1, 0, 0,
90 0, 0, 0, SK_Scalar1, 0 };
91
fmalita5598b632015-09-15 11:26:13 -070092 SkRect srcRect = SkRect::MakeWH(SkIntToScalar(fBitmap->width()),
93 SkIntToScalar(fBitmap->height()));
94 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(fBitmap->width() * 2),
95 SkIntToScalar(fBitmap->height() * 2));
robertphillips534c2702016-04-15 07:57:40 -070096 sk_sp<SkImageFilter> tile(SkTileImageFilter::Make(srcRect, dstRect, nullptr));
robertphillips5605b562016-04-05 11:50:42 -070097 sk_sp<SkColorFilter> cf(SkColorFilter::MakeMatrixFilterRowMajor255(matrix));
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000098
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000099 SkPaint paint;
robertphillips5605b562016-04-05 11:50:42 -0700100 paint.setImageFilter(SkColorFilterImageFilter::Make(std::move(cf), std::move(tile)));
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +0000101 canvas->save();
102 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
103 canvas->clipRect(dstRect);
104 canvas->saveLayer(&dstRect, &paint);
reed9ce9d672016-03-17 10:51:11 -0700105 canvas->drawImage(fBitmap.get(), 0, 0);
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +0000106 canvas->restore();
senorblancoa9fbd162016-01-11 14:09:09 -0800107 canvas->drawRect(srcRect, red);
108 canvas->drawRect(dstRect, blue);
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +0000109 canvas->restore();
senorblancof2700292016-04-01 09:24:48 -0700110
111 canvas->translate(0, SkIntToScalar(100));
112
113 srcRect = SkRect::MakeXYWH(0, 0, 50, 50);
114 dstRect = SkRect::MakeXYWH(0, 0, 100, 100);
115 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(5, 5, 40, 40));
116 sk_sp<SkColorFilter> greenCF = SkColorFilter::MakeModeFilter(SK_ColorGREEN,
117 SkXfermode::kSrc_Mode);
robertphillips5605b562016-04-05 11:50:42 -0700118 sk_sp<SkImageFilter> green(SkColorFilterImageFilter::Make(std::move(greenCF),
119 nullptr,
120 &cropRect));
robertphillips534c2702016-04-15 07:57:40 -0700121 tile = SkTileImageFilter::Make(srcRect, dstRect, std::move(green));
senorblancof2700292016-04-01 09:24:48 -0700122 paint.setColor(SK_ColorRED);
robertphillips5605b562016-04-05 11:50:42 -0700123 paint.setImageFilter(std::move(tile));
senorblancof2700292016-04-01 09:24:48 -0700124 canvas->drawRect(dstRect, paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000125 }
126private:
reed9ce9d672016-03-17 10:51:11 -0700127 sk_sp<SkImage> fBitmap, fCheckerboard;
robertphillips63195182015-06-08 06:21:14 -0700128
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000129 typedef GM INHERITED;
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000130};
131
132//////////////////////////////////////////////////////////////////////////////
133
halcanary385fe4d2015-08-26 13:07:48 -0700134DEF_GM(return new TileImageFilterGM;)
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000135}