blob: eec18cffb9a72d630f5a2cc2e06b1932ee88293a [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 {
35 fBitmap.reset(SkImage::NewFromBitmap(
36 sk_tool_utils::create_string_bitmap(80, 80, 0xD000D000, 15, 65, 96, "e")));
37
38 fCheckerboard.reset(SkImage::NewFromBitmap(
39 sk_tool_utils::create_checkerboard_bitmap(80, 80,
40 sk_tool_utils::color_to_565(0xFFA0A0A0),
41 sk_tool_utils::color_to_565(0xFF404040),
42 8)));
43 }
44
45 void onDraw(SkCanvas* canvas) override {
46 canvas->clear(SK_ColorBLACK);
47 SkPaint paint;
48
49 for (int i = 0; i < 4; i++) {
50 const SkImage* image = (i & 0x01) ? fCheckerboard : fBitmap;
51 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));
56 SkAutoTUnref<SkImageFilter> tileInput(SkImageSource::Create(image));
57 SkScalar dx = SkIntToScalar(i*5);
58 SkScalar dy = SkIntToScalar(i*10);
59 SkAutoTUnref<SkImageFilter> filter(SkOffsetImageFilter::Create(dx, dy, tileInput,
60 &rect));
61 paint.setImageFilter(filter);
62 DrawClippedImage(canvas, image, paint, 1, cropRect);
63 canvas->translate(SkIntToScalar(image->width() + MARGIN), 0);
64 }
65
66 SkIRect cropRect = SkIRect::MakeXYWH(0, 0, 100, 100);
67 SkImageFilter::CropRect rect(SkRect::Make(cropRect));
68 SkAutoTUnref<SkImageFilter> filter(SkOffsetImageFilter::Create(-5, -10, nullptr, &rect));
69 paint.setImageFilter(filter);
70 DrawClippedImage(canvas, fBitmap, paint, 2, cropRect);
71 }
72private:
73 static void DrawClippedImage(SkCanvas* canvas, const SkImage* image, const SkPaint& paint,
74 SkScalar scale, const SkIRect& cropRect) {
75 SkRect clipRect = SkRect::MakeIWH(image->width(), image->height());
reed462a33c2015-06-22 09:10:14 -070076
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000077 canvas->save();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000078 canvas->clipRect(clipRect);
79 canvas->scale(scale, scale);
fmalita5598b632015-09-15 11:26:13 -070080 canvas->drawImage(image, 0, 0, &paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000081 canvas->restore();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000082
reed462a33c2015-06-22 09:10:14 -070083 // Draw a boundary rect around the intersection of the clip rect and crop rect.
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000084 SkRect cropRectFloat;
reed462a33c2015-06-22 09:10:14 -070085 SkMatrix::MakeScale(scale, scale).mapRect(&cropRectFloat, SkRect::Make(cropRect));
robertphillipsf4e59952015-01-07 12:16:10 -080086 if (clipRect.intersect(cropRectFloat)) {
reed462a33c2015-06-22 09:10:14 -070087 SkPaint strokePaint;
88 strokePaint.setStyle(SkPaint::kStroke_Style);
caryclark5f7f4282015-07-16 07:06:46 -070089 strokePaint.setStrokeWidth(2);
reed462a33c2015-06-22 09:10:14 -070090 strokePaint.setColor(SK_ColorRED);
robertphillipsf4e59952015-01-07 12:16:10 -080091 canvas->drawRect(clipRect, strokePaint);
92 }
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000093 }
94
fmalita5598b632015-09-15 11:26:13 -070095 SkAutoTUnref<SkImage> fBitmap, fCheckerboard;
robertphillips943a4622015-09-03 13:32:33 -070096
97 typedef skiagm::GM INHERITED;
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000098};
reed462a33c2015-06-22 09:10:14 -070099DEF_GM( return new OffsetImageFilterGM; )
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000100
101//////////////////////////////////////////////////////////////////////////////
102
reed477fdd82015-06-23 06:01:10 -0700103class SimpleOffsetImageFilterGM : public skiagm::GM {
104public:
105 SimpleOffsetImageFilterGM() {}
106
107protected:
108 SkString onShortName() override {
109 return SkString("simple-offsetimagefilter");
110 }
111
reed5fbb6232015-06-23 14:34:58 -0700112 SkISize onISize() override { return SkISize::Make(640, 200); }
reed477fdd82015-06-23 06:01:10 -0700113
114 void doDraw(SkCanvas* canvas, const SkRect& r, SkImageFilter* imgf,
halcanary96fcdcc2015-08-27 07:41:13 -0700115 const SkRect* clipR = nullptr) {
reed477fdd82015-06-23 06:01:10 -0700116 SkPaint p;
117
118 if (clipR) {
119 p.setColor(0xFF00FF00);
120 p.setStyle(SkPaint::kStroke_Style);
121 canvas->drawRect(clipR->makeInset(SK_ScalarHalf, SK_ScalarHalf), p);
122 p.setStyle(SkPaint::kFill_Style);
123 }
124
reedb3fe1b82015-06-23 08:29:20 -0700125 if (imgf && imgf->cropRectIsSet()) {
126 SkImageFilter::CropRect cr = imgf->getCropRect();
127
128 p.setColor(0x66FF00FF);
129 p.setStyle(SkPaint::kStroke_Style);
130 canvas->drawRect(cr.rect().makeInset(SK_ScalarHalf, SK_ScalarHalf), p);
131 p.setStyle(SkPaint::kFill_Style);
132 }
133
134 p.setColor(0x660000FF);
reed477fdd82015-06-23 06:01:10 -0700135 canvas->drawRect(r, p);
136
137 if (clipR) {
138 canvas->save();
139 canvas->clipRect(*clipR);
140 }
robertphillipsda571052015-06-23 09:28:52 -0700141 if (imgf) {
142 p.setImageFilter(imgf)->unref();
143 }
reedb3fe1b82015-06-23 08:29:20 -0700144 p.setColor(0x66FF0000);
reed477fdd82015-06-23 06:01:10 -0700145 canvas->drawRect(r, p);
reedb3fe1b82015-06-23 08:29:20 -0700146
reed477fdd82015-06-23 06:01:10 -0700147 if (clipR) {
148 canvas->restore();
149 }
150 }
151
152 void onDraw(SkCanvas* canvas) override {
reed5fbb6232015-06-23 14:34:58 -0700153 const SkRect r = SkRect::MakeWH(40, 40);
reed477fdd82015-06-23 06:01:10 -0700154 SkImageFilter::CropRect cr0(r);
reed5fbb6232015-06-23 14:34:58 -0700155 SkImageFilter::CropRect cr1(SkRect::MakeWH(20, 20));
156 const SkRect r2 = SkRect::MakeXYWH(40, 0, 40, 40);
reedb3fe1b82015-06-23 08:29:20 -0700157 SkImageFilter::CropRect cr2(r2);
reed477fdd82015-06-23 06:01:10 -0700158
reed5fbb6232015-06-23 14:34:58 -0700159 canvas->translate(40, 40);
160
161 canvas->save();
halcanary96fcdcc2015-08-27 07:41:13 -0700162 this->doDraw(canvas, r, nullptr);
reed477fdd82015-06-23 06:01:10 -0700163
reed5fbb6232015-06-23 14:34:58 -0700164 canvas->translate(100, 0);
165 this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20));
reed477fdd82015-06-23 06:01:10 -0700166
reed5fbb6232015-06-23 14:34:58 -0700167 canvas->translate(100, 0);
halcanary96fcdcc2015-08-27 07:41:13 -0700168 this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20, nullptr, &cr0));
reed477fdd82015-06-23 06:01:10 -0700169
reed5fbb6232015-06-23 14:34:58 -0700170 canvas->translate(100, 0);
171 this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20), &r);
reed477fdd82015-06-23 06:01:10 -0700172
reed5fbb6232015-06-23 14:34:58 -0700173 canvas->translate(100, 0);
halcanary96fcdcc2015-08-27 07:41:13 -0700174 this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20, nullptr, &cr1));
reedb3fe1b82015-06-23 08:29:20 -0700175
reed5fbb6232015-06-23 14:34:58 -0700176 SkRect clipR = SkRect::MakeXYWH(40, 40, 40, 40);
177 canvas->translate(100, 0);
halcanary96fcdcc2015-08-27 07:41:13 -0700178 this->doDraw(canvas, r, SkOffsetImageFilter::Create(20, 20, nullptr, nullptr), &clipR);
reed5fbb6232015-06-23 14:34:58 -0700179 canvas->restore();
180
181 // 2nd row
182 canvas->translate(0, 80);
183
184 /*
185 * combos of clip and crop rects that align with src and dst
186 */
187
188 // crop==clip==src
halcanary96fcdcc2015-08-27 07:41:13 -0700189 this->doDraw(canvas, r, SkOffsetImageFilter::Create(40, 0, nullptr, &cr0), &r);
reed5fbb6232015-06-23 14:34:58 -0700190
191 // crop==src, clip==dst
192 canvas->translate(100, 0);
halcanary96fcdcc2015-08-27 07:41:13 -0700193 this->doDraw(canvas, r, SkOffsetImageFilter::Create(40, 0, nullptr, &cr0), &r2);
reed5fbb6232015-06-23 14:34:58 -0700194
195 // crop==dst, clip==src
196 canvas->translate(100, 0);
halcanary96fcdcc2015-08-27 07:41:13 -0700197 this->doDraw(canvas, r, SkOffsetImageFilter::Create(40, 0, nullptr, &cr2), &r);
reed5fbb6232015-06-23 14:34:58 -0700198
199 // crop==clip==dst
200 canvas->translate(100, 0);
halcanary96fcdcc2015-08-27 07:41:13 -0700201 this->doDraw(canvas, r, SkOffsetImageFilter::Create(40, 0, nullptr, &cr2), &r2);
reed477fdd82015-06-23 06:01:10 -0700202 }
203
204private:
205 typedef skiagm::GM INHERITED;
206};
207DEF_GM( return new SimpleOffsetImageFilterGM; )