Implements a new class, SkSingleInputImageFilter, to handle DAG connectivity
for filters with a single image input. This provides functionality to store,
flatten and unflatten a single SkImageFilter input, as well as to recursively
evaluate it on the CPU or GPU. The following classes were re-parented to
implement DAG connectivity: SkBlurImageFilter, SkDilateImageFilter,
SkErodeImageFilter, SkColorFilterImageFilter. The constructors for each
have been appended with a new parameter, representing the input filter
(default NULL).
This change also implements an arbitrary SkBitmap input source for filtering,
SkBitmapSource.
NOTE: This CL will require gyp file changes when rolling past this revision.
Review URL: https://codereview.appspot.com/6462071/
git-svn-id: http://skia.googlecode.com/svn/trunk@5170 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/effects/SkBitmapSource.h b/include/effects/SkBitmapSource.h
new file mode 100644
index 0000000..5e07e9e
--- /dev/null
+++ b/include/effects/SkBitmapSource.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 The Android Open Source Project
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+#ifndef SkBitmapSource_DEFINED
+#define SkBitmapSource_DEFINED
+
+#include "SkImageFilter.h"
+#include "SkBitmap.h"
+
+class SK_API SkBitmapSource : public SkImageFilter {
+public:
+ explicit SkBitmapSource(const SkBitmap& bitmap);
+
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapSource)
+
+protected:
+ explicit SkBitmapSource(SkFlattenableReadBuffer& buffer);
+ virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
+ virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
+ SkBitmap* result, SkIPoint* offset) SK_OVERRIDE;
+
+private:
+ SkBitmap fBitmap;
+ typedef SkImageFilter INHERITED;
+};
+
+#endif
+
diff --git a/include/effects/SkBlurImageFilter.h b/include/effects/SkBlurImageFilter.h
index ab84a0e..82828f6 100644
--- a/include/effects/SkBlurImageFilter.h
+++ b/include/effects/SkBlurImageFilter.h
@@ -9,11 +9,11 @@
#ifndef SkBlurImageFilter_DEFINED
#define SkBlurImageFilter_DEFINED
-#include "SkImageFilter.h"
+#include "SkSingleInputImageFilter.h"
-class SK_API SkBlurImageFilter : public SkImageFilter {
+class SK_API SkBlurImageFilter : public SkSingleInputImageFilter {
public:
- SkBlurImageFilter(SkScalar sigmaX, SkScalar sigmaY);
+ SkBlurImageFilter(SkScalar sigmaX, SkScalar sigmaY, SkImageFilter* input = NULL);
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurImageFilter)
@@ -29,7 +29,7 @@
private:
SkSize fSigma;
- typedef SkImageFilter INHERITED;
+ typedef SkSingleInputImageFilter INHERITED;
};
#endif
diff --git a/include/effects/SkMorphologyImageFilter.h b/include/effects/SkMorphologyImageFilter.h
index 4df90ae..706b62f 100644
--- a/include/effects/SkMorphologyImageFilter.h
+++ b/include/effects/SkMorphologyImageFilter.h
@@ -9,11 +9,11 @@
#ifndef SkMorphologyImageFilter_DEFINED
#define SkMorphologyImageFilter_DEFINED
-#include "SkImageFilter.h"
+#include "SkSingleInputImageFilter.h"
-class SK_API SkMorphologyImageFilter : public SkImageFilter {
+class SK_API SkMorphologyImageFilter : public SkSingleInputImageFilter {
public:
- SkMorphologyImageFilter(int radiusX, int radiusY);
+ SkMorphologyImageFilter(int radiusX, int radiusY, SkImageFilter* input);
protected:
SkMorphologyImageFilter(SkFlattenableReadBuffer& buffer);
@@ -24,12 +24,13 @@
private:
SkISize fRadius;
- typedef SkImageFilter INHERITED;
+ typedef SkSingleInputImageFilter INHERITED;
};
class SK_API SkDilateImageFilter : public SkMorphologyImageFilter {
public:
- SkDilateImageFilter(int radiusX, int radiusY) : INHERITED(radiusX, radiusY) {}
+ SkDilateImageFilter(int radiusX, int radiusY, SkImageFilter* input = NULL)
+ : INHERITED(radiusX, radiusY, input) {}
virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
SkBitmap* result, SkIPoint* offset) SK_OVERRIDE;
@@ -46,7 +47,8 @@
class SK_API SkErodeImageFilter : public SkMorphologyImageFilter {
public:
- SkErodeImageFilter(int radiusX, int radiusY) : INHERITED(radiusX, radiusY) {}
+ SkErodeImageFilter(int radiusX, int radiusY, SkImageFilter* input = NULL)
+ : INHERITED(radiusX, radiusY, input) {}
virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
SkBitmap* result, SkIPoint* offset) SK_OVERRIDE;
diff --git a/include/effects/SkSingleInputImageFilter.h b/include/effects/SkSingleInputImageFilter.h
new file mode 100644
index 0000000..fd2c6aa
--- /dev/null
+++ b/include/effects/SkSingleInputImageFilter.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkSingleInputImageFilter_DEFINED
+#define SkSingleInputImageFilter_DEFINED
+
+#include "SkImageFilter.h"
+
+class SkMatrix;
+struct SkIPoint;
+class GrTexture;
+
+class SK_API SkSingleInputImageFilter : public SkImageFilter {
+public:
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSingleInputImageFilter)
+
+protected:
+ explicit SkSingleInputImageFilter(SkImageFilter* input);
+ ~SkSingleInputImageFilter();
+ explicit SkSingleInputImageFilter(SkFlattenableReadBuffer& rb);
+ virtual void flatten(SkFlattenableWriteBuffer& wb) const SK_OVERRIDE;
+
+ // Recurses on input (if non-NULL), and returns the processed result,
+ // otherwise returns src.
+ SkBitmap getInputResult(Proxy*, const SkBitmap& src, const SkMatrix&,
+ SkIPoint* offset);
+
+#if SK_SUPPORT_GPU
+ // Recurses on input (if non-NULL), and returns the processed result as
+ // a texture, otherwise returns src.
+ GrTexture* getInputResultAsTexture(GrTexture* src, const SkRect& rect);
+#endif
+
+ SkImageFilter* input() const { return fInput; }
+private:
+ typedef SkImageFilter INHERITED;
+ SkImageFilter* fInput;
+};
+
+#endif
diff --git a/include/effects/SkTestImageFilters.h b/include/effects/SkTestImageFilters.h
index bb873e9..9aa57ce 100755
--- a/include/effects/SkTestImageFilters.h
+++ b/include/effects/SkTestImageFilters.h
@@ -3,6 +3,7 @@
#define _SkTestImageFilters_h
#include "SkImageFilter.h"
+#include "SkSingleInputImageFilter.h"
#include "SkColorFilter.h"
#include "SkPoint.h"
@@ -90,9 +91,9 @@
typedef SkImageFilter INHERITED;
};
-class SkColorFilterImageFilter : public SkImageFilter {
+class SkColorFilterImageFilter : public SkSingleInputImageFilter {
public:
- SkColorFilterImageFilter(SkColorFilter* cf) : fColorFilter(cf) {
+ SkColorFilterImageFilter(SkColorFilter* cf, SkImageFilter* input = NULL) : INHERITED(input), fColorFilter(cf) {
SkSafeRef(cf);
}
virtual ~SkColorFilterImageFilter();
@@ -109,7 +110,7 @@
private:
SkColorFilter* fColorFilter;
- typedef SkImageFilter INHERITED;
+ typedef SkSingleInputImageFilter INHERITED;
};
///////////////////////////////////////////////////////////////////////////////