| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SKIA_EXT_RECURSIVE_GAUSSIAN_CONVOLUTION_H_ |
| #define SKIA_EXT_RECURSIVE_GAUSSIAN_CONVOLUTION_H_ |
| |
| #include "skia/ext/convolver.h" |
| #include "third_party/skia/include/core/SkSize.h" |
| #include "third_party/skia/include/core/SkTypes.h" |
| |
| namespace skia { |
| |
| // RecursiveFilter, paired with SingleChannelRecursiveGaussianX and |
| // SingleChannelRecursiveGaussianY routines below implement recursive filters as |
| // described in 'Recursive implementation of the Gaussian filter' (Young, Vliet) |
| // (1995). Single-letter variable names mirror exactly the usage in the paper to |
| // ease reading and analysis. |
| class RecursiveFilter { |
| public: |
| enum Order { |
| FUNCTION, |
| FIRST_DERIVATIVE, |
| SECOND_DERIVATIVE |
| }; |
| |
| static float qFromSigma(float sigma); |
| static void computeCoefficients(float q, float b[4]); |
| SK_API RecursiveFilter(float sigma, Order order); |
| |
| Order order() const { return order_; } |
| const float* b() const { return b_; } |
| |
| private: |
| Order order_; |
| float q_; |
| float b_[4]; |
| }; |
| |
| // Applies a gaussian recursive filter given as |filter| to a single channel at |
| // |input_channel_index| to image given in |source_data| along X axis. |
| // The output is placed into |output| into channel |output_channel_index|. |
| SK_API unsigned char SingleChannelRecursiveGaussianX( |
| const unsigned char* source_data, |
| int source_byte_row_stride, |
| int input_channel_index, |
| int input_channel_count, |
| const RecursiveFilter& filter, |
| const SkISize& image_size, |
| unsigned char* output, |
| int output_byte_row_stride, |
| int output_channel_index, |
| int output_channel_count, |
| bool absolute_values); |
| |
| // Applies a gaussian recursive filter along Y axis. |
| SK_API unsigned char SingleChannelRecursiveGaussianY( |
| const unsigned char* source_data, |
| int source_byte_row_stride, |
| int input_channel_index, |
| int input_channel_count, |
| const RecursiveFilter& filter, |
| const SkISize& image_size, |
| unsigned char* output, |
| int output_byte_row_stride, |
| int output_channel_index, |
| int output_channel_count, |
| bool absolute_values); |
| } // namespace skia |
| |
| #endif // SKIA_EXT_RECURSIVE_GAUSSIAN_CONVOLUTION_H_ |