Index: src/core/SkBitmapFilter.h |
diff --git a/src/core/SkBitmapFilter.h b/src/core/SkBitmapFilter.h |
index 038ee98eae6fa63ec8737847301ff881eed71f47..c51a5390aa0c1486eb7850d14d610c677be08297 100644 |
--- a/src/core/SkBitmapFilter.h |
+++ b/src/core/SkBitmapFilter.h |
@@ -23,154 +23,151 @@ |
#define SKBITMAP_FILTER_TABLE_SIZE 128 |
class SkBitmapFilter { |
- public: |
- SkBitmapFilter(float width) |
- : fWidth(width), fInvWidth(1.f/width) { |
- fPrecomputed = false; |
- fLookupMultiplier = this->invWidth() * (SKBITMAP_FILTER_TABLE_SIZE-1); |
- } |
- |
- SkFixed lookup(float x) const { |
- if (!fPrecomputed) { |
- precomputeTable(); |
- } |
- int filter_idx = int(sk_float_abs(x * fLookupMultiplier)); |
- SkASSERT(filter_idx < SKBITMAP_FILTER_TABLE_SIZE); |
- return fFilterTable[filter_idx]; |
- } |
- |
- SkScalar lookupScalar(float x) const { |
- if (!fPrecomputed) { |
- precomputeTable(); |
- } |
- int filter_idx = int(sk_float_abs(x * fLookupMultiplier)); |
- SkASSERT(filter_idx < SKBITMAP_FILTER_TABLE_SIZE); |
- return fFilterTableScalar[filter_idx]; |
- } |
- |
- float width() const { return fWidth; } |
- float invWidth() const { return fInvWidth; } |
- virtual float evaluate(float x) const = 0; |
+public: |
+ SkBitmapFilter(float width) : fWidth(width), fInvWidth(1.f/width) { |
+ fPrecomputed = false; |
+ fLookupMultiplier = this->invWidth() * (SKBITMAP_FILTER_TABLE_SIZE-1); |
+ } |
+ virtual ~SkBitmapFilter() {} |
+ |
+ SkFixed lookup(float x) const { |
+ if (!fPrecomputed) { |
+ precomputeTable(); |
+ } |
+ int filter_idx = int(sk_float_abs(x * fLookupMultiplier)); |
+ SkASSERT(filter_idx < SKBITMAP_FILTER_TABLE_SIZE); |
+ return fFilterTable[filter_idx]; |
+ } |
+ |
+ SkScalar lookupScalar(float x) const { |
+ if (!fPrecomputed) { |
+ precomputeTable(); |
+ } |
+ int filter_idx = int(sk_float_abs(x * fLookupMultiplier)); |
+ SkASSERT(filter_idx < SKBITMAP_FILTER_TABLE_SIZE); |
+ return fFilterTableScalar[filter_idx]; |
+ } |
+ |
+ float width() const { return fWidth; } |
+ float invWidth() const { return fInvWidth; } |
+ virtual float evaluate(float x) const = 0; |
#ifndef SK_SUPPORT_LEGACY_BITMAP_FILTER |
- virtual float evaluate_n(float val, float diff, int count, float* output) const { |
- float sum = 0; |
- for (int index = 0; index < count; index++) { |
- float filterValue = evaluate(val); |
- *output++ = filterValue; |
- sum += filterValue; |
- val += diff; |
- } |
- return sum; |
- } |
+ virtual float evaluate_n(float val, float diff, int count, float* output) const { |
+ float sum = 0; |
+ for (int index = 0; index < count; index++) { |
+ float filterValue = evaluate(val); |
+ *output++ = filterValue; |
+ sum += filterValue; |
+ val += diff; |
+ } |
+ return sum; |
+ } |
#endif |
- virtual ~SkBitmapFilter() {} |
- |
- static SkBitmapFilter* Allocate(); |
- protected: |
- float fWidth; |
- float fInvWidth; |
- |
- float fLookupMultiplier; |
- |
- mutable bool fPrecomputed; |
- mutable SkFixed fFilterTable[SKBITMAP_FILTER_TABLE_SIZE]; |
- mutable SkScalar fFilterTableScalar[SKBITMAP_FILTER_TABLE_SIZE]; |
- private: |
- void precomputeTable() const { |
- fPrecomputed = true; |
- SkFixed *ftp = fFilterTable; |
- SkScalar *ftpScalar = fFilterTableScalar; |
- for (int x = 0; x < SKBITMAP_FILTER_TABLE_SIZE; ++x) { |
- float fx = ((float)x + .5f) * this->width() / SKBITMAP_FILTER_TABLE_SIZE; |
- float filter_value = evaluate(fx); |
- *ftpScalar++ = filter_value; |
- *ftp++ = SkFloatToFixed(filter_value); |
- } |
- } |
+ static SkBitmapFilter* Allocate(); |
+ |
+protected: |
+ float fWidth; |
+ float fInvWidth; |
+ float fLookupMultiplier; |
+ |
+ mutable bool fPrecomputed; |
+ mutable SkFixed fFilterTable[SKBITMAP_FILTER_TABLE_SIZE]; |
+ mutable SkScalar fFilterTableScalar[SKBITMAP_FILTER_TABLE_SIZE]; |
+ |
+private: |
+ void precomputeTable() const { |
+ fPrecomputed = true; |
+ SkFixed *ftp = fFilterTable; |
+ SkScalar *ftpScalar = fFilterTableScalar; |
+ for (int x = 0; x < SKBITMAP_FILTER_TABLE_SIZE; ++x) { |
+ float fx = ((float)x + .5f) * this->width() / SKBITMAP_FILTER_TABLE_SIZE; |
+ float filter_value = evaluate(fx); |
+ *ftpScalar++ = filter_value; |
+ *ftp++ = SkFloatToFixed(filter_value); |
+ } |
+ } |
}; |
-class SkMitchellFilter : public SkBitmapFilter { |
- public: |
+class SkMitchellFilter final : public SkBitmapFilter { |
+public: |
#ifdef SK_SUPPORT_LEGACY_BITMAP_FILTER |
- SkMitchellFilter() |
- : INHERITED(2), B(1.f / 3), C(1.f / 3) { |
- } |
+ SkMitchellFilter() : INHERITED(2), B(1.f / 3), C(1.f / 3) {} |
#else |
- SkMitchellFilter() |
- : INHERITED(2) |
- , fB(1.f / 3.f) |
- , fC(1.f / 3.f) |
- , fA1(-fB - 6*fC) |
- , fB1(6*fB + 30*fC) |
- , fC1(-12*fB - 48*fC) |
- , fD1(8*fB + 24*fC) |
- , fA2(12 - 9*fB - 6*fC) |
- , fB2(-18 + 12*fB + 6*fC) |
- , fD2(6 - 2*fB) { |
- } |
+ SkMitchellFilter() |
+ : INHERITED(2) |
+ , fB(1.f / 3.f) |
+ , fC(1.f / 3.f) |
+ , fA1(-fB - 6*fC) |
+ , fB1(6*fB + 30*fC) |
+ , fC1(-12*fB - 48*fC) |
+ , fD1(8*fB + 24*fC) |
+ , fA2(12 - 9*fB - 6*fC) |
+ , fB2(-18 + 12*fB + 6*fC) |
+ , fD2(6 - 2*fB) |
+ {} |
#endif |
- float evaluate(float x) const override { |
- x = fabsf(x); |
- if (x > 2.f) { |
- return 0; |
- } else if (x > 1.f) { |
+ float evaluate(float x) const override { |
+ x = fabsf(x); |
+ if (x > 2.f) { |
+ return 0; |
+ } else if (x > 1.f) { |
#ifdef SK_SUPPORT_LEGACY_BITMAP_FILTER |
- return ((-B - 6*C) * x*x*x + (6*B + 30*C) * x*x + |
- (-12*B - 48*C) * x + (8*B + 24*C)) * (1.f/6.f); |
+ return ((-B - 6*C) * x*x*x + (6*B + 30*C) * x*x + |
+ (-12*B - 48*C) * x + (8*B + 24*C)) * (1.f/6.f); |
#else |
- return (((fA1 * x + fB1) * x + fC1) * x + fD1) * (1.f/6.f); |
+ return (((fA1 * x + fB1) * x + fC1) * x + fD1) * (1.f/6.f); |
#endif |
- } else { |
+ } else { |
#ifdef SK_SUPPORT_LEGACY_BITMAP_FILTER |
- return ((12 - 9*B - 6*C) * x*x*x + |
- (-18 + 12*B + 6*C) * x*x + |
- (6 - 2*B)) * (1.f/6.f); |
+ return ((12 - 9*B - 6*C) * x*x*x + |
+ (-18 + 12*B + 6*C) * x*x + |
+ (6 - 2*B)) * (1.f/6.f); |
#else |
- return ((fA2 * x + fB2) * x*x + fD2) * (1.f/6.f); |
+ return ((fA2 * x + fB2) * x*x + fD2) * (1.f/6.f); |
#endif |
- } |
- } |
+ } |
+ } |
#ifndef SK_SUPPORT_LEGACY_BITMAP_FILTER |
- // TODO : native Sk4f abs |
- static Sk4f abs(const Sk4f& x) { |
- Sk4f neg = x < Sk4f(0); |
- return neg.thenElse(Sk4f(0) - x, x); |
- } |
- |
- Sk4f evalcore_n(const Sk4f& val) const { |
- Sk4f x = abs(val); |
- Sk4f over2 = x > Sk4f(2); |
- Sk4f over1 = x > Sk4f(1); |
- Sk4f poly1 = (((Sk4f(fA1) * x + Sk4f(fB1)) * x + Sk4f(fC1)) * x + Sk4f(fD1)) |
- * Sk4f(1.f/6.f); |
- Sk4f poly0 = ((Sk4f(fA2) * x + Sk4f(fB2)) * x*x + Sk4f(fD2)) * Sk4f(1.f/6.f); |
- return over2.thenElse(Sk4f(0), over1.thenElse(poly1, poly0)); |
- } |
- |
- float evaluate_n(float val, float diff, int count, float* output) const override { |
- Sk4f sum(0); |
- while (count >= 4) { |
- float v0 = val; |
- float v1 = val += diff; |
- float v2 = val += diff; |
- float v3 = val += diff; |
- val += diff; |
- Sk4f filterValue = evalcore_n(Sk4f(v0, v1, v2, v3)); |
- filterValue.store(output); |
- output += 4; |
- sum = sum + filterValue; |
- count -= 4; |
- } |
- float sums[4]; |
- sum.store(sums); |
- float result = sums[0] + sums[1] + sums[2] + sums[3]; |
- result += INHERITED::evaluate_n(val, diff, count, output); |
- return result; |
- } |
+ // TODO : native Sk4f abs |
+ static Sk4f abs(const Sk4f& x) { |
+ Sk4f neg = x < Sk4f(0); |
+ return neg.thenElse(Sk4f(0) - x, x); |
+ } |
+ |
+ Sk4f evalcore_n(const Sk4f& val) const { |
+ Sk4f x = abs(val); |
+ Sk4f over2 = x > Sk4f(2); |
+ Sk4f over1 = x > Sk4f(1); |
+ Sk4f poly1 = (((Sk4f(fA1) * x + Sk4f(fB1)) * x + Sk4f(fC1)) * x + Sk4f(fD1)) |
+ * Sk4f(1.f/6.f); |
+ Sk4f poly0 = ((Sk4f(fA2) * x + Sk4f(fB2)) * x*x + Sk4f(fD2)) * Sk4f(1.f/6.f); |
+ return over2.thenElse(Sk4f(0), over1.thenElse(poly1, poly0)); |
+ } |
+ |
+ float evaluate_n(float val, float diff, int count, float* output) const override { |
+ Sk4f sum(0); |
+ while (count >= 4) { |
+ float v0 = val; |
+ float v1 = val += diff; |
+ float v2 = val += diff; |
+ float v3 = val += diff; |
+ val += diff; |
+ Sk4f filterValue = evalcore_n(Sk4f(v0, v1, v2, v3)); |
+ filterValue.store(output); |
+ output += 4; |
+ sum = sum + filterValue; |
+ count -= 4; |
+ } |
+ float sums[4]; |
+ sum.store(sums); |
+ float result = sums[0] + sums[1] + sums[2] + sums[3]; |
+ result += INHERITED::evaluate_n(val, diff, count, output); |
+ return result; |
+ } |
#endif |
protected: |
@@ -181,52 +178,47 @@ class SkMitchellFilter : public SkBitmapFilter { |
float fA1, fB1, fC1, fD1; |
float fA2, fB2, fD2; |
#endif |
- private: |
- typedef SkBitmapFilter INHERITED; |
+private: |
+ typedef SkBitmapFilter INHERITED; |
}; |
-class SkGaussianFilter: public SkBitmapFilter { |
- public: |
- SkGaussianFilter(float a, float width=2.0f) |
- : SkBitmapFilter(width), alpha(a), expWidth(expf(-alpha * width * width)) { |
- } |
+class SkGaussianFilter final : public SkBitmapFilter { |
+ float fAlpha, fExpWidth; |
- float evaluate(float x) const override { |
- return SkTMax(0.f, float(expf(-alpha*x*x) - expWidth)); |
- } |
- protected: |
- float alpha, expWidth; |
+public: |
+ SkGaussianFilter(float a, float width = 2) |
+ : SkBitmapFilter(width) |
+ , fAlpha(a) |
+ , fExpWidth(expf(-a * width * width)) |
+ {} |
+ |
+ float evaluate(float x) const override { |
+ return SkTMax(0.f, float(expf(-fAlpha*x*x) - fExpWidth)); |
+ } |
}; |
-class SkTriangleFilter: public SkBitmapFilter { |
- public: |
- SkTriangleFilter(float width=1) |
- : SkBitmapFilter(width) { |
- } |
+class SkTriangleFilter final : public SkBitmapFilter { |
+public: |
+ SkTriangleFilter(float width = 1) : SkBitmapFilter(width) {} |
- float evaluate(float x) const override { |
- return SkTMax(0.f, fWidth - fabsf(x)); |
- } |
- protected: |
+ float evaluate(float x) const override { |
+ return SkTMax(0.f, fWidth - fabsf(x)); |
+ } |
}; |
-class SkBoxFilter: public SkBitmapFilter { |
- public: |
- SkBoxFilter(float width=0.5f) |
- : SkBitmapFilter(width) { |
- } |
+class SkBoxFilter final : public SkBitmapFilter { |
+public: |
+ SkBoxFilter(float width = 0.5f) : SkBitmapFilter(width) {} |
- float evaluate(float x) const override { |
- return (x >= -fWidth && x < fWidth) ? 1.0f : 0.0f; |
- } |
- protected: |
+ float evaluate(float x) const override { |
+ return (x >= -fWidth && x < fWidth) ? 1.0f : 0.0f; |
+ } |
}; |
-class SkHammingFilter: public SkBitmapFilter { |
+class SkHammingFilter final : public SkBitmapFilter { |
public: |
- SkHammingFilter(float width=1.f) |
- : SkBitmapFilter(width) { |
- } |
+ SkHammingFilter(float width = 1) : SkBitmapFilter(width) {} |
+ |
float evaluate(float x) const override { |
if (x <= -fWidth || x >= fWidth) { |
return 0.0f; // Outside of the window. |
@@ -241,23 +233,21 @@ public: |
} |
}; |
-class SkLanczosFilter: public SkBitmapFilter { |
- public: |
- SkLanczosFilter(float width=3.f) |
- : SkBitmapFilter(width) { |
- } |
- |
- float evaluate(float x) const override { |
- if (x <= -fWidth || x >= fWidth) { |
- return 0.0f; // Outside of the window. |
- } |
- if (x > -FLT_EPSILON && x < FLT_EPSILON) { |
- return 1.0f; // Special case the discontinuity at the origin. |
- } |
- float xpi = x * static_cast<float>(SK_ScalarPI); |
- return (sk_float_sin(xpi) / xpi) * // sinc(x) |
- sk_float_sin(xpi / fWidth) / (xpi / fWidth); // sinc(x/fWidth) |
- } |
+class SkLanczosFilter final : public SkBitmapFilter { |
+public: |
+ SkLanczosFilter(float width = 3.f) : SkBitmapFilter(width) {} |
+ |
+ float evaluate(float x) const override { |
+ if (x <= -fWidth || x >= fWidth) { |
+ return 0.0f; // Outside of the window. |
+ } |
+ if (x > -FLT_EPSILON && x < FLT_EPSILON) { |
+ return 1.0f; // Special case the discontinuity at the origin. |
+ } |
+ float xpi = x * static_cast<float>(SK_ScalarPI); |
+ return (sk_float_sin(xpi) / xpi) * // sinc(x) |
+ sk_float_sin(xpi / fWidth) / (xpi / fWidth); // sinc(x/fWidth) |
+ } |
}; |