blob: 4409ebd40eb2e60fb0eeadfefcf216f3b10379a7 [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).
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