blob: eaf36e7f234c5275bd142e593d346a5576af5255 [file] [log] [blame]
senorblanco@chromium.org194d7752013-07-24 22:19:24 +00001/*
2 * Copyright 2011 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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040012#include "include/core/SkColor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkColorFilter.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040014#include "include/core/SkFont.h"
15#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"
22#include "include/core/SkTypeface.h"
23#include "include/core/SkTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050024#include "include/effects/SkBlurImageFilter.h"
25#include "include/effects/SkColorFilterImageFilter.h"
26#include "include/effects/SkMergeImageFilter.h"
27#include "include/effects/SkMorphologyImageFilter.h"
28#include "include/effects/SkOffsetImageFilter.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040029#include "include/utils/SkTextUtils.h"
30#include "tools/ToolUtils.h"
31
32#include <utility>
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000033
34///////////////////////////////////////////////////////////////////////////////
35
robertphillipsfc11b0a2016-04-05 09:09:36 -070036static void draw_paint(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000037 SkPaint paint;
robertphillipsfc11b0a2016-04-05 09:09:36 -070038 paint.setImageFilter(std::move(imf));
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000039 paint.setColor(SK_ColorBLACK);
40 canvas->save();
41 canvas->clipRect(r);
42 canvas->drawPaint(paint);
43 canvas->restore();
44}
45
robertphillipsfc11b0a2016-04-05 09:09:36 -070046static void draw_path(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000047 SkPaint paint;
48 paint.setColor(SK_ColorMAGENTA);
robertphillipsfc11b0a2016-04-05 09:09:36 -070049 paint.setImageFilter(std::move(imf));
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000050 paint.setAntiAlias(true);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000051 canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000052}
53
robertphillipsfc11b0a2016-04-05 09:09:36 -070054static void draw_text(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000055 SkPaint paint;
robertphillipsfc11b0a2016-04-05 09:09:36 -070056 paint.setImageFilter(std::move(imf));
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000057 paint.setColor(SK_ColorGREEN);
Mike Reedb579f072019-01-03 15:45:53 -050058
Mike Kleinea3f0142019-03-20 11:12:10 -050059 SkFont font(ToolUtils::create_portable_typeface(), r.height() / 2);
Mike Reedb579f072019-01-03 15:45:53 -050060 SkTextUtils::DrawString(canvas, "Text", r.centerX(), r.centerY(), font, paint, SkTextUtils::kCenter_Align);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000061}
62
robertphillipsfc11b0a2016-04-05 09:09:36 -070063static void draw_bitmap(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000064 SkPaint paint;
65
66 SkIRect bounds;
67 r.roundOut(&bounds);
68
69 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000070 bm.allocN32Pixels(bounds.width(), bounds.height());
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000071 bm.eraseColor(SK_ColorTRANSPARENT);
72 SkCanvas c(bm);
halcanary96fcdcc2015-08-27 07:41:13 -070073 draw_path(&c, r, nullptr);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000074
robertphillipsfc11b0a2016-04-05 09:09:36 -070075 paint.setImageFilter(std::move(imf));
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000076 canvas->drawBitmap(bm, 0, 0, &paint);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000077}
78
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000079///////////////////////////////////////////////////////////////////////////////
80
81class ImageFiltersCroppedGM : public skiagm::GM {
82public:
83 ImageFiltersCroppedGM () {}
84
85protected:
senorblanco64049812016-02-01 10:32:42 -080086 SkString onShortName() override {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000087 return SkString("imagefilterscropped");
88 }
89
senorblanco64049812016-02-01 10:32:42 -080090 SkISize onISize() override { return SkISize::Make(400, 960); }
cwallez80a61df2015-01-26 12:20:14 -080091
92 void make_checkerboard() {
93 fCheckerboard.allocN32Pixels(80, 80);
94 SkCanvas canvas(fCheckerboard);
95 canvas.clear(SK_ColorTRANSPARENT);
96 SkPaint darkPaint;
Mike Kleind46dce32018-08-16 10:17:03 -040097 darkPaint.setColor(0xFF404040);
cwallez80a61df2015-01-26 12:20:14 -080098 SkPaint lightPaint;
Mike Kleind46dce32018-08-16 10:17:03 -040099 lightPaint.setColor(0xFFA0A0A0);
cwallez80a61df2015-01-26 12:20:14 -0800100 for (int y = 0; y < 80; y += 16) {
101 for (int x = 0; x < 80; x += 16) {
102 canvas.save();
103 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
104 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
105 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
106 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
107 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
108 canvas.restore();
109 }
110 }
111 }
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000112
113 void draw_frame(SkCanvas* canvas, const SkRect& r) {
114 SkPaint paint;
115 paint.setStyle(SkPaint::kStroke_Style);
116 paint.setColor(SK_ColorRED);
117 canvas->drawRect(r, paint);
118 }
119
robertphillips5605b562016-04-05 11:50:42 -0700120 void onOnceBeforeDraw() override{
cwallez80a61df2015-01-26 12:20:14 -0800121 make_checkerboard();
122 }
123
robertphillips5605b562016-04-05 11:50:42 -0700124 void onDraw(SkCanvas* canvas) override {
robertphillipsfc11b0a2016-04-05 09:09:36 -0700125 void (*drawProc[])(SkCanvas*, const SkRect&, sk_sp<SkImageFilter>) = {
reedda420b92015-12-16 08:38:15 -0800126 draw_bitmap, draw_path, draw_paint, draw_text
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000127 };
128
Mike Reedb286bc22019-04-08 16:23:20 -0400129 sk_sp<SkColorFilter> cf(SkColorFilters::Blend(SK_ColorBLUE,
Mike Reed7d954ad2016-10-28 15:42:34 -0400130 SkBlendMode::kSrcIn));
robertphillipsfc11b0a2016-04-05 09:09:36 -0700131 SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
132 SkImageFilter::CropRect::kHasAll_CropEdge);
133 SkImageFilter::CropRect bogusRect(SkRect::Make(SkIRect::MakeXYWH(-100, -100, 10, 10)),
134 SkImageFilter::CropRect::kHasAll_CropEdge);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000135
robertphillips51a315e2016-03-31 09:05:49 -0700136 sk_sp<SkImageFilter> offset(SkOffsetImageFilter::Make(SkIntToScalar(-10),
137 SkIntToScalar(-10),
138 nullptr));
senorblanco@chromium.org962c8862013-09-19 17:26:47 +0000139
robertphillips5605b562016-04-05 11:50:42 -0700140 sk_sp<SkImageFilter> cfOffset(SkColorFilterImageFilter::Make(cf, std::move(offset)));
mtklein1eea9fc2015-01-23 16:09:32 -0800141
robertphillipsfc11b0a2016-04-05 09:09:36 -0700142 sk_sp<SkImageFilter> erodeX(SkErodeImageFilter::Make(8, 0, nullptr, &cropRect));
143 sk_sp<SkImageFilter> erodeY(SkErodeImageFilter::Make(0, 8, nullptr, &cropRect));
cwallez80a61df2015-01-26 12:20:14 -0800144
robertphillipsfc11b0a2016-04-05 09:09:36 -0700145 sk_sp<SkImageFilter> filters[] = {
halcanary96fcdcc2015-08-27 07:41:13 -0700146 nullptr,
robertphillips5605b562016-04-05 11:50:42 -0700147 SkColorFilterImageFilter::Make(cf, nullptr, &cropRect),
robertphillipsfc11b0a2016-04-05 09:09:36 -0700148 SkBlurImageFilter::Make(0.0f, 0.0f, nullptr, &cropRect),
149 SkBlurImageFilter::Make(1.0f, 1.0f, nullptr, &cropRect),
150 SkBlurImageFilter::Make(8.0f, 0.0f, nullptr, &cropRect),
151 SkBlurImageFilter::Make(0.0f, 8.0f, nullptr, &cropRect),
152 SkBlurImageFilter::Make(8.0f, 8.0f, nullptr, &cropRect),
153 SkErodeImageFilter::Make(1, 1, nullptr, &cropRect),
154 SkErodeImageFilter::Make(8, 0, std::move(erodeY), &cropRect),
155 SkErodeImageFilter::Make(0, 8, std::move(erodeX), &cropRect),
156 SkErodeImageFilter::Make(8, 8, nullptr, &cropRect),
157 SkMergeImageFilter::Make(nullptr,
158 std::move(cfOffset),
robertphillipsfc11b0a2016-04-05 09:09:36 -0700159 &cropRect),
160 SkBlurImageFilter::Make(8.0f, 8.0f, nullptr, &bogusRect),
robertphillips5605b562016-04-05 11:50:42 -0700161 SkColorFilterImageFilter::Make(cf, nullptr, &bogusRect),
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000162 };
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000163
164 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
165 SkScalar MARGIN = SkIntToScalar(16);
166 SkScalar DX = r.width() + MARGIN;
167 SkScalar DY = r.height() + MARGIN;
168
169 canvas->translate(MARGIN, MARGIN);
senorblanco@chromium.org7168ecc2013-07-25 18:08:13 +0000170 for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000171 canvas->save();
senorblanco@chromium.org7168ecc2013-07-25 18:08:13 +0000172 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
cwallez80a61df2015-01-26 12:20:14 -0800173 SkPaint paint;
174 canvas->drawBitmap(fCheckerboard, 0, 0);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000175 drawProc[j](canvas, r, filters[i]);
176 canvas->translate(0, DY);
177 }
178 canvas->restore();
179 canvas->translate(DX, 0);
180 }
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000181 }
182
183private:
cwallez80a61df2015-01-26 12:20:14 -0800184 SkBitmap fCheckerboard;
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000185 typedef GM INHERITED;
186};
187
188///////////////////////////////////////////////////////////////////////////////
189
scroggo96f16e82015-12-10 13:31:59 -0800190DEF_GM( return new ImageFiltersCroppedGM; )