180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 The Android Open Source Project 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkMatrixConvolutionImageFilter_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkMatrixConvolutionImageFilter_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkImageFilter.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkScalar.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkSize.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPoint.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*! \class SkMatrixConvolutionImageFilter 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Matrix convolution image filter. This filter applies an NxM image 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru processing kernel to a given input image. This can be used to produce 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru effects such as sharpening, blurring, edge detection, etc. 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass SK_API SkMatrixConvolutionImageFilter : public SkImageFilter { 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /*! \enum TileMode */ 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum TileMode { 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kClamp_TileMode, /*!< Clamp to the image's edge pixels. */ 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kRepeat_TileMode, /*!< Wrap around to the image's opposite edge. */ 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kClampToBlack_TileMode, /*!< Fill with transparent black. */ 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Construct a matrix convolution image filter. 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru @param kernelSize The kernel size in pixels, in each dimension (N by M). 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru @param kernel The image processing kernel. Must contain N * M 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru elements, in row order. 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru @param gain A scale factor applied to each pixel after 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru convolution. This can be used to normalize the 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kernel, if it does not sum to 1. 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru @param bias A bias factor added to each pixel after convolution. 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru @param target An offset applied to each pixel coordinate before 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru convolution. This can be used to center the kernel 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru over the image (e.g., a 3x3 kernel should have a 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru target of {1, 1}). 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru @param tileMode How accesses outside the image are treated. (@see 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru TileMode). 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru @param convolveAlpha If true, all channels are convolved. If false, 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru only the RGB channels are convolved, and 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru alpha is copied from the source image. 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru @param input The input image filter. If NULL, the src bitmap 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru passed to filterImage() is used instead. 500a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger @param cropRect The rectangle to which the output processing will be limited. 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkMatrixConvolutionImageFilter(const SkISize& kernelSize, 540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkScalar* kernel, 550a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkScalar gain, 560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkScalar bias, 570a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIPoint& target, 580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger TileMode tileMode, 590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool convolveAlpha, 600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkImageFilter* input = NULL, 610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const CropRect* cropRect = NULL); 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~SkMatrixConvolutionImageFilter(); 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMatrixConvolutionImageFilter) 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMatrixConvolutionImageFilter(SkFlattenableReadBuffer& buffer); 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBitmap* result, SkIPoint* loc) SK_OVERRIDE; 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_SUPPORT_GPU 740a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger virtual bool asNewEffect(GrEffectRef** effect, 750a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrTexture*, 760a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkMatrix& matrix, 770a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIRect& bounds) const SK_OVERRIDE; 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkISize fKernelSize; 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar* fKernel; 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar fGain; 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar fBias; 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIPoint fTarget; 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru TileMode fTileMode; 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fConvolveAlpha; 88096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger typedef SkImageFilter INHERITED; 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru template <class PixelFetcher, bool convolveAlpha> 910a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger void filterPixels(const SkBitmap& src, 920a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkBitmap* result, 930a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIRect& rect, 940a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIRect& bounds); 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru template <class PixelFetcher> 960a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger void filterPixels(const SkBitmap& src, 970a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkBitmap* result, 980a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIRect& rect, 990a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIRect& bounds); 1000a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger void filterInteriorPixels(const SkBitmap& src, 1010a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkBitmap* result, 1020a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIRect& rect, 1030a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIRect& bounds); 1040a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger void filterBorderPixels(const SkBitmap& src, 1050a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkBitmap* result, 1060a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIRect& rect, 1070a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const SkIRect& bounds); 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 111