OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimConvolutionFilter1D.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 // License: LGPL
3 //
4 // See LICENSE.txt file in the top level directory for more details.
5 //*************************************************************************
6 // $Id: ossimConvolutionFilter1D.cpp 15833 2009-10-29 01:41:53Z eshirschorn $
7 
8 
10 #include <ossim/base/ossimIrect.h>
15 
16 RTTI_DEF1(ossimConvolutionFilter1D, "ossimConvolutionFilter1D", ossimImageSourceFilter);
17 
18 #define PROPNAME_KERNELSIZE "KernelSize"
19 #define PROPNAME_KERNEL "Kernel"
20 #define PROPNAME_ISHZ "Horizontal"
21 #define PROPNAME_CENTEROFFSET "CenterOffset"
22 #define PROPNAME_STRICTNODATA "StrictNoData"
23 
25  :ossimImageSourceFilter(owner),
26  theCenterOffset(0),
27  theTile(NULL),
28  theIsHz(true),
29  theStrictNoData(true),
30  theNullPixValue(0),
31  theMinPixValue(0),
32  theMaxPixValue(0)
33 {
34  //sets up an identity convolution
35  theKernel.push_back(1.0);
36 }
37 
39 {
40 }
41 
43  const ossimIrect& tileRect,
44  ossim_uint32 resLevel)
45 {
47  {
48  return theTile;
49  }
50 
51  if(!isSourceEnabled())
52  {
53  return theInputConnection->getTile(tileRect, resLevel);
54  }
55 
56  //---
57  // We have a 1xn or nx1 matrix, + a center offset
58  // so stretch the input rect out to cover the required pixels
59  //---
60  ossimIrect newRect;
61  ossim_uint32 kl = (ossim_uint32)theKernel.size(); //kernel length
62  if (theIsHz)
63  {
64  //horizontal kernel (row kernel)
65  newRect = ossimIrect(ossimIpt(tileRect.ul().x - theCenterOffset,
66  tileRect.ul().y),
67  ossimIpt(tileRect.lr().x - theCenterOffset + kl -1,
68  tileRect.lr().y));
69  } else {
70  //vertical kernel
71  newRect = ossimIrect(ossimIpt(tileRect.ul().x,
72  tileRect.ul().y - theCenterOffset),
73  ossimIpt(tileRect.lr().x,
74  tileRect.lr().y - theCenterOffset + kl -1));
75  }
77  resLevel);
78 
79  if(!data.valid() || !data->getBuf())
80  {
81  return data;
82  }
83 
84  // First time through or after an initialize()...
85  if (!theTile.valid())
86  {
87  allocate();
88  if (!theTile.valid()) // Should never happen!
89  {
90  return data;
91  }
92  }
93 
94  // First time through, after an initialize() or a setKernel()...
95  if (!theNullPixValue.size())
96  {
98  if (!theNullPixValue.size()) // Should never happen!
99  {
100  return data;
101  }
102  }
103 
104  theTile->setImageRectangle(tileRect);
105  theTile->makeBlank();
106 
107  switch(data->getScalarType())
108  {
109  case OSSIM_UCHAR:
110  {
111  if(data->getDataObjectStatus() == OSSIM_FULL)
112  {
113  convolveFull(static_cast<ossim_uint8>(0), data, theTile);
114  }
115  else
116  {
117  convolvePartial(static_cast<ossim_uint8>(0), data, theTile);
118  }
119  break;
120  }
121  case OSSIM_FLOAT:
123  {
124  if(data->getDataObjectStatus() == OSSIM_FULL)
125  {
126  convolveFull(static_cast<float>(0), data, theTile);
127  }
128  else
129  {
130  convolvePartial(static_cast<float>(0), data, theTile);
131  }
132  break;
133  }
134  case OSSIM_USHORT16:
135  case OSSIM_USHORT11:
136  case OSSIM_USHORT12:
137  case OSSIM_USHORT13:
138  case OSSIM_USHORT14:
139  case OSSIM_USHORT15:
140  {
141  if(data->getDataObjectStatus() == OSSIM_FULL)
142  {
143  convolveFull(static_cast<ossim_uint16>(0), data, theTile);
144  }
145  else
146  {
147  convolvePartial(static_cast<ossim_uint16>(0), data, theTile);
148  }
149  break;
150  }
151  case OSSIM_SSHORT16:
152  {
153  if(data->getDataObjectStatus() == OSSIM_FULL)
154  {
155  convolveFull(static_cast<ossim_sint16>(0), data, theTile);
156  }
157  else
158  {
159  convolvePartial(static_cast<ossim_sint16>(0), data, theTile);
160  }
161  break;
162  }
163  case OSSIM_DOUBLE:
165  {
166  if(data->getDataObjectStatus() == OSSIM_FULL)
167  {
168  convolveFull(static_cast<double>(0), data, theTile);
169  }
170  else
171  {
172  convolvePartial(static_cast<double>(0), data, theTile);
173  }
174  break;
175  }
176  default:
177  {
179  << "ossimConvolutionFilter1D::getTile WARNING:\n"
180  << "Scalar type = " << theTile->getScalarType()
181  << " Not supported by ossimConvolutionFilter1D" << endl;
182  break;
183  }
184  }
185  theTile->validate();
186 
187  return theTile;
188 }
189 
190 
192  T,
193  ossimRefPtr<ossimImageData> inputData,
194  ossimRefPtr<ossimImageData> outputData)
195 {
196  // there may be NULL pixels in the input
197  ossim_int32 inputW = static_cast<ossim_int32>(inputData->getWidth());
198  ossim_uint32 outputW = outputData->getWidth();
199  ossim_uint32 outputH = outputData->getHeight();
200  ossim_uint32 numberOfBands = inputData->getNumberOfBands();
201 
202  ossim_uint32 klength=(ossim_uint32)theKernel.size(),k;
203  ossim_int32 incrK = theIsHz ? 1 : inputW; //kernel increment in input : one col or one row
204  ossim_int32 iRow = inputW - outputW; //jump to go to next row
205 
206  double sum=0.0;
207  T* iKP; //kernel covered input pointer
208 
209  ossim_int32 iCo = incrK*theCenterOffset; //center pixel offset within the input buffer
210 
211  for(ossim_uint32 band = 0; band < numberOfBands; ++band)
212  {
213  T* inputBuf = static_cast<T*>(inputData->getBuf(band));
214  T* outputBuf = static_cast<T*>(outputData->getBuf(band));
215  T maxPix = static_cast<T>(getMaxPixelValue(band));
216  T minPix = static_cast<T>(getMinPixelValue(band));
217  T nullPix = static_cast<T>(inputData->getNullPix(band));
218  T oNullPix = static_cast<T>(getNullPixelValue(band));
219 
220  if(inputBuf&&outputBuf)
221  {
222  for(ossim_uint32 row = 0; row < outputH; ++row)
223  {
224  for(ossim_uint32 col = 0; col < outputW; ++col)
225  {
226  //center pixel may not be NULL
227  if (inputBuf[iCo] != nullPix)
228  {
229  iKP = inputBuf;
230  sum = 0.0;
231  for(k=0;k<klength;++k)
232  {
233  if (*iKP != nullPix) //just sum on non-NULL pixels (potential normailzation issue)
234  {
235  sum += theKernel[k] * (double)(*iKP);
236  } else if (theStrictNoData)
237  {
238  break;
239  }
240  iKP += incrK;
241  }
242  if (k==klength)
243  {
244  if(sum > maxPix)
245  {
246  *outputBuf = maxPix;
247  }
248  else if(sum < minPix)
249  {
250  *outputBuf = minPix;
251  }
252  else
253  {
254  *outputBuf = static_cast<T>(sum);
255  }
256  } else {
257  //theStrictNoData
258  *outputBuf = oNullPix;
259  }
260  } else {
261  *outputBuf = oNullPix;
262  }
263  // move curent center position
264  inputBuf += 1;
265  outputBuf += 1;
266  }
267  //move current center position
268  inputBuf += iRow;
269  //outputBuf += 0;
270  }
271  }
272  }
273 
274 
275 }
276 
278  T,
279  ossimRefPtr<ossimImageData> inputData,
280  ossimRefPtr<ossimImageData> outputData)
281 {
282  //inputData must be displaced according to the Kernel size and theCenterOffset +isHz
283  ossim_int32 inputW = static_cast<ossim_int32>(inputData->getWidth());
284  ossim_uint32 outputW = outputData->getWidth();
285  ossim_uint32 outputH = outputData->getHeight();
286  ossim_uint32 numberOfBands = inputData->getNumberOfBands();
287 
288  ossim_uint32 klength=(ossim_uint32)theKernel.size(), k;
289  ossim_int32 incrK = theIsHz ? 1 : inputW; //kernel increment in input : one col or one row
290  ossim_int32 iRow = inputW - outputW; //jump to go to next row
291 
292  double sum=0.0;
293  T* iKP; //kernel covered input pointer
294 
295  for(ossim_uint32 band = 0; band < numberOfBands; ++band)
296  {
297  T* inputBuf = static_cast<T*>(inputData->getBuf(band));
298  T* outputBuf = static_cast<T*>(outputData->getBuf(band));
299  T maxPix = static_cast<T>(getMaxPixelValue(band));
300  T minPix = static_cast<T>(getMinPixelValue(band));
301 
302  if(inputBuf&&outputBuf)
303  {
304  for(ossim_uint32 row = 0; row < outputH; ++row)
305  {
306  for(ossim_uint32 col = 0; col < outputW; ++col)
307  {
308  sum = 0.0;
309  iKP = inputBuf;
310  for(k=0;k<klength;++k)
311  {
312  sum += theKernel[k] * (double)(*iKP);
313  iKP += incrK;
314  }
315 
316  if(sum > maxPix)
317  {
318  *outputBuf = maxPix;
319  }
320  else if(sum < minPix)
321  {
322  *outputBuf = minPix;
323  }
324  else
325  {
326  *outputBuf = static_cast<T>(sum);
327  }
328  // move curent center position
329  inputBuf += 1;
330  outputBuf += 1;
331  }
332  //move current center position
333  inputBuf += iRow;
334  //outputBuf += 0;
335  }
336  }
337  }
338 }
339 
341 {
342  //---
343  // NOTE:
344  // Since initialize get called often sequentially we will wipe things slick
345  // but not reallocate to avoid multiple delete/allocates.
346  //
347  // On the first getTile call things will be reallocated/computed.
348  //---
349  theTile = NULL;
350  clearNullMinMax();
351 }
352 
354 {
356  {
358 
359  theTile = idf->create(this,
360  this);
361 
362  theTile->initialize();
363  }
364 }
365 
367 {
368  if(!property) return;
369 
370  if(property->getName() == PROPNAME_KERNEL)
371  {
373  property.get());
374  if(matrixProperty)
375  {
376  ossim_uint32 nc=matrixProperty->getNumberOfCols();
377  theKernel.resize(nc);
378  for(ossim_uint32 i=0;i<nc;++i)
379  {
380  theKernel[i] = (*matrixProperty)(0,i);
381  }
382  clearNullMinMax();
383  }
384  else
385  {
387  }
388  } else if (property->getName() == PROPNAME_ISHZ) {
390  property.get());
391  if(booleanProperty)
392  {
393  theIsHz = booleanProperty->getBoolean();
394  }
395  } else if (property->getName() == PROPNAME_STRICTNODATA) {
397  property.get());
398  if(booleanProperty)
399  {
400  theStrictNoData = booleanProperty->getBoolean();
401  }
402  } else if (property->getName() == PROPNAME_CENTEROFFSET) {
404  property.get());
405  if(numProperty)
406  {
407  theCenterOffset = numProperty->asInt32();
408  }
409  } else if (property->getName() == PROPNAME_KERNELSIZE) {
411  property.get());
412  if(numProperty)
413  {
414  theKernel.resize(numProperty->asUInt32());
415  clearNullMinMax();
416  }
417  } else {
419  }
420 }
421 
423 {
424  if(name == PROPNAME_KERNEL)
425  {
426  ossimMatrixProperty* property = new ossimMatrixProperty(name);
427  property->resize(1,(int)theKernel.size());
428  for(ossim_uint32 i=0;i<theKernel.size();++i)
429  {
430  (*property)(0,i) = theKernel[i];
431  }
432  property->setCacheRefreshBit();
433  return property;
434  } else if (name==PROPNAME_ISHZ) {
435  ossimBooleanProperty* property = new ossimBooleanProperty(name,theIsHz);
436  property->setCacheRefreshBit();
437  return property;
438  } else if (name==PROPNAME_STRICTNODATA) {
440  property->setCacheRefreshBit();
441  return property;
442  } else if (name==PROPNAME_CENTEROFFSET) {
444  property->setNumericType(ossimNumericProperty::ossimNumericPropertyType_INT); //restrict to int type
445  property->setCacheRefreshBit();
446  return property;
447  } else if (name == PROPNAME_KERNELSIZE) {
449  property->setNumericType(ossimNumericProperty::ossimNumericPropertyType_INT); //restrict to int type
450  property->setCacheRefreshBit();
451  return property;
452  }
454 }
455 
456 void ossimConvolutionFilter1D::getPropertyNames(std::vector<ossimString>& propertyNames)const
457 {
459  propertyNames.push_back(PROPNAME_KERNELSIZE);
460  propertyNames.push_back(PROPNAME_KERNEL);
461  propertyNames.push_back(PROPNAME_CENTEROFFSET);
462  propertyNames.push_back(PROPNAME_ISHZ);
463  propertyNames.push_back(PROPNAME_STRICTNODATA);
464 }
465 
467  const char* prefix)const
468 {
469  kwl.add(prefix,
471  static_cast<ossim_uint32>(theKernel.size()),
472  true);
473  kwl.add(prefix,
476  true);
477  kwl.add(prefix,
479  theIsHz?"true":"false", //use string instead of boolean
480  true);
481  kwl.add(prefix,
483  theStrictNoData?"true":"false", //use string instead of boolean
484  true);
485 
486  for(ossim_uint32 row = 0; row < theKernel.size(); ++row)
487  {
488  ossimString newPrefix = "k" + ossimString::toString(row);
489  kwl.add(prefix,
490  newPrefix,
491  theKernel[row],
492  true);
493  }
494 
495  return ossimImageSourceFilter::saveState(kwl, prefix);
496 }
497 
498 
500  const char* prefix)
501 {
502  //find kernel size
503  ossim_uint32 iks=0;
504  const char* ks = kwl.find(prefix, PROPNAME_KERNELSIZE);
505  if(ks)
506  {
507  iks = ossimString(ks).toUInt32();
508  if (iks<1)
509  {
510  cerr<<"ossimConvolutionFilter1D : warning bad "<< PROPNAME_KERNELSIZE <<" in state"<<endl;
511  iks=0;
512  }
513  } else {
514  iks=0;
515  cerr<<"ossimConvolutionFilter1D : warning no "<< PROPNAME_KERNELSIZE <<" in state"<<endl;
516  }
517 
518  //load other props
519  const char* co = kwl.find(prefix, PROPNAME_CENTEROFFSET);
520  if(co)
521  {
522  setCenterOffset(ossimString(co).toUInt32());
523  } else {
524  cerr<<"ossimConvolutionFilter1D : warning no "<< PROPNAME_CENTEROFFSET<<" in state"<<endl;
525  }
526  const char* ih = kwl.find(prefix, PROPNAME_ISHZ);
527  if(ih)
528  {
529  setIsHorizontal(ossimString(ih).toBool());
530  } else {
531  cerr<<"ossimConvolutionFilter1D : warning no "<<PROPNAME_ISHZ<<" in state"<<endl;
532  }
533  const char* sn = kwl.find(prefix, PROPNAME_STRICTNODATA);
534  if(sn)
535  {
536  setStrictNoData(ossimString(sn).toBool());
537  } else {
538  cerr<<"ossimConvolutionFilter1D : warning no "<<PROPNAME_STRICTNODATA<<" in state"<<endl;
539  }
540  //load kernel values
541  ossimString newPrefix = prefix;
542  newPrefix += ossimString("k");
543  theKernel.resize(iks);
544  for(ossim_uint32 r=0; r<iks; ++r)
545  {
547 
548  const char* v = kwl.find(newPrefix.c_str(),
549  value.c_str());
550  if(v)
551  {
552  theKernel[r] = ossimString(v).toDouble();
553  } else {
554  cerr<<"ossimConvolutionFilter1D : warning no value for "<<newPrefix<<" in state"<<endl;
555  theKernel[r] = 0.0;
556  }
557  }
558  clearNullMinMax();
559 
560  return ossimImageSourceFilter::loadState(kwl, prefix);
561 }
562 
563 void ossimConvolutionFilter1D::setKernel(const std::vector<ossim_float64>& aKernel)
564 {
565  theKernel = aKernel;
566  // Will be recomputed first getTile call.
567  clearNullMinMax();
568 }
569 
571 {
572  if( isSourceEnabled() && (band < theNullPixValue.size()) )
573  {
574  return theNullPixValue[band];
575  }
576 
578 }
579 
581 {
582  if( isSourceEnabled() && (band < theMinPixValue.size()) )
583  {
584  return theMinPixValue[band];
585  }
586 
588 }
589 
591 {
592  if( isSourceEnabled() && (band < theMaxPixValue.size()) )
593  {
594  return theMaxPixValue[band];
595  }
596 
598 }
599 
601 {
602  theNullPixValue.clear();
603  theMinPixValue.clear();
604  theMaxPixValue.clear();
605 }
606 
608 {
609  const ossim_uint32 BANDS = getNumberOfOutputBands();
610 
611  theNullPixValue.resize(BANDS);
612  theMinPixValue.resize(BANDS);
613  theMaxPixValue.resize(BANDS);
614 
618 
619  for (ossim_uint32 band = 0; band < BANDS; ++band)
620  {
622  {
626  ossim_float64 tempMin = 0.0;
627  ossim_float64 tempMax = 0.0;
628  ossim_float64 k = 0.0;
629  for(ossim_uint32 i=0;i<theKernel.size();++i)
630  {
631  k=theKernel[i];
632  tempMin += (k<0.0) ? k*inputMax : k*inputMin;
633  tempMax += (k>0.0) ? k*inputMax : k*inputMin;
634  }
635 
636  if((tempMin >= defaultMin) && (tempMin <= defaultMax))
637  {
638  theMinPixValue[band] = tempMin;
639  }
640  else
641  {
642  theMinPixValue[band] = defaultMin;
643  }
644 
645  if((tempMax >= defaultMin) && (tempMax <= defaultMax))
646  {
647  theMaxPixValue[band] = tempMax;
648  }
649  else
650  {
651  theMaxPixValue[band] = defaultMax;
652  }
653  if((inputNull < theMinPixValue[band]) ||
654  (inputNull > theMaxPixValue[band]))
655  {
656  theNullPixValue[band] = inputNull;
657  }
658  else
659  {
661  }
662 
663  }
664  else // No input connection...
665  {
667  theMinPixValue[band] = defaultMin;
668  theMaxPixValue[band] = defaultMax;
669  }
670 
671  } // End of band loop.
672 }
16 bit unsigned integer (15 bits used)
virtual ossim_uint32 getWidth() const
virtual bool isSourceEnabled() const
Definition: ossimSource.cpp:79
virtual void getPropertyNames(std::vector< ossimString > &propertyNames) const
void clearNullMinMax()
Clears data members theNullPixValue, theMinPixValue, and theMaxPixValue.
bool theStrictNoData
isHorizontal convolution?
virtual void setProperty(ossimRefPtr< ossimProperty > property)
virtual ossim_uint32 getNumberOfBands() const
virtual void setImageRectangle(const ossimIrect &rect)
Represents serializable keyword/value map.
virtual ossim_uint32 getNumberOfOutputBands() const
Returns the number of bands in a tile returned from this TileSource.
bool valid() const
Definition: ossimRefPtr.h:75
const char * find(const char *key) const
void allocate()
Allocates theTile.
static ossimString toString(bool aValue)
Numeric to string methods.
virtual void setProperty(ossimRefPtr< ossimProperty > property)
std::vector< ossim_float64 > theKernel
const ossimIpt & ul() const
Definition: ossimIrect.h:274
virtual ossimDataObjectStatus getDataObjectStatus() const
virtual ossim_uint32 getHeight() const
16 bit unsigned integer (14 bits used)
ossim_uint32 toUInt32() const
16 bit unsigned integer (13 bits used)
std::vector< double > theNullPixValue
strictly no NODATA values used
#define PROPNAME_KERNELSIZE
virtual void setKernel(const std::vector< ossim_float64 > &aKernel)
virtual void initialize()
Initialize the data buffer.
virtual void setStrictNoData(bool aStrict)
virtual ossimRefPtr< ossimImageData > getTile(const ossimIrect &tileRect, ossim_uint32 resLevel=0)
virtual double getMinPixelValue(ossim_uint32 band=0) const
Returns the min pixel of the band.
double ossim_float64
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
#define PROPNAME_KERNEL
std::vector< double > theMaxPixValue
OSSIM_DLL double defaultMin(ossimScalarType scalarType)
Definition: ossimCommon.cpp:73
static ossimImageDataFactory * instance()
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Method to save the state of an object to a keyword list.
virtual double getNullPixelValue(ossim_uint32 band=0) const
Each band has a null pixel associated with it.
ossim_int32 theCenterOffset
offset of center point in the Kernel
virtual ossimDataObjectStatus validate() const
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Method to the load (recreate) the state of an object from a keyword list.
virtual void getPropertyNames(std::vector< ossimString > &propertyNames) const
OSSIM_DLL double defaultNull(ossimScalarType scalarType)
ossimImageSource * theInputConnection
unsigned int ossim_uint32
virtual const ossim_float64 * getNullPix() const
32 bit normalized floating point
double toDouble() const
#define PTR_CAST(T, p)
Definition: ossimRtti.h:321
void computeNullMinMax()
Computes null, min, and max considering input connection and theKernel.
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Method to the load (recreate) the state of an object from a keyword list.
const ossimIpt & lr() const
Definition: ossimIrect.h:276
virtual ossim_uint32 asUInt32() const
class for vertical or horizontal convolution
std::vector< double > theMinPixValue
#define PROPNAME_ISHZ
virtual ossimRefPtr< ossimImageData > create(ossimSource *owner, ossimScalarType scalar, ossim_uint32 bands=1) const
virtual ossim_sint32 asInt32() const
void convolvePartial(T, ossimRefPtr< ossimImageData > inputData, ossimRefPtr< ossimImageData > outputData)
#define PROPNAME_STRICTNODATA
virtual ossimScalarType getScalarType() const
virtual void makeBlank()
Initializes data to null pixel values.
ossimRefPtr< ossimImageData > theTile
64 bit normalized floating point
16 bit unsigned integer (11 bits used)
virtual void setIsHorizontal(bool aIsHz)
OSSIM_DLL double defaultMax(ossimScalarType scalarType)
void convolveFull(T, ossimRefPtr< ossimImageData > inputData, ossimRefPtr< ossimImageData > outputData)
virtual double getMinPixelValue(ossim_uint32 band=0) const
Returns the min pixel of the band.
virtual ossimScalarType getOutputScalarType() const
This will be used to query the output pixel type of the tile source.
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Method to save the state of an object to a keyword list.
virtual double getMaxPixelValue(ossim_uint32 band=0) const
Returns the max pixel of the band.
ossimConvolutionFilter1D(ossimObject *owner=NULL)
own class methods
ossim_int32 y
Definition: ossimIpt.h:142
virtual const void * getBuf() const
RTTI_DEF1(ossimConvolutionFilter1D, "ossimConvolutionFilter1D", ossimImageSourceFilter)
virtual ossimRefPtr< ossimProperty > getProperty(const ossimString &name) const
#define PROPNAME_CENTEROFFSET
const char * c_str() const
Returns a pointer to a null-terminated array of characters representing the string&#39;s contents...
Definition: ossimString.h:396
ossim_int32 x
Definition: ossimIpt.h:141
virtual double getMaxPixelValue(ossim_uint32 band=0) const
Returns the max pixel of the band.
32 bit floating point
16 bit unsigned iteger
64 bit floating point
16 bit signed integer
virtual void setCenterOffset(ossim_int32 aCenterOffset)
virtual double getNullPixelValue(ossim_uint32 band=0) const
Each band has a null pixel associated with it.
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
8 bit unsigned iteger
const ossimString & getName() const
int ossim_int32
virtual ossimRefPtr< ossimImageData > getTile(const ossimIpt &origin, ossim_uint32 resLevel=0)
virtual ossimRefPtr< ossimProperty > getProperty(const ossimString &name) const
16 bit unsigned integer (12 bits used)