1 /*========================================================================= 2 3 Program: Visualization Toolkit 4 Module: vtkImageReader2Factory.cxx 5 6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 7 All rights reserved. 8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 9 10 This software is distributed WITHOUT ANY WARRANTY; without even 11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 12 PURPOSE. See the above copyright notice for more information. 13 14 =========================================================================*/ 15 #include "vtkImageReader2Factory.h" 16 17 #include "vtkBMPReader.h" 18 #include "vtkGESignaReader.h" 19 #include "vtkImageReader2.h" 20 #include "vtkImageReader2Collection.h" 21 #include "vtkJPEGReader.h" 22 #include "vtkObjectFactory.h" 23 #include "vtkObjectFactoryCollection.h" 24 #include "vtkPNGReader.h" 25 #include "vtkPNMReader.h" 26 #include "vtkSLCReader.h" 27 #include "vtkTIFFReader.h" 28 #include "vtkMetaImageReader.h" 29 30 // Destroying the prototype readers requires information keys. 31 // Include the manager here to make sure the keys are not destroyed 32 // until after the AvailableReaders singleton has been destroyed. 33 #include "vtkFilteringInformationKeyManager.h" 34 35 vtkStandardNewMacro(vtkImageReader2Factory); 36 37 class vtkImageReader2FactoryCleanup 38 { 39 public: Use()40 inline void Use() 41 { 42 } ~vtkImageReader2FactoryCleanup()43 ~vtkImageReader2FactoryCleanup() 44 { 45 if(vtkImageReader2Factory::AvailableReaders) 46 { 47 vtkImageReader2Factory::AvailableReaders->Delete(); 48 vtkImageReader2Factory::AvailableReaders = 0; 49 } 50 } 51 }; 52 static vtkImageReader2FactoryCleanup vtkImageReader2FactoryCleanupGlobal; 53 54 vtkImageReader2Collection* vtkImageReader2Factory::AvailableReaders; 55 PrintSelf(ostream & os,vtkIndent indent)56void vtkImageReader2Factory::PrintSelf(ostream& os, vtkIndent indent) 57 { 58 this->Superclass::PrintSelf(os, indent); 59 os << indent << "Available Readers : "; 60 if(AvailableReaders) 61 { 62 AvailableReaders->PrintSelf(os, indent); 63 } 64 else 65 { 66 os << "None."; 67 } 68 } 69 vtkImageReader2Factory()70vtkImageReader2Factory::vtkImageReader2Factory() 71 { 72 } 73 ~vtkImageReader2Factory()74vtkImageReader2Factory::~vtkImageReader2Factory() 75 { 76 } 77 RegisterReader(vtkImageReader2 * r)78void vtkImageReader2Factory::RegisterReader(vtkImageReader2* r) 79 { 80 vtkImageReader2Factory::InitializeReaders(); 81 AvailableReaders->AddItem(r); 82 } 83 84 CreateImageReader2(const char * path)85vtkImageReader2* vtkImageReader2Factory::CreateImageReader2(const char* path) 86 { 87 vtkImageReader2Factory::InitializeReaders(); 88 vtkImageReader2* ret; 89 vtkCollection* collection = vtkCollection::New(); 90 vtkObjectFactory::CreateAllInstance("vtkImageReaderObject", 91 collection); 92 vtkObject* o; 93 // first try the current registered object factories to see 94 // if one of them can 95 for(collection->InitTraversal(); (o = collection->GetNextItemAsObject()); ) 96 { 97 if(o) 98 { 99 ret = vtkImageReader2::SafeDownCast(o); 100 if(ret && ret->CanReadFile(path)) 101 { 102 return ret; 103 } 104 } 105 } 106 // get rid of the collection 107 collection->Delete(); 108 vtkCollectionSimpleIterator sit; 109 for(vtkImageReader2Factory::AvailableReaders->InitTraversal(sit); 110 (ret = vtkImageReader2Factory::AvailableReaders->GetNextImageReader2(sit));) 111 { 112 if(ret->CanReadFile(path)) 113 { 114 // like a new call 115 return ret->NewInstance(); 116 } 117 } 118 return 0; 119 } 120 121 InitializeReaders()122void vtkImageReader2Factory::InitializeReaders() 123 { 124 if(vtkImageReader2Factory::AvailableReaders) 125 { 126 return; 127 } 128 vtkImageReader2FactoryCleanupGlobal.Use(); 129 vtkImageReader2Factory::AvailableReaders = vtkImageReader2Collection::New(); 130 vtkImageReader2* reader; 131 132 vtkImageReader2Factory::AvailableReaders-> 133 AddItem((reader = vtkPNGReader::New())); 134 reader->Delete(); 135 vtkImageReader2Factory::AvailableReaders-> 136 AddItem((reader = vtkPNMReader::New())); 137 reader->Delete(); 138 vtkImageReader2Factory::AvailableReaders-> 139 AddItem((reader = vtkTIFFReader::New())); 140 reader->Delete(); 141 vtkImageReader2Factory::AvailableReaders-> 142 AddItem((reader = vtkBMPReader::New())); 143 reader->Delete(); 144 vtkImageReader2Factory::AvailableReaders-> 145 AddItem((reader = vtkSLCReader::New())); 146 reader->Delete(); 147 vtkImageReader2Factory::AvailableReaders-> 148 AddItem((reader = vtkJPEGReader::New())); 149 reader->Delete(); 150 vtkImageReader2Factory::AvailableReaders-> 151 AddItem((reader = vtkGESignaReader::New())); 152 reader->Delete(); 153 vtkImageReader2Factory::AvailableReaders-> 154 AddItem((reader = vtkMetaImageReader::New())); 155 reader->Delete(); 156 } 157 GetRegisteredReaders(vtkImageReader2Collection * collection)158void vtkImageReader2Factory::GetRegisteredReaders(vtkImageReader2Collection* collection) 159 { 160 vtkImageReader2Factory::InitializeReaders(); 161 // get all dynamic readers 162 vtkObjectFactory::CreateAllInstance("vtkImageReaderObject", 163 collection); 164 // get the current registered readers 165 vtkImageReader2* ret; 166 vtkCollectionSimpleIterator sit; 167 for(vtkImageReader2Factory::AvailableReaders->InitTraversal(sit); 168 (ret = vtkImageReader2Factory::AvailableReaders->GetNextImageReader2(sit));) 169 { 170 collection->AddItem(ret); 171 } 172 } 173 174 175