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