X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FmaracasVisuLib%2Fsrc%2Finterface%2FwxWindows%2Fwidgets%2FimageUndoRedo%2FimageUndoRedo.cxx;h=4e981c4e89e18d2bb35d4e7efd1be201636324db;hb=06b778a59d0c5109cf7626c76d2ee21e033f8c28;hp=8864148e34df0ea8c7962e50bd881635c88a5776;hpb=b37bd791f88bd4c1a6146fadcb88864d7cd1a5c3;p=creaMaracasVisu.git diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/imageUndoRedo.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/imageUndoRedo.cxx index 8864148..4e981c4 100755 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/imageUndoRedo.cxx +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/imageUndoRedo.cxx @@ -1,85 +1,185 @@ -/* - * imageUndoRedo.cxx - * - * Created on: Sep 26, 2011 - * Author: caceres +/*# --------------------------------------------------------------------- +# +# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image +# pour la Sant�) +# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton +# Previous Authors : Laurent Guigues, Jean-Pierre Roux +# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil +# +# This software is governed by the CeCILL-B license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL-B +# license as circulated by CEA, CNRS and INRIA at the following URL +# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +# or in the file LICENSE.txt. +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL-B license and that you accept its terms. +# ------------------------------------------------------------------------ */ + +/*! + * @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(); +// ---------------------------------------------------------------------------------- +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) +void ImageUndoRedo::Undo( ) +{ + ImageInfoUR* imageInfo = this->m_ImagesDeque->Undo( ); + if( imageInfo != NULL) { - this->SetRedoImage(imageInfo->GetRegion()); - this->DrawUR(imageInfo); + this->DrawUR( imageInfo, true ); + this->UpdateUndoImage( ); } } +// ---------------------------------------------------------------------------------- //virtual -void ImageUndoRedo::Redo() { - ImageInfoUR* imageInfo = this->m_ImagesDeque->Redo(); - this->DrawUR(imageInfo); +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->m_OriginalImage = VTKImageDataPointerType::New(); - this->m_OriginalImage->DeepCopy(m_CurrentImage); + +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + this->m_CurrentImage->Update( ); +#else + // .. +#endif + + this->UpdateUndoImage( ); } +// ---------------------------------------------------------------------------------- //virtual -void ImageUndoRedo::SetUndoImage(const RegionSType& region) { - VTKImageDataPointerType imgResult = this->GetImageRegion(region, - this->m_OriginalImage); - this->m_ImagesDeque->AddImageToUndoContainer(imgResult, region); +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; + } } -//virtual -void ImageUndoRedo::SetRedoImage(const RegionSType& region) { - VTKImageDataPointerType imgResult = this->GetImageRegion(region, - this->m_CurrentImage); - this->m_ImagesDeque->AddImageToRedoContainer(imgResult, region); +// ---------------------------------------------------------------------------------- +void ImageUndoRedo::UpdateUndoImage( ) +{ +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + this->m_CurrentImage->Update( ); +#else + // ... +#endif + this->m_UndoImage = VTKImageDataPointerType::New( ); + this->m_UndoImage->DeepCopy( m_CurrentImage ); +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + this->m_UndoImage->Update( ); +#else + // .. +#endif } - +// ---------------------------------------------------------------------------------- ImageUndoRedo::VTKImageDataPointerType ImageUndoRedo::GetImageRegion( - const RegionSType& region, VTKImageDataPointerType img) { - VTKExtractVOIPointerType extract = VTKExtractVOIPointerType::New(); - VTKImageDataPointerType imgResult = VTKImageDataPointerType::New(); - extract->SetVOI(region.minX, region.maxX, region.minY, region.maxY, - region.minZ, region.maxZ); - extract->SetSampleRate(1, 1, 1); - extract->SetInput(this->m_OriginalImage); - imgResult = extract->GetOutput(); - 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 ); +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + extract->SetInput( img ); +#else + extract->SetInputData( img ); +#endif + VTKImageDataPointerType imgResult = extract->GetOutput( ); -void ImageUndoRedo::SetOriginalImage(VTKImageDataPointerType img) { - this->m_OriginalImage = img; +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + imgResult->Update( ); +#else + // .. +#endif + + return ( imgResult ); } -void ImageUndoRedo::SetCurrentImage(VTKImageDataPointerType img) { +// ---------------------------------------------------------------------------------- +void ImageUndoRedo::SetCurrentImage( VTKImageDataPointerType img ) +{ this->m_CurrentImage = img; } +// ---------------------------------------------------------------------------------- //virtual -void ImageUndoRedo::DrawUR(ImageInfoUR* imageInfo) { - VTKImageDataPointerType img = imageInfo->GetImage(); - for (int i = imageInfo->GetRegion().minX, x = 0; - i <= imageInfo->GetRegion().maxX; i++, x++) { - for (int j = imageInfo->GetRegion().minY, y = 0; - j <= imageInfo->GetRegion().maxY; j++, y++) { - for (int k = imageInfo->GetRegion().minZ, z = 0; - k <= imageInfo->GetRegion().maxZ; k++, z++) { - float value = img->GetScalarComponentAsFloat(i, j, k, 0); - this->m_CurrentImage->SetScalarComponentFromFloat(i, j, k, 0, - value); - } //rof - } //rof - } //rof - this->m_CurrentImage->Modified(); +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( ); } - +// ----------------------------------------------------------------------------------