blob: 21f3981f6afea8983a04f4a3f5244f6f5fa42ed4 [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"
Michael Ludwig898bbfa2019-08-02 15:21:23 -040024#include "include/effects/SkImageFilters.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040025#include "include/utils/SkTextUtils.h"
26#include "tools/ToolUtils.h"
27
28#include <utility>
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000029
30///////////////////////////////////////////////////////////////////////////////
31
robertphillipsfc11b0a2016-04-05 09:09:36 -070032static void draw_paint(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000033 SkPaint paint;
robertphillipsfc11b0a2016-04-05 09:09:36 -070034 paint.setImageFilter(std::move(imf));
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000035 paint.setColor(SK_ColorBLACK);
36 canvas->save();
37 canvas->clipRect(r);
38 canvas->drawPaint(paint);
39 canvas->restore();
40}
41
robertphillipsfc11b0a2016-04-05 09:09:36 -070042static void draw_path(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000043 SkPaint paint;
44 paint.setColor(SK_ColorMAGENTA);
robertphillipsfc11b0a2016-04-05 09:09:36 -070045 paint.setImageFilter(std::move(imf));
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000046 paint.setAntiAlias(true);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000047 canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000048}
49
robertphillipsfc11b0a2016-04-05 09:09:36 -070050static void draw_text(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000051 SkPaint paint;
robertphillipsfc11b0a2016-04-05 09:09:36 -070052 paint.setImageFilter(std::move(imf));
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000053 paint.setColor(SK_ColorGREEN);
Mike Reedb579f072019-01-03 15:45:53 -050054
Mike Kleinea3f0142019-03-20 11:12:10 -050055 SkFont font(ToolUtils::create_portable_typeface(), r.height() / 2);
Mike Reedb579f072019-01-03 15:45:53 -050056 SkTextUtils::DrawString(canvas, "Text", r.centerX(), r.centerY(), font, paint, SkTextUtils::kCenter_Align);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000057}
58
robertphillipsfc11b0a2016-04-05 09:09:36 -070059static void draw_bitmap(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000060 SkPaint paint;
61
62 SkIRect bounds;
63 r.roundOut(&bounds);
64
65 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000066 bm.allocN32Pixels(bounds.width(), bounds.height());
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000067 bm.eraseColor(SK_ColorTRANSPARENT);
68 SkCanvas c(bm);
halcanary96fcdcc2015-08-27 07:41:13 -070069 draw_path(&c, r, nullptr);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000070
robertphillipsfc11b0a2016-04-05 09:09:36 -070071 paint.setImageFilter(std::move(imf));
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000072 canvas->drawBitmap(bm, 0, 0, &paint);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000073}
74
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000075///////////////////////////////////////////////////////////////////////////////
76
77class ImageFiltersCroppedGM : public skiagm::GM {
78public:
79 ImageFiltersCroppedGM () {}
80
81protected:
senorblanco64049812016-02-01 10:32:42 -080082 SkString onShortName() override {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +000083 return SkString("imagefilterscropped");
84 }
85
senorblanco64049812016-02-01 10:32:42 -080086 SkISize onISize() override { return SkISize::Make(400, 960); }
cwallez80a61df2015-01-26 12:20:14 -080087
88 void make_checkerboard() {
89 fCheckerboard.allocN32Pixels(80, 80);
90 SkCanvas canvas(fCheckerboard);
91 canvas.clear(SK_ColorTRANSPARENT);
92 SkPaint darkPaint;
Mike Kleind46dce32018-08-16 10:17:03 -040093 darkPaint.setColor(0xFF404040);
cwallez80a61df2015-01-26 12:20:14 -080094 SkPaint lightPaint;
Mike Kleind46dce32018-08-16 10:17:03 -040095 lightPaint.setColor(0xFFA0A0A0);
cwallez80a61df2015-01-26 12:20:14 -080096 for (int y = 0; y < 80; y += 16) {
97 for (int x = 0; x < 80; x += 16) {
98 canvas.save();
99 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
100 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
101 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
102 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
103 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
104 canvas.restore();
105 }
106 }
107 }
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000108
109 void draw_frame(SkCanvas* canvas, const SkRect& r) {
110 SkPaint paint;
111 paint.setStyle(SkPaint::kStroke_Style);
112 paint.setColor(SK_ColorRED);
113 canvas->drawRect(r, paint);
114 }
115
Hal Canaryfa3305a2019-07-18 12:36:54 -0400116 void onOnceBeforeDraw() override {
cwallez80a61df2015-01-26 12:20:14 -0800117 make_checkerboard();
118 }
119
robertphillips5605b562016-04-05 11:50:42 -0700120 void onDraw(SkCanvas* canvas) override {
robertphillipsfc11b0a2016-04-05 09:09:36 -0700121 void (*drawProc[])(SkCanvas*, const SkRect&, sk_sp<SkImageFilter>) = {
reedda420b92015-12-16 08:38:15 -0800122 draw_bitmap, draw_path, draw_paint, draw_text
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000123 };
124
Mike Reedb286bc22019-04-08 16:23:20 -0400125 sk_sp<SkColorFilter> cf(SkColorFilters::Blend(SK_ColorBLUE,
Mike Reed7d954ad2016-10-28 15:42:34 -0400126 SkBlendMode::kSrcIn));
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400127 SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 44, 44);
128 SkIRect bogusRect = SkIRect::MakeXYWH(-100, -100, 10, 10);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000129
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400130 sk_sp<SkImageFilter> offset(SkImageFilters::Offset(-10, -10, nullptr));
senorblanco@chromium.org962c8862013-09-19 17:26:47 +0000131
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400132 sk_sp<SkImageFilter> cfOffset(SkImageFilters::ColorFilter(cf, std::move(offset)));
mtklein1eea9fc2015-01-23 16:09:32 -0800133
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400134 sk_sp<SkImageFilter> erodeX(SkImageFilters::Erode(8, 0, nullptr, &cropRect));
135 sk_sp<SkImageFilter> erodeY(SkImageFilters::Erode(0, 8, nullptr, &cropRect));
cwallez80a61df2015-01-26 12:20:14 -0800136
robertphillipsfc11b0a2016-04-05 09:09:36 -0700137 sk_sp<SkImageFilter> filters[] = {
halcanary96fcdcc2015-08-27 07:41:13 -0700138 nullptr,
Michael Ludwig898bbfa2019-08-02 15:21:23 -0400139 SkImageFilters::ColorFilter(cf, nullptr, &cropRect),
140 SkImageFilters::Blur(0.0f, 0.0f, nullptr, &cropRect),
141 SkImageFilters::Blur(1.0f, 1.0f, nullptr, &cropRect),
142 SkImageFilters::Blur(8.0f, 0.0f, nullptr, &cropRect),
143 SkImageFilters::Blur(0.0f, 8.0f, nullptr, &cropRect),
144 SkImageFilters::Blur(8.0f, 8.0f, nullptr, &cropRect),
145 SkImageFilters::Erode(1, 1, nullptr, &cropRect),
146 SkImageFilters::Erode(8, 0, std::move(erodeY), &cropRect),
147 SkImageFilters::Erode(0, 8, std::move(erodeX), &cropRect),
148 SkImageFilters::Erode(8, 8, nullptr, &cropRect),
149 SkImageFilters::Merge(nullptr, std::move(cfOffset), &cropRect),
150 SkImageFilters::Blur(8.0f, 8.0f, nullptr, &bogusRect),
151 SkImageFilters::ColorFilter(cf, nullptr, &bogusRect),
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000152 };
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000153
154 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
155 SkScalar MARGIN = SkIntToScalar(16);
156 SkScalar DX = r.width() + MARGIN;
157 SkScalar DY = r.height() + MARGIN;
158
159 canvas->translate(MARGIN, MARGIN);
senorblanco@chromium.org7168ecc2013-07-25 18:08:13 +0000160 for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) {
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000161 canvas->save();
senorblanco@chromium.org7168ecc2013-07-25 18:08:13 +0000162 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
cwallez80a61df2015-01-26 12:20:14 -0800163 SkPaint paint;
164 canvas->drawBitmap(fCheckerboard, 0, 0);
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000165 drawProc[j](canvas, r, filters[i]);
166 canvas->translate(0, DY);
167 }
168 canvas->restore();
169 canvas->translate(DX, 0);
170 }
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000171 }
172
173private:
cwallez80a61df2015-01-26 12:20:14 -0800174 SkBitmap fCheckerboard;
senorblanco@chromium.org194d7752013-07-24 22:19:24 +0000175 typedef GM INHERITED;
176};
177
178///////////////////////////////////////////////////////////////////////////////
179
scroggo96f16e82015-12-10 13:31:59 -0800180DEF_GM( return new ImageFiltersCroppedGM; )