1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef SKIA_EXT_RECURSIVE_GAUSSIAN_CONVOLUTION_H_ 6#define SKIA_EXT_RECURSIVE_GAUSSIAN_CONVOLUTION_H_ 7 8#include "skia/ext/convolver.h" 9#include "third_party/skia/include/core/SkSize.h" 10#include "third_party/skia/include/core/SkTypes.h" 11 12namespace skia { 13 14// RecursiveFilter, paired with SingleChannelRecursiveGaussianX and 15// SingleChannelRecursiveGaussianY routines below implement recursive filters as 16// described in 'Recursive implementation of the Gaussian filter' (Young, Vliet) 17// (1995). Single-letter variable names mirror exactly the usage in the paper to 18// ease reading and analysis. 19class RecursiveFilter { 20 public: 21 enum Order { 22 FUNCTION, 23 FIRST_DERIVATIVE, 24 SECOND_DERIVATIVE 25 }; 26 27 static float qFromSigma(float sigma); 28 static void computeCoefficients(float q, float b[4]); 29 SK_API RecursiveFilter(float sigma, Order order); 30 31 Order order() const { return order_; } 32 const float* b() const { return b_; } 33 34 private: 35 Order order_; 36 float q_; 37 float b_[4]; 38}; 39 40// Applies a gaussian recursive filter given as |filter| to a single channel at 41// |input_channel_index| to image given in |source_data| along X axis. 42// The output is placed into |output| into channel |output_channel_index|. 43SK_API unsigned char SingleChannelRecursiveGaussianX( 44 const unsigned char* source_data, 45 int source_byte_row_stride, 46 int input_channel_index, 47 int input_channel_count, 48 const RecursiveFilter& filter, 49 const SkISize& image_size, 50 unsigned char* output, 51 int output_byte_row_stride, 52 int output_channel_index, 53 int output_channel_count, 54 bool absolute_values); 55 56// Applies a gaussian recursive filter along Y axis. 57SK_API unsigned char SingleChannelRecursiveGaussianY( 58 const unsigned char* source_data, 59 int source_byte_row_stride, 60 int input_channel_index, 61 int input_channel_count, 62 const RecursiveFilter& filter, 63 const SkISize& image_size, 64 unsigned char* output, 65 int output_byte_row_stride, 66 int output_channel_index, 67 int output_channel_count, 68 bool absolute_values); 69} // namespace skia 70 71#endif // SKIA_EXT_RECURSIVE_GAUSSIAN_CONVOLUTION_H_ 72