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