1 /* 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 #ifndef SkMatrixConvolutionImageFilter_DEFINED 9 #define SkMatrixConvolutionImageFilter_DEFINED 10 11 #include "SkImageFilter.h" 12 #include "SkScalar.h" 13 #include "SkSize.h" 14 #include "SkPoint.h" 15 16 /*! \class SkMatrixConvolutionImageFilter 17 Matrix convolution image filter. This filter applies an NxM image 18 processing kernel to a given input image. This can be used to produce 19 effects such as sharpening, blurring, edge detection, etc. 20 */ 21 22 class SK_API SkMatrixConvolutionImageFilter : public SkImageFilter { 23 public: 24 /*! \enum TileMode */ 25 enum TileMode { 26 kClamp_TileMode, /*!< Clamp to the image's edge pixels. */ 27 kRepeat_TileMode, /*!< Wrap around to the image's opposite edge. */ 28 kClampToBlack_TileMode, /*!< Fill with transparent black. */ 29 }; 30 31 /** Construct a matrix convolution image filter. 32 @param kernelSize The kernel size in pixels, in each dimension (N by M). 33 @param kernel The image processing kernel. Must contain N * M 34 elements, in row order. 35 @param gain A scale factor applied to each pixel after 36 convolution. This can be used to normalize the 37 kernel, if it does not sum to 1. 38 @param bias A bias factor added to each pixel after convolution. 39 @param target An offset applied to each pixel coordinate before 40 convolution. This can be used to center the kernel 41 over the image (e.g., a 3x3 kernel should have a 42 target of {1, 1}). 43 @param tileMode How accesses outside the image are treated. (@see 44 TileMode). 45 @param convolveAlpha If true, all channels are convolved. If false, 46 only the RGB channels are convolved, and 47 alpha is copied from the source image. 48 @param input The input image filter. If NULL, the src bitmap 49 passed to filterImage() is used instead. 50 */ 51 52 SkMatrixConvolutionImageFilter(const SkISize& kernelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint& target, TileMode tileMode, bool convolveAlpha, SkImageFilter* input = NULL); 53 virtual ~SkMatrixConvolutionImageFilter(); 54 55 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMatrixConvolutionImageFilter) 56 57 protected: 58 SkMatrixConvolutionImageFilter(SkFlattenableReadBuffer& buffer); 59 virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 60 61 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, 62 SkBitmap* result, SkIPoint* loc) SK_OVERRIDE; 63 64 #if SK_SUPPORT_GPU 65 virtual bool asNewEffect(GrEffectRef** effect, GrTexture*, const SkIPoint& offset) const SK_OVERRIDE; 66 #endif 67 68 private: 69 SkISize fKernelSize; 70 SkScalar* fKernel; 71 SkScalar fGain; 72 SkScalar fBias; 73 SkIPoint fTarget; 74 TileMode fTileMode; 75 bool fConvolveAlpha; 76 typedef SkImageFilter INHERITED; 77 78 template <class PixelFetcher, bool convolveAlpha> 79 void filterPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 80 template <class PixelFetcher> 81 void filterPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 82 void filterInteriorPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 83 void filterBorderPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 84 }; 85 86 #endif 87