blob: 73581ba5c014b4e28053d64e54f6d5f180f91de0 [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"
senorblanco@chromium.org4a9a6122012-12-04 14:18:50 +000016#include "SkMergeImageFilter.h"
senorblanco@chromium.org9daf96a2012-11-06 20:29:39 +000017#include "SkOffsetImageFilter.h"
reed@google.com32d25b62011-12-20 16:19:00 +000018#include "SkTestImageFilters.h"
19
20#define FILTER_WIDTH SkIntToScalar(150)
21#define FILTER_HEIGHT SkIntToScalar(200)
22
23static SkImageFilter* make0() { return new SkDownSampleImageFilter(SK_Scalar1 / 5); }
24static SkImageFilter* make1() { return new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16)); }
25static SkImageFilter* make2() {
26 SkColorFilter* cf = SkColorFilter::CreateModeFilter(SK_ColorBLUE,
27 SkXfermode::kSrcIn_Mode);
28 SkAutoUnref aur(cf);
senorblanco@chromium.orgcd9f5592012-10-26 19:37:00 +000029 return SkColorFilterImageFilter::Create(cf);
reed@google.com32d25b62011-12-20 16:19:00 +000030}
31static SkImageFilter* make3() {
reed@google.com76dd2772012-01-05 21:15:07 +000032 return new SkBlurImageFilter(8, 0);
33}
34
35static SkImageFilter* make4() {
reed@google.com32d25b62011-12-20 16:19:00 +000036 SkImageFilter* outer = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16));
37 SkImageFilter* inner = new SkDownSampleImageFilter(SK_Scalar1 / 5);
38 SkAutoUnref aur0(outer);
39 SkAutoUnref aur1(inner);
40 return new SkComposeImageFilter(outer, inner);
41}
reed@google.com76dd2772012-01-05 21:15:07 +000042static SkImageFilter* make5() {
reed@google.com32d25b62011-12-20 16:19:00 +000043 SkImageFilter* first = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16));
44 SkImageFilter* second = new SkDownSampleImageFilter(SK_Scalar1 / 5);
45 SkAutoUnref aur0(first);
46 SkAutoUnref aur1(second);
47 return new SkMergeImageFilter(first, second);
48}
49
reed@google.com76dd2772012-01-05 21:15:07 +000050static SkImageFilter* make6() {
reed@google.com32d25b62011-12-20 16:19:00 +000051 SkImageFilter* outer = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16));
52 SkImageFilter* inner = new SkDownSampleImageFilter(SK_Scalar1 / 5);
53 SkAutoUnref aur0(outer);
54 SkAutoUnref aur1(inner);
55 SkImageFilter* compose = new SkComposeImageFilter(outer, inner);
56 SkAutoUnref aur2(compose);
rmistry@google.comd6176b02012-08-23 18:14:13 +000057
reed@google.com32d25b62011-12-20 16:19:00 +000058 SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF,
59 SkXfermode::kSrcIn_Mode);
60 SkAutoUnref aur3(cf);
senorblanco@chromium.orgcd9f5592012-10-26 19:37:00 +000061 SkImageFilter* blue = SkColorFilterImageFilter::Create(cf);
reed@google.com32d25b62011-12-20 16:19:00 +000062 SkAutoUnref aur4(blue);
rmistry@google.comd6176b02012-08-23 18:14:13 +000063
reed@google.com76dd2772012-01-05 21:15:07 +000064 return new SkMergeImageFilter(compose, blue);
65}
reed@google.com32d25b62011-12-20 16:19:00 +000066
reed@google.com76dd2772012-01-05 21:15:07 +000067static SkImageFilter* make7() {
68 SkImageFilter* outer = new SkOffsetImageFilter(SkIntToScalar(16), SkIntToScalar(16));
69 SkImageFilter* inner = make3();
70 SkAutoUnref aur0(outer);
71 SkAutoUnref aur1(inner);
72 SkImageFilter* compose = new SkComposeImageFilter(outer, inner);
73 SkAutoUnref aur2(compose);
rmistry@google.comd6176b02012-08-23 18:14:13 +000074
reed@google.com76dd2772012-01-05 21:15:07 +000075 SkColorFilter* cf = SkColorFilter::CreateModeFilter(0x880000FF,
76 SkXfermode::kSrcIn_Mode);
77 SkAutoUnref aur3(cf);
senorblanco@chromium.orgcd9f5592012-10-26 19:37:00 +000078 SkImageFilter* blue = SkColorFilterImageFilter::Create(cf);
reed@google.com76dd2772012-01-05 21:15:07 +000079 SkAutoUnref aur4(blue);
rmistry@google.comd6176b02012-08-23 18:14:13 +000080
reed@google.com32d25b62011-12-20 16:19:00 +000081 return new SkMergeImageFilter(compose, blue);
82}
83
84static void draw0(SkCanvas* canvas) {
85 SkPaint p;
86 p.setAntiAlias(true);
87 SkRect r = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
reed@google.com76dd2772012-01-05 21:15:07 +000088 r.inset(SK_Scalar1 * 12, SK_Scalar1 * 12);
reed@google.com32d25b62011-12-20 16:19:00 +000089 p.setColor(SK_ColorRED);
90 canvas->drawOval(r, p);
91}
92
93class TestImageFiltersGM : public skiagm::GM {
94public:
95 TestImageFiltersGM () {}
96
97protected:
98
99 virtual SkString onShortName() {
100 return SkString("testimagefilters");
101 }
102
reed@google.com76dd2772012-01-05 21:15:07 +0000103 virtual SkISize onISize() { return SkISize::Make(700, 460); }
reed@google.com32d25b62011-12-20 16:19:00 +0000104
105 virtual void onDraw(SkCanvas* canvas) {
reed@google.com76dd2772012-01-05 21:15:07 +0000106// this->drawSizeBounds(canvas, 0xFFCCCCCC);
107
reed@google.com32d25b62011-12-20 16:19:00 +0000108 static SkImageFilter* (*gFilterProc[])() = {
reed@google.com76dd2772012-01-05 21:15:07 +0000109 make0, make1, make2, make3, make4, make5, make6, make7
reed@google.com32d25b62011-12-20 16:19:00 +0000110 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000111
reed@google.com32d25b62011-12-20 16:19:00 +0000112 const SkRect bounds = SkRect::MakeWH(FILTER_WIDTH, FILTER_HEIGHT);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000113
reed@google.com32d25b62011-12-20 16:19:00 +0000114 const SkScalar dx = bounds.width() * 8 / 7;
115 const SkScalar dy = bounds.height() * 8 / 7;
116
reed@google.com76dd2772012-01-05 21:15:07 +0000117 canvas->translate(SkIntToScalar(8), SkIntToScalar(8));
reed@google.com32d25b62011-12-20 16:19:00 +0000118
reed@google.com76dd2772012-01-05 21:15:07 +0000119 for (size_t i = 0; i < SK_ARRAY_COUNT(gFilterProc); ++i) {
120 int ix = i % 4;
121 int iy = i / 4;
reed@google.com32d25b62011-12-20 16:19:00 +0000122
123 SkAutoCanvasRestore acr(canvas, true);
124 canvas->translate(ix * dx, iy * dy);
125
126 SkPaint p;
reed@google.com76dd2772012-01-05 21:15:07 +0000127 p.setStyle(SkPaint::kStroke_Style);
reed@google.com32d25b62011-12-20 16:19:00 +0000128 canvas->drawRect(bounds, p);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000129
reed@google.com76dd2772012-01-05 21:15:07 +0000130 SkPaint paint;
131 paint.setImageFilter(gFilterProc[i]())->unref();
reed@google.com32d25b62011-12-20 16:19:00 +0000132 canvas->saveLayer(&bounds, &paint);
133 draw0(canvas);
134 }
135 }
136
137private:
138 typedef GM INHERITED;
139};
140
141//////////////////////////////////////////////////////////////////////////////
142
143static skiagm::GM* MyFactory(void*) { return new TestImageFiltersGM; }
144static skiagm::GMRegistry reg(MyFactory);