blob: a938fd0b260514c93ed7ee3fa97fbb471d59dfec [file] [log] [blame]
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +00001/*
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).
skia.committer@gmail.comc1ad0222012-09-19 02:01:47 +000033 @param kernel The image processing kernel. Must contain N * M
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000034 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).
senorblanco@chromium.org8640d502012-09-25 14:32:42 +000045 @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.
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000048 @param input The input image filter. If NULL, the src bitmap
49 passed to filterImage() is used instead.
50 */
51
senorblanco@chromium.org8640d502012-09-25 14:32:42 +000052 SkMatrixConvolutionImageFilter(const SkISize& kernelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint& target, TileMode tileMode, bool convolveAlpha, SkImageFilter* input = NULL);
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000053 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;
senorblanco@chromium.org8640d502012-09-25 14:32:42 +000071 bool fConvolveAlpha;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000072 typedef SkSingleInputImageFilter INHERITED;
73
senorblanco@chromium.org8640d502012-09-25 14:32:42 +000074 template <class PixelFetcher, bool convolveAlpha>
75 void filterPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect);
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000076 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