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