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:
1836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void computeFastBounds(const SkRect& src, SkRect* dst) const override;
1936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool onFilterBounds(const SkIRect& src, const SkMatrix& ctm, SkIRect* dst) const 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,
3324e06d5244ae96e440410e1d76e039983b2efac9senorblanco                            const CropRect* cropRect);
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;
3736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void flatten(SkWriteBuffer&) const override;
3884207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#if SK_SUPPORT_GPU
3936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool canFilterImageGPU() const override { return true; }
400ded88d431a1872e21986984f009db2e84f52738senorblanco@chromium.org    bool filterImageGPUGeneric(bool dilate, Proxy* proxy, const SkBitmap& src,
414cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org                               const Context& ctm, SkBitmap* result,
42ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                               SkIPoint* offset) const;
4384207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#endif
4454924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com
4505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    SkISize    radius() const { return fRadius; }
4605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
4705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprivate:
4805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    SkISize    fRadius;
49377c14a1e648f4427bd11474fad8ac264d98aff2senorblanco@chromium.org    typedef SkImageFilter INHERITED;
5005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org};
5105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
5205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgclass SK_API SkDilateImageFilter : public SkMorphologyImageFilter {
5305054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic:
54cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static SkDilateImageFilter* Create(int radiusX, int radiusY,
55cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                       SkImageFilter* input = NULL,
5624e06d5244ae96e440410e1d76e039983b2efac9senorblanco                                       const CropRect* cropRect = NULL) {
579fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        if (radiusX < 0 || radiusY < 0) {
589fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed            return NULL;
599fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        }
6024e06d5244ae96e440410e1d76e039983b2efac9senorblanco        return SkNEW_ARGS(SkDilateImageFilter, (radiusX, radiusY, input, cropRect));
61cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
6205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
634cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
6436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                               SkBitmap* result, SkIPoint* offset) const override;
6584207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#if SK_SUPPORT_GPU
664cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context&,
6736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                SkBitmap* result, SkIPoint* offset) const override;
6884207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#endif
69ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com
70f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips    SK_TO_STRING_OVERRIDE()
71ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDilateImageFilter)
7205054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
7354924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected:
7424e06d5244ae96e440410e1d76e039983b2efac9senorblanco    SkDilateImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect)
7524e06d5244ae96e440410e1d76e039983b2efac9senorblanco        : INHERITED(radiusX, radiusY, input, cropRect) {}
7654924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprivate:
7705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    typedef SkMorphologyImageFilter INHERITED;
7805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org};
7905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
8005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgclass SK_API SkErodeImageFilter : public SkMorphologyImageFilter {
8105054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgpublic:
82cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static SkErodeImageFilter* Create(int radiusX, int radiusY,
83cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                      SkImageFilter* input = NULL,
8424e06d5244ae96e440410e1d76e039983b2efac9senorblanco                                      const CropRect* cropRect = NULL) {
859fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        if (radiusX < 0 || radiusY < 0) {
869fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed            return NULL;
879fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed        }
8824e06d5244ae96e440410e1d76e039983b2efac9senorblanco        return SkNEW_ARGS(SkErodeImageFilter, (radiusX, radiusY, input, cropRect));
89cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
9005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
914cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
9236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                               SkBitmap* result, SkIPoint* offset) const override;
9384207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#if SK_SUPPORT_GPU
944cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context&,
9536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                SkBitmap* result, SkIPoint* offset) const override;
9684207c42789e67ef377befb0c9057b9b73fbd6e3senorblanco@chromium.org#endif
9705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
98f3f5bad7ded35265c0b5d042cc4174386b197a33robertphillips    SK_TO_STRING_OVERRIDE()
99ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkErodeImageFilter)
10005054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
10154924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comprotected:
10224e06d5244ae96e440410e1d76e039983b2efac9senorblanco    SkErodeImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect)
10324e06d5244ae96e440410e1d76e039983b2efac9senorblanco        : INHERITED(radiusX, radiusY, input, cropRect) {}
104cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
10505054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.orgprivate:
10605054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org    typedef SkMorphologyImageFilter INHERITED;
10705054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org};
10805054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org
10905054f1a78a697b507580d0025db6c90423e033fsenorblanco@chromium.org#endif
110