Bug #664 ยป bug664.patch
trunk-bug664/src/pngchunk.cpp 2009-12-29 10:17:19.000000000 +0800 | ||
---|---|---|
103 | 103 |
std::cout << "Exiv2::PngChunk::decodeTXTChunk: TXT chunk data: " |
104 | 104 |
<< std::string((const char*)arr.pData_, 32) << "\n"; |
105 | 105 |
#endif |
106 |
parseChunkContent(pImage, key.pData_, arr); |
|
106 |
parseChunkContent(pImage, key.pData_, key.size_, arr);
|
|
107 | 107 | |
108 | 108 |
} // PngChunk::decodeTXTChunk |
109 | 109 | |
... | ... | |
111 | 111 |
{ |
112 | 112 |
// From a tEXt, zTXt, or iTXt chunk, |
113 | 113 |
// we get the key, it's a null terminated string at the chunk start |
114 | ||
114 |
if (data.size_ <= (stripHeader ? 8 : 0)) throw Error(14); |
|
115 | 115 |
const byte *key = data.pData_ + (stripHeader ? 8 : 0); |
116 | 116 | |
117 | 117 |
// Find null string at end of key. |
... | ... | |
162 | 162 |
const byte* text = data.pData_ + keysize + 1; |
163 | 163 |
long textsize = data.size_ - keysize - 1; |
164 | 164 | |
165 |
arr.alloc(textsize); |
|
166 | 165 |
arr = DataBuf(text, textsize); |
167 | 166 |
} |
168 | 167 |
else if(type == iTXt_Chunk) |
... | ... | |
228 | 227 | |
229 | 228 |
} // PngChunk::parsePngChunk |
230 | 229 | |
231 |
void PngChunk::parseChunkContent(Image* pImage, const byte *key, const DataBuf arr) |
|
230 |
void PngChunk::parseChunkContent( Image* pImage, |
|
231 |
const byte* key, |
|
232 |
long keySize, |
|
233 |
const DataBuf arr) |
|
232 | 234 |
{ |
233 | 235 |
// We look if an ImageMagick EXIF raw profile exist. |
234 | 236 | |
235 |
if ( (memcmp("Raw profile type exif", key, 21) == 0 || |
|
236 |
memcmp("Raw profile type APP1", key, 21) == 0) && |
|
237 |
pImage->exifData().empty()) |
|
237 |
if ( keySize >= 21 |
|
238 |
&& ( memcmp("Raw profile type exif", key, 21) == 0 |
|
239 |
|| memcmp("Raw profile type APP1", key, 21) == 0) |
|
240 |
&& pImage->exifData().empty()) |
|
238 | 241 |
{ |
239 | 242 |
DataBuf exifData = readRawProfile(arr); |
240 | 243 |
long length = exifData.size_; |
... | ... | |
282 | 285 | |
283 | 286 |
// We look if an ImageMagick IPTC raw profile exist. |
284 | 287 | |
285 |
if ( memcmp("Raw profile type iptc", key, 21) == 0 |
|
288 |
if ( keySize >= 21 |
|
289 |
&& memcmp("Raw profile type iptc", key, 21) == 0 |
|
286 | 290 |
&& pImage->iptcData().empty()) { |
287 | 291 |
DataBuf psData = readRawProfile(arr); |
288 | 292 |
if (psData.size_ > 0) { |
... | ... | |
332 | 336 | |
333 | 337 |
// We look if an ImageMagick XMP raw profile exist. |
334 | 338 | |
335 |
if ( memcmp("Raw profile type xmp", key, 20) == 0 && |
|
336 |
pImage->xmpData().empty()) |
|
339 |
if ( keySize >= 20 |
|
340 |
&& memcmp("Raw profile type xmp", key, 20) == 0 |
|
341 |
&& pImage->xmpData().empty()) |
|
337 | 342 |
{ |
338 | 343 |
DataBuf xmpBuf = readRawProfile(arr); |
339 | 344 |
long length = xmpBuf.size_; |
... | ... | |
362 | 367 | |
363 | 368 |
// We look if an Adobe XMP string exist. |
364 | 369 | |
365 |
if ( memcmp("XML:com.adobe.xmp", key, 17) == 0 && |
|
366 |
pImage->xmpData().empty()) |
|
370 |
if ( keySize >= 17 |
|
371 |
&& memcmp("XML:com.adobe.xmp", key, 17) == 0 |
|
372 |
&& pImage->xmpData().empty()) |
|
367 | 373 |
{ |
368 | 374 |
if (arr.size_ > 0) |
369 | 375 |
{ |
... | ... | |
390 | 396 |
// We look if a comments string exist. Note than we use only 'Description' keyword which |
391 | 397 |
// is dedicaced to store long comments. 'Comment' keyword is ignored. |
392 | 398 | |
393 |
if ( memcmp("Description", key, 11) == 0 && |
|
394 |
pImage->comment().empty()) |
|
399 |
if ( keySize >= 11 |
|
400 |
&& memcmp("Description", key, 11) == 0 |
|
401 |
&& pImage->comment().empty()) |
|
395 | 402 |
{ |
396 | 403 |
pImage->comment().assign(reinterpret_cast<char*>(arr.pData_), arr.size_); |
397 | 404 |
} |
trunk-bug664/src/pngchunk_int.hpp 2009-12-29 10:16:40.000000000 +0800 | ||
---|---|---|
134 | 134 |
Xmp packet generated by Adobe ==> Image Xmp metadata. |
135 | 135 |
Description string ==> Image Comments. |
136 | 136 |
*/ |
137 |
static void parseChunkContent(Image* pImage,
|
|
137 |
static void parseChunkContent( Image* pImage,
|
|
138 | 138 |
const byte* key, |
139 |
long keySize, |
|
139 | 140 |
const DataBuf arr); |
140 | 141 | |
141 | 142 |
/*! |
trunk-bug664/src/pngimage.cpp 2009-12-29 10:34:48.000000000 +0800 | ||
---|---|---|
132 | 132 |
if (io_->error()) throw Error(14); |
133 | 133 |
if (bufRead != cheaderBuf.size_) throw Error(20); |
134 | 134 | |
135 |
#ifdef DEBUG |
|
136 |
std::cout << "Exiv2::PngImage::readMetadata: Next Chunk: " << cheaderBuf.pData_ + 4 << "\n"; |
|
137 |
#endif |
|
138 | 135 |
// Decode chunk data length. |
139 | ||
140 | 136 |
uint32_t dataOffset = Exiv2::getULong(cheaderBuf.pData_, Exiv2::bigEndian); |
141 | 137 |
if (dataOffset > 0x7FFFFFFF) throw Exiv2::Error(14); |
142 | 138 | |
... | ... | |
159 | 155 |
{ |
160 | 156 |
// Last chunk found: we stop parsing. |
161 | 157 |
#ifdef DEBUG |
162 |
std::cout << "Exiv2::PngImage::readMetadata: Found IEND chunk (lenght: " << dataOffset << ")\n";
|
|
158 |
std::cout << "Exiv2::PngImage::readMetadata: Found IEND chunk (length: " << dataOffset << ")\n";
|
|
163 | 159 |
#endif |
164 | 160 |
return; |
165 | 161 |
} |
166 | 162 |
else if (!memcmp(cheaderBuf.pData_ + 4, "IHDR", 4)) |
167 | 163 |
{ |
168 | 164 |
#ifdef DEBUG |
169 |
std::cout << "Exiv2::PngImage::readMetadata: Found IHDR chunk (lenght: " << dataOffset << ")\n";
|
|
165 |
std::cout << "Exiv2::PngImage::readMetadata: Found IHDR chunk (length: " << dataOffset << ")\n";
|
|
170 | 166 |
#endif |
171 | 167 |
PngChunk::decodeIHDRChunk(cdataBuf, &pixelWidth_, &pixelHeight_); |
172 | 168 |
} |
173 | 169 |
else if (!memcmp(cheaderBuf.pData_ + 4, "tEXt", 4)) |
174 | 170 |
{ |
175 | 171 |
#ifdef DEBUG |
176 |
std::cout << "Exiv2::PngImage::readMetadata: Found tEXt chunk (lenght: " << dataOffset << ")\n";
|
|
172 |
std::cout << "Exiv2::PngImage::readMetadata: Found tEXt chunk (length: " << dataOffset << ")\n";
|
|
177 | 173 |
#endif |
178 | 174 |
PngChunk::decodeTXTChunk(this, cdataBuf, PngChunk::tEXt_Chunk); |
179 | 175 |
} |
180 | 176 |
else if (!memcmp(cheaderBuf.pData_ + 4, "zTXt", 4)) |
181 | 177 |
{ |
182 | 178 |
#ifdef DEBUG |
183 |
std::cout << "Exiv2::PngImage::readMetadata: Found zTXt chunk (lenght: " << dataOffset << ")\n";
|
|
179 |
std::cout << "Exiv2::PngImage::readMetadata: Found zTXt chunk (length: " << dataOffset << ")\n";
|
|
184 | 180 |
#endif |
185 | 181 |
PngChunk::decodeTXTChunk(this, cdataBuf, PngChunk::zTXt_Chunk); |
186 | 182 |
} |
187 | 183 |
else if (!memcmp(cheaderBuf.pData_ + 4, "iTXt", 4)) |
188 | 184 |
{ |
189 | 185 |
#ifdef DEBUG |
190 |
std::cout << "Exiv2::PngImage::readMetadata: Found iTXt chunk (lenght: " << dataOffset << ")\n";
|
|
186 |
std::cout << "Exiv2::PngImage::readMetadata: Found iTXt chunk (length: " << dataOffset << ")\n";
|
|
191 | 187 |
#endif |
192 | 188 |
PngChunk::decodeTXTChunk(this, cdataBuf, PngChunk::iTXt_Chunk); |
193 | 189 |
} |
... | ... | |
270 | 266 |
{ |
271 | 267 |
// Last chunk found: we write it and done. |
272 | 268 |
#ifdef DEBUG |
273 |
std::cout << "Exiv2::PngImage::doWriteMetadata: Write IEND chunk (lenght: " << dataOffset << ")\n";
|
|
269 |
std::cout << "Exiv2::PngImage::doWriteMetadata: Write IEND chunk (length: " << dataOffset << ")\n";
|
|
274 | 270 |
#endif |
275 | 271 |
if (outIo.write(chunkBuf.pData_, chunkBuf.size_) != chunkBuf.size_) throw Error(21); |
276 | 272 |
return; |
... | ... | |
278 | 274 |
else if (!memcmp(cheaderBuf.pData_ + 4, "IHDR", 4)) |
279 | 275 |
{ |
280 | 276 |
#ifdef DEBUG |
281 |
std::cout << "Exiv2::PngImage::doWriteMetadata: Write IHDR chunk (lenght: " << dataOffset << ")\n";
|
|
277 |
std::cout << "Exiv2::PngImage::doWriteMetadata: Write IHDR chunk (length: " << dataOffset << ")\n";
|
|
282 | 278 |
#endif |
283 | 279 |
if (outIo.write(chunkBuf.pData_, chunkBuf.size_) != chunkBuf.size_) throw Error(21); |
284 | 280 | |
... | ... | |
362 | 358 |
{ |
363 | 359 |
#ifdef DEBUG |
364 | 360 |
std::cout << "Exiv2::PngImage::doWriteMetadata: write " << cheaderBuf.pData_ + 4 |
365 |
<< " chunk (lenght: " << dataOffset << ")\n";
|
|
361 |
<< " chunk (length: " << dataOffset << ")\n";
|
|
366 | 362 |
#endif |
367 | 363 |
if (outIo.write(chunkBuf.pData_, chunkBuf.size_) != chunkBuf.size_) throw Error(21); |
368 | 364 |
} |
... | ... | |
372 | 368 |
// Write all others chunk as well. |
373 | 369 |
#ifdef DEBUG |
374 | 370 |
std::cout << "Exiv2::PngImage::doWriteMetadata: write " << cheaderBuf.pData_ + 4 |
375 |
<< " chunk (lenght: " << dataOffset << ")\n";
|
|
371 |
<< " chunk (length: " << dataOffset << ")\n";
|
|
376 | 372 |
#endif |
377 | 373 |
if (outIo.write(chunkBuf.pData_, chunkBuf.size_) != chunkBuf.size_) throw Error(21); |
378 | 374 |