blob: cd2a16fdfe3fa9111cd4e2915337b205d8875bb8 [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
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000011#include "SkImageFilter.h"
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000012#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
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000022class SK_API SkMatrixConvolutionImageFilter : public SkImageFilter {
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000023public:
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
senorblanco@chromium.org3bc16c82012-10-04 17:18:20 +000064#if SK_SUPPORT_GPU
bsalomon@google.com0ac6af42013-01-16 15:16:18 +000065 virtual bool asNewEffect(GrEffectRef**, GrTexture*) const SK_OVERRIDE;
senorblanco@chromium.org3bc16c82012-10-04 17:18:20 +000066#endif
67
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000068private:
69 SkISize fKernelSize;
70 SkScalar* fKernel;
71 SkScalar fGain;
72 SkScalar fBias;
73 SkIPoint fTarget;
74 TileMode fTileMode;
senorblanco@chromium.org8640d502012-09-25 14:32:42 +000075 bool fConvolveAlpha;
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000076 typedef SkImageFilter INHERITED;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000077
senorblanco@chromium.org8640d502012-09-25 14:32:42 +000078 template <class PixelFetcher, bool convolveAlpha>
79 void filterPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect);
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000080 template <class PixelFetcher>
81 void filterPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect);
82 void filterInteriorPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect);
83 void filterBorderPixels(const SkBitmap& src, SkBitmap* result, const SkIRect& rect);
84};
85
86#endif