SkMatrixConvolutionImageFilter.h revision c1ad0226087e10b1f300b5a45e3d6fdb23b8d1b8
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 input The input image filter. If NULL, the src bitmap 46 passed to filterImage() is used instead. 47 */ 48 49 SkMatrixConvolutionImageFilter(const SkISize& kernelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint& target, TileMode tileMode, SkImageFilter* input = NULL); 50 virtual ~SkMatrixConvolutionImageFilter(); 51 52 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMatrixConvolutionImageFilter) 53 54protected: 55 SkMatrixConvolutionImageFilter(SkFlattenableReadBuffer& buffer); 56 virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 57 58 virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, 59 SkBitmap* result, SkIPoint* loc) SK_OVERRIDE; 60 61private: 62 SkISize fKernelSize; 63 SkScalar* fKernel; 64 SkScalar fGain; 65 SkScalar fBias; 66 SkIPoint fTarget; 67 TileMode fTileMode; 68 typedef SkSingleInputImageFilter INHERITED; 69 70 template <class PixelFetcher> 71 void filterPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 72 void filterInteriorPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 73 void filterBorderPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 74}; 75 76#endif 77