SkMorphologyImageFilter.h revision 8b0e8ac5f582de80356019406e2975079bf0829d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2012 The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef SkMorphologyImageFilter_DEFINED
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define SkMorphologyImageFilter_DEFINED
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkColor.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkImageFilter.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkSize.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SK_API SkMorphologyImageFilter : public SkImageFilter {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SkMorphologyImageFilter(int radiusX, int radiusY, SkImageFilter* input, const CropRect* cropRect);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void computeFastBounds(const SkRect& src, SkRect* dst) const SK_OVERRIDE;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * All morphology procs have the same signature: src is the source buffer, dst the
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * destination buffer, radius is the morphology radius, width and height are the bounds
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * of the destination buffer (in pixels), and srcStride and dstStride are the
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * number of pixels per row in each buffer. All buffers are 8888.
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef void (*Proc)(const SkPMColor* src, SkPMColor* dst, int radius,
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         int width, int height, int srcStride, int dstStride);
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)protected:
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool filterImageGeneric(Proc procX, Proc procY,
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Proxy*, const SkBitmap& src, const SkMatrix&,
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            SkBitmap* result, SkIPoint* offset);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SkMorphologyImageFilter(SkReadBuffer& buffer);
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if SK_SUPPORT_GPU
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual bool canFilterImageGPU() const SK_OVERRIDE { return true; }
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool filterImageGPUGeneric(bool dilate, Proxy* proxy, const SkBitmap& src,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const SkMatrix& ctm, SkBitmap* result,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               SkIPoint* offset);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkISize    radius() const { return fRadius; }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SkISize    fRadius;
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    typedef SkImageFilter INHERITED;
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SK_API SkDilateImageFilter : public SkMorphologyImageFilter {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SkDilateImageFilter(int radiusX, int radiusY,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        SkImageFilter* input = NULL,
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const CropRect* cropRect = NULL)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : INHERITED(radiusX, radiusY, input, cropRect) {}
57
58    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
59                               SkBitmap* result, SkIPoint* offset) SK_OVERRIDE;
60#if SK_SUPPORT_GPU
61    virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm,
62                                SkBitmap* result, SkIPoint* offset) SK_OVERRIDE;
63#endif
64
65    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDilateImageFilter)
66
67protected:
68    SkDilateImageFilter(SkReadBuffer& buffer) : INHERITED(buffer) {}
69
70private:
71    typedef SkMorphologyImageFilter INHERITED;
72};
73
74class SK_API SkErodeImageFilter : public SkMorphologyImageFilter {
75public:
76    SkErodeImageFilter(int radiusX, int radiusY,
77                       SkImageFilter* input = NULL,
78                       const CropRect* cropRect = NULL)
79    : INHERITED(radiusX, radiusY, input, cropRect) {}
80
81    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
82                               SkBitmap* result, SkIPoint* offset) SK_OVERRIDE;
83#if SK_SUPPORT_GPU
84    virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm,
85                                SkBitmap* result, SkIPoint* offset) SK_OVERRIDE;
86#endif
87
88    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkErodeImageFilter)
89
90protected:
91    SkErodeImageFilter(SkReadBuffer& buffer) : INHERITED(buffer) {}
92
93private:
94    typedef SkMorphologyImageFilter INHERITED;
95};
96
97#endif
98