TuttleOFX  1
nearestNeighbor.hpp
Go to the documentation of this file.
00001 #ifndef _TERRY_SAMPLER_NEARESTNEIGHBOR_HPP_
00002 #define _TERRY_SAMPLER_NEARESTNEIGHBOR_HPP_
00003 
00004 #include "details.hpp"
00005 #include <terry/basic_colors.hpp>
00006 #include <iostream>
00007 
00008 namespace terry {
00009 using namespace boost::gil;
00010 namespace sampler {
00011 
00012 struct nearest_neighbor_sampler
00013 {
00014         const size_t _windowSize;
00015 
00016         nearest_neighbor_sampler() :
00017                 _windowSize ( 2.0 )
00018         {}
00019 
00020         /**
00021          * @brief Get weight for a specific distance, for nearest neighbor resampler.
00022          *
00023          * @param[in] distance between the pixels and the current pixel
00024          * @param[out] weight return value to weight the pixel in filtering
00025          */
00026         template<typename Weight>
00027         void operator()( const RESAMPLING_CORE_TYPE& distance, Weight& weight )
00028         {
00029                 if( distance > 0.5 || distance <= -0.5 )
00030                         weight = 0.0;
00031                 else
00032                         weight = 1.0;
00033         }
00034 };
00035 
00036 
00037 /*
00038 template <typename DstP, typename SrcView, typename F>
00039 bool sample( nearest_neighbor_sampler, const SrcView& src, const point2<F>& p, DstP& result, const EParamFilterOutOfImage outOfImageProcess )
00040 {
00041         typedef typename SrcView::value_type SrcP;
00042         point2<std::ptrdiff_t> center( iround( p ) );
00043 
00044         // if we are outside the image
00045         if( center.x < 0 )
00046         {
00047                 switch( outOfImageProcess )
00048                 {
00049                         case eParamFilterOutBlack :
00050                         {
00051                                 result = get_black<DstP>();
00052                                 return true;
00053                         }
00054                         case eParamFilterOutTransparency :
00055                         {
00056                                 result = SrcP(0);
00057                                 return true;
00058                         }
00059                         case eParamFilterOutCopy :
00060                         {
00061                                 center.x = 0.0;
00062                                 break;
00063                         }
00064                         case eParamFilterOutMirror :
00065                         {
00066                                 int value = ( - 1.0 * center.x / src.width() );
00067                                 int idx = center.x + value * src.width();
00068 
00069                                 if( value % 2 == 0 ) // even - mirrored image
00070                                 {
00071                                         center.x = - idx - 1.0;
00072                                         break;
00073                                 }
00074                                 else // odd - displaced image
00075                                 {
00076                                         center.x = src.width() - 1.0 + idx ;
00077                                         break;
00078                                 }
00079                         }
00080                 }
00081         }
00082         if( center.x > src.width() - 1.0 )
00083         {
00084                 switch( outOfImageProcess )
00085                 {
00086                         case eParamFilterOutBlack :
00087                         {
00088                                 result = get_black<DstP>();
00089                                 return true;
00090                         }
00091                         case eParamFilterOutTransparency :
00092                         {
00093                                 result = SrcP(0);
00094                                 return true;
00095                         }
00096                         case eParamFilterOutCopy :
00097                         {
00098                                 center.x = src.width() - 1.0;
00099                                 break;
00100                         }
00101                         case eParamFilterOutMirror :
00102                         {
00103                                 int value =  center.x / src.width();
00104                                 int idx = center.x - ( value + 1.0 ) * src.width();
00105 
00106                                 if( value % 2 == 0 ) // even - mirrored image
00107                                 {
00108                                         center.x = src.width() - 1.0 + idx ;
00109                                         break;
00110                                 }
00111                                 else // odd - displaced image
00112                                 {
00113                                         center.x = - idx - 1.0;
00114                                         break;
00115                                 }
00116                         }
00117                 }
00118         }
00119         if( center.y < 0 )
00120         {
00121                 switch( outOfImageProcess )
00122                 {
00123                         case eParamFilterOutBlack :
00124                         {
00125                                 result = get_black<DstP>();
00126                                 return true;
00127                         }
00128                         case eParamFilterOutTransparency :
00129                         {
00130                                 result = SrcP(0);
00131                                 return true;
00132                         }
00133                         case eParamFilterOutCopy :
00134                         {
00135                                 center.y = 0;
00136                                 break;
00137                         }
00138                         case eParamFilterOutMirror :
00139                         {
00140                                 int value = ( - 1.0 * center.y / src.height() );
00141                                 int idx = center.y + value * src.height();
00142 
00143                                 if( value % 2 == 0 ) // even - mirrored image
00144                                 {
00145                                         center.y = - idx - 1.0;
00146                                         break;
00147                                 }
00148                                 else // odd - displaced image
00149                                 {
00150                                         center.y = src.height() - 1.0 + idx ;
00151                                         break;
00152                                 }
00153                         }
00154                 }
00155         }
00156 
00157         if( center.y > src.height() - 1.0 )
00158         {
00159                 switch( outOfImageProcess )
00160                 {
00161                         case eParamFilterOutBlack :
00162                         {
00163                                 result = get_black<DstP>();
00164                                 return true;
00165                         }
00166                         case eParamFilterOutTransparency :
00167                         {
00168                                 result = SrcP(0);
00169                                 return true;
00170                         }
00171                         case eParamFilterOutCopy :
00172                         {
00173                                 center.y = src.height() - 1.0;
00174                                 break;
00175                         }
00176                         case eParamFilterOutMirror :
00177                         {
00178                                 int value =  center.y / src.height();
00179                                 int idx = center.y - ( value + 1.0 ) * src.height();
00180 
00181                                 if( value % 2 == 0 ) // even - mirrored image
00182                                 {
00183                                         center.y = src.height() - 1.0 + idx ;
00184                                         break;
00185                                 }
00186                                 else // odd - displaced image
00187                                 {
00188                                         center.y = - idx - 1.0;
00189                                         break;
00190                                 }
00191                         }
00192                 }
00193         }
00194 
00195         result = src( center.x, center.y );
00196         return true;
00197 }*/
00198 
00199 }
00200 }
00201 
00202 #endif
00203