blob: 8f23483212abe86a0fb18d7d86ddac700c4b0b70 [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"
fmalita5598b632015-09-15 11:26:13 -07009#include "SkImage.h"
10#include "SkImageSource.h"
halcanary878fa022015-01-26 11:24:32 -080011#include "SkOffsetImageFilter.h"
fmalita5598b632015-09-15 11:26:13 -070012#include "SkSurface.h"
halcanary878fa022015-01-26 11:24:32 -080013#include "gm.h"
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000014
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000015#define WIDTH 600
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000016#define HEIGHT 100
17#define MARGIN 12
18
reed462a33c2015-06-22 09:10:14 -070019class OffsetImageFilterGM : public skiagm::GM {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000020public:
reed462a33c2015-06-22 09:10:14 -070021 OffsetImageFilterGM() {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000022 this->setBGColor(0xFF000000);
23 }
24
25protected:
reed462a33c2015-06-22 09:10:14 -070026 SkString onShortName() override {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000027 return SkString("offsetimagefilter");
28 }
29
reed462a33c2015-06-22 09:10:14 -070030 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070031 return SkISize::Make(WIDTH, HEIGHT);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000032 }
33
fmalita5598b632015-09-15 11:26:13 -070034 void onOnceBeforeDraw() override {
reed9ce9d672016-03-17 10:51:11 -070035 fBitmap = SkImage::MakeFromBitmap(
36 sk_tool_utils::create_string_bitmap(80, 80, 0xD000D000, 15, 65, 96, "e"));
halcanary9d524f22016-03-29 09:03:52 -070037
reed9ce9d672016-03-17 10:51:11 -070038 fCheckerboard = SkImage::MakeFromBitmap(
fmalita5598b632015-09-15 11:26:13 -070039 sk_tool_utils::create_checkerboard_bitmap(80, 80,
40 sk_tool_utils::color_to_565(0xFFA0A0A0),
41 sk_tool_utils::color_to_565(0xFF404040),
reed9ce9d672016-03-17 10:51:11 -070042 8));
fmalita5598b632015-09-15 11:26:13 -070043 }
44
45 void onDraw(SkCanvas* canvas) override {
46 canvas->clear(SK_ColorBLACK);
47 SkPaint paint;
48
49 for (int i = 0; i < 4; i++) {
robertphillips549c8992016-04-01 09:28:51 -070050 sk_sp<SkImage> image = (i & 0x01) ? fCheckerboard : fBitmap;
fmalita5598b632015-09-15 11:26:13 -070051 SkIRect cropRect = SkIRect::MakeXYWH(i * 12,
52 i * 8,
53 image->width() - i * 8,
54 image->height() - i * 12);
55 SkImageFilter::CropRect rect(SkRect::Make(cropRect));
robertphillips549c8992016-04-01 09:28:51 -070056 sk_sp<SkImageFilter> tileInput(SkImageSource::Make(image));
fmalita5598b632015-09-15 11:26:13 -070057 SkScalar dx = SkIntToScalar(i*5);
58 SkScalar dy = SkIntToScalar(i*10);
robertphillips51a315e2016-03-31 09:05:49 -070059 paint.setImageFilter(SkOffsetImageFilter::Make(dx, dy, std::move(tileInput), &rect));
robertphillips549c8992016-04-01 09:28:51 -070060 DrawClippedImage(canvas, image.get(), paint, 1, cropRect);
fmalita5598b632015-09-15 11:26:13 -070061 canvas->translate(SkIntToScalar(image->width() + MARGIN), 0);
62 }
63
64 SkIRect cropRect = SkIRect::MakeXYWH(0, 0, 100, 100);
65 SkImageFilter::CropRect rect(SkRect::Make(cropRect));
robertphillips51a315e2016-03-31 09:05:49 -070066 paint.setImageFilter(SkOffsetImageFilter::Make(-5, -10, nullptr, &rect));
reed9ce9d672016-03-17 10:51:11 -070067 DrawClippedImage(canvas, fBitmap.get(), paint, 2, cropRect);
fmalita5598b632015-09-15 11:26:13 -070068 }
69private:
70 static void DrawClippedImage(SkCanvas* canvas, const SkImage* image, const SkPaint& paint,
71 SkScalar scale, const SkIRect& cropRect) {
72 SkRect clipRect = SkRect::MakeIWH(image->width(), image->height());
reed462a33c2015-06-22 09:10:14 -070073
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000074 canvas->save();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000075 canvas->clipRect(clipRect);
76 canvas->scale(scale, scale);
fmalita5598b632015-09-15 11:26:13 -070077 canvas->drawImage(image, 0, 0, &paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000078 canvas->restore();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000079
reed462a33c2015-06-22 09:10:14 -070080 // Draw a boundary rect around the intersection of the clip rect and crop rect.
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000081 SkRect cropRectFloat;
reed462a33c2015-06-22 09:10:14 -070082 SkMatrix::MakeScale(scale, scale).mapRect(&cropRectFloat, SkRect::Make(cropRect));
robertphillipsf4e59952015-01-07 12:16:10 -080083 if (clipRect.intersect(cropRectFloat)) {
reed462a33c2015-06-22 09:10:14 -070084 SkPaint strokePaint;
85 strokePaint.setStyle(SkPaint::kStroke_Style);
caryclark5f7f4282015-07-16 07:06:46 -070086 strokePaint.setStrokeWidth(2);
reed462a33c2015-06-22 09:10:14 -070087 strokePaint.setColor(SK_ColorRED);
robertphillipsf4e59952015-01-07 12:16:10 -080088 canvas->drawRect(clipRect, strokePaint);
89 }
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000090 }
91
reed9ce9d672016-03-17 10:51:11 -070092 sk_sp<SkImage> fBitmap, fCheckerboard;
robertphillips943a4622015-09-03 13:32:33 -070093
94 typedef skiagm::GM INHERITED;
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000095};
reed462a33c2015-06-22 09:10:14 -070096DEF_GM( return new OffsetImageFilterGM; )
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000097
98//////////////////////////////////////////////////////////////////////////////
99
reed477fdd82015-06-23 06:01:10 -0700100class SimpleOffsetImageFilterGM : public skiagm::GM {
101public:
102 SimpleOffsetImageFilterGM() {}
halcanary9d524f22016-03-29 09:03:52 -0700103
reed477fdd82015-06-23 06:01:10 -0700104protected:
105 SkString onShortName() override {
106 return SkString("simple-offsetimagefilter");
107 }
halcanary9d524f22016-03-29 09:03:52 -0700108
reed5fbb6232015-06-23 14:34:58 -0700109 SkISize onISize() override { return SkISize::Make(640, 200); }
halcanary9d524f22016-03-29 09:03:52 -0700110
robertphillips51a315e2016-03-31 09:05:49 -0700111 void doDraw(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imgf,
halcanary96fcdcc2015-08-27 07:41:13 -0700112 const SkRect* clipR = nullptr) {
reed477fdd82015-06-23 06:01:10 -0700113 SkPaint p;
114
115 if (clipR) {
116 p.setColor(0xFF00FF00);
117 p.setStyle(SkPaint::kStroke_Style);
118 canvas->drawRect(clipR->makeInset(SK_ScalarHalf, SK_ScalarHalf), p);
119 p.setStyle(SkPaint::kFill_Style);
120 }
121
reedb3fe1b82015-06-23 08:29:20 -0700122 if (imgf && imgf->cropRectIsSet()) {
123 SkImageFilter::CropRect cr = imgf->getCropRect();
124
125 p.setColor(0x66FF00FF);
126 p.setStyle(SkPaint::kStroke_Style);
127 canvas->drawRect(cr.rect().makeInset(SK_ScalarHalf, SK_ScalarHalf), p);
128 p.setStyle(SkPaint::kFill_Style);
129 }
130
131 p.setColor(0x660000FF);
reed477fdd82015-06-23 06:01:10 -0700132 canvas->drawRect(r, p);
133
134 if (clipR) {
135 canvas->save();
136 canvas->clipRect(*clipR);
137 }
robertphillipsda571052015-06-23 09:28:52 -0700138 if (imgf) {
robertphillips51a315e2016-03-31 09:05:49 -0700139 p.setImageFilter(std::move(imgf));
robertphillipsda571052015-06-23 09:28:52 -0700140 }
reedb3fe1b82015-06-23 08:29:20 -0700141 p.setColor(0x66FF0000);
reed477fdd82015-06-23 06:01:10 -0700142 canvas->drawRect(r, p);
reedb3fe1b82015-06-23 08:29:20 -0700143
reed477fdd82015-06-23 06:01:10 -0700144 if (clipR) {
145 canvas->restore();
146 }
147 }
148
149 void onDraw(SkCanvas* canvas) override {
reed5fbb6232015-06-23 14:34:58 -0700150 const SkRect r = SkRect::MakeWH(40, 40);
reed477fdd82015-06-23 06:01:10 -0700151 SkImageFilter::CropRect cr0(r);
reed5fbb6232015-06-23 14:34:58 -0700152 SkImageFilter::CropRect cr1(SkRect::MakeWH(20, 20));
153 const SkRect r2 = SkRect::MakeXYWH(40, 0, 40, 40);
reedb3fe1b82015-06-23 08:29:20 -0700154 SkImageFilter::CropRect cr2(r2);
reed477fdd82015-06-23 06:01:10 -0700155
reed5fbb6232015-06-23 14:34:58 -0700156 canvas->translate(40, 40);
halcanary9d524f22016-03-29 09:03:52 -0700157
reed5fbb6232015-06-23 14:34:58 -0700158 canvas->save();
halcanary96fcdcc2015-08-27 07:41:13 -0700159 this->doDraw(canvas, r, nullptr);
halcanary9d524f22016-03-29 09:03:52 -0700160
reed5fbb6232015-06-23 14:34:58 -0700161 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700162 this->doDraw(canvas, r, SkOffsetImageFilter::Make(20, 20, nullptr));
halcanary9d524f22016-03-29 09:03:52 -0700163
reed5fbb6232015-06-23 14:34:58 -0700164 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700165 this->doDraw(canvas, r, SkOffsetImageFilter::Make(20, 20, nullptr, &cr0));
halcanary9d524f22016-03-29 09:03:52 -0700166
reed5fbb6232015-06-23 14:34:58 -0700167 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700168 this->doDraw(canvas, r, SkOffsetImageFilter::Make(20, 20, nullptr), &r);
halcanary9d524f22016-03-29 09:03:52 -0700169
reed5fbb6232015-06-23 14:34:58 -0700170 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700171 this->doDraw(canvas, r, SkOffsetImageFilter::Make(20, 20, nullptr, &cr1));
halcanary9d524f22016-03-29 09:03:52 -0700172
reed5fbb6232015-06-23 14:34:58 -0700173 SkRect clipR = SkRect::MakeXYWH(40, 40, 40, 40);
174 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700175 this->doDraw(canvas, r, SkOffsetImageFilter::Make(20, 20, nullptr, nullptr), &clipR);
reed5fbb6232015-06-23 14:34:58 -0700176 canvas->restore();
177
178 // 2nd row
179 canvas->translate(0, 80);
180
181 /*
182 * combos of clip and crop rects that align with src and dst
183 */
184
185 // crop==clip==src
robertphillips51a315e2016-03-31 09:05:49 -0700186 this->doDraw(canvas, r, SkOffsetImageFilter::Make(40, 0, nullptr, &cr0), &r);
reed5fbb6232015-06-23 14:34:58 -0700187
188 // crop==src, clip==dst
189 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700190 this->doDraw(canvas, r, SkOffsetImageFilter::Make(40, 0, nullptr, &cr0), &r2);
reed5fbb6232015-06-23 14:34:58 -0700191
192 // crop==dst, clip==src
193 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700194 this->doDraw(canvas, r, SkOffsetImageFilter::Make(40, 0, nullptr, &cr2), &r);
reed5fbb6232015-06-23 14:34:58 -0700195
196 // crop==clip==dst
197 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700198 this->doDraw(canvas, r, SkOffsetImageFilter::Make(40, 0, nullptr, &cr2), &r2);
reed477fdd82015-06-23 06:01:10 -0700199 }
200
201private:
202 typedef skiagm::GM INHERITED;
203};
204DEF_GM( return new SimpleOffsetImageFilterGM; )