blob: c4bddbf4e82192cdd95af6f382f474cb087ce7f7 [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
robertphillips491fb172016-03-30 12:32:58 -070024static SkImageFilter* make0() {
25 return SkDownSampleImageFilter::Create(SK_Scalar1 / 5);
26}
27
28static SkImageFilter* make1() {
29 return SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16));
30}
31
reed@google.com32d25b62011-12-20 16:19:00 +000032static SkImageFilter* make2() {
robertphillips491fb172016-03-30 12:32:58 -070033 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
reedd053ce92016-03-22 10:17:23 -070034 return SkColorFilterImageFilter::Create(cf.get());
reed@google.com32d25b62011-12-20 16:19:00 +000035}
robertphillips491fb172016-03-30 12:32:58 -070036
reed@google.com32d25b62011-12-20 16:19:00 +000037static SkImageFilter* make3() {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000038 return SkBlurImageFilter::Create(8, 0);
reed@google.com76dd2772012-01-05 21:15:07 +000039}
40
41static SkImageFilter* make4() {
robertphillips491fb172016-03-30 12:32:58 -070042 sk_sp<SkImageFilter> outer(SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16)));
43 sk_sp<SkImageFilter> inner(SkDownSampleImageFilter::Create(SK_Scalar1 / 5));
44 return SkComposeImageFilter::Make(std::move(outer), std::move(inner)).release();
reed@google.com32d25b62011-12-20 16:19:00 +000045}
robertphillips491fb172016-03-30 12:32:58 -070046
reed@google.com76dd2772012-01-05 21:15:07 +000047static SkImageFilter* make5() {
robertphillips491fb172016-03-30 12:32:58 -070048 sk_sp<SkImageFilter> first(SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16)));
49 sk_sp<SkImageFilter> second(SkDownSampleImageFilter::Create(SK_Scalar1 / 5));
robertphillips2238c9d2016-03-30 13:34:16 -070050 return SkMergeImageFilter::Make(std::move(first), std::move(second)).release();
reed@google.com32d25b62011-12-20 16:19:00 +000051}
52
reed@google.com76dd2772012-01-05 21:15:07 +000053static SkImageFilter* make6() {
robertphillips491fb172016-03-30 12:32:58 -070054 sk_sp<SkImageFilter> outer(SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16)));
55 sk_sp<SkImageFilter> inner(SkDownSampleImageFilter::Create(SK_Scalar1 / 5));
56 sk_sp<SkImageFilter> compose(SkComposeImageFilter::Make(std::move(outer), std::move(inner)));
rmistry@google.comd6176b02012-08-23 18:14:13 +000057
robertphillips491fb172016-03-30 12:32:58 -070058 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(0x880000FF, SkXfermode::kSrcIn_Mode));
59 sk_sp<SkImageFilter> blue(SkColorFilterImageFilter::Create(cf.get()));
rmistry@google.comd6176b02012-08-23 18:14:13 +000060
robertphillips2238c9d2016-03-30 13:34:16 -070061 return SkMergeImageFilter::Make(std::move(compose), std::move(blue)).release();
reed@google.com76dd2772012-01-05 21:15:07 +000062}
reed@google.com32d25b62011-12-20 16:19:00 +000063
reed@google.com76dd2772012-01-05 21:15:07 +000064static SkImageFilter* make7() {
robertphillips491fb172016-03-30 12:32:58 -070065 sk_sp<SkImageFilter> outer(SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16)));
66 sk_sp<SkImageFilter> inner(make3());
67 sk_sp<SkImageFilter> compose(SkComposeImageFilter::Make(std::move(outer), std::move(inner)));
rmistry@google.comd6176b02012-08-23 18:14:13 +000068
robertphillips491fb172016-03-30 12:32:58 -070069 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(0x880000FF, SkXfermode::kSrcIn_Mode));
70 sk_sp<SkImageFilter> blue(SkColorFilterImageFilter::Create(cf.get()));
rmistry@google.comd6176b02012-08-23 18:14:13 +000071
robertphillips2238c9d2016-03-30 13:34:16 -070072 return SkMergeImageFilter::Make(std::move(compose), std::move(blue)).release();
reed@google.com32d25b62011-12-20 16:19:00 +000073}
74
75static void draw0(SkCanvas* canvas) {
76 SkPaint p;
77 p.setAntiAlias(true);
78 SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
reed@google.com76dd2772012-01-05 21:15:07 +000079 r.inset(SK_Scalar1 * 12, SK_Scalar1 * 12);
reed@google.com32d25b62011-12-20 16:19:00 +000080 p.setColor(SK_ColorRED);
81 canvas->drawOval(r, p);
82}
83
84class TestImageFiltersGM : public skiagm::GM {
85public:
86 TestImageFiltersGM () {}
87
88protected:
89
mtklein36352bf2015-03-25 18:17:31 -070090 SkString onShortName() override {
reed@google.com32d25b62011-12-20 16:19:00 +000091 return SkString("testimagefilters");
92 }
93
mtklein36352bf2015-03-25 18:17:31 -070094 SkISize onISize() override { return SkISize::Make(700, 460); }
reed@google.com32d25b62011-12-20 16:19:00 +000095
mtklein36352bf2015-03-25 18:17:31 -070096 void onDraw(SkCanvas* canvas) override {
reed@google.com76dd2772012-01-05 21:15:07 +000097// this->drawSizeBounds(canvas, 0xFFCCCCCC);
98
reed@google.com32d25b62011-12-20 16:19:00 +000099 static SkImageFilter* (*gFilterProc[])() = {
reed@google.com76dd2772012-01-05 21:15:07 +0000100 make0, make1, make2, make3, make4, make5, make6, make7
reed@google.com32d25b62011-12-20 16:19:00 +0000101 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000102
reed@google.com32d25b62011-12-20 16:19:00 +0000103 const SkRect bounds = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000104
reed@google.com32d25b62011-12-20 16:19:00 +0000105 const SkScalar dx = bounds.width() * 8 / 7;
106 const SkScalar dy = bounds.height() * 8 / 7;
107
reed@google.com76dd2772012-01-05 21:15:07 +0000108 canvas->translate(SkIntToScalar(8), SkIntToScalar(8));
reed@google.com32d25b62011-12-20 16:19:00 +0000109
reed@google.com7fa2a652014-01-27 13:42:58 +0000110 for (int i = 0; i < (int)SK_ARRAY_COUNT(gFilterProc); ++i) {
reed@google.com76dd2772012-01-05 21:15:07 +0000111 int ix = i % 4;
112 int iy = i / 4;
reed@google.com32d25b62011-12-20 16:19:00 +0000113
114 SkAutoCanvasRestore acr(canvas, true);
115 canvas->translate(ix * dx, iy * dy);
116
117 SkPaint p;
reed@google.com76dd2772012-01-05 21:15:07 +0000118 p.setStyle(SkPaint::kStroke_Style);
reed@google.com32d25b62011-12-20 16:19:00 +0000119 canvas->drawRect(bounds, p);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000120
reed@google.com76dd2772012-01-05 21:15:07 +0000121 SkPaint paint;
122 paint.setImageFilter(gFilterProc[i]())->unref();
reed@google.com32d25b62011-12-20 16:19:00 +0000123 canvas->saveLayer(&bounds, &paint);
124 draw0(canvas);
125 }
126 }
127
128private:
129 typedef GM INHERITED;
130};
131
132//////////////////////////////////////////////////////////////////////////////
133
scroggo96f16e82015-12-10 13:31:59 -0800134DEF_GM( return new TestImageFiltersGM; )