Update Morphology image filter to store its type
authorrobertphillips <robertphillips@google.com>
Wed, 30 Mar 2016 15:09:56 +0000 (08:09 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 30 Mar 2016 15:09:57 +0000 (08:09 -0700)
TBR=bsalomon@google.com

GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1834953002

Review URL: https://codereview.chromium.org/1834953002

include/effects/SkMorphologyImageFilter.h
src/effects/SkMorphologyImageFilter.cpp

index b449b19..4e699a7 100644 (file)
@@ -29,18 +29,25 @@ public:
                          int width, int height, int srcStride, int dstStride);
 
 protected:
+    enum Op {
+        kErode_Op,
+        kDilate_Op,
+    };
+
+    virtual Op op() const = 0;
+
     SkMorphologyImageFilter(int radiusX, int radiusY, SkImageFilter* input,
                             const CropRect* cropRect);
-    sk_sp<SkSpecialImage> filterImageGeneric(bool dilate, 
-                                             SkSpecialImage* source,
-                                             const Context&,
-                                             SkIPoint* offset) const;
+    sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source,
+                                        const Context&,
+                                        SkIPoint* offset) const override;
     void flatten(SkWriteBuffer&) const override;
 
     SkISize radius() const { return fRadius; }
 
 private:
-    SkISize fRadius;
+    SkISize  fRadius;
+
     typedef SkImageFilter INHERITED;
 };
 
@@ -60,8 +67,7 @@ public:
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDilateImageFilter)
 
 protected:
-    sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
-                                        SkIPoint* offset) const override;
+    Op op() const override { return kDilate_Op; }
 
 private:
     SkDilateImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect)
@@ -86,8 +92,7 @@ public:
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkErodeImageFilter)
 
 protected:
-    sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
-                                        SkIPoint* offset) const override;
+    Op op() const override { return kErode_Op; }
 
 private:
     SkErodeImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect)
index 8c952e8..5c36480 100644 (file)
@@ -515,10 +515,9 @@ static sk_sp<SkSpecialImage> apply_morphology(SkSpecialImage* input,
 }
 #endif
 
-sk_sp<SkSpecialImage> SkMorphologyImageFilter::filterImageGeneric(bool dilate,
-                                                                  SkSpecialImage* source,
-                                                                  const Context& ctx,
-                                                                  SkIPoint* offset) const {
+sk_sp<SkSpecialImage> SkMorphologyImageFilter::onFilterImage(SkSpecialImage* source,
+                                                             const Context& ctx,
+                                                             SkIPoint* offset) const {
     SkIPoint inputOffset = SkIPoint::Make(0, 0);
     sk_sp<SkSpecialImage> input(this->filterInput(0, source, ctx, &inputOffset));
     if (!input) {
@@ -552,8 +551,8 @@ sk_sp<SkSpecialImage> SkMorphologyImageFilter::filterImageGeneric(bool dilate,
 
 #if SK_SUPPORT_GPU
     if (input->peekTexture() && input->peekTexture()->getContext()) {
-        auto type = dilate ? GrMorphologyEffect::kDilate_MorphologyType
-                           : GrMorphologyEffect::kErode_MorphologyType;
+        auto type = (kDilate_Op == this->op()) ? GrMorphologyEffect::kDilate_MorphologyType
+                                               : GrMorphologyEffect::kErode_MorphologyType;
         sk_sp<SkSpecialImage> result(apply_morphology(input.get(), srcBounds, type,
                                                       SkISize::Make(width, height)));
         if (result) {
@@ -586,7 +585,7 @@ sk_sp<SkSpecialImage> SkMorphologyImageFilter::filterImageGeneric(bool dilate,
 
     SkMorphologyImageFilter::Proc procX, procY;
 
-    if (dilate) {
+    if (kDilate_Op == this->op()) {
         procX = SkOpts::dilate_x;
         procY = SkOpts::dilate_y;
     } else {
@@ -622,13 +621,3 @@ sk_sp<SkSpecialImage> SkMorphologyImageFilter::filterImageGeneric(bool dilate,
                                           SkIRect::MakeWH(bounds.width(), bounds.height()),
                                           dst);
 }
-
-sk_sp<SkSpecialImage> SkDilateImageFilter::onFilterImage(SkSpecialImage* source, const Context& ctx,
-                                                         SkIPoint* offset) const {
-    return this->filterImageGeneric(true, source, ctx, offset);
-}
-
-sk_sp<SkSpecialImage> SkErodeImageFilter::onFilterImage(SkSpecialImage* source, const Context& ctx,
-                                                        SkIPoint* offset) const {
-    return this->filterImageGeneric(false, source, ctx, offset);
-}