diff options
author | 2012-10-10 20:36:13 +0000 | |
---|---|---|
committer | 2012-10-10 20:36:13 +0000 | |
commit | 9f25de79009ce721aa13abe71c38179d5a6710e2 (patch) | |
tree | 378ab68681b93697ca8351105e570fce4d39879e /include | |
parent | efb1d77ad2cb77f6b124b0674fccf67d9b737b60 (diff) |
This patch implements generalized DAG connectivity for SkImageFilter. SkImageFilter maintains a list of inputs, which can be constructed either from a SkImageFilter** or zero or more SkImageFilter* arguments (varargs).
Existing filters which maintained their own filter connectivity were refactored to use the new constructors and flattening/unflattening code. Modifying the remaining filters which are not yet DAG-friendly is left for future work; they are considered to have zero inputs for now.
Review URL: https://codereview.appspot.com/6443119
git-svn-id: http://skia.googlecode.com/svn/trunk@5891 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include')
-rw-r--r-- | include/core/SkImageFilter.h | 23 | ||||
-rw-r--r-- | include/effects/SkBlendImageFilter.h | 4 | ||||
-rw-r--r-- | include/effects/SkSingleInputImageFilter.h | 3 | ||||
-rwxr-xr-x | include/effects/SkTestImageFilters.h | 20 |
4 files changed, 29 insertions, 21 deletions
diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h index 92a5a58d28..f035bf9d37 100644 --- a/include/core/SkImageFilter.h +++ b/include/core/SkImageFilter.h @@ -109,8 +109,18 @@ public: virtual GrTexture* onFilterImageGPU(Proxy*, GrTexture* texture, const SkRect& rect); protected: - SkImageFilter() {} - explicit SkImageFilter(SkFlattenableReadBuffer& rb) : INHERITED(rb) {} + SkImageFilter(int numInputs, SkImageFilter** inputs); + + // The ... represents numInputs SkImageFilter pointers, upon which this + // constructor will call SkSafeRef(). This is the same behaviour as + // the SkImageFilter(int, SkImageFilter**) constructor above. + explicit SkImageFilter(int numInputs, ...); + + virtual ~SkImageFilter(); + + explicit SkImageFilter(SkFlattenableReadBuffer& rb); + + virtual void flatten(SkFlattenableWriteBuffer& wb) const SK_OVERRIDE; // Default impl returns false virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, @@ -118,8 +128,17 @@ protected: // Default impl copies src into dst and returns true virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*); + int numInputs() const { return fNumInputs; } + SkImageFilter* getInput(int i) const { SkASSERT(i < fNumInputs); return fInputs[i]; } + // Return the result of processing the given input, or the source bitmap + // if we have no connected input at that index. + SkBitmap getInputResult(int index, Proxy*, const SkBitmap& src, const SkMatrix&, + SkIPoint*); + private: typedef SkFlattenable INHERITED; + int fNumInputs; + SkImageFilter** fInputs; }; #endif diff --git a/include/effects/SkBlendImageFilter.h b/include/effects/SkBlendImageFilter.h index be1be68054..ff528ad2ad 100644 --- a/include/effects/SkBlendImageFilter.h +++ b/include/effects/SkBlendImageFilter.h @@ -43,9 +43,9 @@ protected: private: Mode fMode; - SkImageFilter* fBackground; - SkImageFilter* fForeground; typedef SkImageFilter INHERITED; + SkImageFilter* getBackgroundInput() { return getInput(0); } + SkImageFilter* getForegroundInput() { return getInput(1); } }; #endif diff --git a/include/effects/SkSingleInputImageFilter.h b/include/effects/SkSingleInputImageFilter.h index b29eca039d..e7819c4f2f 100644 --- a/include/effects/SkSingleInputImageFilter.h +++ b/include/effects/SkSingleInputImageFilter.h @@ -35,10 +35,9 @@ protected: GrTexture* getInputResultAsTexture(Proxy* proxy, GrTexture* src, const SkRect& rect); #endif - SkImageFilter* input() const { return fInput; } + SkImageFilter* input() const { return getInput(0); } private: typedef SkImageFilter INHERITED; - SkImageFilter* fInput; }; #endif diff --git a/include/effects/SkTestImageFilters.h b/include/effects/SkTestImageFilters.h index 4c96776a00..c31a439ddb 100755 --- a/include/effects/SkTestImageFilters.h +++ b/include/effects/SkTestImageFilters.h @@ -7,7 +7,7 @@ class SkOffsetImageFilter : public SkImageFilter { public: - SkOffsetImageFilter(SkScalar dx, SkScalar dy) { + SkOffsetImageFilter(SkScalar dx, SkScalar dy) : INHERITED(0) { fOffset.set(dx, dy); } @@ -29,28 +29,19 @@ private: class SkComposeImageFilter : public SkImageFilter { public: - SkComposeImageFilter(SkImageFilter* outer, SkImageFilter* inner) { - fOuter = outer; - fInner = inner; - SkSafeRef(outer); - SkSafeRef(inner); - } + SkComposeImageFilter(SkImageFilter* outer, SkImageFilter* inner) : INHERITED(2, outer, inner) {} virtual ~SkComposeImageFilter(); SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeImageFilter) protected: SkComposeImageFilter(SkFlattenableReadBuffer& buffer); - virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, SkBitmap* result, SkIPoint* loc) SK_OVERRIDE; virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) SK_OVERRIDE; private: - SkImageFilter* fOuter; - SkImageFilter* fInner; - typedef SkImageFilter INHERITED; }; @@ -75,7 +66,6 @@ protected: virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*) SK_OVERRIDE; private: - SkImageFilter** fFilters; uint8_t* fModes; // SkXfermode::Mode int fCount; @@ -83,8 +73,8 @@ private: // of the filters and modes (unless fCount is so large we can't fit). intptr_t fStorage[16]; - void initAlloc(int count, bool hasModes); - void init(SkImageFilter* const [], int count, const SkXfermode::Mode []); + void initAllocModes(); + void initModes(const SkXfermode::Mode []); typedef SkImageFilter INHERITED; }; @@ -94,7 +84,7 @@ private: // Fun mode that scales down (only) and then scales back up to look pixelated class SkDownSampleImageFilter : public SkImageFilter { public: - SkDownSampleImageFilter(SkScalar scale) : fScale(scale) {} + SkDownSampleImageFilter(SkScalar scale) : INHERITED(0), fScale(scale) {} SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDownSampleImageFilter) |