Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 | |
| 2 /* | |
| 3 * Copyright 2013 Google Inc. | |
| 4 * | |
| 5 * Use of this source code is governed by a BSD-style license that can be | |
| 6 * found in the LICENSE file. | |
| 7 */ | |
| 8 | |
| 9 | |
| 10 #ifndef SkBitmapFilter_DEFINED | |
| 11 #define SkBitmapFilter_DEFINED | |
| 12 | |
| 13 #include "SkMath.h" | |
| 14 | |
| 15 class SkBitmapFilter { | |
| 16 public: | |
| 17 SkBitmapFilter( float width ) | |
| 18 : fWidth( width ), fInvWidth( 1.f/width ) { | |
| 19 } | |
| 20 | |
| 21 float width() const { return fWidth; } | |
| 22 float invWidth() const { return fInvWidth; } | |
| 23 virtual float Evaluate( float x ) const = 0; | |
|
reed1
2013/06/18 20:21:21
non-static methods are lowerCamelCase
humper
2013/06/19 20:49:26
Done.
| |
| 24 protected: | |
| 25 float fWidth; | |
| 26 float fInvWidth; | |
| 27 }; | |
| 28 | |
| 29 class SkMitchellFilter: public SkBitmapFilter { | |
| 30 public: | |
| 31 SkMitchellFilter( float b, float c, float width=2.0 ) | |
| 32 : SkBitmapFilter( width ), B( b ), C( c ) { | |
| 33 } | |
| 34 | |
| 35 virtual float Evaluate( float x ) const { | |
|
reed1
2013/06/18 20:21:21
SK_OVERRIDE
humper
2013/06/19 20:49:26
Done.
| |
| 36 x = fabsf(x); | |
| 37 float ret; | |
| 38 if (x > 2.f) { | |
| 39 return 0; | |
| 40 } else if (x > 1.f) { | |
| 41 return ((-B - 6*C) * x*x*x + (6*B + 30*C) * x*x + | |
| 42 (-12*B - 48*C) * x + (8*B + 24*C)) * (1.f/6.f); | |
| 43 } else { | |
| 44 return ((12 - 9*B - 6*C) * x*x*x + | |
| 45 (-18 + 12*B + 6*C) * x*x + | |
| 46 (6 - 2*B)) * (1.f/6.f); | |
| 47 } | |
| 48 } | |
| 49 protected: | |
| 50 float B, C; | |
| 51 }; | |
| 52 | |
| 53 class SkGaussianFilter: public SkBitmapFilter { | |
| 54 public: | |
| 55 SkGaussianFilter( float a, float width=2.0 ) | |
| 56 : SkBitmapFilter( width ), alpha(a), expWidth( expf(-alpha * width * width )) { | |
| 57 } | |
| 58 | |
| 59 virtual float Evaluate( float x ) const { | |
| 60 return SkTMax(0.f, float(expf(-alpha*x*x) - expWidth)); | |
| 61 } | |
| 62 protected: | |
| 63 float alpha, expWidth; | |
| 64 }; | |
| 65 | |
| 66 class SkTriangleFilter: public SkBitmapFilter { | |
| 67 public: | |
| 68 SkTriangleFilter( float width=1 ) | |
| 69 : SkBitmapFilter( width ) { | |
| 70 } | |
| 71 | |
| 72 virtual float Evaluate( float x ) const { | |
| 73 return SkTMax( 0.f, fWidth - fabsf(x) ); | |
| 74 } | |
| 75 protected: | |
| 76 }; | |
| 77 | |
| 78 class SkBoxFilter: public SkBitmapFilter { | |
| 79 public: | |
| 80 SkBoxFilter( float width=.5 ) | |
|
reed1
2013/06/18 20:21:21
need .5f to avoid warning
humper
2013/06/19 20:49:26
Done.
| |
| 81 : SkBitmapFilter( width ) { | |
| 82 } | |
| 83 | |
| 84 virtual float Evaluate( float x ) const { | |
| 85 return 1; | |
| 86 } | |
| 87 protected: | |
| 88 }; | |
| 89 | |
| 90 | |
| 91 class SkSincFilter: public SkBitmapFilter { | |
| 92 public: | |
| 93 SkSincFilter( float t, float width=3 ) | |
| 94 : SkBitmapFilter( width ), tau(t) { | |
| 95 } | |
| 96 | |
| 97 virtual float Evaluate( float x ) const { | |
| 98 x = fabsf(x/fWidth); | |
|
reed1
2013/06/18 20:21:21
sk_float_abs
reed1
2013/06/18 20:21:21
x * fInvWidth
humper
2013/06/19 20:49:26
Done.
humper
2013/06/19 20:49:26
Done.
humper
2013/06/19 20:49:26
Done.
| |
| 99 if (x < 1e-5) return 1.f; | |
|
reed1
2013/06/18 20:21:21
1e-5f for warning I think
humper
2013/06/19 20:49:26
Done.
| |
| 100 if (x > 1.) return 0.f; | |
| 101 x *= M_PI; | |
| 102 float sinc = sinf(x) / x; | |
|
reed1
2013/06/18 20:21:21
sk_float_sin
humper
2013/06/19 20:49:26
Done.
| |
| 103 float lanczos = sinf(x * tau) / (x * tau); | |
| 104 return sinc * lanczos; | |
| 105 } | |
| 106 protected: | |
| 107 float tau; | |
| 108 }; | |
| 109 | |
| 110 | |
| 111 #endif | |
| OLD | NEW |