blob: ff7ed89d43bcc7d6398f64fbda8a627e7a2c3716 [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
8
9#ifndef SkMorphologyImageFilter_DEFINED
10#define SkMorphologyImageFilter_DEFINED
11
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +000012#include "SkColor.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
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000016class SK_API SkMorphologyImageFilter : public SkImageFilter {
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000017public:
senorblanco@chromium.org336d1d72014-01-27 21:03:17 +000018 virtual void computeFastBounds(const SkRect& src, SkRect* dst) const SK_OVERRIDE;
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000019 virtual bool onFilterBounds(const SkIRect& src, const SkMatrix& ctm, SkIRect* dst) const SK_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:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000032 SkMorphologyImageFilter(int radiusX, int radiusY, SkImageFilter* input,
senorblanco5e5f9482014-08-26 12:27:12 -070033 const CropRect* cropRect, uint32_t uniqueID);
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +000034 bool filterImageGeneric(Proc procX, Proc procY,
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000035 Proxy*, const SkBitmap& src, const Context&,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +000036 SkBitmap* result, SkIPoint* offset) const;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000037 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
senorblanco@chromium.org84207c42012-08-22 20:51:19 +000038#if SK_SUPPORT_GPU
senorblanco@chromium.org302cffb2012-08-01 20:16:34 +000039 virtual bool canFilterImageGPU() const SK_OVERRIDE { return true; }
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +000040 bool filterImageGPUGeneric(bool dilate, Proxy* proxy, const SkBitmap& src,
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000041 const Context& ctm, SkBitmap* result,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +000042 SkIPoint* offset) const;
senorblanco@chromium.org84207c42012-08-22 20:51:19 +000043#endif
djsollen@google.com54924242012-03-29 15:18:04 +000044
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000045 SkISize radius() const { return fRadius; }
46
47private:
48 SkISize fRadius;
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000049 typedef SkImageFilter INHERITED;
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000050};
51
52class SK_API SkDilateImageFilter : public SkMorphologyImageFilter {
53public:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000054 static SkDilateImageFilter* Create(int radiusX, int radiusY,
55 SkImageFilter* input = NULL,
senorblanco5e5f9482014-08-26 12:27:12 -070056 const CropRect* cropRect = NULL,
57 uint32_t uniqueID = 0) {
reed9fa60da2014-08-21 07:59:51 -070058 if (radiusX < 0 || radiusY < 0) {
59 return NULL;
60 }
senorblanco5e5f9482014-08-26 12:27:12 -070061 return SkNEW_ARGS(SkDilateImageFilter, (radiusX, radiusY, input, cropRect, uniqueID));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000062 }
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000063
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000064 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +000065 SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
senorblanco@chromium.org84207c42012-08-22 20:51:19 +000066#if SK_SUPPORT_GPU
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000067 virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context&,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +000068 SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
senorblanco@chromium.org84207c42012-08-22 20:51:19 +000069#endif
djsollen@google.comba28d032012-03-26 17:57:35 +000070
71 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDilateImageFilter)
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000072
djsollen@google.com54924242012-03-29 15:18:04 +000073protected:
senorblanco5e5f9482014-08-26 12:27:12 -070074 SkDilateImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect, uint32_t uniqueID)
75 : INHERITED(radiusX, radiusY, input, cropRect, uniqueID) {}
djsollen@google.com54924242012-03-29 15:18:04 +000076private:
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000077 typedef SkMorphologyImageFilter INHERITED;
78};
79
80class SK_API SkErodeImageFilter : public SkMorphologyImageFilter {
81public:
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000082 static SkErodeImageFilter* Create(int radiusX, int radiusY,
83 SkImageFilter* input = NULL,
senorblanco5e5f9482014-08-26 12:27:12 -070084 const CropRect* cropRect = NULL,
85 uint32_t uniqueID = 0) {
reed9fa60da2014-08-21 07:59:51 -070086 if (radiusX < 0 || radiusY < 0) {
87 return NULL;
88 }
senorblanco5e5f9482014-08-26 12:27:12 -070089 return SkNEW_ARGS(SkErodeImageFilter, (radiusX, radiusY, input, cropRect, uniqueID));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000090 }
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000091
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000092 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +000093 SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
senorblanco@chromium.org84207c42012-08-22 20:51:19 +000094#if SK_SUPPORT_GPU
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000095 virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context&,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +000096 SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
senorblanco@chromium.org84207c42012-08-22 20:51:19 +000097#endif
senorblanco@chromium.org05054f12012-03-02 21:05:45 +000098
djsollen@google.comba28d032012-03-26 17:57:35 +000099 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkErodeImageFilter)
senorblanco@chromium.org05054f12012-03-02 21:05:45 +0000100
djsollen@google.com54924242012-03-29 15:18:04 +0000101protected:
senorblanco5e5f9482014-08-26 12:27:12 -0700102 SkErodeImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect, uint32_t uniqueID)
103 : INHERITED(radiusX, radiusY, input, cropRect, uniqueID) {}
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000104
senorblanco@chromium.org05054f12012-03-02 21:05:45 +0000105private:
106 typedef SkMorphologyImageFilter INHERITED;
107};
108
109#endif