blob: 2c4fadb092039e522b06ad2869102ddfb6f2654e [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
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000024static SkImageFilter* make0() { return SkDownSampleImageFilter::Create(SK_Scalar1 / 5); }
25static SkImageFilter* make1() { return SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16)); }
reed@google.com32d25b62011-12-20 16:19:00 +000026static SkImageFilter* make2() {
27 SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorBLUE,
28 SkXfermode::kSrcIn_Mode);
29 SkAutoUnref aur(cf);
senorblanco@chromium.orgcd9f5592012-10-26 19:37:00 +000030 return SkColorFilterImageFilter::Create(cf);
reed@google.com32d25b62011-12-20 16:19:00 +000031}
32static SkImageFilter* make3() {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000033 return SkBlurImageFilter::Create(8, 0);
reed@google.com76dd2772012-01-05 21:15:07 +000034}
35
36static SkImageFilter* make4() {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000037 SkImageFilter* outer = SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16));
38 SkImageFilter* inner = SkDownSampleImageFilter::Create(SK_Scalar1 / 5);
reed@google.com32d25b62011-12-20 16:19:00 +000039 SkAutoUnref aur0(outer);
40 SkAutoUnref aur1(inner);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000041 return SkComposeImageFilter::Create(outer, inner);
reed@google.com32d25b62011-12-20 16:19:00 +000042}
reed@google.com76dd2772012-01-05 21:15:07 +000043static SkImageFilter* make5() {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000044 SkImageFilter* first = SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16));
45 SkImageFilter* second = SkDownSampleImageFilter::Create(SK_Scalar1 / 5);
reed@google.com32d25b62011-12-20 16:19:00 +000046 SkAutoUnref aur0(first);
47 SkAutoUnref aur1(second);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000048 return SkMergeImageFilter::Create(first, second);
reed@google.com32d25b62011-12-20 16:19:00 +000049}
50
reed@google.com76dd2772012-01-05 21:15:07 +000051static SkImageFilter* make6() {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000052 SkImageFilter* outer = SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16));
53 SkImageFilter* inner = SkDownSampleImageFilter::Create(SK_Scalar1 / 5);
reed@google.com32d25b62011-12-20 16:19:00 +000054 SkAutoUnref aur0(outer);
55 SkAutoUnref aur1(inner);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000056 SkImageFilter* compose = SkComposeImageFilter::Create(outer, inner);
reed@google.com32d25b62011-12-20 16:19:00 +000057 SkAutoUnref aur2(compose);
rmistry@google.comd6176b02012-08-23 18:14:13 +000058
reed@google.com32d25b62011-12-20 16:19:00 +000059 SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF,
60 SkXfermode::kSrcIn_Mode);
61 SkAutoUnref aur3(cf);
senorblanco@chromium.orgcd9f5592012-10-26 19:37:00 +000062 SkImageFilter* blue = SkColorFilterImageFilter::Create(cf);
reed@google.com32d25b62011-12-20 16:19:00 +000063 SkAutoUnref aur4(blue);
rmistry@google.comd6176b02012-08-23 18:14:13 +000064
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000065 return SkMergeImageFilter::Create(compose, blue);
reed@google.com76dd2772012-01-05 21:15:07 +000066}
reed@google.com32d25b62011-12-20 16:19:00 +000067
reed@google.com76dd2772012-01-05 21:15:07 +000068static SkImageFilter* make7() {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000069 SkImageFilter* outer = SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16));
reed@google.com76dd2772012-01-05 21:15:07 +000070 SkImageFilter* inner = make3();
71 SkAutoUnref aur0(outer);
72 SkAutoUnref aur1(inner);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000073 SkImageFilter* compose = SkComposeImageFilter::Create(outer, inner);
reed@google.com76dd2772012-01-05 21:15:07 +000074 SkAutoUnref aur2(compose);
rmistry@google.comd6176b02012-08-23 18:14:13 +000075
reed@google.com76dd2772012-01-05 21:15:07 +000076 SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF,
77 SkXfermode::kSrcIn_Mode);
78 SkAutoUnref aur3(cf);
senorblanco@chromium.orgcd9f5592012-10-26 19:37:00 +000079 SkImageFilter* blue = SkColorFilterImageFilter::Create(cf);
reed@google.com76dd2772012-01-05 21:15:07 +000080 SkAutoUnref aur4(blue);
rmistry@google.comd6176b02012-08-23 18:14:13 +000081
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000082 return SkMergeImageFilter::Create(compose, blue);
reed@google.com32d25b62011-12-20 16:19:00 +000083}
84
85static void draw0(SkCanvas* canvas) {
86 SkPaint p;
87 p.setAntiAlias(true);
88 SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
reed@google.com76dd2772012-01-05 21:15:07 +000089 r.inset(SK_Scalar1 * 12, SK_Scalar1 * 12);
reed@google.com32d25b62011-12-20 16:19:00 +000090 p.setColor(SK_ColorRED);
91 canvas->drawOval(r, p);
92}
93
94class TestImageFiltersGM : public skiagm::GM {
95public:
96 TestImageFiltersGM () {}
97
98protected:
99
mtklein36352bf2015-03-25 18:17:31 -0700100 SkString onShortName() override {
reed@google.com32d25b62011-12-20 16:19:00 +0000101 return SkString("testimagefilters");
102 }
103
mtklein36352bf2015-03-25 18:17:31 -0700104 SkISize onISize() override { return SkISize::Make(700, 460); }
reed@google.com32d25b62011-12-20 16:19:00 +0000105
mtklein36352bf2015-03-25 18:17:31 -0700106 void onDraw(SkCanvas* canvas) override {
reed@google.com76dd2772012-01-05 21:15:07 +0000107// this->drawSizeBounds(canvas, 0xFFCCCCCC);
108
reed@google.com32d25b62011-12-20 16:19:00 +0000109 static SkImageFilter* (*gFilterProc[])() = {
reed@google.com76dd2772012-01-05 21:15:07 +0000110 make0, make1, make2, make3, make4, make5, make6, make7
reed@google.com32d25b62011-12-20 16:19:00 +0000111 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000112
reed@google.com32d25b62011-12-20 16:19:00 +0000113 const SkRect bounds = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000114
reed@google.com32d25b62011-12-20 16:19:00 +0000115 const SkScalar dx = bounds.width() * 8 / 7;
116 const SkScalar dy = bounds.height() * 8 / 7;
117
reed@google.com76dd2772012-01-05 21:15:07 +0000118 canvas->translate(SkIntToScalar(8), SkIntToScalar(8));
reed@google.com32d25b62011-12-20 16:19:00 +0000119
reed@google.com7fa2a652014-01-27 13:42:58 +0000120 for (int i = 0; i < (int)SK_ARRAY_COUNT(gFilterProc); ++i) {
reed@google.com76dd2772012-01-05 21:15:07 +0000121 int ix = i % 4;
122 int iy = i / 4;
reed@google.com32d25b62011-12-20 16:19:00 +0000123
124 SkAutoCanvasRestore acr(canvas, true);
125 canvas->translate(ix * dx, iy * dy);
126
127 SkPaint p;
reed@google.com76dd2772012-01-05 21:15:07 +0000128 p.setStyle(SkPaint::kStroke_Style);
reed@google.com32d25b62011-12-20 16:19:00 +0000129 canvas->drawRect(bounds, p);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000130
reed@google.com76dd2772012-01-05 21:15:07 +0000131 SkPaint paint;
132 paint.setImageFilter(gFilterProc[i]())->unref();
reed@google.com32d25b62011-12-20 16:19:00 +0000133 canvas->saveLayer(&bounds, &paint);
134 draw0(canvas);
135 }
136 }
137
138private:
139 typedef GM INHERITED;
140};
141
142//////////////////////////////////////////////////////////////////////////////
143
144static skiagm::GM* MyFactory(void*) { return new TestImageFiltersGM; }
145static skiagm::GMRegistry reg(MyFactory);