]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/imageUndoRedo.cxx
d49b1b21d2e980660400992d2b84cd30d8182835
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / imageUndoRedo / imageUndoRedo.cxx
1 /*!
2  * @file        imageUndoRedo.cxx
3  * @brief       This file contains the implementation of the ImageUndoRedo class.
4  * @author      Info-Dev
5  * @author      Diego CACERES (diego.caceres[AT]creatis.insa-lyon.fr)
6  * @date        2011-11-15
7  */
8
9 #include "imageUndoRedo.h"
10
11 // ----------------------------------------------------------------------------------
12 ImageUndoRedo::ImageUndoRedo( )
13 {
14         this->m_ImagesDeque = new IDequeType( );
15 }
16 // ----------------------------------------------------------------------------------
17 //virtual
18 ImageUndoRedo::~ImageUndoRedo( )
19 {
20
21 }
22 // ----------------------------------------------------------------------------------
23 //virtual
24 void ImageUndoRedo::Undo( )
25 {
26         ImageInfoUR* imageInfo = this->m_ImagesDeque->Undo( );
27         if( imageInfo != NULL)
28         {
29                 this->DrawUR( imageInfo, true );
30                 this->UpdateUndoImage( );
31         }
32 }
33 // ----------------------------------------------------------------------------------
34 //virtual
35 void ImageUndoRedo::Redo( )
36 {
37         ImageInfoUR* imageInfo = this->m_ImagesDeque->Redo( );
38         if( imageInfo != NULL)
39         {
40                 this->DrawUR( imageInfo, false );
41                 this->UpdateUndoImage( );
42         }
43 }
44 // ----------------------------------------------------------------------------------
45 void ImageUndoRedo::SetImage( VTKImageDataPointerType image )
46 {
47         this->m_CurrentImage = image;
48         this->m_CurrentImage->Update( );
49         this->UpdateUndoImage( );
50 }
51 // ----------------------------------------------------------------------------------
52 //virtual
53 void ImageUndoRedo::SetURImages( ImageMManagerType* imMManager )
54 {
55         ImageMManagerType* newImageManager = new ImageMManagerType( imMManager );
56         if( newImageManager->ValidateRegion( ) )
57         {
58                 RegionSType region = newImageManager->GetModifiedRegion( );
59                 VTKImageDataPointerType imgUndo = this->GetImageRegion( region,
60                         this->m_UndoImage );
61                 VTKImageDataPointerType imgRedo = this->GetImageRegion( region,
62                         this->m_CurrentImage );
63                 this->m_ImagesDeque->AddImagesToURContainer( imgUndo, imgRedo,
64                         newImageManager );
65                 this->UpdateUndoImage( );
66         }
67         else
68         {
69                 std::cerr << "INVALID REGION" << std::endl;
70         }
71 }
72 // ----------------------------------------------------------------------------------
73 void ImageUndoRedo::UpdateUndoImage( )
74 {
75         this->m_CurrentImage->Update( );
76         this->m_UndoImage = VTKImageDataPointerType::New( );
77         this->m_UndoImage->DeepCopy( m_CurrentImage );
78         this->m_UndoImage->Update( );
79 }
80 // ----------------------------------------------------------------------------------
81 ImageUndoRedo::VTKImageDataPointerType ImageUndoRedo::GetImageRegion(
82         const RegionSType& region, VTKImageDataPointerType img )
83 {
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( );
90         imgResult->Update( );
91         return ( imgResult );
92 }
93 // ----------------------------------------------------------------------------------
94 void ImageUndoRedo::SetCurrentImage( VTKImageDataPointerType img )
95 {
96         this->m_CurrentImage = img;
97 }
98 // ----------------------------------------------------------------------------------
99 //virtual
100 void ImageUndoRedo::DrawUR( ImageInfoUR* imageInfo, const bool& undo )
101 {
102         VTKImageDataPointerType img;
103         if( undo )
104         {
105                 img = imageInfo->GetUndoImage( );
106         } //fi
107         else
108         {
109                 img = imageInfo->GetRedoImage( );
110         } //else
111         RegionSType region = imageInfo->GetImageMManager( )->GetModifiedRegion( );
112         if( img != NULL)
113         {
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++ )
118                 {
119                         for( int k = region.minZ, z = 0; k <= region.maxZ; k++, z++ )
120                         {
121                                 void* ptrsrc = img->GetScalarPointer( 0, y, z );
122                                 void* ptrdest = this->m_CurrentImage->GetScalarPointer(
123                                         region.minX, j, k );
124                                 memcpy( ptrdest, ptrsrc, linesize );
125                         }
126                 }
127                 this->m_CurrentImage->Modified( );
128         }
129         this->m_ImagesDeque->ManageMemory( );
130 }
131 // ----------------------------------------------------------------------------------