105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org/*
205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * Copyright 2012 The Android Open Source Project
305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org *
405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org * found in the LICENSE file.
605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org */
705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#ifndef SkMorphologyImageFilter_DEFINED
1005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#define SkMorphologyImageFilter_DEFINED
1105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
120ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org#include "SkColor.h"
13377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.org#include "SkImageFilter.h"
14bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org#include "SkSize.h"
1505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
16377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.orgclass SK_API SkMorphologyImageFilter : public SkImageFilter {
1705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic:
18336d1d759590d9bedcbc5a96d0fff79861cf8f7asenorblanco@chromium.org    virtual void computeFastBounds(const SkRect& src, SkRect* dst) const SK_OVERRIDE;
19c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    virtual bool onFilterBounds(const SkIRect& src, const SkMatrix& ctm, SkIRect* dst) const SK_OVERRIDE;
2005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
210ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org    /**
220ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org     * All morphology procs have the same signature: src is the source buffer, dst the
230ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org     * destination buffer, radius is the morphology radius, width and height are the bounds
240ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org     * of the destination buffer (in pixels), and srcStride and dstStride are the
250ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org     * number of pixels per row in each buffer. All buffers are 8888.
260ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org     */
270ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org
280ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org    typedef void (*Proc)(const SkPMColor* src, SkPMColor* dst, int radius,
290ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org                         int width, int height, int srcStride, int dstStride);
300ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org
3105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprotected:
32cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    SkMorphologyImageFilter(int radiusX, int radiusY, SkImageFilter* input,
335e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                            const CropRect* cropRect, uint32_t uniqueID);
340ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org    bool filterImageGeneric(Proc procX, Proc procY,
354cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org                            Proxy*, const SkBitmap& src, const Context&,
36ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                            SkBitmap* result, SkIPoint* offset) const;
379fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
388b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    SkMorphologyImageFilter(SkReadBuffer& buffer);
399fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
408b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
4184207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#if SK_SUPPORT_GPU
42302cffba86a188373c99833d83392f33e6014542senorblanco@chromium.org    virtual bool canFilterImageGPU() const SK_OVERRIDE { return true; }
430ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org    bool filterImageGPUGeneric(bool dilate, Proxy* proxy, const SkBitmap& src,
444cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org                               const Context& ctm, SkBitmap* result,
45ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                               SkIPoint* offset) const;
4684207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#endif
4754924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com
4805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    SkISize    radius() const { return fRadius; }
4905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
5005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprivate:
5105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    SkISize    fRadius;
52377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.org    typedef SkImageFilter INHERITED;
5305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org};
5405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
5505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgclass SK_API SkDilateImageFilter : public SkMorphologyImageFilter {
5605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic:
57cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static SkDilateImageFilter* Create(int radiusX, int radiusY,
58cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                       SkImageFilter* input = NULL,
595e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                       const CropRect* cropRect = NULL,
605e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                       uint32_t uniqueID = 0) {
619fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        if (radiusX < 0 || radiusY < 0) {
629fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed            return NULL;
639fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        }
645e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco        return SkNEW_ARGS(SkDilateImageFilter, (radiusX, radiusY, input, cropRect, uniqueID));
65cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
6605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
674cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
68ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                               SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
6984207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#if SK_SUPPORT_GPU
704cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context&,
71ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                                SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
7284207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#endif
73ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
74ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDilateImageFilter)
7505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
7654924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected:
775e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco    SkDilateImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect, uint32_t uniqueID)
785e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco        : INHERITED(radiusX, radiusY, input, cropRect, uniqueID) {}
799fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
80bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    explicit SkDilateImageFilter(SkReadBuffer& buffer) : INHERITED(buffer) {}
819fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
82cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
8354924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprivate:
8405054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    typedef SkMorphologyImageFilter INHERITED;
8505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org};
8605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
8705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgclass SK_API SkErodeImageFilter : public SkMorphologyImageFilter {
8805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic:
89cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static SkErodeImageFilter* Create(int radiusX, int radiusY,
90cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                      SkImageFilter* input = NULL,
915e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                      const CropRect* cropRect = NULL,
925e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco                                      uint32_t uniqueID = 0) {
939fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        if (radiusX < 0 || radiusY < 0) {
949fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed            return NULL;
959fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        }
965e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco        return SkNEW_ARGS(SkErodeImageFilter, (radiusX, radiusY, input, cropRect, uniqueID));
97cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
9805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
994cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
100ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                               SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
10184207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#if SK_SUPPORT_GPU
1024cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context&,
103ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                                SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
10484207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#endif
10505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
106ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkErodeImageFilter)
10705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
10854924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected:
1095e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco    SkErodeImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect, uint32_t uniqueID)
1105e5f948b6b363dbfc8c076d8ff0c6b8e9ea99958senorblanco        : INHERITED(radiusX, radiusY, input, cropRect, uniqueID) {}
1119fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
112bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    explicit SkErodeImageFilter(SkReadBuffer& buffer) : INHERITED(buffer) {}
1139fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
114cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
11505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprivate:
11605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    typedef SkMorphologyImageFilter INHERITED;
11705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org};
11805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
11905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#endif
120