Compress-Zopfli
view release on metacpan or search on metacpan
zopflib/src/zopflipng/lodepng/lodepng.h view on Meta::CPAN
cleaned out code as well as making certain parts faster.
*) 28 dec 2006: Added "Settings" to the encoder.
*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now.
Removed some code duplication in the decoder. Fixed little bug in an example.
*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter.
Fixed a bug of the decoder with 16-bit per color.
*) 15 okt 2006: Changed documentation structure
*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the
given image buffer, however for now it's not compressed.
*) 08 sep 2006: (!) Changed to interface with a Decoder class
*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different
way. Renamed decodePNG to decodePNGGeneric.
*) 29 jul 2006: (!) Changed the interface: image info is now returned as a
struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy.
*) 28 jul 2006: Cleaned the code and added new error checks.
Corrected terminology "deflate" into "inflate".
*) 23 jun 2006: Added SDL example in the documentation in the header, this
example allows easy debugging by displaying the PNG and its transparency.
*) 22 jun 2006: (!) Changed way to obtain error value. Added
loadFile function for convenience. Made decodePNG32 faster.
*) 21 jun 2006: (!) Changed type of info vector to unsigned.
zopflib/src/zopflipng/lodepng/lodepng_util.cpp view on Meta::CPAN
struct ExtractPNG //PNG decoding and information extraction
{
std::vector<ZlibBlockInfo>* zlibinfo;
ExtractPNG(std::vector<ZlibBlockInfo>* info) : zlibinfo(info) {};
int error;
void decode(const unsigned char* in, size_t size)
{
error = 0;
if(size == 0 || in == 0) { error = 48; return; } //the given data is empty
readPngHeader(&in[0], size); if(error) return;
size_t pos = 33; //first byte of the first chunk after the header
std::vector<unsigned char> idat; //the data from idat chunks
bool IEND = false;
//loop through the chunks, ignoring unknown chunks and stopping at IEND chunk.
//IDAT data is put at the start of the in buffer
while(!IEND)
{
//error: size of the in buffer too small to contain next chunk
if(pos + 8 >= size) { error = 30; return; }
size_t chunkLength = read32bitInt(&in[pos]); pos += 4;
zopflib/src/zopflipng/lodepng/lodepng_util.cpp view on Meta::CPAN
}
pos += 4; //step over CRC (which is ignored)
}
std::vector<unsigned char> out; //now the out buffer will be filled
ExtractZlib zlib(zlibinfo); //decompress with the Zlib decompressor
error = zlib.decompress(out, idat);
if(error) return; //stop if the zlib decompressor returned an error
}
//read the information from the header and store it in the Info
void readPngHeader(const unsigned char* in, size_t inlength)
{
if(inlength < 29) { error = 27; return; } //error: the data length is smaller than the length of the header
if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71
|| in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) { error = 28; return; } //no PNG signature
//error: it doesn't start with a IHDR chunk!
if(in[12] != 'I' || in[13] != 'H' || in[14] != 'D' || in[15] != 'R') { error = 29; return; }
}
unsigned long readBitFromReversedStream(size_t& bitp, const unsigned char* bits)
{
( run in 0.766 second using v1.01-cache-2.11-cpan-0a6323c29d9 )