1 //*******************************************************************
2 //
3 // License: MIT
4 //
5 // See LICENSE.txt file in the top level directory for more details.
6 //
7 // Author: Garrett Potts
8 //
9 //********************************************************************
10 // $Id$
11 
12 #include <ossim/support_data/ossimRpfColorConverterSubsection.h>
13 #include <ossim/support_data/ossimRpfColorConverterOffsetRecord.h>
14 #include <ossim/base/ossimEndian.h>
15 #include <ossim/base/ossimErrorCodes.h>
16 #include <ossim/base/ossimIoStream.h>
17 #include <iterator>
18 
operator <<(std::ostream & out,const ossimRpfColorConverterSubsection & data)19 std::ostream& operator <<(std::ostream& out,
20                           const ossimRpfColorConverterSubsection& data)
21 {
22    data.print(out);
23    return out;
24 }
25 
ossimRpfColorConverterSubsection()26 ossimRpfColorConverterSubsection::ossimRpfColorConverterSubsection()
27 {
28    theNumberOfColorConverterOffsetRecords = 0;
29    clearFields();
30 }
31 
clearFields()32 void ossimRpfColorConverterSubsection::clearFields()
33 {
34    theColorConverterOffsetTableOffset     = 0;
35    theColorConverterOffsetRecordLength    = 0;
36    theConverterRecordLength               = 0;
37 
38    theTableList.clear();
39 }
40 
getColorConversionTable(ossim_uint32 givenThisNumberOfEntires) const41 const ossimRpfColorConverterTable* ossimRpfColorConverterSubsection::getColorConversionTable(ossim_uint32 givenThisNumberOfEntires)const
42 {
43    std::vector<ossimRpfColorConverterTable>::const_iterator listElement = theTableList.begin();
44 
45    while(listElement != theTableList.end())
46    {
47       if((*listElement).getNumberOfEntries() == givenThisNumberOfEntires)
48       {
49          return &(*listElement);
50       }
51    }
52 
53    return NULL;
54 }
55 
parseStream(ossim::istream & in,ossimByteOrder byteOrder)56 ossimErrorCode ossimRpfColorConverterSubsection::parseStream(ossim::istream& in,
57                                                              ossimByteOrder byteOrder)
58 {
59    if(in)
60    {
61       clearFields();
62 
63       // this is the start of the subsection
64       theStartOffset = in.tellg();
65       in.read((char*)&theColorConverterOffsetTableOffset, 4);
66       in.read((char*)&theColorConverterOffsetRecordLength, 2);
67       in.read((char*)&theConverterRecordLength, 2);
68 
69       // this grabs the end of the subsection
70       theEndOffset   = in.tellg();
71 
72       ossimEndian anEndian;
73 
74       if(anEndian.getSystemEndianType() != byteOrder)
75       {
76          anEndian.swap(theColorConverterOffsetTableOffset);
77          anEndian.swap(theColorConverterOffsetRecordLength);
78          anEndian.swap(theConverterRecordLength);
79 
80       }
81       theTableList.resize(theNumberOfColorConverterOffsetRecords);
82       for(unsigned long index = 0;
83           index < theNumberOfColorConverterOffsetRecords;
84           ++index)
85       {
86          ossimRpfColorConverterOffsetRecord recordInfo;
87 
88          if(recordInfo.parseStream(in, byteOrder) ==
89             ossimErrorCodes::OSSIM_OK)
90          {
91             unsigned long rememberGet = in.tellg();
92 
93             theTableList[index].setNumberOfEntries(recordInfo.theNumberOfColorConverterRecords);
94             theTableList[index].setTableId(recordInfo.theColorConverterTableId);
95             in.seekg(theStartOffset + recordInfo.theColorConverterTableOffset, std::ios_base::beg);
96             theTableList[index].parseStream(in, byteOrder);
97 
98             in.seekg(rememberGet, std::ios_base::beg);
99          }
100          else
101          {
102             return ossimErrorCodes::OSSIM_ERROR;
103          }
104       }
105    }
106    else
107    {
108       return ossimErrorCodes::OSSIM_ERROR;
109    }
110 
111    return ossimErrorCodes::OSSIM_OK;
112 }
113 
setNumberOfColorConverterOffsetRecords(ossim_uint16 numberOfRecords)114 void ossimRpfColorConverterSubsection::setNumberOfColorConverterOffsetRecords(ossim_uint16 numberOfRecords)
115 {
116    theNumberOfColorConverterOffsetRecords = numberOfRecords;
117 }
118 
print(std::ostream & out) const119 void ossimRpfColorConverterSubsection::print(std::ostream& out)const
120 {
121    out << "theColorConverterOffsetTableOffset:      "
122        << theColorConverterOffsetTableOffset
123        << "\ntheColorConverterOffsetRecordLength:     "
124        << theColorConverterOffsetRecordLength
125        << "\ntheConverterRecordLength:                "
126        << theConverterRecordLength << "\n";
127 
128    copy(theTableList.begin(),
129         theTableList.end(),
130         std::ostream_iterator<ossimRpfColorConverterTable>(out, "\n"));
131 }
132