blob: c6742b2a60347b5a2fb5895460b9b8d2c6406395 [file] [log] [blame]
reed@google.com32d25b62011-12-20 16:19:00 +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
8#include "gm.h"
9#include "SkCanvas.h"
10#include "SkColorFilter.h"
11#include "SkColorPriv.h"
12#include "SkShader.h"
reed@google.com76dd2772012-01-05 21:15:07 +000013
14#include "SkBlurImageFilter.h"
senorblanco@chromium.org44888c62012-08-20 19:23:24 +000015#include "SkColorFilterImageFilter.h"
commit-bot@chromium.org1c4c9ef2013-08-07 00:07:51 +000016#include "SkComposeImageFilter.h"
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000017#include "SkMergeImageFilter.h"
senorblanco@chromium.org9daf96a2012-11-06 20:29:39 +000018#include "SkOffsetImageFilter.h"
reed@google.com32d25b62011-12-20 16:19:00 +000019#include "SkTestImageFilters.h"
20
21#define FILTER_WIDTH SkIntToScalar(150)
22#define FILTER_HEIGHT SkIntToScalar(200)
23
robertphillips51a315e2016-03-31 09:05:49 -070024static sk_sp<SkImageFilter> make0() {
robertphillipsfc0f44a2016-04-06 07:44:01 -070025 return SkDownSampleImageFilter::Make(SK_Scalar1 / 5, nullptr);
robertphillips491fb172016-03-30 12:32:58 -070026}
27
robertphillips51a315e2016-03-31 09:05:49 -070028static sk_sp<SkImageFilter> make1() {
29 return SkOffsetImageFilter::Make(SkIntToScalar(16), SkIntToScalar(16), nullptr);
robertphillips491fb172016-03-30 12:32:58 -070030}
31
robertphillips51a315e2016-03-31 09:05:49 -070032static sk_sp<SkImageFilter> make2() {
robertphillips491fb172016-03-30 12:32:58 -070033 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
robertphillips5605b562016-04-05 11:50:42 -070034 return SkColorFilterImageFilter::Make(std::move(cf), nullptr);
reed@google.com32d25b62011-12-20 16:19:00 +000035}
robertphillips491fb172016-03-30 12:32:58 -070036
robertphillips51a315e2016-03-31 09:05:49 -070037static sk_sp<SkImageFilter> make3() {
robertphillips6e7025a2016-04-04 04:31:25 -070038 return SkBlurImageFilter::Make(8, 0, nullptr);
reed@google.com76dd2772012-01-05 21:15:07 +000039}
40
robertphillips51a315e2016-03-31 09:05:49 -070041static sk_sp<SkImageFilter> make4() {
42 sk_sp<SkImageFilter> outer(SkOffsetImageFilter::Make(SkIntToScalar(16),
43 SkIntToScalar(16),
44 nullptr));
robertphillipsfc0f44a2016-04-06 07:44:01 -070045 sk_sp<SkImageFilter> inner(SkDownSampleImageFilter::Make(SK_Scalar1 / 5, nullptr));
robertphillips51a315e2016-03-31 09:05:49 -070046 return SkComposeImageFilter::Make(std::move(outer), std::move(inner));
reed@google.com32d25b62011-12-20 16:19:00 +000047}
robertphillips491fb172016-03-30 12:32:58 -070048
robertphillips51a315e2016-03-31 09:05:49 -070049static sk_sp<SkImageFilter> make5() {
50 sk_sp<SkImageFilter> first(SkOffsetImageFilter::Make(SkIntToScalar(16),
51 SkIntToScalar(16),
52 nullptr));
robertphillipsfc0f44a2016-04-06 07:44:01 -070053 sk_sp<SkImageFilter> second(SkDownSampleImageFilter::Make(SK_Scalar1 / 5, nullptr));
robertphillips51a315e2016-03-31 09:05:49 -070054 return SkMergeImageFilter::Make(std::move(first), std::move(second));
reed@google.com32d25b62011-12-20 16:19:00 +000055}
56
robertphillips51a315e2016-03-31 09:05:49 -070057static sk_sp<SkImageFilter> make6() {
58 sk_sp<SkImageFilter> outer(SkOffsetImageFilter::Make(SkIntToScalar(16),
59 SkIntToScalar(16),
60 nullptr));
robertphillipsfc0f44a2016-04-06 07:44:01 -070061 sk_sp<SkImageFilter> inner(SkDownSampleImageFilter::Make(SK_Scalar1 / 5, nullptr));
robertphillips491fb172016-03-30 12:32:58 -070062 sk_sp<SkImageFilter> compose(SkComposeImageFilter::Make(std::move(outer), std::move(inner)));
rmistry@google.comd6176b02012-08-23 18:14:13 +000063
robertphillips491fb172016-03-30 12:32:58 -070064 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(0x880000FF, SkXfermode::kSrcIn_Mode));
robertphillips5605b562016-04-05 11:50:42 -070065 sk_sp<SkImageFilter> blue(SkColorFilterImageFilter::Make(std::move(cf), nullptr));
rmistry@google.comd6176b02012-08-23 18:14:13 +000066
robertphillips51a315e2016-03-31 09:05:49 -070067 return SkMergeImageFilter::Make(std::move(compose), std::move(blue));
reed@google.com76dd2772012-01-05 21:15:07 +000068}
reed@google.com32d25b62011-12-20 16:19:00 +000069
robertphillips51a315e2016-03-31 09:05:49 -070070static sk_sp<SkImageFilter> make7() {
71 sk_sp<SkImageFilter> outer(SkOffsetImageFilter::Make(SkIntToScalar(16),
72 SkIntToScalar(16),
73 nullptr));
robertphillips491fb172016-03-30 12:32:58 -070074 sk_sp<SkImageFilter> inner(make3());
75 sk_sp<SkImageFilter> compose(SkComposeImageFilter::Make(std::move(outer), std::move(inner)));
rmistry@google.comd6176b02012-08-23 18:14:13 +000076
robertphillips491fb172016-03-30 12:32:58 -070077 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(0x880000FF, SkXfermode::kSrcIn_Mode));
robertphillips5605b562016-04-05 11:50:42 -070078 sk_sp<SkImageFilter> blue(SkColorFilterImageFilter::Make(std::move(cf), nullptr));
rmistry@google.comd6176b02012-08-23 18:14:13 +000079
robertphillips51a315e2016-03-31 09:05:49 -070080 return SkMergeImageFilter::Make(std::move(compose), std::move(blue));
reed@google.com32d25b62011-12-20 16:19:00 +000081}
82
83static void draw0(SkCanvas* canvas) {
84 SkPaint p;
85 p.setAntiAlias(true);
86 SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
reed@google.com76dd2772012-01-05 21:15:07 +000087 r.inset(SK_Scalar1 * 12, SK_Scalar1 * 12);
reed@google.com32d25b62011-12-20 16:19:00 +000088 p.setColor(SK_ColorRED);
89 canvas->drawOval(r, p);
90}
91
92class TestImageFiltersGM : public skiagm::GM {
93public:
94 TestImageFiltersGM () {}
95
96protected:
97
mtklein36352bf2015-03-25 18:17:31 -070098 SkString onShortName() override {
reed@google.com32d25b62011-12-20 16:19:00 +000099 return SkString("testimagefilters");
100 }
101
mtklein36352bf2015-03-25 18:17:31 -0700102 SkISize onISize() override { return SkISize::Make(700, 460); }
reed@google.com32d25b62011-12-20 16:19:00 +0000103
mtklein36352bf2015-03-25 18:17:31 -0700104 void onDraw(SkCanvas* canvas) override {
reed@google.com76dd2772012-01-05 21:15:07 +0000105// this->drawSizeBounds(canvas, 0xFFCCCCCC);
106
robertphillips51a315e2016-03-31 09:05:49 -0700107 static sk_sp<SkImageFilter> (*gFilterProc[])() = {
reed@google.com76dd2772012-01-05 21:15:07 +0000108 make0, make1, make2, make3, make4, make5, make6, make7
reed@google.com32d25b62011-12-20 16:19:00 +0000109 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000110
reed@google.com32d25b62011-12-20 16:19:00 +0000111 const SkRect bounds = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000112
reed@google.com32d25b62011-12-20 16:19:00 +0000113 const SkScalar dx = bounds.width() * 8 / 7;
114 const SkScalar dy = bounds.height() * 8 / 7;
115
reed@google.com76dd2772012-01-05 21:15:07 +0000116 canvas->translate(SkIntToScalar(8), SkIntToScalar(8));
reed@google.com32d25b62011-12-20 16:19:00 +0000117
reed@google.com7fa2a652014-01-27 13:42:58 +0000118 for (int i = 0; i < (int)SK_ARRAY_COUNT(gFilterProc); ++i) {
reed@google.com76dd2772012-01-05 21:15:07 +0000119 int ix = i % 4;
120 int iy = i / 4;
reed@google.com32d25b62011-12-20 16:19:00 +0000121
122 SkAutoCanvasRestore acr(canvas, true);
123 canvas->translate(ix * dx, iy * dy);
124
125 SkPaint p;
reed@google.com76dd2772012-01-05 21:15:07 +0000126 p.setStyle(SkPaint::kStroke_Style);
reed@google.com32d25b62011-12-20 16:19:00 +0000127 canvas->drawRect(bounds, p);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000128
reed@google.com76dd2772012-01-05 21:15:07 +0000129 SkPaint paint;
robertphillips51a315e2016-03-31 09:05:49 -0700130 paint.setImageFilter(gFilterProc[i]());
reed@google.com32d25b62011-12-20 16:19:00 +0000131 canvas->saveLayer(&bounds, &paint);
132 draw0(canvas);
133 }
134 }
135
136private:
137 typedef GM INHERITED;
138};
139
140//////////////////////////////////////////////////////////////////////////////
141
scroggo96f16e82015-12-10 13:31:59 -0800142DEF_GM( return new TestImageFiltersGM; )