@ -16,16 +16,22 @@ ABOUT:
adapted to write to memory or a general streaming interface ; let me know .
adapted to write to memory or a general streaming interface ; let me know .
The PNG output is not optimal ; it is 20 - 50 % larger than the file
The PNG output is not optimal ; it is 20 - 50 % larger than the file
written by a decent optimizing implementation . This library is designed
written by a decent optimizing implementation ; though providing a custom
for source code compactness and simplicity , not optimal image file size
zlib compress function ( see STBIW_ZLIB_COMPRESS ) can mitigate that .
or run - time performance .
This library is designed for source code compactness and simplicity ,
not optimal image file size or run - time performance .
BUILDING :
BUILDING :
You can # define STBIW_ASSERT ( x ) before the # include to avoid using assert . h .
You can # define STBIW_ASSERT ( x ) before the # include to avoid using assert . h .
You can # define STBIW_MALLOC ( ) , STBIW_REALLOC ( ) , and STBIW_FREE ( ) to replace
You can # define STBIW_MALLOC ( ) , STBIW_REALLOC ( ) , and STBIW_FREE ( ) to replace
malloc , realloc , free .
malloc , realloc , free .
You can define STBIW_MEMMOVE ( ) to replace memmove ( )
You can # define STBIW_MEMMOVE ( ) to replace memmove ( )
You can # define STBIW_ZLIB_COMPRESS to use a custom zlib - style compress function
for PNG compression ( instead of the builtin one ) , it must have the following signature :
unsigned char * my_compress ( unsigned char * data , int data_len , int * out_len , int quality ) ;
The returned data will be freed with STBIW_FREE ( ) ( free ( ) by default ) ,
so it must be heap allocated with STBIW_MALLOC ( ) ( malloc ( ) by default ) ,
USAGE :
USAGE :
@ -650,6 +656,7 @@ int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *da
// PNG writer
// PNG writer
//
//
# ifndef STBIW_ZLIB_COMPRESS
// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size()
// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size()
# define stbiw__sbraw(a) ((int *) (a) - 2)
# define stbiw__sbraw(a) ((int *) (a) - 2)
# define stbiw__sbm(a) stbiw__sbraw(a)[0]
# define stbiw__sbm(a) stbiw__sbraw(a)[0]
@ -730,8 +737,14 @@ static unsigned int stbiw__zhash(unsigned char *data)
# define stbiw__ZHASH 16384
# define stbiw__ZHASH 16384
# endif // STBIW_ZLIB_COMPRESS
unsigned char * stbi_zlib_compress ( unsigned char * data , int data_len , int * out_len , int quality )
unsigned char * stbi_zlib_compress ( unsigned char * data , int data_len , int * out_len , int quality )
{
{
# ifdef STBIW_ZLIB_COMPRESS
// user provided a zlib compress implementation, use that
return STBIW_ZLIB_COMPRESS ( data , data_len , out_len , quality ) ;
# else // use builtin
static unsigned short lengthc [ ] = { 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15 , 17 , 19 , 23 , 27 , 31 , 35 , 43 , 51 , 59 , 67 , 83 , 99 , 115 , 131 , 163 , 195 , 227 , 258 , 259 } ;
static unsigned short lengthc [ ] = { 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15 , 17 , 19 , 23 , 27 , 31 , 35 , 43 , 51 , 59 , 67 , 83 , 99 , 115 , 131 , 163 , 195 , 227 , 258 , 259 } ;
static unsigned char lengtheb [ ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 5 , 5 , 5 , 5 , 0 } ;
static unsigned char lengtheb [ ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 5 , 5 , 5 , 5 , 0 } ;
static unsigned short distc [ ] = { 1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 , 17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 , 257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 , 4097 , 6145 , 8193 , 12289 , 16385 , 24577 , 32768 } ;
static unsigned short distc [ ] = { 1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 , 17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 , 257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 , 4097 , 6145 , 8193 , 12289 , 16385 , 24577 , 32768 } ;
@ -833,6 +846,7 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l
// make returned pointer freeable
// make returned pointer freeable
STBIW_MEMMOVE ( stbiw__sbraw ( out ) , out , * out_len ) ;
STBIW_MEMMOVE ( stbiw__sbraw ( out ) , out , * out_len ) ;
return ( unsigned char * ) stbiw__sbraw ( out ) ;
return ( unsigned char * ) stbiw__sbraw ( out ) ;
# endif // STBIW_ZLIB_COMPRESS
}
}
static unsigned int stbiw__crc32 ( unsigned char * buffer , int len )
static unsigned int stbiw__crc32 ( unsigned char * buffer , int len )