aboutsummaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-10 20:36:13 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-10 20:36:13 +0000
commit9f25de79009ce721aa13abe71c38179d5a6710e2 (patch)
tree378ab68681b93697ca8351105e570fce4d39879e /include
parentefb1d77ad2cb77f6b124b0674fccf67d9b737b60 (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.h23
-rw-r--r--include/effects/SkBlendImageFilter.h4
-rw-r--r--include/effects/SkSingleInputImageFilter.h3
-rwxr-xr-xinclude/effects/SkTestImageFilters.h20
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)