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)56 void 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()70 vtkImageReader2Factory::vtkImageReader2Factory()
71 {
72 }
73 
~vtkImageReader2Factory()74 vtkImageReader2Factory::~vtkImageReader2Factory()
75 {
76 }
77 
RegisterReader(vtkImageReader2 * r)78 void vtkImageReader2Factory::RegisterReader(vtkImageReader2* r)
79 {
80   vtkImageReader2Factory::InitializeReaders();
81   AvailableReaders->AddItem(r);
82 }
83 
84 
CreateImageReader2(const char * path)85 vtkImageReader2* 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()122 void 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)158 void 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