|
|
@@ -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<bx::HashCrc32> writer(_writer);
|
|
|
-
|
|
|
int32_t total = 0;
|
|
|
- total += bx::write(&writer, "\x89PNG\r\n\x1a\n", _err);
|
|
|
-
|
|
|
- total += bx::write(&writer, bx::toBigEndian<uint32_t>(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);
|
|
|
-
|
|
|
- const uint8_t* src = (const uint8_t*)_src;
|
|
|
- const uint32_t bpp = _grayscale ? 8 : 32;
|
|
|
+ total += bx::write(_writer, "\x89PNG\r\n\x1a\n", _err);
|
|
|
+ total += bx::write(_writer, bx::toBigEndian<uint32_t>(13), _err);
|
|
|
+
|
|
|
+ HashWriter<bx::HashCrc32> 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 uint32_t bpp = _grayscale ? 8 : 32;
|
|
|
const uint32_t stride = _width*bpp/8;
|
|
|
const uint16_t zlen = bx::toLittleEndian<uint16_t>(uint16_t(stride + 1) );
|
|
|
const uint16_t zlenC = bx::toLittleEndian<uint16_t>(~zlen);
|
|
|
|
|
|
- total += bx::write(&writer, bx::toBigEndian<uint32_t>(_height*(stride+6)+6), _err);
|
|
|
+ total += bx::write(_writer, bx::toBigEndian<uint32_t>(_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<bx::HashAdler32> writerA(&writerC);
|
|
|
+
|
|
|
for (uint32_t ii = 0; ii < _height && _err->isOk(); ++ii)
|
|
|
{
|
|
|
- chksum.add(0);
|
|
|
- chksum.add(&src[ii*_srcPitch], stride);
|
|
|
-
|
|
|
- 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(&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(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;
|
|
|
}
|