11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef _SkTestImageFilters_h
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define _SkTestImageFilters_h
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkImageFilter.h"
64f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkColorFilter.h"
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkOffsetImageFilter : public SkImageFilter {
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkOffsetImageFilter(SkScalar dx, SkScalar dy) {
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fOffset.set(dx, dy);
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkNEW_ARGS(SkOffsetImageFilter, (buffer));
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkOffsetImageFilter(SkFlattenableReadBuffer& buffer);
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) SK_OVERRIDE;
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // overrides from SkFlattenable
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory() SK_OVERRIDE;
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkVector fOffset;
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SkImageFilter INHERITED;
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkComposeImageFilter : public SkImageFilter {
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkComposeImageFilter(SkImageFilter* outer, SkImageFilter* inner) {
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fOuter = outer;
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fInner = inner;
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkSafeRef(outer);
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkSafeRef(inner);
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual ~SkComposeImageFilter();
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkNEW_ARGS(SkComposeImageFilter, (buffer));
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkComposeImageFilter(SkFlattenableReadBuffer& buffer);
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) SK_OVERRIDE;
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // overrides from SkFlattenable
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory() SK_OVERRIDE;
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkImageFilter*  fOuter;
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkImageFilter*  fInner;
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SkImageFilter INHERITED;
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkXfermode.h"
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkMergeImageFilter : public SkImageFilter {
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkMergeImageFilter(SkImageFilter* first, SkImageFilter* second,
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                       SkXfermode::Mode = SkXfermode::kSrcOver_Mode);
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkMergeImageFilter(SkImageFilter* const filters[], int count,
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                       const SkXfermode::Mode modes[] = NULL);
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual ~SkMergeImageFilter();
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkNEW_ARGS(SkMergeImageFilter, (buffer));
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkMergeImageFilter(SkFlattenableReadBuffer& buffer);
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) SK_OVERRIDE;
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // overrides from SkFlattenable
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory() SK_OVERRIDE;
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkImageFilter**     fFilters;
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint8_t*            fModes; // SkXfermode::Mode
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                 fCount;
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // private storage, to avoid dynamically allocating storage for our copy
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // of the filters and modes (unless fCount is so large we can't fit).
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    intptr_t    fStorage[16];
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void initAlloc(int count, bool hasModes);
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void init(SkImageFilter* const [], int count, const SkXfermode::Mode []);
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SkImageFilter INHERITED;
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkColorFilterImageFilter : public SkImageFilter {
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkColorFilterImageFilter(SkColorFilter* cf) : fColorFilter(cf) {
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkSafeRef(cf);
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual ~SkColorFilterImageFilter();
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkNEW_ARGS(SkColorFilterImageFilter, (buffer));
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkColorFilterImageFilter(SkFlattenableReadBuffer& buffer);
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // overrides from SkFlattenable
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory() SK_OVERRIDE;
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkColorFilter*  fColorFilter;
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SkImageFilter INHERITED;
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Fun mode that scales down (only) and then scales back up to look pixelated
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkDownSampleImageFilter : public SkImageFilter {
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkDownSampleImageFilter(SkScalar scale) : fScale(scale) {}
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkNEW_ARGS(SkDownSampleImageFilter, (buffer));
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkDownSampleImageFilter(SkFlattenableReadBuffer& buffer);
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkBitmap* result, SkIPoint* loc) SK_OVERRIDE;
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // overrides from SkFlattenable
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory()  SK_OVERRIDE;
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar fScale;
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SkImageFilter INHERITED;
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
157