diff --git a/src/image.cpp b/src/image.cpp index 3749297..bfb0466 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -3315,6 +3315,7 @@ namespace bimg HashWriter(bx::WriterI* _writer) : m_writer(_writer) { + begin(); } void begin() @@ -3342,34 +3343,28 @@ namespace bimg { BX_ERROR_SCOPE(_err); - HashWriter writer(_writer); - int32_t total = 0; - total += bx::write(&writer, "\x89PNG\r\n\x1a\n", _err); + total += bx::write(_writer, "\x89PNG\r\n\x1a\n", _err); + total += bx::write(_writer, bx::toBigEndian(13), _err); - total += bx::write(&writer, bx::toBigEndian(13), _err); - writer.begin(); - total += bx::write(&writer, "IHDR", _err); - total += bx::write(&writer, bx::toBigEndian(_width), _err); - total += bx::write(&writer, bx::toBigEndian(_height), _err); - total += bx::write(&writer, "\x08\x06", _err); - total += bx::writeRep(&writer, 0, 3, _err); - total += bx::write(&writer, bx::toBigEndian(writer.end() ), _err); + HashWriter writerC(_writer); + total += bx::write(&writerC, "IHDR", _err); + total += bx::write(&writerC, bx::toBigEndian(_width), _err); + total += bx::write(&writerC, bx::toBigEndian(_height), _err); + total += bx::write(&writerC, "\x08\x06", _err); + total += bx::writeRep(&writerC, 0, 3, _err); + total += bx::write(_writer, bx::toBigEndian(writerC.end() ), _err); - const uint8_t* src = (const uint8_t*)_src; - const uint32_t bpp = _grayscale ? 8 : 32; + const uint32_t bpp = _grayscale ? 8 : 32; const uint32_t stride = _width*bpp/8; const uint16_t zlen = bx::toLittleEndian(uint16_t(stride + 1) ); const uint16_t zlenC = bx::toLittleEndian(~zlen); - total += bx::write(&writer, bx::toBigEndian(_height*(stride+6)+6), _err); + total += bx::write(_writer, bx::toBigEndian(_height*(stride+6)+6), _err); - writer.begin(); - total += bx::write(&writer, "IDAT", _err); - total += bx::write(&writer, "\x78\x9c", _err); - - bx::HashAdler32 chksum; - chksum.begin(); + writerC.begin(); + total += bx::write(&writerC, "IDAT", _err); + total += bx::write(&writerC, "\x78\x9c", _err); const uint8_t* data = (const uint8_t*)_src; int32_t step = int32_t(_srcPitch); @@ -3379,21 +3374,19 @@ namespace bimg step = -step; } + HashWriter writerA(&writerC); + for (uint32_t ii = 0; ii < _height && _err->isOk(); ++ii) { - chksum.add(0); - chksum.add(&src[ii*_srcPitch], stride); + total += bx::write(&writerC, uint8_t(ii == _height-1 ? 1 : 0), _err); + total += bx::write(&writerC, zlen, _err); + total += bx::write(&writerC, zlenC, _err); - total += bx::write(&writer, uint8_t(ii == _height-1 ? 1 : 0), _err); - - total += bx::write(&writer, zlen, _err); - total += bx::write(&writer, zlenC, _err); - - total += bx::write(&writer, uint8_t(0), _err); + total += bx::write(&writerA, uint8_t(0), _err); if (_grayscale) { - total += bx::write(&writer, data, stride, _err); + total += bx::write(&writerA, data, stride, _err); } else { @@ -3404,22 +3397,22 @@ namespace bimg const uint8_t gg = bgra[1]; const uint8_t rr = bgra[2]; const uint8_t aa = bgra[3]; - total += bx::write(&writer, rr, _err); - total += bx::write(&writer, gg, _err); - total += bx::write(&writer, bb, _err); - total += bx::write(&writer, aa, _err); + total += bx::write(&writerA, rr, _err); + total += bx::write(&writerA, gg, _err); + total += bx::write(&writerA, bb, _err); + total += bx::write(&writerA, aa, _err); } } data += step; } - total += bx::write(&writer, bx::toBigEndian(chksum.end() ), _err); - total += bx::write(&writer, bx::toBigEndian(writer.end() ), _err); + total += bx::write(&writerC, bx::toBigEndian(writerA.end() ), _err); + total += bx::write(_writer, bx::toBigEndian(writerC.end() ), _err); - writer.begin(); - total += bx::write(&writer, uint32_t(0), _err); - total += bx::write(&writer, "IEND", _err); - total += bx::write(&writer, bx::toBigEndian(writer.end() ), _err); + writerC.begin(); + total += bx::write(&writerC, uint32_t(0), _err); + total += bx::write(&writerC, "IEND", _err); + total += bx::write(_writer, bx::toBigEndian(writerC.end() ), _err); return total; }