SkMorphologyImageFilter.h 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. #ifndef SkMorphologyImageFilter_DEFINED
  8. #define SkMorphologyImageFilter_DEFINED
  9. #include "include/core/SkColor.h"
  10. #include "include/core/SkFlattenable.h"
  11. #include "include/core/SkImageFilter.h"
  12. #include "include/core/SkSize.h"
  13. ///////////////////////////////////////////////////////////////////////////////
  14. class SK_API SkMorphologyImageFilter : public SkImageFilter {
  15. public:
  16. SkRect computeFastBounds(const SkRect& src) const override;
  17. SkIRect onFilterNodeBounds(const SkIRect& src, const SkMatrix& ctm,
  18. MapDirection, const SkIRect* inputRect) const override;
  19. /**
  20. * All morphology procs have the same signature: src is the source buffer, dst the
  21. * destination buffer, radius is the morphology radius, width and height are the bounds
  22. * of the destination buffer (in pixels), and srcStride and dstStride are the
  23. * number of pixels per row in each buffer. All buffers are 8888.
  24. */
  25. typedef void (*Proc)(const SkPMColor* src, SkPMColor* dst, int radius,
  26. int width, int height, int srcStride, int dstStride);
  27. protected:
  28. enum Op {
  29. kErode_Op,
  30. kDilate_Op,
  31. };
  32. virtual Op op() const = 0;
  33. SkMorphologyImageFilter(int radiusX, int radiusY,
  34. sk_sp<SkImageFilter> input,
  35. const CropRect* cropRect);
  36. sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source,
  37. const Context&,
  38. SkIPoint* offset) const override;
  39. void flatten(SkWriteBuffer&) const override;
  40. SkISize radius() const { return fRadius; }
  41. private:
  42. SkISize fRadius;
  43. typedef SkImageFilter INHERITED;
  44. };
  45. ///////////////////////////////////////////////////////////////////////////////
  46. class SK_API SkDilateImageFilter : public SkMorphologyImageFilter {
  47. public:
  48. static sk_sp<SkImageFilter> Make(int radiusX, int radiusY,
  49. sk_sp<SkImageFilter> input,
  50. const CropRect* cropRect = nullptr);
  51. protected:
  52. Op op() const override { return kDilate_Op; }
  53. private:
  54. SK_FLATTENABLE_HOOKS(SkDilateImageFilter)
  55. SkDilateImageFilter(int radiusX, int radiusY,
  56. sk_sp<SkImageFilter> input,
  57. const CropRect* cropRect)
  58. : INHERITED(radiusX, radiusY, input, cropRect) {}
  59. typedef SkMorphologyImageFilter INHERITED;
  60. };
  61. ///////////////////////////////////////////////////////////////////////////////
  62. class SK_API SkErodeImageFilter : public SkMorphologyImageFilter {
  63. public:
  64. static sk_sp<SkImageFilter> Make(int radiusX, int radiusY,
  65. sk_sp<SkImageFilter> input,
  66. const CropRect* cropRect = nullptr);
  67. protected:
  68. Op op() const override { return kErode_Op; }
  69. private:
  70. SK_FLATTENABLE_HOOKS(SkErodeImageFilter)
  71. SkErodeImageFilter(int radiusX, int radiusY,
  72. sk_sp<SkImageFilter> input, const CropRect* cropRect)
  73. : INHERITED(radiusX, radiusY, input, cropRect) {}
  74. typedef SkMorphologyImageFilter INHERITED;
  75. };
  76. #endif