Patch #1271 » printStructure-3.diff
exiv2-0.26.as/include/exiv2/orfimage.hpp 2017-01-24 10:08:23.000000000 -0500 | ||
---|---|---|
79 | 79 | |
80 | 80 |
//! @name Manipulators |
81 | 81 |
//@{ |
82 |
void printStructure(std::ostream& out, PrintStructureOption option,int depth); |
|
82 | 83 |
void readMetadata(); |
83 | 84 |
void writeMetadata(); |
84 | 85 |
/*! |
exiv2-0.26.as/include/exiv2/rafimage.hpp 2017-01-24 10:08:23.000000000 -0500 | ||
---|---|---|
78 | 78 | |
79 | 79 |
//! @name Manipulators |
80 | 80 |
//@{ |
81 |
void printStructure(std::ostream& out, PrintStructureOption option,int depth); |
|
81 | 82 |
void readMetadata(); |
82 | 83 |
/*! |
83 | 84 |
@brief Todo: Write metadata back to the image. This method is not |
exiv2-0.26.as/include/exiv2/riffvideo.hpp 2017-01-24 10:08:23.000000000 -0500 | ||
---|---|---|
71 | 71 | |
72 | 72 |
//! @name Manipulators |
73 | 73 |
//@{ |
74 |
void printStructure(std::ostream& out, PrintStructureOption option,int depth); |
|
74 | 75 |
void readMetadata(); |
75 | 76 |
void writeMetadata(); |
76 | 77 |
//@} |
... | ... | |
185 | 186 |
RiffVideo(const RiffVideo& rhs); |
186 | 187 |
//! Assignment operator |
187 | 188 |
RiffVideo& operator=(const RiffVideo& rhs); |
189 |
bool equalsRiffTag(Exiv2::DataBuf& buf ,const char* str); |
|
188 | 190 |
//@} |
189 | 191 | |
190 | 192 |
private: |
193 |
const static int RIFF_TAG_SIZE; |
|
194 |
const static char* RIFF_CHUNK_HEADER_ICCP; |
|
195 |
const static char* RIFF_CHUNK_HEADER_EXIF; |
|
196 |
const static char* RIFF_CHUNK_HEADER_XMP; |
|
191 | 197 |
//! Variable to check the end of metadata traversing. |
192 | 198 |
bool continueTraversing_; |
193 | 199 |
//! Variable which stores current stream being processsed. |
exiv2-0.26.as/include/exiv2/rw2image.hpp 2017-01-24 10:08:23.000000000 -0500 | ||
---|---|---|
76 | 76 | |
77 | 77 |
//! @name Manipulators |
78 | 78 |
//@{ |
79 |
void printStructure(std::ostream& out, PrintStructureOption option,int depth); |
|
79 | 80 |
void readMetadata(); |
80 | 81 |
/*! |
81 | 82 |
@brief Todo: Write metadata back to the image. This method is not |
exiv2-0.26.as/src/cr2image.cpp 2017-02-01 07:23:55.000000000 -0500 | ||
---|---|---|
107 | 107 |
throw Error(3, "CR2"); |
108 | 108 |
} |
109 | 109 |
clearMetadata(); |
110 |
std::ofstream devnull; |
|
111 |
printStructure(devnull, kpsRecursive, 0); |
|
110 | 112 |
ByteOrder bo = Cr2Parser::decode(exifData_, |
111 | 113 |
iptcData_, |
112 | 114 |
xmpData_, |
exiv2-0.26.as/src/orfimage.cpp 2017-02-01 07:23:55.000000000 -0500 | ||
---|---|---|
89 | 89 |
throw(Error(32, "Image comment", "ORF")); |
90 | 90 |
} |
91 | 91 | |
92 |
void OrfImage::printStructure(std::ostream& out, PrintStructureOption option, int depth) { |
|
93 |
std::cout << "ORF IMAGE" << std::endl; |
|
94 |
if (io_->open() != 0) throw Error(9, io_->path(), strError()); |
|
95 |
// Ensure that this is the correct image type |
|
96 |
if ( imageType() == ImageType::none ) |
|
97 |
if (!isOrfType(*io_, false)) { |
|
98 |
if (io_->error() || io_->eof()) throw Error(14); |
|
99 |
throw Error(15); |
|
100 |
} |
|
101 | ||
102 |
io_->seek(0,BasicIo::beg); |
|
103 | ||
104 |
printTiffStructure(io(),out,option,depth-1); |
|
105 |
} // OrfImage::printStructure |
|
106 | ||
92 | 107 |
void OrfImage::readMetadata() |
93 | 108 |
{ |
94 | 109 |
#ifdef DEBUG |
... | ... | |
104 | 119 |
throw Error(3, "ORF"); |
105 | 120 |
} |
106 | 121 |
clearMetadata(); |
122 |
std::ofstream devnull; |
|
123 |
printStructure(devnull, kpsRecursive, 0); |
|
107 | 124 |
ByteOrder bo = OrfParser::decode(exifData_, |
108 | 125 |
iptcData_, |
109 | 126 |
xmpData_, |
exiv2-0.26.as/src/rafimage.cpp 2017-02-01 17:39:32.000000000 -0500 | ||
---|---|---|
34 | 34 | |
35 | 35 |
#include "rafimage.hpp" |
36 | 36 |
#include "tiffimage.hpp" |
37 |
#include "image_int.hpp" |
|
37 | 38 |
#include "image.hpp" |
38 | 39 |
#include "basicio.hpp" |
39 | 40 |
#include "error.hpp" |
... | ... | |
95 | 96 |
throw(Error(32, "Image comment", "RAF")); |
96 | 97 |
} |
97 | 98 | |
99 |
void RafImage::printStructure(std::ostream& out, PrintStructureOption option, int depth) { |
|
100 |
if (io_->open() != 0) { |
|
101 |
throw Error(9, io_->path(), strError()); |
|
102 |
} |
|
103 |
// Ensure this is the correct image type |
|
104 |
if (!isRafType(*io_, true)) { |
|
105 |
if (io_->error() || io_->eof()) throw Error(14); |
|
106 |
throw Error(3, "RAF"); |
|
107 |
} |
|
108 |
bool bPrint = option==kpsBasic || option==kpsRecursive; |
|
109 |
if ( bPrint ) { |
|
110 |
io_->seek(0,BasicIo::beg); // rewind |
|
111 | ||
112 |
if ( bPrint ) { |
|
113 |
out << Internal::indent(depth) |
|
114 |
<< "STRUCTURE OF RAF FILE: " |
|
115 |
<< io().path() |
|
116 |
<< std::endl; |
|
117 |
out << Internal::indent(depth) |
|
118 |
<< Internal::stringFormat(" Length | Offset | Payload") |
|
119 |
<< std::endl; |
|
120 |
} |
|
121 | ||
122 |
byte magicdata [17]; |
|
123 |
io_->read(magicdata, 16); |
|
124 |
magicdata[16] = 0; |
|
125 |
if ( bPrint ) { |
|
126 |
out << Internal::indent(depth) |
|
127 |
<< Internal::stringFormat(" %8u | %8u | ", 16, 0) |
|
128 |
<< "Magic number : " |
|
129 |
<< std::string((char*)&magicdata) |
|
130 |
<< std::endl; |
|
131 |
} |
|
132 | ||
133 |
byte data1 [5]; |
|
134 |
io_->read(data1, 4); |
|
135 |
data1[4] = 0; |
|
136 |
if ( bPrint ) { |
|
137 |
out << Internal::indent(depth) |
|
138 |
<< Internal::stringFormat(" %8u | %8u | ", 4, 16) |
|
139 |
<< "data 1 : " |
|
140 |
<< std::string((char*)&data1) |
|
141 |
<< std::endl; |
|
142 |
} |
|
143 | ||
144 |
byte data2 [9]; |
|
145 |
io_->read(data2, 8); |
|
146 |
data2[8] = 0; |
|
147 |
if ( bPrint ) { |
|
148 |
out << Internal::indent(depth) |
|
149 |
<< Internal::stringFormat(" %8u | %8u | ", 8, 20) |
|
150 |
<< "data 2 : " |
|
151 |
<< std::string((char*)&data2) |
|
152 |
<< std::endl; |
|
153 |
} |
|
154 | ||
155 |
byte camdata [33]; |
|
156 |
io_->read(camdata, 32); |
|
157 |
camdata[32] = 0; |
|
158 |
if ( bPrint ) { |
|
159 |
out << Internal::indent(depth) |
|
160 |
<< Internal::stringFormat(" %8u | %8u | ", 32, 28) |
|
161 |
<< "camera : " |
|
162 |
<< std::string((char*)&camdata) |
|
163 |
<< std::endl; |
|
164 |
} |
|
165 | ||
166 |
byte dir_version [5]; |
|
167 |
io_->read(dir_version, 4); |
|
168 |
dir_version[4] = 0; |
|
169 |
if ( bPrint ) { |
|
170 |
out << Internal::indent(depth) |
|
171 |
<< Internal::stringFormat(" %8u | %8u | ", 4, 60) |
|
172 |
<< "dir version : " |
|
173 |
<< std::string((char*)&dir_version) |
|
174 |
<< std::endl; |
|
175 |
} |
|
176 | ||
177 |
byte unknown [20]; |
|
178 |
io_->read(unknown, 20); |
|
179 | ||
180 |
byte jpg_img_offset [4]; |
|
181 |
io_->read(jpg_img_offset, 4); |
|
182 |
byte jpg_img_length [4]; |
|
183 |
io_->read(jpg_img_length, 4); |
|
184 |
long jpg_img_off = Exiv2::getULong((const byte *) jpg_img_offset, bigEndian); |
|
185 |
long jpg_img_len = Exiv2::getULong((const byte *) jpg_img_length, bigEndian); |
|
186 |
std::stringstream j_off; |
|
187 |
std::stringstream j_len; |
|
188 |
j_off << jpg_img_off; |
|
189 |
j_len << jpg_img_len; |
|
190 |
if ( bPrint ) { |
|
191 |
out << Internal::indent(depth) |
|
192 |
<< Internal::stringFormat(" %8u | %8u | ", 4, 84) |
|
193 |
<< "JPEG Image Offset : " |
|
194 |
<< j_off.str() |
|
195 |
<< std::endl; |
|
196 |
out << Internal::indent(depth) |
|
197 |
<< Internal::stringFormat(" %8u | %8u | ", 4, 88) |
|
198 |
<< "JPEG Image Length : " |
|
199 |
<< j_len.str() |
|
200 |
<< std::endl; |
|
201 |
} |
|
202 | ||
203 |
byte cfa_header_offset [4]; |
|
204 |
io_->read(cfa_header_offset, 4); |
|
205 |
byte cfa_header_length [4]; |
|
206 |
io_->read(cfa_header_length, 4); |
|
207 |
long cfa_hdr_off = Exiv2::getULong((const byte *) cfa_header_offset, bigEndian); |
|
208 |
long cfa_hdr_len = Exiv2::getULong((const byte *) cfa_header_length, bigEndian); |
|
209 |
std::stringstream ch_off; |
|
210 |
std::stringstream ch_len; |
|
211 |
ch_off << cfa_hdr_off; |
|
212 |
ch_len << cfa_hdr_len; |
|
213 |
if ( bPrint ) { |
|
214 |
out << Internal::indent(depth) |
|
215 |
<< Internal::stringFormat(" %8u | %8u | ", 4, 92) |
|
216 |
<< "CFA Header Offset : " |
|
217 |
<< ch_off.str() |
|
218 |
<< std::endl; |
|
219 |
out << Internal::indent(depth) |
|
220 |
<< Internal::stringFormat(" %8u | %8u | ", 4, 96) |
|
221 |
<< "CFA Header Length : " |
|
222 |
<< ch_len.str() |
|
223 |
<< std::endl; |
|
224 |
} |
|
225 | ||
226 |
byte cfa_offset [4]; |
|
227 |
io_->read(cfa_offset, 4); |
|
228 |
byte cfa_length [4]; |
|
229 |
io_->read(cfa_length, 4); |
|
230 |
long cfa_off = Exiv2::getULong((const byte *) cfa_offset, bigEndian); |
|
231 |
long cfa_len = Exiv2::getULong((const byte *) cfa_length, bigEndian); |
|
232 |
std::stringstream c_off; |
|
233 |
std::stringstream c_len; |
|
234 |
c_off << cfa_off; |
|
235 |
c_len << cfa_len; |
|
236 |
if ( bPrint ) { |
|
237 |
out << Internal::indent(depth) |
|
238 |
<< Internal::stringFormat(" %8u | %8u | ", 4, 100) |
|
239 |
<< "CFA Offset : " |
|
240 |
<< c_off.str() |
|
241 |
<< std::endl; |
|
242 |
out << Internal::indent(depth) |
|
243 |
<< Internal::stringFormat(" %8u | %8u | ", 4, 104) |
|
244 |
<< "CFA Length : " |
|
245 |
<< c_len.str() |
|
246 |
<< std::endl; |
|
247 |
} |
|
248 | ||
249 |
io_->seek(jpg_img_off, BasicIo::beg); // rewind |
|
250 |
DataBuf payload(16); // header is different from chunks |
|
251 |
io_->read(payload.pData_, payload.size_); |
|
252 |
if ( bPrint ) { |
|
253 |
out << Internal::indent(depth) |
|
254 |
<< Internal::stringFormat(" %8u | %8u | ", jpg_img_len, jpg_img_off) |
|
255 |
<< "jpg image / exif : " |
|
256 |
<< Internal::binaryToString(payload, payload.size_) |
|
257 |
<< std::endl; |
|
258 |
} |
|
259 | ||
260 |
io_->seek(cfa_hdr_off, BasicIo::beg); // rewind |
|
261 |
io_->read(payload.pData_, payload.size_); |
|
262 |
if ( bPrint ) { |
|
263 |
out << Internal::indent(depth) |
|
264 |
<< Internal::stringFormat(" %8u | %8u | ", cfa_hdr_len, cfa_hdr_off) |
|
265 |
<< "CFA Header: " |
|
266 |
<< Internal::binaryToString(payload, payload.size_) |
|
267 |
<< std::endl; |
|
268 |
} |
|
269 | ||
270 |
io_->seek(cfa_off, BasicIo::beg); // rewind |
|
271 |
io_->read(payload.pData_, payload.size_); |
|
272 |
if ( bPrint ) { |
|
273 |
out << Internal::indent(depth) |
|
274 |
<< Internal::stringFormat(" %8u | %8u | ", cfa_len, cfa_off) |
|
275 |
<< "CFA : " |
|
276 |
<< Internal::binaryToString(payload, payload.size_) |
|
277 |
<< std::endl; |
|
278 |
} |
|
279 |
} |
|
280 |
} // RafImage::printStructure |
|
281 | ||
98 | 282 |
void RafImage::readMetadata() |
99 | 283 |
{ |
100 | 284 |
#ifdef DEBUG |
... | ... | |
107 | 291 |
if (io_->error() || io_->eof()) throw Error(14); |
108 | 292 |
throw Error(3, "RAF"); |
109 | 293 |
} |
110 |
byte const* pData = io_->mmap(); |
|
111 |
long size = io_->size(); |
|
112 |
if (size < 88 + 4) throw Error(14); // includes the test for -1 |
|
113 |
uint32_t const start = getULong(pData + 84, bigEndian) + 12; |
|
114 |
if (static_cast<uint32_t>(size) < start) throw Error(14); |
|
294 | ||
115 | 295 |
clearMetadata(); |
296 | ||
297 |
io_->seek(84,BasicIo::beg); |
|
298 |
byte jpg_img_offset [4]; |
|
299 |
io_->read(jpg_img_offset, 4); |
|
300 |
byte jpg_img_length [4]; |
|
301 |
io_->read(jpg_img_length, 4); |
|
302 |
long jpg_img_off = Exiv2::getULong((const byte *) jpg_img_offset, bigEndian); |
|
303 |
long jpg_img_len = Exiv2::getULong((const byte *) jpg_img_length, bigEndian); |
|
304 | ||
305 |
DataBuf buf(jpg_img_len - 12); |
|
306 |
io_->seek(jpg_img_off + 12,BasicIo::beg); |
|
307 |
io_->read(buf.pData_, buf.size_ - 12); |
|
308 |
if (io_->error() || io_->eof()) throw Error(14); |
|
309 | ||
310 |
io_->seek(0,BasicIo::beg); // rewind |
|
311 | ||
116 | 312 |
ByteOrder bo = TiffParser::decode(exifData_, |
117 | 313 |
iptcData_, |
118 | 314 |
xmpData_, |
119 |
pData + start,
|
|
120 |
size - start);
|
|
315 |
buf.pData_,
|
|
316 |
buf.size_);
|
|
121 | 317 | |
122 |
exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(pData + 84, bigEndian);
|
|
123 |
exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(pData + 88, bigEndian);
|
|
318 |
exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(jpg_img_offset, bigEndian);
|
|
319 |
exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(jpg_img_length, bigEndian);
|
|
124 | 320 | |
125 | 321 |
setByteOrder(bo); |
126 | 322 |
} // RafImage::readMetadata |
exiv2-0.26.as/src/riffvideo.cpp 2017-02-01 07:23:55.000000000 -0500 | ||
---|---|---|
41 | 41 |
#include "tags_int.hpp" |
42 | 42 |
#include "types.hpp" |
43 | 43 |
#include "tiffimage_int.hpp" |
44 |
#include "image_int.hpp" |
|
44 | 45 |
// + standard includes |
45 | 46 |
#include <cmath> |
46 | 47 | |
... | ... | |
516 | 517 |
return "video/riff"; |
517 | 518 |
} |
518 | 519 | |
520 |
const int RiffVideo::RIFF_TAG_SIZE = 0x4; |
|
521 |
const char* RiffVideo::RIFF_CHUNK_HEADER_ICCP = "ICCP"; |
|
522 |
const char* RiffVideo::RIFF_CHUNK_HEADER_EXIF = "EXIF"; |
|
523 |
const char* RiffVideo::RIFF_CHUNK_HEADER_XMP = "XMP "; |
|
524 | ||
525 |
/*! |
|
526 |
@brief Function used to check equality of a Tags with a |
|
527 |
particular string (ignores case while comparing). |
|
528 |
@param buf Data buffer that will contain Tag to compare |
|
529 |
@param str char* Pointer to string |
|
530 |
@return Returns true if the buffer value is equal to string. |
|
531 |
*/ |
|
532 |
bool RiffVideo::equalsRiffTag(Exiv2::DataBuf& buf, const char* str) { |
|
533 |
for(int i = 0; i < 4; i++ ) |
|
534 |
if(toupper(buf.pData_[i]) != str[i]) |
|
535 |
return false; |
|
536 |
return true; |
|
537 |
} |
|
538 | ||
539 |
void RiffVideo::printStructure(std::ostream& out, PrintStructureOption option, int depth) { |
|
540 |
if (io_->open() != 0) { |
|
541 |
throw Error(9, io_->path(), strError()); |
|
542 |
} |
|
543 |
// Ensure this is the correct image type |
|
544 |
if (!isRiffType(*io_, true)) { |
|
545 |
if (io_->error() || io_->eof()) throw Error(14); |
|
546 |
throw Error(3, "RIFF"); |
|
547 |
} |
|
548 | ||
549 |
bool bPrint = option==kpsBasic || option==kpsRecursive; |
|
550 |
if ( bPrint || option == kpsXMP || option == kpsIccProfile || option == kpsIptcErase ) { |
|
551 |
byte data [RIFF_TAG_SIZE * 2]; |
|
552 |
io_->read(data, RIFF_TAG_SIZE * 2); |
|
553 |
uint64_t filesize = Exiv2::getULong(data + RIFF_TAG_SIZE, littleEndian); |
|
554 |
DataBuf chunkId(5) ; |
|
555 |
chunkId.pData_[4] = '\0' ; |
|
556 | ||
557 |
if ( bPrint ) { |
|
558 |
out << Internal::indent(depth) |
|
559 |
<< "STRUCTURE OF RIFF FILE: " |
|
560 |
<< io().path() |
|
561 |
<< std::endl; |
|
562 |
out << Internal::indent(depth) |
|
563 |
<< Internal::stringFormat(" Chunk | Length | Offset | Payload") |
|
564 |
<< std::endl; |
|
565 |
} |
|
566 | ||
567 |
io_->seek(0,BasicIo::beg); // rewind |
|
568 |
while ( !io_->eof() && (uint64_t) io_->tell() < filesize) { |
|
569 |
uint64_t offset = (uint64_t) io_->tell(); |
|
570 |
byte size_buff[RIFF_TAG_SIZE]; |
|
571 |
io_->read(chunkId.pData_, RIFF_TAG_SIZE); |
|
572 |
io_->read(size_buff, RIFF_TAG_SIZE); |
|
573 |
long size = Exiv2::getULong(size_buff, littleEndian); |
|
574 |
DataBuf payload(offset?size:RIFF_TAG_SIZE); // header is different from chunks |
|
575 |
io_->read(payload.pData_, payload.size_); |
|
576 | ||
577 |
if ( bPrint ) { |
|
578 |
out << Internal::indent(depth) |
|
579 |
<< Internal::stringFormat(" %s | %12u | %12u | ", (const char*)chunkId.pData_,size,(uint32_t)offset) |
|
580 |
<< Internal::binaryToString(payload,payload.size_>32?32:payload.size_) |
|
581 |
<< std::endl; |
|
582 |
} |
|
583 | ||
584 |
if ( equalsRiffTag(chunkId, RIFF_CHUNK_HEADER_EXIF) && option==kpsRecursive ) { |
|
585 |
// create memio object with the payload, then print the structure |
|
586 |
BasicIo::AutoPtr p = BasicIo::AutoPtr(new MemIo(payload.pData_,payload.size_)); |
|
587 |
printTiffStructure(*p,out,option,depth); |
|
588 |
} |
|
589 | ||
590 |
bool bPrintPayload = (equalsRiffTag(chunkId, RIFF_CHUNK_HEADER_XMP) && option==kpsXMP) |
|
591 |
|| (equalsRiffTag(chunkId, RIFF_CHUNK_HEADER_ICCP) && option==kpsIccProfile) |
|
592 |
; |
|
593 |
if ( bPrintPayload ) { |
|
594 |
out.write((const char*) payload.pData_,payload.size_); |
|
595 |
} |
|
596 | ||
597 |
if ( offset && io_->tell() % 2 ) io_->seek(+1, BasicIo::cur); // skip padding byte on sub-chunks |
|
598 |
} |
|
599 |
} |
|
600 |
} // RiffVideo::printStructure |
|
601 | ||
519 | 602 |
void RiffVideo::writeMetadata() |
520 | 603 |
{ |
521 | 604 |
} // RiffVideo::writeMetadata |
exiv2-0.26.as/src/rw2image.cpp 2017-02-01 12:26:49.000000000 -0500 | ||
---|---|---|
100 | 100 |
throw(Error(32, "Image comment", "RW2")); |
101 | 101 |
} |
102 | 102 | |
103 |
void Rw2Image::printStructure(std::ostream& out, PrintStructureOption option, int depth) { |
|
104 |
std::cout << "RW2 IMAGE" << std::endl; |
|
105 |
if (io_->open() != 0) throw Error(9, io_->path(), strError()); |
|
106 |
// Ensure that this is the correct image type |
|
107 |
if ( imageType() == ImageType::none ) |
|
108 |
if (!isRw2Type(*io_, false)) { |
|
109 |
if (io_->error() || io_->eof()) throw Error(14); |
|
110 |
throw Error(15); |
|
111 |
} |
|
112 | ||
113 |
io_->seek(0,BasicIo::beg); |
|
114 | ||
115 |
printTiffStructure(io(),out,option,depth-1); |
|
116 |
} // Rw2Image::printStructure |
|
117 | ||
103 | 118 |
void Rw2Image::readMetadata() |
104 | 119 |
{ |
105 | 120 |
#ifdef DEBUG |
... | ... | |
115 | 130 |
throw Error(3, "RW2"); |
116 | 131 |
} |
117 | 132 |
clearMetadata(); |
133 |
std::ofstream devnull; |
|
134 |
printStructure(devnull, kpsRecursive, 0); |
|
118 | 135 |
ByteOrder bo = Rw2Parser::decode(exifData_, |
119 | 136 |
iptcData_, |
120 | 137 |
xmpData_, |
exiv2-0.26.as/src/webpimage.cpp 2017-02-01 07:23:55.000000000 -0500 | ||
---|---|---|
412 | 412 | |
413 | 413 |
void WebPImage::printStructure(std::ostream& out, PrintStructureOption option,int depth) |
414 | 414 |
{ |
415 |
if (io_->open() != 0) throw Error(9, io_->path(), strError()); |
|
416 |
IoCloser closer(*io_); |
|
415 |
if (io_->open() != 0) { |
|
416 |
throw Error(9, io_->path(), strError()); |
|
417 |
} |
|
417 | 418 |
// Ensure this is the correct image type |
418 | 419 |
if (!isWebPType(*io_, true)) { |
419 | 420 |
if (io_->error() || io_->eof()) throw Error(14); |
- « Previous
- 1
- 2
- 3
- Next »