Updated LodePNG to 20160501 version

This commit is contained in:
vsonnier 2016-06-06 19:39:18 +02:00
parent ca0102b3aa
commit ceeb8e25f7
2 changed files with 520 additions and 386 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/* /*
LodePNG version 20141130 LodePNG version 20160501
Copyright (c) 2005-2014 Lode Vandevenne Copyright (c) 2005-2016 Lode Vandevenne
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -28,12 +28,7 @@ freely, subject to the following restrictions:
#include <string.h> /*for size_t*/ #include <string.h> /*for size_t*/
#ifdef __cplusplus extern const char* LODEPNG_VERSION_STRING;
#include <vector>
#include <string>
#endif /*__cplusplus*/
#define LODEPNG_VERSION_STRING "20141130"
/* /*
The following #defines are used to create code sections. They can be disabled The following #defines are used to create code sections. They can be disabled
@ -41,6 +36,8 @@ to disable code sections, which can give faster compile time and smaller binary.
The "NO_COMPILE" defines are designed to be used to pass as defines to the The "NO_COMPILE" defines are designed to be used to pass as defines to the
compiler command to disable them without modifying this header, e.g. compiler command to disable them without modifying this header, e.g.
-DLODEPNG_NO_COMPILE_ZLIB for gcc. -DLODEPNG_NO_COMPILE_ZLIB for gcc.
In addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to
allow implementing a custom lodepng_crc32.
*/ */
/*deflate & zlib. If disabled, you must specify alternative zlib functions in /*deflate & zlib. If disabled, you must specify alternative zlib functions in
the custom_zlib field of the compress and decompress settings*/ the custom_zlib field of the compress and decompress settings*/
@ -84,6 +81,11 @@ source files with custom allocators.*/
#endif #endif
#endif #endif
#ifdef LODEPNG_COMPILE_CPP
#include <vector>
#include <string>
#endif /*LODEPNG_COMPILE_CPP*/
#ifdef LODEPNG_COMPILE_PNG #ifdef LODEPNG_COMPILE_PNG
/*The PNG color types (also used for raw).*/ /*The PNG color types (also used for raw).*/
typedef enum LodePNGColorType typedef enum LodePNGColorType
@ -213,8 +215,8 @@ Same as the other decode functions, but instead takes a filename as input.
unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
const std::string& filename, const std::string& filename,
LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);
#endif //LODEPNG_COMPILE_DISK #endif /* LODEPNG_COMPILE_DISK */
#endif //LODEPNG_COMPILE_DECODER #endif /* LODEPNG_COMPILE_DECODER */
#ifdef LODEPNG_COMPILE_ENCODER #ifdef LODEPNG_COMPILE_ENCODER
/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype /*Same as lodepng_encode_memory, but encodes to an std::vector. colortype
@ -237,9 +239,9 @@ unsigned encode(const std::string& filename,
unsigned encode(const std::string& filename, unsigned encode(const std::string& filename,
const std::vector<unsigned char>& in, unsigned w, unsigned h, const std::vector<unsigned char>& in, unsigned w, unsigned h,
LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8);
#endif //LODEPNG_COMPILE_DISK #endif /* LODEPNG_COMPILE_DISK */
#endif //LODEPNG_COMPILE_ENCODER #endif /* LODEPNG_COMPILE_ENCODER */
} //namespace lodepng } /* namespace lodepng */
#endif /*LODEPNG_COMPILE_CPP*/ #endif /*LODEPNG_COMPILE_CPP*/
#endif /*LODEPNG_COMPILE_PNG*/ #endif /*LODEPNG_COMPILE_PNG*/
@ -506,7 +508,7 @@ For 16-bit per channel colors, uses big endian format like PNG does.
Return value is LodePNG error code Return value is LodePNG error code
*/ */
unsigned lodepng_convert(unsigned char* out, const unsigned char* in, unsigned lodepng_convert(unsigned char* out, const unsigned char* in,
LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in,
unsigned w, unsigned h); unsigned w, unsigned h);
#ifdef LODEPNG_COMPILE_DECODER #ifdef LODEPNG_COMPILE_DECODER
@ -538,7 +540,7 @@ typedef enum LodePNGFilterStrategy
{ {
/*every filter at zero*/ /*every filter at zero*/
LFS_ZERO, LFS_ZERO,
/*Use filter that gives minumum sum, as described in the official PNG filter heuristic.*/ /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/
LFS_MINSUM, LFS_MINSUM,
/*Use the filter type that gives smallest Shannon entropy for this scanline. Depending /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending
on the image, this is better or worse than minsum.*/ on the image, this is better or worse than minsum.*/
@ -629,7 +631,7 @@ typedef struct LodePNGState
LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/
unsigned error; unsigned error;
#ifdef LODEPNG_COMPILE_CPP #ifdef LODEPNG_COMPILE_CPP
//For the lodepng::State subclass. /* For the lodepng::State subclass. */
virtual ~LodePNGState(){} virtual ~LodePNGState(){}
#endif #endif
} LodePNGState; } LodePNGState;
@ -811,7 +813,7 @@ unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const
#endif /*LODEPNG_COMPILE_DISK*/ #endif /*LODEPNG_COMPILE_DISK*/
#ifdef LODEPNG_COMPILE_CPP #ifdef LODEPNG_COMPILE_CPP
//The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. /* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */
namespace lodepng namespace lodepng
{ {
#ifdef LODEPNG_COMPILE_PNG #ifdef LODEPNG_COMPILE_PNG
@ -825,7 +827,7 @@ class State : public LodePNGState
}; };
#ifdef LODEPNG_COMPILE_DECODER #ifdef LODEPNG_COMPILE_DECODER
//Same as other lodepng::decode, but using a State for more settings and information. /* Same as other lodepng::decode, but using a State for more settings and information. */
unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
State& state, State& state,
const unsigned char* in, size_t insize); const unsigned char* in, size_t insize);
@ -835,7 +837,7 @@ unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
#endif /*LODEPNG_COMPILE_DECODER*/ #endif /*LODEPNG_COMPILE_DECODER*/
#ifdef LODEPNG_COMPILE_ENCODER #ifdef LODEPNG_COMPILE_ENCODER
//Same as other lodepng::encode, but using a State for more settings and information. /* Same as other lodepng::encode, but using a State for more settings and information. */
unsigned encode(std::vector<unsigned char>& out, unsigned encode(std::vector<unsigned char>& out,
const unsigned char* in, unsigned w, unsigned h, const unsigned char* in, unsigned w, unsigned h,
State& state); State& state);
@ -846,47 +848,47 @@ unsigned encode(std::vector<unsigned char>& out,
#ifdef LODEPNG_COMPILE_DISK #ifdef LODEPNG_COMPILE_DISK
/* /*
Load a file from disk into an std::vector. If the vector is empty, then either Load a file from disk into an std::vector.
the file doesn't exist or is an empty file. return value: error code (0 means ok)
*/ */
void load_file(std::vector<unsigned char>& buffer, const std::string& filename); unsigned load_file(std::vector<unsigned char>& buffer, const std::string& filename);
/* /*
Save the binary data in an std::vector to a file on disk. The file is overwritten Save the binary data in an std::vector to a file on disk. The file is overwritten
without warning. without warning.
*/ */
void save_file(const std::vector<unsigned char>& buffer, const std::string& filename); unsigned save_file(const std::vector<unsigned char>& buffer, const std::string& filename);
#endif //LODEPNG_COMPILE_DISK #endif /* LODEPNG_COMPILE_DISK */
#endif //LODEPNG_COMPILE_PNG #endif /* LODEPNG_COMPILE_PNG */
#ifdef LODEPNG_COMPILE_ZLIB #ifdef LODEPNG_COMPILE_ZLIB
#ifdef LODEPNG_COMPILE_DECODER #ifdef LODEPNG_COMPILE_DECODER
//Zlib-decompress an unsigned char buffer /* Zlib-decompress an unsigned char buffer */
unsigned decompress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize, unsigned decompress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,
const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings);
//Zlib-decompress an std::vector /* Zlib-decompress an std::vector */
unsigned decompress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in, unsigned decompress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,
const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings);
#endif //LODEPNG_COMPILE_DECODER #endif /* LODEPNG_COMPILE_DECODER */
#ifdef LODEPNG_COMPILE_ENCODER #ifdef LODEPNG_COMPILE_ENCODER
//Zlib-compress an unsigned char buffer /* Zlib-compress an unsigned char buffer */
unsigned compress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize, unsigned compress(std::vector<unsigned char>& out, const unsigned char* in, size_t insize,
const LodePNGCompressSettings& settings = lodepng_default_compress_settings); const LodePNGCompressSettings& settings = lodepng_default_compress_settings);
//Zlib-compress an std::vector /* Zlib-compress an std::vector */
unsigned compress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in, unsigned compress(std::vector<unsigned char>& out, const std::vector<unsigned char>& in,
const LodePNGCompressSettings& settings = lodepng_default_compress_settings); const LodePNGCompressSettings& settings = lodepng_default_compress_settings);
#endif //LODEPNG_COMPILE_ENCODER #endif /* LODEPNG_COMPILE_ENCODER */
#endif //LODEPNG_COMPILE_ZLIB #endif /* LODEPNG_COMPILE_ZLIB */
} //namespace lodepng } /* namespace lodepng */
#endif /*LODEPNG_COMPILE_CPP*/ #endif /*LODEPNG_COMPILE_CPP*/
/* /*
TODO: TODO:
[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often [.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often
[.] check compatibility with vareous compilers - done but needs to be redone for every newer version [.] check compatibility with various compilers - done but needs to be redone for every newer version
[X] converting color to 16-bit per channel types [X] converting color to 16-bit per channel types
[ ] read all public PNG chunk types (but never let the color profile and gamma ones touch RGB values) [ ] read all public PNG chunk types (but never let the color profile and gamma ones touch RGB values)
[ ] make sure encoder generates no chunks with size > (2^31)-1 [ ] make sure encoder generates no chunks with size > (2^31)-1
@ -894,8 +896,9 @@ TODO:
[X] let the "isFullyOpaque" function check color keys and transparent palettes too [X] let the "isFullyOpaque" function check color keys and transparent palettes too
[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" [X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl"
[ ] don't stop decoding on errors like 69, 57, 58 (make warnings) [ ] don't stop decoding on errors like 69, 57, 58 (make warnings)
[ ] make option to choose if the raw image with non multiple of 8 bits per scanline should have padding bits or not
[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes [ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes
[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ...
[ ] allow user to give data (void*) to custom allocator
*/ */
#endif /*LODEPNG_H inclusion guard*/ #endif /*LODEPNG_H inclusion guard*/
@ -925,8 +928,9 @@ LodePNG Documentation
10. examples 10. examples
10.1. decoder C++ example 10.1. decoder C++ example
10.2. decoder C example 10.2. decoder C example
11. changes 11. state settings reference
12. contact information 12. changes
13. contact information
1. about 1. about
@ -1552,8 +1556,49 @@ int main(int argc, char *argv[])
return 0; return 0;
} }
11. state settings reference
----------------------------
11. changes A quick reference of some settings to set on the LodePNGState
For decoding:
state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums
state.decoder.zlibsettings.custom_...: use custom inflate function
state.decoder.ignore_crc: ignore CRC checksums
state.decoder.color_convert: convert internal PNG color to chosen one
state.decoder.read_text_chunks: whether to read in text metadata chunks
state.decoder.remember_unknown_chunks: whether to read in unknown chunks
state.info_raw.colortype: desired color type for decoded image
state.info_raw.bitdepth: desired bit depth for decoded image
state.info_raw....: more color settings, see struct LodePNGColorMode
state.info_png....: no settings for decoder but ouput, see struct LodePNGInfo
For encoding:
state.encoder.zlibsettings.btype: disable compression by setting it to 0
state.encoder.zlibsettings.use_lz77: use LZ77 in compression
state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize
state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match
state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching
state.encoder.zlibsettings.lazymatching: try one more LZ77 matching
state.encoder.zlibsettings.custom_...: use custom deflate function
state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png
state.encoder.filter_palette_zero: PNG filter strategy for palette
state.encoder.filter_strategy: PNG filter strategy to encode with
state.encoder.force_palette: add palette even if not encoding to one
state.encoder.add_id: add LodePNG identifier and version as a text chunk
state.encoder.text_compression: use compressed text chunks for metadata
state.info_raw.colortype: color type of raw input image you provide
state.info_raw.bitdepth: bit depth of raw input image you provide
state.info_raw: more color settings, see struct LodePNGColorMode
state.info_png.color.colortype: desired color type if auto_convert is false
state.info_png.color.bitdepth: desired bit depth if auto_convert is false
state.info_png.color....: more color settings, see struct LodePNGColorMode
state.info_png....: more PNG related settings, see struct LodePNGInfo
12. changes
----------- -----------
The version number of LodePNG is the date of the change given in the format The version number of LodePNG is the date of the change given in the format
@ -1562,6 +1607,12 @@ yyyymmdd.
Some changes aren't backwards compatible. Those are indicated with a (!) Some changes aren't backwards compatible. Those are indicated with a (!)
symbol. symbol.
*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort).
*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within
the limits of pure C90).
*) 08 dec 2015: Made load_file function return error if file can't be opened.
*) 24 okt 2015: Bugfix with decoding to palette output.
*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding.
*) 23 aug 2014: Reduced needless memory usage of decoder. *) 23 aug 2014: Reduced needless memory usage of decoder.
*) 28 jun 2014: Removed fix_png setting, always support palette OOB for *) 28 jun 2014: Removed fix_png setting, always support palette OOB for
simplicity. Made ColorProfile public. simplicity. Made ColorProfile public.
@ -1586,7 +1637,7 @@ symbol.
*) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed *) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed
redundant C++ codec classes. Reduced amount of structs. Everything changed, redundant C++ codec classes. Reduced amount of structs. Everything changed,
but it is cleaner now imho and functionality remains the same. Also fixed but it is cleaner now imho and functionality remains the same. Also fixed
several bugs and shrinked the implementation code. Made new samples. several bugs and shrunk the implementation code. Made new samples.
*) 6 nov 2011 (!): By default, the encoder now automatically chooses the best *) 6 nov 2011 (!): By default, the encoder now automatically chooses the best
PNG color model and bit depth, based on the amount and type of colors of the PNG color model and bit depth, based on the amount and type of colors of the
raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color.
@ -1621,7 +1672,7 @@ symbol.
*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. *) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor.
*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. *) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder.
*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added *) 17 jan 2008: ability to encode and decode compressed zTXt chunks added
Also vareous fixes, such as in the deflate and the padding bits code. Also various fixes, such as in the deflate and the padding bits code.
*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved *) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved
filtering code of encoder. filtering code of encoder.
*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A *) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A
@ -1692,7 +1743,7 @@ symbol.
*) 12 aug 2005: Initial release (C++, decoder only) *) 12 aug 2005: Initial release (C++, decoder only)
12. contact information 13. contact information
----------------------- -----------------------
Feel free to contact me with suggestions, problems, comments, ... concerning Feel free to contact me with suggestions, problems, comments, ... concerning
@ -1704,5 +1755,5 @@ Domain: gmail dot com.
Account: lode dot vandevenne. Account: lode dot vandevenne.
Copyright (c) 2005-2014 Lode Vandevenne Copyright (c) 2005-2016 Lode Vandevenne
*/ */