/*! * @file imageUndoRedo.cxx * @brief This file contains the implementation of the ImageUndoRedo class. * @author Info-Dev * @author Diego CACERES (diego.caceres[AT]creatis.insa-lyon.fr) * @date 2011-11-15 */ #include "imageUndoRedo.h" // ---------------------------------------------------------------------------------- ImageUndoRedo::ImageUndoRedo( ) { this->m_ImagesDeque = new IDequeType( ); } // ---------------------------------------------------------------------------------- //virtual ImageUndoRedo::~ImageUndoRedo( ) { } // ---------------------------------------------------------------------------------- //virtual void ImageUndoRedo::Undo( ) { ImageInfoUR* imageInfo = this->m_ImagesDeque->Undo( ); if( imageInfo != NULL) { this->DrawUR( imageInfo, true ); this->UpdateUndoImage( ); } } // ---------------------------------------------------------------------------------- //virtual void ImageUndoRedo::Redo( ) { ImageInfoUR* imageInfo = this->m_ImagesDeque->Redo( ); if( imageInfo != NULL) { this->DrawUR( imageInfo, false ); this->UpdateUndoImage( ); } } // ---------------------------------------------------------------------------------- void ImageUndoRedo::SetImage( VTKImageDataPointerType image ) { this->m_CurrentImage = image; this->m_CurrentImage->Update( ); this->UpdateUndoImage( ); } // ---------------------------------------------------------------------------------- //virtual void ImageUndoRedo::SetURImages( ImageMManagerType* imMManager ) { ImageMManagerType* newImageManager = new ImageMManagerType( imMManager ); if( newImageManager->ValidateRegion( ) ) { RegionSType region = newImageManager->GetModifiedRegion( ); VTKImageDataPointerType imgUndo = this->GetImageRegion( region, this->m_UndoImage ); VTKImageDataPointerType imgRedo = this->GetImageRegion( region, this->m_CurrentImage ); this->m_ImagesDeque->AddImagesToURContainer( imgUndo, imgRedo, newImageManager ); this->UpdateUndoImage( ); } else { std::cerr << "INVALID REGION" << std::endl; } } // ---------------------------------------------------------------------------------- void ImageUndoRedo::UpdateUndoImage( ) { this->m_CurrentImage->Update( ); this->m_UndoImage = VTKImageDataPointerType::New( ); this->m_UndoImage->DeepCopy( m_CurrentImage ); this->m_UndoImage->Update( ); } // ---------------------------------------------------------------------------------- ImageUndoRedo::VTKImageDataPointerType ImageUndoRedo::GetImageRegion( const RegionSType& region, VTKImageDataPointerType img ) { VTKExtractVOIPointerType extract = VTKExtractVOIPointerType::New( ); extract->SetVOI( region.minX, region.maxX, region.minY, region.maxY, region.minZ, region.maxZ ); extract->SetSampleRate( 1, 1, 1 ); extract->SetInput( img ); VTKImageDataPointerType imgResult = extract->GetOutput( ); imgResult->Update( ); return ( imgResult ); } // ---------------------------------------------------------------------------------- void ImageUndoRedo::SetCurrentImage( VTKImageDataPointerType img ) { this->m_CurrentImage = img; } // ---------------------------------------------------------------------------------- //virtual void ImageUndoRedo::DrawUR( ImageInfoUR* imageInfo, const bool& undo ) { VTKImageDataPointerType img; if( undo ) { img = imageInfo->GetUndoImage( ); } //fi else { img = imageInfo->GetRedoImage( ); } //else RegionSType region = imageInfo->GetImageMManager( )->GetModifiedRegion( ); if( img != NULL) { int *dim = img->GetDimensions( ); int sizeXImageIn = dim[ 0 ]; size_t linesize = sizeXImageIn * sizeof(unsigned short); for( int j = region.minY, y = 0; j <= region.maxY; j++, y++ ) { for( int k = region.minZ, z = 0; k <= region.maxZ; k++, z++ ) { void* ptrsrc = img->GetScalarPointer( 0, y, z ); void* ptrdest = this->m_CurrentImage->GetScalarPointer( region.minX, j, k ); memcpy( ptrdest, ptrsrc, linesize ); } } this->m_CurrentImage->Modified( ); } this->m_ImagesDeque->ManageMemory( ); } // ----------------------------------------------------------------------------------