SkMatrixConvolutionImageFilter.h revision 8640d5024d57da5508bdf7585849e3b1f1cb365b
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 "SkSingleInputImageFilter.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 22class SkMatrixConvolutionImageFilter : public SkSingleInputImageFilter { 23public: 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 57protected: 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 64private: 65 SkISize fKernelSize; 66 SkScalar* fKernel; 67 SkScalar fGain; 68 SkScalar fBias; 69 SkIPoint fTarget; 70 TileMode fTileMode; 71 bool fConvolveAlpha; 72 typedef SkSingleInputImageFilter INHERITED; 73 74 template <class PixelFetcher, bool convolveAlpha> 75 void filterPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 76 template <class PixelFetcher> 77 void filterPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 78 void filterInteriorPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 79 void filterBorderPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 80}; 81 82#endif 83