aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkGaussFilter.cpp7
-rw-r--r--src/core/SkGaussFilter.h16
-rw-r--r--src/core/SkMaskBlurFilter.cpp4
-rw-r--r--tests/SkGaussFilterTest.cpp18
4 files changed, 19 insertions, 26 deletions
diff --git a/src/core/SkGaussFilter.cpp b/src/core/SkGaussFilter.cpp
index c0d612ddec..5bbdc05f43 100644
--- a/src/core/SkGaussFilter.cpp
+++ b/src/core/SkGaussFilter.cpp
@@ -142,10 +142,3 @@ SkGaussFilter::SkGaussFilter(double sigma, Type type) {
fN = calculate_gauss_factors(sigma, fBasis);
}
}
-
-int SkGaussFilter::filterDouble(double values[5]) const {
- for (int i = 0; i < fN; i++) {
- values[i] = fBasis[i];
- }
- return fN;
-}
diff --git a/src/core/SkGaussFilter.h b/src/core/SkGaussFilter.h
index be00cf2cc0..8ad0831e9f 100644
--- a/src/core/SkGaussFilter.h
+++ b/src/core/SkGaussFilter.h
@@ -8,7 +8,7 @@
#ifndef SkGaussFilter_DEFINED
#define SkGaussFilter_DEFINED
-#include <cstdint>
+#include <cstddef>
// Define gaussian filters for values of sigma < 2. Produce values good to 1 part in 1,000,000.
// Gaussian produces values as defined in the SVG 1.1 spec:
@@ -16,6 +16,7 @@
// Bessel produces values as defined in "Scale-Space for Discrete Signals" by Tony Lindeberg
class SkGaussFilter {
public:
+ static constexpr int kGaussArrayMax = 5;
enum class Type : bool {
Gaussian,
Bessel
@@ -24,24 +25,17 @@ public:
// Type selects which method is used to calculate the gaussian factors.
SkGaussFilter(double sigma, Type type);
+ size_t size() const { return fN; }
int radius() const { return fN - 1; }
- int width() const { return 2 * this->radius() + 1; }
-
- // TODO: remove filterDouble and use the ranged-for loop interface.
-
- // Take an array of values where the gaussian factors will be placed. Return the number of
- // values filled.
- int filterDouble(double values[5]) const;
+ int width() const { return 2 * this->radius() + 1; }
// Allow a filter to be used in a C++ ranged-for loop.
const double* begin() const { return &fBasis[0]; }
const double* end() const { return &fBasis[fN]; }
private:
- double fBasis[5];
+ double fBasis[kGaussArrayMax];
int fN;
};
#endif // SkGaussFilter_DEFINED
-
-
diff --git a/src/core/SkMaskBlurFilter.cpp b/src/core/SkMaskBlurFilter.cpp
index 9de68fcedc..dac21ee60c 100644
--- a/src/core/SkMaskBlurFilter.cpp
+++ b/src/core/SkMaskBlurFilter.cpp
@@ -1159,8 +1159,8 @@ static SkIPoint small_blur(double sigmaX, double sigmaY, const SkMask& src, SkMa
}
};
- uint16_t gaussFactorsX[5],
- gaussFactorsY[5];
+ uint16_t gaussFactorsX[SkGaussFilter::kGaussArrayMax],
+ gaussFactorsY[SkGaussFilter::kGaussArrayMax];
prepareGauss(filterX, gaussFactorsX);
prepareGauss(filterY, gaussFactorsY);
diff --git a/tests/SkGaussFilterTest.cpp b/tests/SkGaussFilterTest.cpp
index 2fdf4ac573..149260b3a3 100644
--- a/tests/SkGaussFilterTest.cpp
+++ b/tests/SkGaussFilterTest.cpp
@@ -32,9 +32,12 @@ DEF_TEST(SkGaussFilterCommon, r) {
double sigma; SkGaussFilter::Type type; std::vector<double> golden;
std::tie(sigma, type, golden) = test;
SkGaussFilter filter{sigma, type};
- double result[5];
- size_t n = filter.filterDouble(result);
- REPORTER_ASSERT(r, n == golden.size());
+ double result[SkGaussFilter::kGaussArrayMax];
+ int n = 0;
+ for (auto d : filter) {
+ result[n++] = d;
+ }
+ REPORTER_ASSERT(r, static_cast<size_t>(n) == golden.size());
double sum = careful_add(n, result);
REPORTER_ASSERT(r, sum == 1.0);
for (size_t i = 0; i < golden.size(); i++) {
@@ -70,9 +73,12 @@ DEF_TEST(SkGaussFilterSweep, r) {
const double maxSigma = nextafter(2.0, 0.0);
auto check = [&](double sigma, SkGaussFilter::Type type) {
SkGaussFilter filter{sigma, type};
- double result[5];
- int n = filter.filterDouble(result);
- REPORTER_ASSERT(r, n <= 5);
+ double result[SkGaussFilter::kGaussArrayMax];
+ int n = 0;
+ for (auto d : filter) {
+ result[n++] = d;
+ }
+ REPORTER_ASSERT(r, n <= SkGaussFilter::kGaussArrayMax);
double sum = careful_add(n, result);
REPORTER_ASSERT(r, sum == 1.0);
};