blob: f598b8a696131e0290f7589ce7a88888d1d2d4d3 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkBlendMode.h"
11#include "include/core/SkCanvas.h"
12#include "include/core/SkColor.h"
13#include "include/core/SkColorFilter.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "include/core/SkImage.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040015#include "include/core/SkImageFilter.h"
16#include "include/core/SkPaint.h"
17#include "include/core/SkRect.h"
18#include "include/core/SkRefCnt.h"
19#include "include/core/SkScalar.h"
20#include "include/core/SkSize.h"
21#include "include/core/SkString.h"
Michael Ludwig898bbfa2019-08-02 15:21:23 -040022#include "include/effects/SkImageFilters.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050023#include "tools/ToolUtils.h"
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000024
Ben Wagner7fde8e12019-05-01 17:28:53 -040025#include <stddef.h>
26#include <utility>
27
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000028#define WIDTH 400
senorblancof2700292016-04-01 09:24:48 -070029#define HEIGHT 200
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000030#define MARGIN 12
31
32namespace skiagm {
33
34class TileImageFilterGM : public GM {
35public:
robertphillips63195182015-06-08 06:21:14 -070036 TileImageFilterGM() {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000037 this->setBGColor(0xFF000000);
38 }
39
40protected:
robertphillips63195182015-06-08 06:21:14 -070041 SkString onShortName() override {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000042 return SkString("tileimagefilter");
43 }
44
Hal Canaryfa3305a2019-07-18 12:36:54 -040045 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070046 return SkISize::Make(WIDTH, HEIGHT);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000047 }
48
robertphillips63195182015-06-08 06:21:14 -070049 void onOnceBeforeDraw() override {
reed9ce9d672016-03-17 10:51:11 -070050 fBitmap = SkImage::MakeFromBitmap(
Mike Kleinea3f0142019-03-20 11:12:10 -050051 ToolUtils::create_string_bitmap(50, 50, 0xD000D000, 10, 45, 50, "e"));
halcanary878fa022015-01-26 11:24:32 -080052
reed9ce9d672016-03-17 10:51:11 -070053 fCheckerboard = SkImage::MakeFromBitmap(
Mike Kleinea3f0142019-03-20 11:12:10 -050054 ToolUtils::create_checkerboard_bitmap(80, 80, 0xFFA0A0A0, 0xFF404040, 8));
robertphillips63195182015-06-08 06:21:14 -070055 }
halcanary878fa022015-01-26 11:24:32 -080056
robertphillips63195182015-06-08 06:21:14 -070057 void onDraw(SkCanvas* canvas) override {
senorblanco16b254a2015-04-09 11:13:24 -070058 canvas->clear(SK_ColorBLACK);
senorblancoa9fbd162016-01-11 14:09:09 -080059 SkPaint red;
60 red.setColor(SK_ColorRED);
61 red.setStyle(SkPaint::kStroke_Style);
62 SkPaint blue;
63 blue.setColor(SK_ColorBLUE);
64 blue.setStyle(SkPaint::kStroke_Style);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000065
66 int x = 0, y = 0;
Robert Phillips39667382019-04-17 16:03:30 -040067
68 {
69 for (size_t i = 0; i < 4; i++) {
70 sk_sp<SkImage> image = (i & 0x01) ? fCheckerboard : fBitmap;
71 SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(image->width()/4),
72 SkIntToScalar(image->height()/4),
73 SkIntToScalar(image->width()/(i+1)),
74 SkIntToScalar(image->height()/(i+1)));
75 SkRect dstRect = SkRect::MakeXYWH(SkIntToScalar(i * 8),
76 SkIntToScalar(i * 4),
77 SkIntToScalar(image->width() - i * 12),
78 SkIntToScalar(image->height()) - i * 12);
Michael Ludwig898bbfa2019-08-02 15:21:23 -040079 sk_sp<SkImageFilter> tileInput(SkImageFilters::Image(image));
80 sk_sp<SkImageFilter> filter(SkImageFilters::Tile(srcRect, dstRect,
81 std::move(tileInput)));
Robert Phillips39667382019-04-17 16:03:30 -040082 canvas->save();
83 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
84 SkPaint paint;
85 paint.setImageFilter(std::move(filter));
86 canvas->drawImage(fBitmap.get(), 0, 0, &paint);
87 canvas->drawRect(srcRect, red);
88 canvas->drawRect(dstRect, blue);
89 canvas->restore();
90 x += image->width() + MARGIN;
91 if (x + image->width() > WIDTH) {
92 x = 0;
93 y += image->height() + MARGIN;
94 }
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000095 }
96 }
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +000097
Robert Phillips39667382019-04-17 16:03:30 -040098 {
Mike Reede869a1e2019-04-30 12:18:54 -040099 float matrix[20] = { 1, 0, 0, 0, 0,
100 0, 1, 0, 0, 0,
101 0, 0, 1, 0, 0,
102 0, 0, 0, 1, 0 };
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +0000103
Robert Phillips39667382019-04-17 16:03:30 -0400104 SkRect srcRect = SkRect::MakeWH(SkIntToScalar(fBitmap->width()),
105 SkIntToScalar(fBitmap->height()));
106 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(fBitmap->width() * 2),
107 SkIntToScalar(fBitmap->height() * 2));
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400108 sk_sp<SkImageFilter> tile(SkImageFilters::Tile(srcRect, dstRect, nullptr));
Mike Reede869a1e2019-04-30 12:18:54 -0400109 sk_sp<SkColorFilter> cf(SkColorFilters::Matrix(matrix));
senorblanco@chromium.org0a5c2332014-04-29 15:20:39 +0000110
Robert Phillips39667382019-04-17 16:03:30 -0400111 SkPaint paint;
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400112 paint.setImageFilter(SkImageFilters::ColorFilter(std::move(cf), std::move(tile)));
Robert Phillips39667382019-04-17 16:03:30 -0400113 canvas->save();
114 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
115 canvas->clipRect(dstRect);
116 canvas->saveLayer(&dstRect, &paint);
117 canvas->drawImage(fBitmap.get(), 0, 0);
118 canvas->restore();
119 canvas->drawRect(srcRect, red);
120 canvas->drawRect(dstRect, blue);
121 canvas->restore();
122 }
senorblancof2700292016-04-01 09:24:48 -0700123
Robert Phillips39667382019-04-17 16:03:30 -0400124 // test that the crop rect properly applies to the tile image filter
125 {
126 canvas->translate(0, SkIntToScalar(100));
senorblancof2700292016-04-01 09:24:48 -0700127
Robert Phillips39667382019-04-17 16:03:30 -0400128 SkRect srcRect = SkRect::MakeXYWH(0, 0, 50, 50);
129 SkRect dstRect = SkRect::MakeXYWH(0, 0, 100, 100);
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400130 SkIRect cropRect = SkIRect::MakeXYWH(5, 5, 40, 40);
Robert Phillips39667382019-04-17 16:03:30 -0400131 sk_sp<SkColorFilter> greenCF = SkColorFilters::Blend(SK_ColorGREEN, SkBlendMode::kSrc);
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400132 sk_sp<SkImageFilter> green(SkImageFilters::ColorFilter(std::move(greenCF),
Robert Phillips39667382019-04-17 16:03:30 -0400133 nullptr,
134 &cropRect));
135 SkPaint paint;
136 paint.setColor(SK_ColorRED);
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400137 paint.setImageFilter(SkImageFilters::Tile(srcRect, dstRect, std::move(green)));
Robert Phillips39667382019-04-17 16:03:30 -0400138 canvas->drawRect(dstRect, paint);
139 }
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000140 }
141private:
reed9ce9d672016-03-17 10:51:11 -0700142 sk_sp<SkImage> fBitmap, fCheckerboard;
robertphillips63195182015-06-08 06:21:14 -0700143
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000144 typedef GM INHERITED;
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000145};
146
147//////////////////////////////////////////////////////////////////////////////
148
halcanary385fe4d2015-08-26 13:07:48 -0700149DEF_GM(return new TileImageFilterGM;)
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000150}