]> Creatis software - creaMaracasVisu.git/blobdiff - lib/maracasVisuLib/src/interface/wxWindows/widgets/OpenImageDialog.cxx
v1.0.3 BUG 1404
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / OpenImageDialog.cxx
index 88ebdd363493988a80a2a33ca16b8ad48f556e05..4a1038a684d43d68e2e8339f558e346dcda21f50 100644 (file)
 #include "OpenImageDialog.h"
 #include "creaWx.h"
 
+#if defined(__GNUC__)
+// GCC compiler
+// dlopen, dlsym, etc.
+  #include <dlfcn.h>
+#endif
+
 typedef vtkImageData* (*GETIMAGEDATADIALOG)();
 
 namespace creaMaracasVisuKernel{
-       OpenImageDialog::OpenImageDialog()
+       OpenImageDialog::OpenImageDialog(bool usegimmick)
        {
-               img = NULL;
-               bool gimmicknotfound = true;
+               img = NULL;             
+               _filename = "";
+               bool gimmickfound = false;
 
-       #ifdef WIN32
-               HINSTANCE gimmickhandle;
-               gimmickhandle = LoadLibrary(TEXT("creaImageIO2.dll"));
-               std::cout<<"imagehandle "<<gimmickhandle<<std::endl;
-               if(gimmickhandle!=NULL){
+               if(usegimmick){
+               #ifdef WIN32
+                       HINSTANCE gimmickhandle;
+                       gimmickhandle = LoadLibrary(TEXT("creaImageIO.dll"));
+                       std::cout<<"imagehandle "<<gimmickhandle<<std::endl;
+                       if(gimmickhandle!=NULL){
 
-                       GETIMAGEDATADIALOG getImageDataDialog;
+                               GETIMAGEDATADIALOG getImageDataDialog;
 
-                       getImageDataDialog = (GETIMAGEDATADIALOG)GetProcAddress(gimmickhandle, "getImageDataDialog");
+                               getImageDataDialog = (GETIMAGEDATADIALOG)GetProcAddress(gimmickhandle, "getImageDataDialog");
 
-                       std::cout<<"imagedatadialog "<<getImageDataDialog<<std::endl;
+                               std::cout<<"imagedatadialog "<<getImageDataDialog<<std::endl;
 
-                       if(getImageDataDialog!=NULL){
-                               img = getImageDataDialog();
-                               gimmicknotfound = false;
+                               if(getImageDataDialog!=NULL){
+                                       img = getImageDataDialog();
+                                       gimmickfound = true;
+                               }
+                               if(!FreeLibrary(gimmickhandle)){
+                                       std::cout<<"Error while releasing the handle creaImageIO2.dll"<<std::endl;
+                               }
+                       }
+               #else
+                       void * gimmickhandle;   
+                       GETIMAGEDATADIALOG getImageDataDialog;
+                       char * erreur;
+                       int closingerror;
+                       gimmickhandle = dlopen ("libcreaImageIO.so", RTLD_LAZY);                        
+                       if (! gimmickhandle) {
+                               erreur = dlerror ();
+                               std::cout<<erreur<<"imagehandle "<<gimmickhandle<<std::endl;                
+                       }else{
+                               getImageDataDialog = (GETIMAGEDATADIALOG) dlsym (gimmickhandle, "getImageDataDialog");
+                               if(!getImageDataDialog){
+                               erreur = dlerror ();
+                               std::cout<<erreur<<"getImageDataDialog "<<getImageDataDialog<<std::endl;                        
+                               }else{
+                                       img = (*getImageDataDialog)();
+                                       gimmickfound = true;
+                                       
+                               }
+                               /*dlclose returns 0 on success, non-zero on error*/
+                               closingerror = dlclose(gimmickhandle);
+                               if(closingerror!=0){
+                                       std::cout<<closingerror<<"error closing handle  "<<gimmickhandle<<std::endl;  
+                               }else{
+                                       std::cout<<"handle released..."<<std::endl;  
+                               }
                        }
-               }
-
-       #endif
-
-               if(gimmicknotfound){
 
+               #endif
+               }
+               
+               if(!gimmickfound || !usegimmick){
+                       //int i, j, k, extint[6];
+                       //double spacing[3];
+                       //unsigned short* ptr1, *ptr2;
                        wxFileDialog* FD =
                          new wxFileDialog( 0, _T("Read Image"),wxEmptyString,wxEmptyString, _T("*.mhd"));
 
                        if (FD->ShowModal()==wxID_OK)
                        {
                                std::string  path= crea::wx2std(FD->GetPath());
-
-                               vtkMetaImageReader *reader =  vtkMetaImageReader::New();
+                               vtkMetaImageReader* reader =  vtkMetaImageReader::New();
                                reader->SetFileName(path.c_str());
-                               img = reader->GetOutput();
+                               reader->Update();
+                               _filename = path;
+                               img = vtkImageData::New();
+                               img->DeepCopy(reader->GetOutput());
+                               //reader->GetOutput()->Delete();
+                               reader->Delete();
+                               /*std::cout<<"image reference count "<<img->GetReferenceCount()<<std::endl;
+                               reader->GetOutput()->GetSpacing(spacing);
+                               img->SetSpacing(spacing);
+                               reader->GetOutput()->GetExtent(extint);
+                               img->SetExtent(extint);
+                               img->SetScalarType(reader->GetOutput()->GetScalarType());                               
+                               img->AllocateScalars();
+                               std::cout<<"image reference count "<<img->GetReferenceCount()<<std::endl;
+                               for (i=extint[0];i <= extint[1];i++){
+                                       for (j=extint[2];j<=extint[3];j++){
+                                               for (k=extint[4];k<=extint[5];k++){
+                                                       
+                                                               ptr1=(unsigned short*) reader->GetOutput()->GetScalarPointer(i,j,k); 
+                                                               ptr2=(unsigned short*)img->GetScalarPointer(i,j,k);
+                                                               *ptr2 = *ptr1;
+                                               }
+                                       }
+                               }*/
+                               
+                               /*std::cout<<"image reference count "<<img->GetReferenceCount()<<std::endl;*/
                        }
+                       //delete FD;
                }
        }
 
        //-------------------------------------------------------------------
        OpenImageDialog::~OpenImageDialog()
        {
+               img = NULL;
        }
 
-       vtkImageData* OpenImageDialog::getImageData(){
+       vtkImageData* OpenImageDialog::getImageData(){          
                return img;
        }
+       std::string OpenImageDialog::getFilename(){
+               return _filename;
+       }
 }