SkTestImageFilters.h revision 76dd277b1fa021c42fc3acdd8d61e7dc05f9c267
1
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(Proxy*, 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(Proxy*, 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(Proxy*, 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(Proxy*, 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(Proxy*, 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
158