gpufilter
GPU-Efficient Recursive Filtering and Summed-Area Tables
include/extension.h
Go to the documentation of this file.
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 //=============================================================================