Home | History | Annotate | Download | only in ext
      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