TuttleOFX
1
|
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