2 * @file imageUndoRedo.cxx
3 * @brief This file contains the implementation of the ImageUndoRedo class.
5 * @author Diego CACERES (diego.caceres[AT]creatis.insa-lyon.fr)
9 #include "imageUndoRedo.h"
11 // ----------------------------------------------------------------------------------
12 ImageUndoRedo::ImageUndoRedo( )
14 this->m_ImagesDeque = new IDequeType( );
16 // ----------------------------------------------------------------------------------
18 ImageUndoRedo::~ImageUndoRedo( )
22 // ----------------------------------------------------------------------------------
24 void ImageUndoRedo::Undo( )
26 ImageInfoUR* imageInfo = this->m_ImagesDeque->Undo( );
27 if( imageInfo != NULL)
29 this->DrawUR( imageInfo, true );
30 this->UpdateUndoImage( );
33 // ----------------------------------------------------------------------------------
35 void ImageUndoRedo::Redo( )
37 ImageInfoUR* imageInfo = this->m_ImagesDeque->Redo( );
38 if( imageInfo != NULL)
40 this->DrawUR( imageInfo, false );
41 this->UpdateUndoImage( );
44 // ----------------------------------------------------------------------------------
45 void ImageUndoRedo::SetImage( VTKImageDataPointerType image )
47 this->m_CurrentImage = image;
48 this->m_CurrentImage->Update( );
49 this->UpdateUndoImage( );
51 // ----------------------------------------------------------------------------------
53 void ImageUndoRedo::SetURImages( ImageMManagerType* imMManager )
55 ImageMManagerType* newImageManager = new ImageMManagerType( imMManager );
56 if( newImageManager->ValidateRegion( ) )
58 RegionSType region = newImageManager->GetModifiedRegion( );
59 VTKImageDataPointerType imgUndo = this->GetImageRegion( region,
61 VTKImageDataPointerType imgRedo = this->GetImageRegion( region,
62 this->m_CurrentImage );
63 this->m_ImagesDeque->AddImagesToURContainer( imgUndo, imgRedo,
65 this->UpdateUndoImage( );
69 std::cerr << "INVALID REGION" << std::endl;
72 // ----------------------------------------------------------------------------------
73 void ImageUndoRedo::UpdateUndoImage( )
75 this->m_CurrentImage->Update( );
76 this->m_UndoImage = VTKImageDataPointerType::New( );
77 this->m_UndoImage->DeepCopy( m_CurrentImage );
78 this->m_UndoImage->Update( );
80 // ----------------------------------------------------------------------------------
81 ImageUndoRedo::VTKImageDataPointerType ImageUndoRedo::GetImageRegion(
82 const RegionSType& region, VTKImageDataPointerType img )
84 VTKExtractVOIPointerType extract = VTKExtractVOIPointerType::New( );
85 extract->SetVOI( region.minX, region.maxX, region.minY, region.maxY,
86 region.minZ, region.maxZ );
87 extract->SetSampleRate( 1, 1, 1 );
88 extract->SetInput( img );
89 VTKImageDataPointerType imgResult = extract->GetOutput( );
93 // ----------------------------------------------------------------------------------
94 void ImageUndoRedo::SetCurrentImage( VTKImageDataPointerType img )
96 this->m_CurrentImage = img;
98 // ----------------------------------------------------------------------------------
100 void ImageUndoRedo::DrawUR( ImageInfoUR* imageInfo, const bool& undo )
102 VTKImageDataPointerType img;
105 img = imageInfo->GetUndoImage( );
109 img = imageInfo->GetRedoImage( );
111 RegionSType region = imageInfo->GetImageMManager( )->GetModifiedRegion( );
114 int *dim = img->GetDimensions( );
115 int sizeXImageIn = dim[ 0 ];
116 size_t linesize = sizeXImageIn * sizeof(unsigned short);
117 for( int j = region.minY, y = 0; j <= region.maxY; j++, y++ )
119 for( int k = region.minZ, z = 0; k <= region.maxZ; k++, z++ )
121 void* ptrsrc = img->GetScalarPointer( 0, y, z );
122 void* ptrdest = this->m_CurrentImage->GetScalarPointer(
124 memcpy( ptrdest, ptrsrc, linesize );
127 this->m_CurrentImage->Modified( );
129 this->m_ImagesDeque->ManageMemory( );
131 // ----------------------------------------------------------------------------------