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