summaryrefslogtreecommitdiff
path: root/chromium/skia/ext/recursive_gaussian_convolution.h
diff options
context:
space:
mode:
authorZeno Albisser <zeno.albisser@digia.com>2013-08-15 21:46:11 +0200
committerZeno Albisser <zeno.albisser@digia.com>2013-08-15 21:46:11 +0200
commit679147eead574d186ebf3069647b4c23e8ccace6 (patch)
treefc247a0ac8ff119f7c8550879ebb6d3dd8d1ff69 /chromium/skia/ext/recursive_gaussian_convolution.h
downloadqtwebengine-chromium-679147eead574d186ebf3069647b4c23e8ccace6.tar.gz
Initial import.
Diffstat (limited to 'chromium/skia/ext/recursive_gaussian_convolution.h')
-rw-r--r--chromium/skia/ext/recursive_gaussian_convolution.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/chromium/skia/ext/recursive_gaussian_convolution.h b/chromium/skia/ext/recursive_gaussian_convolution.h
new file mode 100644
index 00000000000..a4843292e1a
--- /dev/null
+++ b/chromium/skia/ext/recursive_gaussian_convolution.h
@@ -0,0 +1,71 @@
+// 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_