00001 /* 00002 // 00003 // Copyright 2009-2010 SRI International 00004 // 00005 // This file is part of the Computational Morphometry Toolkit. 00006 // 00007 // http://www.nitrc.org/projects/cmtk/ 00008 // 00009 // The Computational Morphometry Toolkit is free software: you can 00010 // redistribute it and/or modify it under the terms of the GNU General Public 00011 // License as published by the Free Software Foundation, either version 3 of 00012 // the License, or (at your option) any later version. 00013 // 00014 // The Computational Morphometry Toolkit is distributed in the hope that it 00015 // will be useful, but WITHOUT ANY WARRANTY; without even the implied 00016 // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 // GNU General Public License for more details. 00018 // 00019 // You should have received a copy of the GNU General Public License along 00020 // with the Computational Morphometry Toolkit. If not, see 00021 // <http://www.gnu.org/licenses/>. 00022 // 00023 // $Revision: 2398 $ 00024 // 00025 // $LastChangedDate: 2010-10-05 14:54:37 -0700 (Tue, 05 Oct 2010) $ 00026 // 00027 // $LastChangedBy: torstenrohlfing $ 00028 // 00029 */ 00030 00031 #ifndef __cmtkImageOperationFlip_h_included_ 00032 #define __cmtkImageOperationFlip_h_included_ 00033 00034 #include <cmtkconfig.h> 00035 00036 #include <Base/cmtkImageOperation.h> 00037 00038 namespace 00039 cmtk 00040 { 00041 00043 class ImageOperationConvertType 00045 : public ImageOperation 00046 { 00047 public: 00049 ImageOperationConvertType( const cmtk::ScalarDataType newType ) : m_NewType( newType ) {} 00050 00052 virtual cmtk::UniformVolume::SmartPtr Apply( cmtk::UniformVolume::SmartPtr& volume ) 00053 { 00054 switch ( this->m_NewType ) 00055 { 00056 case cmtk::TYPE_CHAR: 00057 case cmtk::TYPE_BYTE: 00058 case cmtk::TYPE_SHORT: 00059 case cmtk::TYPE_USHORT: 00060 case cmtk::TYPE_INT: 00061 case cmtk::TYPE_FLOAT: 00062 case cmtk::TYPE_DOUBLE: 00063 if ( this->m_NewType != volume->GetData()->GetType() ) 00064 { 00065 volume->SetData( cmtk::TypedArray::SmartPtr( volume->GetData()->Convert( this->m_NewType ) ) ); 00066 } 00067 break; 00068 default: 00069 break; 00070 } 00071 return volume; 00072 } 00073 00075 static void NewChar() 00076 { 00077 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationConvertType( cmtk::TYPE_CHAR ) ) ); 00078 } 00079 00081 static void NewByte() 00082 { 00083 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationConvertType( cmtk::TYPE_BYTE ) ) ); 00084 } 00085 00087 static void NewShort() 00088 { 00089 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationConvertType( cmtk::TYPE_SHORT ) ) ); 00090 } 00091 00093 static void NewUShort() 00094 { 00095 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationConvertType( cmtk::TYPE_USHORT ) ) ); 00096 } 00097 00099 static void NewInt() 00100 { 00101 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationConvertType( cmtk::TYPE_INT ) ) ); 00102 } 00103 00105 static void NewFloat() 00106 { 00107 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationConvertType( cmtk::TYPE_FLOAT ) ) ); 00108 } 00109 00111 static void NewDouble() 00112 { 00113 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationConvertType( cmtk::TYPE_DOUBLE ) ) ); 00114 } 00115 00116 private: 00118 cmtk::ScalarDataType m_NewType; 00119 }; 00120 00122 class ImageOperationFlip 00124 : public ImageOperation 00125 { 00126 public: 00128 ImageOperationFlip( const int normalAxis ) : m_NormalAxis( normalAxis ) {} 00129 00131 virtual cmtk::UniformVolume::SmartPtr Apply( cmtk::UniformVolume::SmartPtr& volume ) 00132 { 00133 volume->ApplyMirrorPlane( this->m_NormalAxis ); 00134 return volume; 00135 } 00136 00138 static void NewX() 00139 { 00140 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationFlip( cmtk::AXIS_X ) ) ); 00141 } 00142 00144 static void NewY() 00145 { 00146 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationFlip( cmtk::AXIS_Y ) ) ); 00147 } 00148 00150 static void NewZ() 00151 { 00152 ImageOperation::m_ImageOperationList.push_back( SmartPtr( new ImageOperationFlip( cmtk::AXIS_Z ) ) ); 00153 } 00154 00155 private: 00157 int m_NormalAxis; 00158 }; 00159 00160 } // namespace cmtk 00161 00162 #endif // #ifndef __cmtkImageOperationFlip_h_included_