blob: aa9edfd155175b2bd6eada13012d883d6ba5eb76 [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"
Cary Clark4dc5a452018-05-21 11:56:57 -040012#include "SkFlattenable.h"
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000013#include "SkImageFilter.h"
senorblanco@chromium.orgbf2768b2012-08-20 15:43:14 +000014#include "SkSize.h"
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000015
robertphillipsf299e712016-03-25 04:49:22 -070016///////////////////////////////////////////////////////////////////////////////
schenney95376a02015-10-06 12:59:55 -070017class SK_API SkMorphologyImageFilter : public SkImageFilter {
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000018public:
senorblancoe5e79842016-03-21 14:51:59 -070019 SkRect computeFastBounds(const SkRect& src) const override;
Robert Phillips12078432018-05-17 11:17:39 -040020 SkIRect onFilterNodeBounds(const SkIRect& src, const SkMatrix& ctm,
21 MapDirection, const SkIRect* inputRect) const override;
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000022
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +000023 /**
24 * All morphology procs have the same signature: src is the source buffer, dst the
25 * destination buffer, radius is the morphology radius, width and height are the bounds
26 * of the destination buffer (in pixels), and srcStride and dstStride are the
27 * number of pixels per row in each buffer. All buffers are 8888.
28 */
29
30 typedef void (*Proc)(const SkPMColor* src, SkPMColor* dst, int radius,
31 int width, int height, int srcStride, int dstStride);
32
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000033protected:
robertphillips40d8d622016-03-30 08:09:56 -070034 enum Op {
35 kErode_Op,
36 kDilate_Op,
37 };
38
39 virtual Op op() const = 0;
40
robertphillipsfc11b0a2016-04-05 09:09:36 -070041 SkMorphologyImageFilter(int radiusX, int radiusY,
42 sk_sp<SkImageFilter> input,
senorblanco24e06d52015-03-18 12:11:33 -070043 const CropRect* cropRect);
robertphillips40d8d622016-03-30 08:09:56 -070044 sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source,
45 const Context&,
46 SkIPoint* offset) const override;
Matt Sarett6d72ed92017-04-10 16:35:33 -040047 sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override;
mtklein36352bf2015-03-25 18:17:31 -070048 void flatten(SkWriteBuffer&) const override;
djsollen@google.com54924242012-03-29 15:18:04 +000049
robertphillipsf299e712016-03-25 04:49:22 -070050 SkISize radius() const { return fRadius; }
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000051
52private:
robertphillips40d8d622016-03-30 08:09:56 -070053 SkISize fRadius;
54
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000055 typedef SkImageFilter INHERITED;
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000056};
57
robertphillipsf299e712016-03-25 04:49:22 -070058///////////////////////////////////////////////////////////////////////////////
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000059class SK_API SkDilateImageFilter : public SkMorphologyImageFilter {
60public:
robertphillipsfc11b0a2016-04-05 09:09:36 -070061 static sk_sp<SkImageFilter> Make(int radiusX, int radiusY,
62 sk_sp<SkImageFilter> input,
robertphillips225db442016-04-17 14:27:05 -070063 const CropRect* cropRect = nullptr);
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000064
Cary Clark4dc5a452018-05-21 11:56:57 -040065 Factory getFactory() const override { return CreateProc; }
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000066
robertphillipsf299e712016-03-25 04:49:22 -070067protected:
robertphillips40d8d622016-03-30 08:09:56 -070068 Op op() const override { return kDilate_Op; }
robertphillipsf299e712016-03-25 04:49:22 -070069
reed5ea95df2015-10-06 14:05:32 -070070private:
robertphillipsfc11b0a2016-04-05 09:09:36 -070071 SkDilateImageFilter(int radiusX, int radiusY,
72 sk_sp<SkImageFilter> input,
73 const CropRect* cropRect)
senorblanco24e06d52015-03-18 12:11:33 -070074 : INHERITED(radiusX, radiusY, input, cropRect) {}
Cary Clark4dc5a452018-05-21 11:56:57 -040075 static sk_sp<SkFlattenable> CreateProc(SkReadBuffer&);
76 friend class SkFlattenable::PrivateInitializer;
reed5ea95df2015-10-06 14:05:32 -070077
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000078 typedef SkMorphologyImageFilter INHERITED;
79};
80
robertphillipsf299e712016-03-25 04:49:22 -070081///////////////////////////////////////////////////////////////////////////////
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000082class SK_API SkErodeImageFilter : public SkMorphologyImageFilter {
83public:
robertphillipsfc11b0a2016-04-05 09:09:36 -070084 static sk_sp<SkImageFilter> Make(int radiusX, int radiusY,
85 sk_sp<SkImageFilter> input,
robertphillips225db442016-04-17 14:27:05 -070086 const CropRect* cropRect = nullptr);
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000087
Cary Clark4dc5a452018-05-21 11:56:57 -040088 Factory getFactory() const override { return CreateProc; }
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000089
robertphillipsf299e712016-03-25 04:49:22 -070090protected:
robertphillips40d8d622016-03-30 08:09:56 -070091 Op op() const override { return kErode_Op; }
robertphillipsf299e712016-03-25 04:49:22 -070092
reed5ea95df2015-10-06 14:05:32 -070093private:
robertphillipsfc11b0a2016-04-05 09:09:36 -070094 SkErodeImageFilter(int radiusX, int radiusY,
95 sk_sp<SkImageFilter> input, const CropRect* cropRect)
senorblanco24e06d52015-03-18 12:11:33 -070096 : INHERITED(radiusX, radiusY, input, cropRect) {}
Cary Clark4dc5a452018-05-21 11:56:57 -040097 static sk_sp<SkFlattenable> CreateProc(SkReadBuffer&);
98 friend class SkFlattenable::PrivateInitializer;
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000099
senorblanco@chromium.org05054f12012-03-02 21:05:45 +0000100 typedef SkMorphologyImageFilter INHERITED;
101};
102
103#endif