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