Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright 2012 The Android Open Source Project
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 
      9 #ifndef SkMorphologyImageFilter_DEFINED
     10 #define SkMorphologyImageFilter_DEFINED
     11 
     12 #include "SkColor.h"
     13 #include "SkImageFilter.h"
     14 #include "SkSize.h"
     15 
     16 class SK_API SkMorphologyImageFilter : public SkImageFilter {
     17 public:
     18     void computeFastBounds(const SkRect& src, SkRect* dst) const override;
     19     void onFilterNodeBounds(const SkIRect& src, const SkMatrix& ctm,
     20                             SkIRect* dst, MapDirection) const override;
     21 
     22     /**
     23      * All morphology procs have the same signature: src is the source buffer, dst the
     24      * destination buffer, radius is the morphology radius, width and height are the bounds
     25      * of the destination buffer (in pixels), and srcStride and dstStride are the
     26      * number of pixels per row in each buffer. All buffers are 8888.
     27      */
     28 
     29     typedef void (*Proc)(const SkPMColor* src, SkPMColor* dst, int radius,
     30                          int width, int height, int srcStride, int dstStride);
     31 
     32 protected:
     33     SkMorphologyImageFilter(int radiusX, int radiusY, SkImageFilter* input,
     34                             const CropRect* cropRect);
     35     bool filterImageGeneric(Proc procX, Proc procY,
     36                             Proxy*, const SkBitmap& src, const Context&,
     37                             SkBitmap* result, SkIPoint* offset) const;
     38     void flatten(SkWriteBuffer&) const override;
     39 #if SK_SUPPORT_GPU
     40     bool canFilterImageGPU() const override { return true; }
     41     bool filterImageGPUGeneric(bool dilate, Proxy* proxy, const SkBitmap& src,
     42                                const Context& ctm, SkBitmap* result,
     43                                SkIPoint* offset) const;
     44 #endif
     45 
     46     SkISize    radius() const { return fRadius; }
     47 
     48 private:
     49     SkISize    fRadius;
     50     typedef SkImageFilter INHERITED;
     51 };
     52 
     53 class SK_API SkDilateImageFilter : public SkMorphologyImageFilter {
     54 public:
     55     static SkImageFilter* Create(int radiusX, int radiusY, SkImageFilter* input = NULL,
     56                                  const CropRect* cropRect = NULL) {
     57         if (radiusX < 0 || radiusY < 0) {
     58             return NULL;
     59         }
     60         return new SkDilateImageFilter(radiusX, radiusY, input, cropRect);
     61     }
     62 
     63     bool onFilterImageDeprecated(Proxy*, const SkBitmap& src, const Context&,
     64                                  SkBitmap* result, SkIPoint* offset) const override;
     65 
     66 #if SK_SUPPORT_GPU
     67     bool filterImageGPUDeprecated(Proxy* proxy, const SkBitmap& src, const Context&,
     68                                   SkBitmap* result, SkIPoint* offset) const override;
     69 #endif
     70 
     71     SK_TO_STRING_OVERRIDE()
     72     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDilateImageFilter)
     73 
     74 private:
     75     SkDilateImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect)
     76         : INHERITED(radiusX, radiusY, input, cropRect) {}
     77 
     78     typedef SkMorphologyImageFilter INHERITED;
     79 };
     80 
     81 class SK_API SkErodeImageFilter : public SkMorphologyImageFilter {
     82 public:
     83     static SkImageFilter* Create(int radiusX, int radiusY,
     84                                       SkImageFilter* input = NULL,
     85                                       const CropRect* cropRect = NULL) {
     86         if (radiusX < 0 || radiusY < 0) {
     87             return NULL;
     88         }
     89         return new SkErodeImageFilter(radiusX, radiusY, input, cropRect);
     90     }
     91 
     92     bool onFilterImageDeprecated(Proxy*, const SkBitmap& src, const Context&,
     93                                  SkBitmap* result, SkIPoint* offset) const override;
     94 
     95 #if SK_SUPPORT_GPU
     96     bool filterImageGPUDeprecated(Proxy* proxy, const SkBitmap& src, const Context&,
     97                                   SkBitmap* result, SkIPoint* offset) const override;
     98 #endif
     99 
    100     SK_TO_STRING_OVERRIDE()
    101     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkErodeImageFilter)
    102 
    103 private:
    104     SkErodeImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect)
    105         : INHERITED(radiusX, radiusY, input, cropRect) {}
    106 
    107     typedef SkMorphologyImageFilter INHERITED;
    108 };
    109 
    110 #endif
    111