1/*
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 "include/core/SkImageFilter.h"
12#include "include/core/SkPoint.h"
13#include "include/core/SkScalar.h"
14#include "include/core/SkSize.h"
15
16class SkBitmap;
17enum class SkTileMode;
18
19/*! \class SkMatrixConvolutionImageFilter
20 Matrix convolution image filter. This filter applies an NxM image
21 processing kernel to a given input image. This can be used to produce
22 effects such as sharpening, blurring, edge detection, etc.
23
24 DEPRECATED: Use include/effects/SkImageFilters::MatrixConvolution
25 */
26
27class SK_API SkMatrixConvolutionImageFilter {
28public:
29 /*! \enum TileMode
30 * DEPRECATED: Use SkTileMode instead. */
31 enum TileMode {
32 kClamp_TileMode = 0, /*!< Clamp to the image's edge pixels. */
33 kRepeat_TileMode, /*!< Wrap around to the image's opposite edge. */
34 kClampToBlack_TileMode, /*!< Fill with transparent black. */
35 kLast_TileMode = kClampToBlack_TileMode,
36
37 // TODO: remove kMax - it is non-standard but used by Chromium!
38 kMax_TileMode = kClampToBlack_TileMode
39 };
40
41 static sk_sp<SkImageFilter> Make(const SkISize& kernelSize,
42 const SkScalar* kernel,
43 SkScalar gain,
44 SkScalar bias,
45 const SkIPoint& kernelOffset,
46 TileMode tileMode,
47 bool convolveAlpha,
48 sk_sp<SkImageFilter> input,
49 const SkImageFilter::CropRect* cropRect = nullptr);
50
51 /** Construct a matrix convolution image filter.
52 @param kernelSize The kernel size in pixels, in each dimension (N by M).
53 @param kernel The image processing kernel. Must contain N * M
54 elements, in row order.
55 @param gain A scale factor applied to each pixel after
56 convolution. This can be used to normalize the
57 kernel, if it does not sum to 1.
58 @param bias A bias factor added to each pixel after convolution.
59 @param kernelOffset An offset applied to each pixel coordinate before
60 convolution. This can be used to center the kernel
61 over the image (e.g., a 3x3 kernel should have an
62 offset of {1, 1}).
63 @param tileMode How accesses outside the image are treated. (@see
64 TileMode). EXPERIMENTAL: kMirror not supported yet.
65 @param convolveAlpha If true, all channels are convolved. If false,
66 only the RGB channels are convolved, and
67 alpha is copied from the source image.
68 @param input The input image filter. If NULL, the src bitmap
69 passed to filterImage() is used instead.
70 @param cropRect The rectangle to which the output processing will be limited.
71 */
72 static sk_sp<SkImageFilter> Make(const SkISize& kernelSize,
73 const SkScalar* kernel,
74 SkScalar gain,
75 SkScalar bias,
76 const SkIPoint& kernelOffset,
77 SkTileMode tileMode,
78 bool convolveAlpha,
79 sk_sp<SkImageFilter> input,
80 const SkImageFilter::CropRect* cropRect = nullptr);
81
82 static void RegisterFlattenables();
83
84private:
85 SkMatrixConvolutionImageFilter() = delete;
86};
87
88#endif
89