1 //*******************************************************************
2 //
3 // License: See top level LICENSE.txt file.
4 //
5 // Author: Garrett Potts (gpotts@imagelinks)
6 // Description:
7 //
8 //*************************************************************************
9 // $Id: ossimImageSourceHistogramFilter.cpp 13312 2008-07-27 01:26:52Z gpotts $
10 #include <ossim/imaging/ossimImageSourceHistogramFilter.h>
11 #include <ossim/base/ossimHistogramSource.h>
12 #include <ossim/base/ossimMultiResLevelHistogram.h>
13 #include <ossim/base/ossimMultiBandHistogram.h>
14 #include <ossim/base/ossimHistogram.h>
15 #include <ossim/base/ossimCommon.h>
16 #include <ossim/imaging/ossimImageData.h>
17 #include <ossim/base/ossimKeyword.h>
18 #include <ossim/base/ossimKeywordlist.h>
19
20 using namespace std;
21
22 static const ossimKeyword PROPRIETARY_FILENAME_KW("proprietary_filename",
23 "imports a proprietary file");
24
25 static const ossimKeyword HISTOGRAM_FILENAME_KW("histogram_filename",
26 "read an OSSIM histogram file");
27
28
29 RTTI_DEF1(ossimImageSourceHistogramFilter, "ossimImageSourceHistogramFilter", ossimImageSourceFilter)
30
ossimImageSourceHistogramFilter()31 ossimImageSourceHistogramFilter::ossimImageSourceHistogramFilter()
32 :ossimImageSourceFilter(),
33 theCurrentResLevel(0),
34 theHistogram(NULL),
35 theFilename("")
36 {
37 setNumberOfInputs(2);
38 theInputListIsFixedFlag = true;
39 }
40
ossimImageSourceHistogramFilter(ossimImageSource * inputSource,ossimRefPtr<ossimMultiResLevelHistogram> histogram)41 ossimImageSourceHistogramFilter::ossimImageSourceHistogramFilter(ossimImageSource* inputSource,
42 ossimRefPtr<ossimMultiResLevelHistogram> histogram)
43 : ossimImageSourceFilter(inputSource),
44 theCurrentResLevel(0),
45 theHistogram(histogram),
46 theFilename("")
47 {
48 setNumberOfInputs(2);
49 theInputListIsFixedFlag = true;
50 }
51
~ossimImageSourceHistogramFilter()52 ossimImageSourceHistogramFilter::~ossimImageSourceHistogramFilter()
53 {
54 }
55
56
setHistogram(ossimRefPtr<ossimMultiResLevelHistogram> histogram)57 void ossimImageSourceHistogramFilter::setHistogram(ossimRefPtr<ossimMultiResLevelHistogram> histogram)
58 {
59 theHistogram = histogram;
60
61 if(theHistogram.valid())
62 {
63 theHistogram->setBinCount(0, 0);
64 }
65 }
66
setHistogram(const ossimFilename & filename)67 bool ossimImageSourceHistogramFilter::setHistogram(const ossimFilename& filename)
68 {
69 ossimRefPtr<ossimMultiResLevelHistogram> histogram = new ossimMultiResLevelHistogram;
70
71 bool result = histogram->importHistogram(filename);
72
73 if(result)
74 {
75 theFilename = filename;
76 setHistogram(histogram);
77 }
78
79 return result;
80 }
81
getHistogram()82 ossimRefPtr<ossimMultiResLevelHistogram> ossimImageSourceHistogramFilter::getHistogram()
83 {
84 if(!getInput(1))
85 {
86 return theHistogram;
87 }
88 else
89 {
90 ossimHistogramSource* histoSource = PTR_CAST(ossimHistogramSource, getInput(1));
91 if(histoSource)
92 {
93 return histoSource->getHistogram();
94 }
95 }
96
97 return (ossimMultiResLevelHistogram*)0;
98 }
99
getHistogram() const100 const ossimRefPtr<ossimMultiResLevelHistogram> ossimImageSourceHistogramFilter::getHistogram()const
101 {
102 if(!getInput(1))
103 {
104 return theHistogram;
105 }
106 else
107 {
108 ossimHistogramSource* histoSource = PTR_CAST(ossimHistogramSource, getInput(1));
109 if(histoSource)
110 {
111 return histoSource->getHistogram();
112 }
113 }
114
115 return (ossimMultiResLevelHistogram*)0;
116 }
117
canConnectMyInputTo(ossim_int32 inputIndex,const ossimConnectableObject * object) const118 bool ossimImageSourceHistogramFilter::canConnectMyInputTo(ossim_int32 inputIndex,
119 const ossimConnectableObject* object)const
120 {
121 if(object)
122 {
123 if(PTR_CAST(ossimImageSource, object) && ( inputIndex == 0 ))
124 {
125 return true;
126 }
127 else if(PTR_CAST(ossimHistogramSource, object) && ( inputIndex == 1 ))
128 {
129 return true;
130 }
131 }
132
133 return false;
134 }
135
connectInputEvent(ossimConnectionEvent & event)136 void ossimImageSourceHistogramFilter::connectInputEvent(ossimConnectionEvent& event)
137 {
138 theInputConnection = PTR_CAST(ossimImageSource, getInput(0));
139 if(PTR_CAST(ossimHistogramSource, event.getNewObject()))
140 {
141 // only initialize if it's a new object
142 initialize();
143 }
144 }
145
saveState(ossimKeywordlist & kwl,const char * prefix) const146 bool ossimImageSourceHistogramFilter::saveState(ossimKeywordlist& kwl,
147 const char* prefix)const
148 {
149 bool result = ossimImageSourceFilter::saveState(kwl, prefix);
150
151 kwl.add(prefix,
152 HISTOGRAM_FILENAME_KW,
153 theFilename,
154 true);
155
156 return result;
157 }
158
loadState(const ossimKeywordlist & kwl,const char * prefix)159 bool ossimImageSourceHistogramFilter::loadState(const ossimKeywordlist& kwl,
160 const char* prefix)
161 {
162 const char* proprietaryName = kwl.find(prefix, PROPRIETARY_FILENAME_KW);
163 const char* ossimName = kwl.find(prefix, HISTOGRAM_FILENAME_KW);
164 bool result = true;
165 ossimFilename file;
166
167 if(proprietaryName)
168 {
169 theFilename = ossimFilename(proprietaryName);
170 }
171 else if(ossimName)
172 {
173 if(!theHistogram)
174 {
175 theHistogram = new ossimMultiResLevelHistogram;
176 }
177 theFilename = ossimFilename(ossimName);
178
179 }
180
181 if(theFilename.exists()&&(theFilename!=""))
182 {
183 if(!theHistogram)
184 {
185 theHistogram = new ossimMultiResLevelHistogram;
186 }
187 result = theHistogram->importHistogram(theFilename);
188 }
189 if(theHistogram.valid())
190 {
191 theHistogram->setBinCount(0, 0);
192 }
193
194 result = ossimImageSourceFilter::loadState(kwl, prefix);
195
196 setNumberOfInputs(2);
197 theInputListIsFixedFlag = true;
198
199 return result;
200 }
201
print(std::ostream & out) const202 std::ostream& ossimImageSourceHistogramFilter::print(std::ostream& out) const
203 {
204
205 out << "ossimImageSourceHistogramFilter::print:\n"
206 << "theFilename: " << endl;
207
208 return ossimImageSourceFilter::print(out);
209 }
210