From: Diego Caceres Date: Tue, 29 Nov 2011 15:27:48 +0000 (+0000) Subject: DFCH: undo/redo image paint algorithm optimized =) X-Git-Tag: v1.0.4~36 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=f29cb8ab22a8fa3befdefa314bb4c58d9e827e16;p=creaMaracasVisu.git DFCH: undo/redo image paint algorithm optimized =) --- diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/imageUndoRedo.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/imageUndoRedo.cxx index 7672f4e..d49b1b2 100755 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/imageUndoRedo.cxx +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/imageUndoRedo.cxx @@ -9,101 +9,123 @@ #include "imageUndoRedo.h" // ---------------------------------------------------------------------------------- -ImageUndoRedo::ImageUndoRedo() { - this->m_ImagesDeque = new IDequeType(); +ImageUndoRedo::ImageUndoRedo( ) +{ + this->m_ImagesDeque = new IDequeType( ); } // ---------------------------------------------------------------------------------- //virtual -ImageUndoRedo::~ImageUndoRedo() { +ImageUndoRedo::~ImageUndoRedo( ) +{ } // ---------------------------------------------------------------------------------- //virtual -void ImageUndoRedo::Undo() { - ImageInfoUR* imageInfo = this->m_ImagesDeque->Undo(); - if (imageInfo != NULL) { - this->DrawUR(imageInfo, true); - this->UpdateUndoImage(); +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::Redo( ) +{ + ImageInfoUR* imageInfo = this->m_ImagesDeque->Redo( ); + if( imageInfo != NULL) + { + this->DrawUR( imageInfo, false ); + this->UpdateUndoImage( ); } } // ---------------------------------------------------------------------------------- -void ImageUndoRedo::SetImage(VTKImageDataPointerType image) { +void ImageUndoRedo::SetImage( VTKImageDataPointerType image ) +{ this->m_CurrentImage = image; - this->m_CurrentImage->Update(); - this->UpdateUndoImage(); + 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 { +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(); +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); + 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) { +void ImageUndoRedo::SetCurrentImage( VTKImageDataPointerType img ) +{ this->m_CurrentImage = img; } // ---------------------------------------------------------------------------------- //virtual -void ImageUndoRedo::DrawUR(ImageInfoUR* imageInfo, const bool& undo) { +void ImageUndoRedo::DrawUR( ImageInfoUR* imageInfo, const bool& undo ) +{ VTKImageDataPointerType img; - if (undo) { - img = imageInfo->GetUndoImage(); + if( undo ) + { + img = imageInfo->GetUndoImage( ); } //fi - else { - img = imageInfo->GetRedoImage(); + else + { + img = imageInfo->GetRedoImage( ); } //else - RegionSType region = imageInfo->GetImageMManager()->GetModifiedRegion(); - if (img != NULL) { - for (int i = region.minX, x = 0; i <= region.maxX; i++, x++) { - for (int j = region.minY, y = 0; j <= region.maxY; j++, y++) { - for (int k = region.minZ, z = 0; k <= region.maxZ; k++, z++) { - float value = img->GetScalarComponentAsFloat(x, y, z, 0); - this->m_CurrentImage->SetScalarComponentFromFloat(i, j, k, - 0, value); - } //rof - } //rof - } //rof - this->m_CurrentImage->Modified(); + 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(); + this->m_ImagesDeque->ManageMemory( ); } // ----------------------------------------------------------------------------------