SkMatrixConvolutionImageFilter.h revision 5faa2dc266ec933b3961f985e5718236f1ecbe47
15faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org/* 25faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Copyright 2012 The Android Open Source Project 35faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * 45faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 55faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org * found in the LICENSE file. 65faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org */ 75faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 85faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#ifndef SkMatrixConvolutionImageFilter_DEFINED 95faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#define SkMatrixConvolutionImageFilter_DEFINED 105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 115faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkSingleInputImageFilter.h" 125faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkScalar.h" 135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkSize.h" 145faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#include "SkPoint.h" 155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 165faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org/*! \class SkMatrixConvolutionImageFilter 175faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org Matrix convolution image filter. This filter applies an NxM image 185faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org processing kernel to a given input image. This can be used to produce 195faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org effects such as sharpening, blurring, edge detection, etc. 205faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org */ 215faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 225faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgclass SkMatrixConvolutionImageFilter : public SkSingleInputImageFilter { 235faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgpublic: 245faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org /*! \enum TileMode */ 255faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org enum TileMode { 265faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org kClamp_TileMode, /*!< Clamp to the image's edge pixels. */ 275faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org kRepeat_TileMode, /*!< Wrap around to the image's opposite edge. */ 285faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org kClampToBlack_TileMode, /*!< Fill with transparent black. */ 295faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org }; 305faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 315faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org /** Construct a matrix convolution image filter. 325faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org @param kernelSize The kernel size in pixels, in each dimension (N by M). 335faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org @param kernel The image processing kernel. Must contain N * M 345faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org elements, in row order. 355faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org @param gain A scale factor applied to each pixel after 365faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org convolution. This can be used to normalize the 375faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org kernel, if it does not sum to 1. 385faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org @param bias A bias factor added to each pixel after convolution. 395faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org @param target An offset applied to each pixel coordinate before 405faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org convolution. This can be used to center the kernel 415faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org over the image (e.g., a 3x3 kernel should have a 425faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org target of {1, 1}). 435faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org @param tileMode How accesses outside the image are treated. (@see 445faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org TileMode). 455faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org @param input The input image filter. If NULL, the src bitmap 465faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org passed to filterImage() is used instead. 475faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org */ 485faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 495faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkMatrixConvolutionImageFilter(const SkISize& kernelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint& target, TileMode tileMode, SkImageFilter* input = NULL); 505faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org virtual ~SkMatrixConvolutionImageFilter(); 515faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 525faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMatrixConvolutionImageFilter) 535faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 545faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprotected: 555faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkMatrixConvolutionImageFilter(SkFlattenableReadBuffer& buffer); 565faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 575faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 585faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&, 595faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkBitmap* result, SkIPoint* loc) SK_OVERRIDE; 605faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 615faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgprivate: 625faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkISize fKernelSize; 635faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkScalar* fKernel; 645faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkScalar fGain; 655faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkScalar fBias; 665faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org SkIPoint fTarget; 675faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org TileMode fTileMode; 685faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org typedef SkSingleInputImageFilter INHERITED; 695faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 705faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org template <class PixelFetcher> 715faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org void filterPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 725faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org void filterInteriorPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 735faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org void filterBorderPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect); 745faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org}; 755faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org 765faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org#endif 77