Factor our function to read PNG Chunk info

v0.27.3
Luis Díaz Más 6 years ago
parent 914a8c5585
commit d1097fab59

@ -389,6 +389,17 @@ namespace Exiv2 {
}
}
void readChunk(DataBuf& buffer, BasicIo& io)
{
long bufRead = io.read(buffer.pData_, buffer.size_);
if (io.error()) {
throw Error(kerFailedToReadImageData);
}
if (bufRead != buffer.size_) {
throw Error(kerInputDataReadFailed);
}
}
void PngImage::readMetadata()
{
#ifdef DEBUG
@ -405,23 +416,15 @@ namespace Exiv2 {
clearMetadata();
const long imgSize = (long) io_->size();
DataBuf cheaderBuf(8); // Chunk header size : 4 bytes (data size) + 4 bytes (chunk type).
DataBuf cheaderBuf(8); // Chunk header: 4 bytes (data size) + 4 bytes (chunk type).
while(!io_->eof())
{
// Read chunk header.
#ifdef DEBUG
std::cout << "Exiv2::PngImage::readMetadata: Position: " << io_->tell() << std::endl;
#endif
std::memset(cheaderBuf.pData_, 0x0, cheaderBuf.size_);
long bufRead = io_->read(cheaderBuf.pData_, cheaderBuf.size_);
if (io_->error()) {
throw Error(kerFailedToReadImageData);
}
if (bufRead != cheaderBuf.size_) {
throw Error(kerInputDataReadFailed);
}
readChunk(cheaderBuf, *io_); // Read chunk header.
// Decode chunk data length.
uint32_t dataOffset = Exiv2::getULong(cheaderBuf.pData_, Exiv2::bigEndian);
@ -445,16 +448,8 @@ namespace Exiv2 {
!memcmp(cheaderBuf.pData_ + 4, "iTXt", 4) ||
!memcmp(cheaderBuf.pData_ + 4, "iCCP", 4))
{
// Extract chunk data.
DataBuf cdataBuf(dataOffset);
bufRead = io_->read(cdataBuf.pData_, dataOffset);
if (io_->error()) {
throw Error(kerFailedToReadImageData);
}
if (bufRead != (long)dataOffset) {
throw Error(kerInputDataReadFailed);
}
readChunk(cdataBuf, *io_); // Extract chunk data.
if (!memcmp(cheaderBuf.pData_ + 4, "IEND", 4))
{

Loading…
Cancel
Save