blob: fc71d30e94d2ae405469f84f85e0bc70438610d8 [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"
reed@google.com32d25b62011-12-20 16:19:00 +000015#include "SkTestImageFilters.h"
16
17#define FILTER_WIDTH SkIntToScalar(150)
18#define FILTER_HEIGHT SkIntToScalar(200)
19
20static SkImageFilter* make0() { return new SkDownSampleImageFilter(SK_Scalar1 / 5); }
21static SkImageFilter* make1() { return new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16)); }
22static SkImageFilter* make2() {
23 SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorBLUE,
24 SkXfermode::kSrcIn_Mode);
25 SkAutoUnref aur(cf);
26 return new SkColorFilterImageFilter(cf);
27}
28static SkImageFilter* make3() {
reed@google.com76dd2772012-01-05 21:15:07 +000029 return new SkBlurImageFilter(8, 0);
30}
31
32static SkImageFilter* make4() {
reed@google.com32d25b62011-12-20 16:19:00 +000033 SkImageFilter* outer = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16));
34 SkImageFilter* inner = new SkDownSampleImageFilter(SK_Scalar1 / 5);
35 SkAutoUnref aur0(outer);
36 SkAutoUnref aur1(inner);
37 return new SkComposeImageFilter(outer, inner);
38}
reed@google.com76dd2772012-01-05 21:15:07 +000039static SkImageFilter* make5() {
reed@google.com32d25b62011-12-20 16:19:00 +000040 SkImageFilter* first = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16));
41 SkImageFilter* second = new SkDownSampleImageFilter(SK_Scalar1 / 5);
42 SkAutoUnref aur0(first);
43 SkAutoUnref aur1(second);
44 return new SkMergeImageFilter(first, second);
45}
46
reed@google.com76dd2772012-01-05 21:15:07 +000047static SkImageFilter* make6() {
reed@google.com32d25b62011-12-20 16:19:00 +000048 SkImageFilter* outer = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16));
49 SkImageFilter* inner = new SkDownSampleImageFilter(SK_Scalar1 / 5);
50 SkAutoUnref aur0(outer);
51 SkAutoUnref aur1(inner);
52 SkImageFilter* compose = new SkComposeImageFilter(outer, inner);
53 SkAutoUnref aur2(compose);
reed@google.com76dd2772012-01-05 21:15:07 +000054
reed@google.com32d25b62011-12-20 16:19:00 +000055 SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF,
56 SkXfermode::kSrcIn_Mode);
57 SkAutoUnref aur3(cf);
58 SkImageFilter* blue = new SkColorFilterImageFilter(cf);
59 SkAutoUnref aur4(blue);
reed@google.com76dd2772012-01-05 21:15:07 +000060
61 return new SkMergeImageFilter(compose, blue);
62}
reed@google.com32d25b62011-12-20 16:19:00 +000063
reed@google.com76dd2772012-01-05 21:15:07 +000064static SkImageFilter* make7() {
65 SkImageFilter* outer = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16));
66 SkImageFilter* inner = make3();
67 SkAutoUnref aur0(outer);
68 SkAutoUnref aur1(inner);
69 SkImageFilter* compose = new SkComposeImageFilter(outer, inner);
70 SkAutoUnref aur2(compose);
71
72 SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF,
73 SkXfermode::kSrcIn_Mode);
74 SkAutoUnref aur3(cf);
75 SkImageFilter* blue = new SkColorFilterImageFilter(cf);
76 SkAutoUnref aur4(blue);
77
reed@google.com32d25b62011-12-20 16:19:00 +000078 return new SkMergeImageFilter(compose, blue);
79}
80
81static void draw0(SkCanvas* canvas) {
82 SkPaint p;
83 p.setAntiAlias(true);
84 SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
reed@google.com76dd2772012-01-05 21:15:07 +000085 r.inset(SK_Scalar1 * 12, SK_Scalar1 * 12);
reed@google.com32d25b62011-12-20 16:19:00 +000086 p.setColor(SK_ColorRED);
87 canvas->drawOval(r, p);
88}
89
90class TestImageFiltersGM : public skiagm::GM {
91public:
92 TestImageFiltersGM () {}
93
94protected:
95
96 virtual SkString onShortName() {
97 return SkString("testimagefilters");
98 }
99
reed@google.com76dd2772012-01-05 21:15:07 +0000100 virtual SkISize onISize() { return SkISize::Make(700, 460); }
reed@google.com32d25b62011-12-20 16:19:00 +0000101
102 virtual void onDraw(SkCanvas* canvas) {
reed@google.com76dd2772012-01-05 21:15:07 +0000103// this->drawSizeBounds(canvas, 0xFFCCCCCC);
104
reed@google.com32d25b62011-12-20 16:19:00 +0000105 static SkImageFilter* (*gFilterProc[])() = {
reed@google.com76dd2772012-01-05 21:15:07 +0000106 make0, make1, make2, make3, make4, make5, make6, make7
reed@google.com32d25b62011-12-20 16:19:00 +0000107 };
108
109 const SkRect bounds = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
110
111 const SkScalar dx = bounds.width() * 8 / 7;
112 const SkScalar dy = bounds.height() * 8 / 7;
113
reed@google.com76dd2772012-01-05 21:15:07 +0000114 canvas->translate(SkIntToScalar(8), SkIntToScalar(8));
reed@google.com32d25b62011-12-20 16:19:00 +0000115
reed@google.com76dd2772012-01-05 21:15:07 +0000116 for (size_t i = 0; i < SK_ARRAY_COUNT(gFilterProc); ++i) {
117 int ix = i % 4;
118 int iy = i / 4;
reed@google.com32d25b62011-12-20 16:19:00 +0000119
120 SkAutoCanvasRestore acr(canvas, true);
121 canvas->translate(ix * dx, iy * dy);
122
123 SkPaint p;
reed@google.com76dd2772012-01-05 21:15:07 +0000124 p.setStyle(SkPaint::kStroke_Style);
reed@google.com32d25b62011-12-20 16:19:00 +0000125 canvas->drawRect(bounds, p);
126
reed@google.com76dd2772012-01-05 21:15:07 +0000127 SkPaint paint;
128 paint.setImageFilter(gFilterProc[i]())->unref();
reed@google.com32d25b62011-12-20 16:19:00 +0000129 canvas->saveLayer(&bounds, &paint);
130 draw0(canvas);
131 }
132 }
133
134private:
135 typedef GM INHERITED;
136};
137
138//////////////////////////////////////////////////////////////////////////////
139
140static skiagm::GM* MyFactory(void*) { return new TestImageFiltersGM; }
141static skiagm::GMRegistry reg(MyFactory);
142
143