blob: 09a3acf31a8579797dc3a951deab841d9f33af1f [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 {
joshualittac977922014-07-22 09:52:11 -070026 kClamp_TileMode = 0, /*!< Clamp to the image's edge pixels. */
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000027 kRepeat_TileMode, /*!< Wrap around to the image's opposite edge. */
28 kClampToBlack_TileMode, /*!< Fill with transparent black. */
joshualittac977922014-07-22 09:52:11 -070029 kMax_TileMode = kClampToBlack_TileMode
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000030 };
31
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000032 virtual ~SkMatrixConvolutionImageFilter();
33
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000034 /** Construct a matrix convolution image filter.
35 @param kernelSize The kernel size in pixels, in each dimension (N by M).
36 @param kernel The image processing kernel. Must contain N * M
37 elements, in row order.
38 @param gain A scale factor applied to each pixel after
39 convolution. This can be used to normalize the
40 kernel, if it does not sum to 1.
41 @param bias A bias factor added to each pixel after convolution.
42 @param kernelOffset An offset applied to each pixel coordinate before
43 convolution. This can be used to center the kernel
44 over the image (e.g., a 3x3 kernel should have an
45 offset of {1, 1}).
46 @param tileMode How accesses outside the image are treated. (@see
47 TileMode).
48 @param convolveAlpha If true, all channels are convolved. If false,
49 only the RGB channels are convolved, and
50 alpha is copied from the source image.
51 @param input The input image filter. If NULL, the src bitmap
52 passed to filterImage() is used instead.
53 @param cropRect The rectangle to which the output processing will be limited.
54 */
reed2d6ba662015-12-20 20:08:42 -080055 static SkMatrixConvolutionImageFilter* Create(const SkISize& kernelSize,
56 const SkScalar* kernel,
57 SkScalar gain,
58 SkScalar bias,
59 const SkIPoint& kernelOffset,
60 TileMode tileMode,
61 bool convolveAlpha,
62 SkImageFilter* input = NULL,
63 const CropRect* cropRect = NULL);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000064
robertphillipsf3f5bad2014-12-19 13:49:15 -080065 SK_TO_STRING_OVERRIDE()
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000066 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMatrixConvolutionImageFilter)
67
68protected:
commit-bot@chromium.orgbd0be252014-05-15 15:40:41 +000069 SkMatrixConvolutionImageFilter(const SkISize& kernelSize,
70 const SkScalar* kernel,
71 SkScalar gain,
72 SkScalar bias,
73 const SkIPoint& kernelOffset,
74 TileMode tileMode,
75 bool convolveAlpha,
76 SkImageFilter* input,
senorblanco24e06d52015-03-18 12:11:33 -070077 const CropRect* cropRect);
mtklein36352bf2015-03-25 18:17:31 -070078 void flatten(SkWriteBuffer&) const override;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000079
joshualitt85ff25e2015-07-08 09:10:03 -070080 bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
81 SkBitmap* result, SkIPoint* loc) const override;
senorblancodb64af32015-12-09 10:11:43 -080082 void onFilterNodeBounds(const SkIRect&, const SkMatrix&, SkIRect*, MapDirection) const override;
senorblancoa544eda2015-12-07 07:48:34 -080083 bool canComputeFastBounds() const override;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000084
senorblanco@chromium.org3bc16c82012-10-04 17:18:20 +000085#if SK_SUPPORT_GPU
bsalomon4a339522015-10-06 08:40:50 -070086 bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const SkMatrix&,
87 const SkIRect& bounds) const override;
senorblanco@chromium.org3bc16c82012-10-04 17:18:20 +000088#endif
89
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000090private:
91 SkISize fKernelSize;
92 SkScalar* fKernel;
93 SkScalar fGain;
94 SkScalar fBias;
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000095 SkIPoint fKernelOffset;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000096 TileMode fTileMode;
senorblanco@chromium.org8640d502012-09-25 14:32:42 +000097 bool fConvolveAlpha;
senorblanco@chromium.org377c14a2013-02-04 22:57:21 +000098 typedef SkImageFilter INHERITED;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +000099
senorblanco@chromium.org8640d502012-09-25 14:32:42 +0000100 template <class PixelFetcher, bool convolveAlpha>
senorblanco@chromium.org7938bae2013-10-18 20:08:14 +0000101 void filterPixels(const SkBitmap& src,
102 SkBitmap* result,
103 const SkIRect& rect,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +0000104 const SkIRect& bounds) const;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +0000105 template <class PixelFetcher>
senorblanco@chromium.org7938bae2013-10-18 20:08:14 +0000106 void filterPixels(const SkBitmap& src,
107 SkBitmap* result,
108 const SkIRect& rect,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +0000109 const SkIRect& bounds) const;
senorblanco@chromium.org7938bae2013-10-18 20:08:14 +0000110 void filterInteriorPixels(const SkBitmap& src,
111 SkBitmap* result,
112 const SkIRect& rect,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +0000113 const SkIRect& bounds) const;
senorblanco@chromium.org7938bae2013-10-18 20:08:14 +0000114 void filterBorderPixels(const SkBitmap& src,
115 SkBitmap* result,
116 const SkIRect& rect,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +0000117 const SkIRect& bounds) const;
senorblanco@chromium.org5faa2dc2012-09-18 20:32:34 +0000118};
119
120#endif