blob: 978509188877dd75eceb9767ab199ed78cafb219 [file] [log] [blame]
senorblanco@chromium.org05054f12012-03-02 21:05:45 +00001/*
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
senorblanco@chromium.org05054f12012-03-02 21:05:45 +00008#ifndef SkMorphologyImageFilter_DEFINED
9#define SkMorphologyImageFilter_DEFINED
10
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +000011#include "SkColor.h"
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000012#include "SkImageFilter.h"
senorblanco@chromium.orgbf2768b2012-08-20 15:43:14 +000013#include "SkSize.h"
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000014
robertphillipsf299e712016-03-25 04:49:22 -070015///////////////////////////////////////////////////////////////////////////////
schenney95376a02015-10-06 12:59:55 -070016class SK_API SkMorphologyImageFilter : public SkImageFilter {
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000017public:
senorblancoe5e79842016-03-21 14:51:59 -070018 SkRect computeFastBounds(const SkRect& src) const override;
19 SkIRect onFilterNodeBounds(const SkIRect& src, const SkMatrix&, MapDirection) const override;
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000020
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +000021 /**
22 * All morphology procs have the same signature: src is the source buffer, dst the
23 * destination buffer, radius is the morphology radius, width and height are the bounds
24 * of the destination buffer (in pixels), and srcStride and dstStride are the
25 * number of pixels per row in each buffer. All buffers are 8888.
26 */
27
28 typedef void (*Proc)(const SkPMColor* src, SkPMColor* dst, int radius,
29 int width, int height, int srcStride, int dstStride);
30
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000031protected:
robertphillips40d8d622016-03-30 08:09:56 -070032 enum Op {
33 kErode_Op,
34 kDilate_Op,
35 };
36
37 virtual Op op() const = 0;
38
robertphillipsfc11b0a2016-04-05 09:09:36 -070039 SkMorphologyImageFilter(int radiusX, int radiusY,
40 sk_sp<SkImageFilter> input,
senorblanco24e06d52015-03-18 12:11:33 -070041 const CropRect* cropRect);
robertphillips40d8d622016-03-30 08:09:56 -070042 sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source,
43 const Context&,
44 SkIPoint* offset) const override;
Matt Sarett6d72ed92017-04-10 16:35:33 -040045 sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override;
mtklein36352bf2015-03-25 18:17:31 -070046 void flatten(SkWriteBuffer&) const override;
djsollen@google.com54924242012-03-29 15:18:04 +000047
robertphillipsf299e712016-03-25 04:49:22 -070048 SkISize radius() const { return fRadius; }
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000049
50private:
robertphillips40d8d622016-03-30 08:09:56 -070051 SkISize fRadius;
52
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000053 typedef SkImageFilter INHERITED;
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000054};
55
robertphillipsf299e712016-03-25 04:49:22 -070056///////////////////////////////////////////////////////////////////////////////
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000057class SK_API SkDilateImageFilter : public SkMorphologyImageFilter {
58public:
robertphillipsfc11b0a2016-04-05 09:09:36 -070059 static sk_sp<SkImageFilter> Make(int radiusX, int radiusY,
60 sk_sp<SkImageFilter> input,
robertphillips225db442016-04-17 14:27:05 -070061 const CropRect* cropRect = nullptr);
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000062
robertphillipsf3f5bad2014-12-19 13:49:15 -080063 SK_TO_STRING_OVERRIDE()
djsollen@google.comba28d032012-03-26 17:57:35 +000064 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDilateImageFilter)
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000065
robertphillipsf299e712016-03-25 04:49:22 -070066protected:
robertphillips40d8d622016-03-30 08:09:56 -070067 Op op() const override { return kDilate_Op; }
robertphillipsf299e712016-03-25 04:49:22 -070068
reed5ea95df2015-10-06 14:05:32 -070069private:
robertphillipsfc11b0a2016-04-05 09:09:36 -070070 SkDilateImageFilter(int radiusX, int radiusY,
71 sk_sp<SkImageFilter> input,
72 const CropRect* cropRect)
senorblanco24e06d52015-03-18 12:11:33 -070073 : INHERITED(radiusX, radiusY, input, cropRect) {}
reed5ea95df2015-10-06 14:05:32 -070074
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000075 typedef SkMorphologyImageFilter INHERITED;
76};
77
robertphillipsf299e712016-03-25 04:49:22 -070078///////////////////////////////////////////////////////////////////////////////
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000079class SK_API SkErodeImageFilter : public SkMorphologyImageFilter {
80public:
robertphillipsfc11b0a2016-04-05 09:09:36 -070081 static sk_sp<SkImageFilter> Make(int radiusX, int radiusY,
82 sk_sp<SkImageFilter> input,
robertphillips225db442016-04-17 14:27:05 -070083 const CropRect* cropRect = nullptr);
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000084
robertphillipsf3f5bad2014-12-19 13:49:15 -080085 SK_TO_STRING_OVERRIDE()
djsollen@google.comba28d032012-03-26 17:57:35 +000086 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkErodeImageFilter)
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000087
robertphillipsf299e712016-03-25 04:49:22 -070088protected:
robertphillips40d8d622016-03-30 08:09:56 -070089 Op op() const override { return kErode_Op; }
robertphillipsf299e712016-03-25 04:49:22 -070090
reed5ea95df2015-10-06 14:05:32 -070091private:
robertphillipsfc11b0a2016-04-05 09:09:36 -070092 SkErodeImageFilter(int radiusX, int radiusY,
93 sk_sp<SkImageFilter> input, const CropRect* cropRect)
senorblanco24e06d52015-03-18 12:11:33 -070094 : INHERITED(radiusX, radiusY, input, cropRect) {}
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000095
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000096 typedef SkMorphologyImageFilter INHERITED;
97};
98
99#endif