gpufilter
GPU-Efficient Recursive Filtering and Summed-Area Tables
|
00001 00009 #ifndef EXTENSION_H 00010 #define EXTENSION_H 00011 00012 //== INCLUDES ================================================================= 00013 00014 #include <cmath> 00015 00016 //== NAMESPACES =============================================================== 00017 00018 namespace gpufilter { 00019 00020 //== ENUMERATION ============================================================== 00021 00026 enum initcond { 00027 zero, 00028 clamp, 00029 repeat, 00030 mirror 00031 }; 00032 00033 //== CLASS DEFINITION ========================================================= 00034 00040 struct _clamp { 00046 float operator () ( float t ) const { 00047 if( t < 0.f ) return 0.f; 00048 else if( t > 1.f ) return 1.f; 00049 else return t; 00050 } 00057 int operator () ( int i, int n ) const { 00058 if( i < 0 ) return 0; 00059 else if( i >= n ) return n-1; 00060 else return i; 00061 } 00062 }; 00063 00064 //== CLASS DEFINITION ========================================================= 00065 00071 struct _repeat { 00077 float operator () ( float t ) const { 00078 t = fmodf(t, 1.f); 00079 return t < 0.f ? t + 1.f : t; 00080 } 00087 int operator () ( int i, int n ) const { 00088 if( i >= 0 ) return i % n; 00089 else return (n-1) - ((-i-1) % n); 00090 } 00091 }; 00092 00093 //== CLASS DEFINITION ========================================================= 00094 00100 struct _mirror { 00106 float operator () ( float t ) const { 00107 t = fabs(fmodf(t, 2.f)); 00108 return t > 1.f ? 2.f - t : t; 00109 } 00116 int operator () ( int i, int n ) const { 00117 _repeat r; 00118 i = r(i, 2*n); 00119 if( i >= n ) return i = (2*n)-i-1; 00120 else return i; 00121 } 00122 }; 00123 00124 //== IMPLEMENTATION =========================================================== 00125 00142 template< class T > 00143 T lookat( const T *in, 00144 const int& i, 00145 const int& n, 00146 const initcond& ic, 00147 const int& p = 1 ) { 00148 if( !in ) return (T)0; 00149 switch( ic ) { 00150 case zero: 00151 if( i < 0 ) return (T)0; 00152 else if( i >= n ) return (T)0; 00153 else return in[i*p]; 00154 case clamp: 00155 _clamp c; 00156 return in[ c(i, n)*p ]; 00157 case repeat: 00158 _repeat r; 00159 return in[ r(i, n)*p ]; 00160 case mirror: 00161 _mirror m; 00162 return in[ m(i, n)*p ]; 00163 } 00164 return (T)0; 00165 } 00166 00185 template< class T > 00186 T lookat( const T *img, 00187 const int& i, 00188 const int& j, 00189 const int& h, 00190 const int& w, 00191 const initcond& ic ) { 00192 if( !img ) return (T)0; 00193 switch( ic ) { 00194 case zero: 00195 if( i < 0 or j < 0 ) return (T)0; 00196 else if( i >= h or j >= w ) return (T)0; 00197 else return img[i*w+j]; 00198 case clamp: 00199 _clamp c; 00200 return img[ c(i, h)*w + c(j, w) ]; 00201 case repeat: 00202 _repeat r; 00203 return img[ r(i, h)*w + r(j, w) ]; 00204 case mirror: 00205 _mirror m; 00206 return img[ m(i, h)*w + m(j, w) ]; 00207 } 00208 return (T)0; 00209 } 00210 00211 //============================================================================= 00212 } // namespace gpufilter 00213 //============================================================================= 00214 #endif // EXTENSION_H 00215 //=============================================================================