SkTestImageFilters.h revision 8bb3ba151e83cdb76aeab13ea6d6527a061c2176
1
2#ifndef _SkTestImageFilters_h
3#define _SkTestImageFilters_h
4
5#include "SkImageFilter.h"
6#include "SkColorFilter.h"
7
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
21    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
22                               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
51    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
52                               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
82    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
83                               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
104class 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
118    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
119                               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
144    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
145                               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
157