ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkDefaultConvertPixelTraits_h 00019 #define __itkDefaultConvertPixelTraits_h 00020 00021 #include "itkOffset.h" 00022 #include "itkVector.h" 00023 #include "itkMatrix.h" 00024 #include "itkVariableLengthVector.h" 00025 00026 namespace itk 00027 { 00039 template< typename PixelType > 00040 class DefaultConvertPixelTraits 00041 { 00042 public: 00044 typedef typename PixelType::ComponentType ComponentType; 00045 00047 static unsigned int GetNumberOfComponents() 00048 { return PixelType::GetNumberOfComponents(); } 00049 00050 static unsigned int GetNumberOfComponents( const PixelType itkNotUsed(pixel) ) 00051 { return PixelType::GetNumberOfComponents( ); } 00052 00054 static ComponentType GetNthComponent(int c, const PixelType & pixel) 00055 { return pixel.GetNthComponent(c); } 00056 00058 static void SetNthComponent(int c, PixelType & pixel, const ComponentType & v) 00059 { pixel.SetNthComponent(c, v); } 00060 00062 static ComponentType GetScalarValue(const PixelType & pixel) 00063 { return pixel.GetScalarValue(); } 00064 }; 00066 00067 #define ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(type) \ 00068 template< > \ 00069 class DefaultConvertPixelTraits< type > \ 00070 { \ 00071 public: \ 00072 typedef type ComponentType; \ 00073 static unsigned int GetNumberOfComponents() \ 00074 { \ 00075 return 1; \ 00076 } \ 00077 static unsigned int GetNumberOfComponents(const type) \ 00078 { \ 00079 return 1; \ 00080 } \ 00081 static void SetNthComponent(int, type & pixel, const ComponentType &v) \ 00082 { \ 00083 pixel = v; \ 00084 } \ 00085 static type GetNthComponent(int, const type pixel) \ 00086 { \ 00087 return pixel; \ 00088 } \ 00089 static type GetScalarValue(const type &pixel) \ 00090 { \ 00091 return pixel; \ 00092 } \ 00093 }; 00094 00095 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(float) 00096 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(double) 00097 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(int) 00098 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(char) 00099 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(short) 00100 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned int) 00101 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(signed char) 00102 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned char) 00103 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned short) 00104 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(long) 00105 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned long) 00106 ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(bool) 00107 00108 #undef ITK_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL 00109 00110 // 00111 // Default traits for the Offset<> pixel type 00112 // 00113 00114 template<unsigned int VDimension> 00115 class DefaultConvertPixelTraits< Offset< VDimension > > 00116 { 00117 public: 00118 typedef Offset< VDimension > TargetType; 00119 typedef typename TargetType::OffsetValueType ComponentType; 00120 static unsigned int GetNumberOfComponents() 00121 { 00122 return VDimension; 00123 } 00124 static void SetNthComponent(int i, TargetType & pixel, const ComponentType &v) 00125 { 00126 pixel[i] = v; 00127 } 00128 static ComponentType GetScalarValue(const TargetType &pixel) 00129 { 00130 return pixel[0]; 00131 } 00132 }; 00133 00134 // 00135 // Default traits for the pixel types deriving from FixedArray<> 00136 // 00137 00138 #define ITK_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(type) \ 00139 template<typename TComponentType, unsigned VDimension > \ 00140 class DefaultConvertPixelTraits< type< TComponentType, VDimension > > \ 00141 { \ 00142 public: \ 00143 typedef type< TComponentType, VDimension > TargetType; \ 00144 typedef TComponentType ComponentType; \ 00145 static unsigned int GetNumberOfComponents() \ 00146 { \ 00147 return VDimension; \ 00148 } \ 00149 static unsigned int GetNumberOfComponents( const TargetType ) \ 00150 { \ 00151 return VDimension; \ 00152 } \ 00153 static void SetNthComponent(int i, TargetType & pixel, \ 00154 const ComponentType &v) \ 00155 { \ 00156 pixel[i] = v; \ 00157 } \ 00158 static ComponentType GetNthComponent(int i, const TargetType pixel) \ 00159 { \ 00160 return pixel[i]; \ 00161 } \ 00162 static ComponentType GetScalarValue(const TargetType &pixel) \ 00163 { \ 00164 return pixel[0]; \ 00165 } \ 00166 } \ 00167 00168 ITK_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(Vector); 00169 ITK_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(CovariantVector); 00170 ITK_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(Point); 00171 ITK_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(FixedArray); 00172 00173 // 00174 // End of Traits for the classes deriving from FixedArray. 00175 // 00176 // 00177 00178 // 00179 // Default traits for pixel types deriving from VariableLengthVector<> 00180 // 00181 template<typename VComponent> 00182 class DefaultConvertPixelTraits< VariableLengthVector< VComponent > > 00183 { 00184 public: 00185 typedef VariableLengthVector< VComponent > TargetType; 00186 typedef VComponent ComponentType; 00187 static unsigned int GetNumberOfComponents() 00188 { 00189 return 0; 00190 } 00191 static unsigned int GetNumberOfComponents( const TargetType pixel ) 00192 { 00193 return pixel.Size(); 00194 } 00195 static void SetNthComponent(int i, TargetType & pixel, 00196 const ComponentType &v) 00197 { 00198 pixel[i] = v; 00199 } 00200 static ComponentType GetNthComponent(int i, const TargetType & pixel) 00201 { 00202 return pixel[i]; 00203 } 00204 static ComponentType GetScalarValue(const TargetType &pixel) 00205 { 00206 return pixel.GetNorm(); 00207 } 00208 }; 00209 00210 00211 // 00212 // End of Traits for the classes deriving from FixedArray. 00213 // 00214 // 00215 00216 // 00217 // Default traits for the pixel types deriving from Matrix<> 00218 // 00219 00220 template<typename VComponent, unsigned VRows, unsigned VCols > 00221 class DefaultConvertPixelTraits< Matrix< VComponent, VRows, VCols > > 00222 { 00223 public: 00224 typedef Matrix< VComponent, VRows, VCols > TargetType; 00225 typedef VComponent ComponentType; 00226 static unsigned int GetNumberOfComponents() 00227 { 00228 return VRows * VCols; 00229 } 00230 static void SetNthComponent(int i, TargetType & pixel, 00231 const ComponentType &v) 00232 { 00233 const unsigned int row = i / VCols; 00234 const unsigned int col = i % VCols; 00235 pixel[row][col] = v; 00236 } 00237 static ComponentType GetScalarValue(const TargetType &pixel) 00238 { 00239 return pixel[0][0]; 00240 } 00241 }; 00242 00243 // 00244 // Default traits for the pixel types deriving from std::complex<> 00245 // 00246 00247 template<typename TComponent > 00248 class DefaultConvertPixelTraits< ::std::complex< TComponent > > 00249 { 00250 public: 00251 typedef::std::complex< TComponent > TargetType; 00252 typedef TComponent ComponentType; 00253 static unsigned int GetNumberOfComponents() 00254 { 00255 return 2; 00256 } 00257 static void SetNthComponent(int i, TargetType & pixel, const ComponentType &v) 00258 { 00259 if ( i == 0 ) 00260 { 00261 pixel = TargetType( v, pixel.imag() ); 00262 } 00263 else 00264 { 00265 pixel = TargetType(pixel.real(), v); 00266 } 00267 } 00268 static ComponentType GetScalarValue(const TargetType &pixel) 00269 { 00270 return std::norm(pixel); 00271 } 00272 }; 00273 00274 00275 // 00276 // End of Traits for the classes deriving from std::complex. 00277 // 00278 // 00279 } // end namespace itk 00280 #endif 00281