blob: 4b9fcaaded609a7ab0b7f1351991793f44239d9b [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/SkCanvas.h"
11#include "include/core/SkColor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkImage.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040013#include "include/core/SkImageFilter.h"
14#include "include/core/SkMatrix.h"
15#include "include/core/SkPaint.h"
16#include "include/core/SkRect.h"
17#include "include/core/SkRefCnt.h"
18#include "include/core/SkScalar.h"
19#include "include/core/SkSize.h"
20#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "include/effects/SkImageSource.h"
22#include "include/effects/SkOffsetImageFilter.h"
23#include "tools/ToolUtils.h"
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000024
Ben Wagner7fde8e12019-05-01 17:28:53 -040025#include <utility>
26
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000027#define WIDTH 600
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000028#define HEIGHT 100
29#define MARGIN 12
30
reed462a33c2015-06-22 09:10:14 -070031class OffsetImageFilterGM : public skiagm::GM {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000032public:
reed462a33c2015-06-22 09:10:14 -070033 OffsetImageFilterGM() {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000034 this->setBGColor(0xFF000000);
35 }
36
37protected:
reed462a33c2015-06-22 09:10:14 -070038 SkString onShortName() override {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000039 return SkString("offsetimagefilter");
40 }
41
reed462a33c2015-06-22 09:10:14 -070042 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070043 return SkISize::Make(WIDTH, HEIGHT);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000044 }
45
fmalita5598b632015-09-15 11:26:13 -070046 void onOnceBeforeDraw() override {
reed9ce9d672016-03-17 10:51:11 -070047 fBitmap = SkImage::MakeFromBitmap(
Mike Kleinea3f0142019-03-20 11:12:10 -050048 ToolUtils::create_string_bitmap(80, 80, 0xD000D000, 15, 65, 96, "e"));
halcanary9d524f22016-03-29 09:03:52 -070049
reed9ce9d672016-03-17 10:51:11 -070050 fCheckerboard = SkImage::MakeFromBitmap(
Mike Kleinea3f0142019-03-20 11:12:10 -050051 ToolUtils::create_checkerboard_bitmap(80, 80, 0xFFA0A0A0, 0xFF404040, 8));
fmalita5598b632015-09-15 11:26:13 -070052 }
53
54 void onDraw(SkCanvas* canvas) override {
55 canvas->clear(SK_ColorBLACK);
56 SkPaint paint;
57
58 for (int 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 SkIRect cropRect = SkIRect::MakeXYWH(i * 12,
61 i * 8,
62 image->width() - i * 8,
63 image->height() - i * 12);
64 SkImageFilter::CropRect rect(SkRect::Make(cropRect));
robertphillips549c8992016-04-01 09:28:51 -070065 sk_sp<SkImageFilter> tileInput(SkImageSource::Make(image));
fmalita5598b632015-09-15 11:26:13 -070066 SkScalar dx = SkIntToScalar(i*5);
67 SkScalar dy = SkIntToScalar(i*10);
robertphillips51a315e2016-03-31 09:05:49 -070068 paint.setImageFilter(SkOffsetImageFilter::Make(dx, dy, std::move(tileInput), &rect));
robertphillips549c8992016-04-01 09:28:51 -070069 DrawClippedImage(canvas, image.get(), paint, 1, cropRect);
fmalita5598b632015-09-15 11:26:13 -070070 canvas->translate(SkIntToScalar(image->width() + MARGIN), 0);
71 }
72
73 SkIRect cropRect = SkIRect::MakeXYWH(0, 0, 100, 100);
74 SkImageFilter::CropRect rect(SkRect::Make(cropRect));
robertphillips51a315e2016-03-31 09:05:49 -070075 paint.setImageFilter(SkOffsetImageFilter::Make(-5, -10, nullptr, &rect));
reed9ce9d672016-03-17 10:51:11 -070076 DrawClippedImage(canvas, fBitmap.get(), paint, 2, cropRect);
fmalita5598b632015-09-15 11:26:13 -070077 }
78private:
79 static void DrawClippedImage(SkCanvas* canvas, const SkImage* image, const SkPaint& paint,
80 SkScalar scale, const SkIRect& cropRect) {
81 SkRect clipRect = SkRect::MakeIWH(image->width(), image->height());
reed462a33c2015-06-22 09:10:14 -070082
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000083 canvas->save();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000084 canvas->clipRect(clipRect);
85 canvas->scale(scale, scale);
fmalita5598b632015-09-15 11:26:13 -070086 canvas->drawImage(image, 0, 0, &paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000087 canvas->restore();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000088
reed462a33c2015-06-22 09:10:14 -070089 // Draw a boundary rect around the intersection of the clip rect and crop rect.
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000090 SkRect cropRectFloat;
reed462a33c2015-06-22 09:10:14 -070091 SkMatrix::MakeScale(scale, scale).mapRect(&cropRectFloat, SkRect::Make(cropRect));
robertphillipsf4e59952015-01-07 12:16:10 -080092 if (clipRect.intersect(cropRectFloat)) {
reed462a33c2015-06-22 09:10:14 -070093 SkPaint strokePaint;
94 strokePaint.setStyle(SkPaint::kStroke_Style);
caryclark5f7f4282015-07-16 07:06:46 -070095 strokePaint.setStrokeWidth(2);
reed462a33c2015-06-22 09:10:14 -070096 strokePaint.setColor(SK_ColorRED);
robertphillipsf4e59952015-01-07 12:16:10 -080097 canvas->drawRect(clipRect, strokePaint);
98 }
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000099 }
100
reed9ce9d672016-03-17 10:51:11 -0700101 sk_sp<SkImage> fBitmap, fCheckerboard;
robertphillips943a4622015-09-03 13:32:33 -0700102
103 typedef skiagm::GM INHERITED;
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000104};
reed462a33c2015-06-22 09:10:14 -0700105DEF_GM( return new OffsetImageFilterGM; )
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000106
107//////////////////////////////////////////////////////////////////////////////
108
reed477fdd82015-06-23 06:01:10 -0700109class SimpleOffsetImageFilterGM : public skiagm::GM {
110public:
111 SimpleOffsetImageFilterGM() {}
halcanary9d524f22016-03-29 09:03:52 -0700112
reed477fdd82015-06-23 06:01:10 -0700113protected:
114 SkString onShortName() override {
115 return SkString("simple-offsetimagefilter");
116 }
halcanary9d524f22016-03-29 09:03:52 -0700117
reed5fbb6232015-06-23 14:34:58 -0700118 SkISize onISize() override { return SkISize::Make(640, 200); }
halcanary9d524f22016-03-29 09:03:52 -0700119
robertphillips51a315e2016-03-31 09:05:49 -0700120 void doDraw(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imgf,
halcanary96fcdcc2015-08-27 07:41:13 -0700121 const SkRect* clipR = nullptr) {
reed477fdd82015-06-23 06:01:10 -0700122 SkPaint p;
123
124 if (clipR) {
125 p.setColor(0xFF00FF00);
126 p.setStyle(SkPaint::kStroke_Style);
127 canvas->drawRect(clipR->makeInset(SK_ScalarHalf, SK_ScalarHalf), p);
128 p.setStyle(SkPaint::kFill_Style);
129 }
130
reedb3fe1b82015-06-23 08:29:20 -0700131 if (imgf && imgf->cropRectIsSet()) {
132 SkImageFilter::CropRect cr = imgf->getCropRect();
133
134 p.setColor(0x66FF00FF);
135 p.setStyle(SkPaint::kStroke_Style);
136 canvas->drawRect(cr.rect().makeInset(SK_ScalarHalf, SK_ScalarHalf), p);
137 p.setStyle(SkPaint::kFill_Style);
138 }
139
140 p.setColor(0x660000FF);
reed477fdd82015-06-23 06:01:10 -0700141 canvas->drawRect(r, p);
142
143 if (clipR) {
144 canvas->save();
145 canvas->clipRect(*clipR);
146 }
robertphillipsda571052015-06-23 09:28:52 -0700147 if (imgf) {
robertphillips51a315e2016-03-31 09:05:49 -0700148 p.setImageFilter(std::move(imgf));
robertphillipsda571052015-06-23 09:28:52 -0700149 }
reedb3fe1b82015-06-23 08:29:20 -0700150 p.setColor(0x66FF0000);
reed477fdd82015-06-23 06:01:10 -0700151 canvas->drawRect(r, p);
reedb3fe1b82015-06-23 08:29:20 -0700152
reed477fdd82015-06-23 06:01:10 -0700153 if (clipR) {
154 canvas->restore();
155 }
156 }
157
158 void onDraw(SkCanvas* canvas) override {
reed5fbb6232015-06-23 14:34:58 -0700159 const SkRect r = SkRect::MakeWH(40, 40);
reed477fdd82015-06-23 06:01:10 -0700160 SkImageFilter::CropRect cr0(r);
reed5fbb6232015-06-23 14:34:58 -0700161 SkImageFilter::CropRect cr1(SkRect::MakeWH(20, 20));
162 const SkRect r2 = SkRect::MakeXYWH(40, 0, 40, 40);
reedb3fe1b82015-06-23 08:29:20 -0700163 SkImageFilter::CropRect cr2(r2);
reed477fdd82015-06-23 06:01:10 -0700164
reed5fbb6232015-06-23 14:34:58 -0700165 canvas->translate(40, 40);
halcanary9d524f22016-03-29 09:03:52 -0700166
reed5fbb6232015-06-23 14:34:58 -0700167 canvas->save();
halcanary96fcdcc2015-08-27 07:41:13 -0700168 this->doDraw(canvas, r, nullptr);
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));
halcanary9d524f22016-03-29 09:03:52 -0700172
reed5fbb6232015-06-23 14:34:58 -0700173 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700174 this->doDraw(canvas, r, SkOffsetImageFilter::Make(20, 20, nullptr, &cr0));
halcanary9d524f22016-03-29 09:03:52 -0700175
reed5fbb6232015-06-23 14:34:58 -0700176 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700177 this->doDraw(canvas, r, SkOffsetImageFilter::Make(20, 20, nullptr), &r);
halcanary9d524f22016-03-29 09:03:52 -0700178
reed5fbb6232015-06-23 14:34:58 -0700179 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700180 this->doDraw(canvas, r, SkOffsetImageFilter::Make(20, 20, nullptr, &cr1));
halcanary9d524f22016-03-29 09:03:52 -0700181
reed5fbb6232015-06-23 14:34:58 -0700182 SkRect clipR = SkRect::MakeXYWH(40, 40, 40, 40);
183 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700184 this->doDraw(canvas, r, SkOffsetImageFilter::Make(20, 20, nullptr, nullptr), &clipR);
reed5fbb6232015-06-23 14:34:58 -0700185 canvas->restore();
186
187 // 2nd row
188 canvas->translate(0, 80);
189
190 /*
191 * combos of clip and crop rects that align with src and dst
192 */
193
194 // crop==clip==src
robertphillips51a315e2016-03-31 09:05:49 -0700195 this->doDraw(canvas, r, SkOffsetImageFilter::Make(40, 0, nullptr, &cr0), &r);
reed5fbb6232015-06-23 14:34:58 -0700196
197 // crop==src, clip==dst
198 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700199 this->doDraw(canvas, r, SkOffsetImageFilter::Make(40, 0, nullptr, &cr0), &r2);
reed5fbb6232015-06-23 14:34:58 -0700200
201 // crop==dst, clip==src
202 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700203 this->doDraw(canvas, r, SkOffsetImageFilter::Make(40, 0, nullptr, &cr2), &r);
reed5fbb6232015-06-23 14:34:58 -0700204
205 // crop==clip==dst
206 canvas->translate(100, 0);
robertphillips51a315e2016-03-31 09:05:49 -0700207 this->doDraw(canvas, r, SkOffsetImageFilter::Make(40, 0, nullptr, &cr2), &r2);
reed477fdd82015-06-23 06:01:10 -0700208 }
209
210private:
211 typedef skiagm::GM INHERITED;
212};
213DEF_GM( return new SimpleOffsetImageFilterGM; )