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 12 namespace 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. 19 class 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|. 43 SK_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. 57 SK_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