blob: 4ec697ed0f5fcf666f0d635eb35606964d6da2e3 [file] [log] [blame]
reed@google.com32d25b62011-12-20 16:19:00 +00001
2#ifndef _SkTestImageFilters_h
3#define _SkTestImageFilters_h
4
5#include "SkImageFilter.h"
6
7class SkOffsetImageFilter : public SkImageFilter {
8public:
9 SkOffsetImageFilter(SkScalar dx, SkScalar dy) {
10 fOffset.set(dx, dy);
11 }
12
13 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
14 return SkNEW_ARGS(SkOffsetImageFilter, (buffer));
15 }
16
17protected:
18 SkOffsetImageFilter(SkFlattenableReadBuffer& buffer);
19
20 virtual bool onFilterImage(const SkBitmap& src, const SkMatrix&,
21 SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
22 virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) SK_OVERRIDE;
23 // overrides from SkFlattenable
24 virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
25 virtual Factory getFactory() SK_OVERRIDE;
26
27private:
28 SkVector fOffset;
29
30 typedef SkImageFilter INHERITED;
31};
32
33class SkComposeImageFilter : public SkImageFilter {
34public:
35 SkComposeImageFilter(SkImageFilter* outer, SkImageFilter* inner) {
36 fOuter = outer;
37 fInner = inner;
38 SkSafeRef(outer);
39 SkSafeRef(inner);
40 }
41 virtual ~SkComposeImageFilter();
42
43 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
44 return SkNEW_ARGS(SkComposeImageFilter, (buffer));
45 }
46
47protected:
48 SkComposeImageFilter(SkFlattenableReadBuffer& buffer);
49
50 virtual bool onFilterImage(const SkBitmap& src, const SkMatrix&,
51 SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
52 virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) SK_OVERRIDE;
53 // overrides from SkFlattenable
54 virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
55 virtual Factory getFactory() SK_OVERRIDE;
56
57private:
58 SkImageFilter* fOuter;
59 SkImageFilter* fInner;
60
61 typedef SkImageFilter INHERITED;
62};
63
64#include "SkXfermode.h"
65
66class SkMergeImageFilter : public SkImageFilter {
67public:
68 SkMergeImageFilter(SkImageFilter* first, SkImageFilter* second,
69 SkXfermode::Mode = SkXfermode::kSrcOver_Mode);
70 SkMergeImageFilter(SkImageFilter* const filters[], int count,
71 const SkXfermode::Mode modes[] = NULL);
72 virtual ~SkMergeImageFilter();
73
74 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
75 return SkNEW_ARGS(SkMergeImageFilter, (buffer));
76 }
77
78protected:
79 SkMergeImageFilter(SkFlattenableReadBuffer& buffer);
80
81 virtual bool onFilterImage(const SkBitmap& src, const SkMatrix&,
82 SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
83 virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) SK_OVERRIDE;
84 // overrides from SkFlattenable
85 virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
86 virtual Factory getFactory() SK_OVERRIDE;
87
88private:
89 SkImageFilter** fFilters;
90 uint8_t* fModes; // SkXfermode::Mode
91 int fCount;
92
93 // private storage, to avoid dynamically allocating storage for our copy
94 // of the filters and modes (unless fCount is so large we can't fit).
95 intptr_t fStorage[16];
96
97 void initAlloc(int count, bool hasModes);
98 void init(SkImageFilter* const [], int count, const SkXfermode::Mode []);
99
100 typedef SkImageFilter INHERITED;
101};
102
103class SkColorFilter;
104
105class SkColorFilterImageFilter : public SkImageFilter {
106public:
107 SkColorFilterImageFilter(SkColorFilter* cf) : fColorFilter(cf) {
108 SkSafeRef(cf);
109 }
110 virtual ~SkColorFilterImageFilter();
111
112 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
113 return SkNEW_ARGS(SkColorFilterImageFilter, (buffer));
114 }
115
116protected:
117 SkColorFilterImageFilter(SkFlattenableReadBuffer& buffer);
118
119 virtual bool onFilterImage(const SkBitmap& src, const SkMatrix&,
120 SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
121 // overrides from SkFlattenable
122 virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
123 virtual Factory getFactory() SK_OVERRIDE;
124
125private:
126 SkColorFilter* fColorFilter;
127
128 typedef SkImageFilter INHERITED;
129};
130
131///////////////////////////////////////////////////////////////////////////////
132
133// Fun mode that scales down (only) and then scales back up to look pixelated
134class SkDownSampleImageFilter : public SkImageFilter {
135public:
136 SkDownSampleImageFilter(SkScalar scale) : fScale(scale) {}
137
138 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
139 return SkNEW_ARGS(SkDownSampleImageFilter, (buffer));
140 }
141
142protected:
143 SkDownSampleImageFilter(SkFlattenableReadBuffer& buffer);
144
145 virtual bool onFilterImage(const SkBitmap& src, const SkMatrix&,
146 SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
147 // overrides from SkFlattenable
148 virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
149 virtual Factory getFactory() SK_OVERRIDE;
150
151private:
152 SkScalar fScale;
153
154 typedef SkImageFilter INHERITED;
155};
156
157#endif