update stb libs
This commit is contained in:
parent
c70a9a245b
commit
a6a6761e9f
@ -1,4 +1,4 @@
|
|||||||
/* stb_image_write - v1.15 - public domain - http://nothings.org/stb
|
/* stb_image_write - v1.16 - public domain - http://nothings.org/stb
|
||||||
writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015
|
writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015
|
||||||
no warranty implied; use at your own risk
|
no warranty implied; use at your own risk
|
||||||
|
|
||||||
@ -140,6 +140,7 @@ CREDITS:
|
|||||||
Ivan Tikhonov
|
Ivan Tikhonov
|
||||||
github:ignotion
|
github:ignotion
|
||||||
Adam Schackart
|
Adam Schackart
|
||||||
|
Andrew Kensler
|
||||||
|
|
||||||
LICENSE
|
LICENSE
|
||||||
|
|
||||||
@ -166,9 +167,9 @@ LICENSE
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations
|
#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations
|
||||||
extern int stbi_write_tga_with_rle;
|
STBIWDEF int stbi_write_tga_with_rle;
|
||||||
extern int stbi_write_png_compression_level;
|
STBIWDEF int stbi_write_png_compression_level;
|
||||||
extern int stbi_write_force_png_filter;
|
STBIWDEF int stbi_write_force_png_filter;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef STBI_WRITE_NO_STDIO
|
#ifndef STBI_WRITE_NO_STDIO
|
||||||
@ -178,7 +179,7 @@ STBIWDEF int stbi_write_tga(char const* filename, int w, int h, int comp, const
|
|||||||
STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);
|
STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);
|
||||||
STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality);
|
STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality);
|
||||||
|
|
||||||
#ifdef STBI_WINDOWS_UTF8
|
#ifdef STBIW_WINDOWS_UTF8
|
||||||
STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
|
STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -285,7 +286,7 @@ static void stbi__stdio_write(void* context, void* data, int size)
|
|||||||
fwrite(data,1,size,(FILE*) context);
|
fwrite(data,1,size,(FILE*) context);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8)
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#define STBIW_EXTERN extern "C"
|
#define STBIW_EXTERN extern "C"
|
||||||
#else
|
#else
|
||||||
@ -303,16 +304,16 @@ STBIWDEF int stbiw_convert_wchar_to_utf8(char* buffer, size_t bufferlen, const w
|
|||||||
static FILE *stbiw__fopen(char const *filename, char const *mode)
|
static FILE *stbiw__fopen(char const *filename, char const *mode)
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
|
#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8)
|
||||||
wchar_t wMode[64];
|
wchar_t wMode[64];
|
||||||
wchar_t wFilename[1024];
|
wchar_t wFilename[1024];
|
||||||
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
|
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#if _MSC_VER >= 1400
|
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||||
if (0 != _wfopen_s(&f, wFilename, wMode))
|
if (0 != _wfopen_s(&f, wFilename, wMode))
|
||||||
f = 0;
|
f = 0;
|
||||||
#else
|
#else
|
||||||
@ -397,7 +398,7 @@ static void stbiw__putc(stbi__write_context* s, unsigned char c)
|
|||||||
|
|
||||||
static void stbiw__write1(stbi__write_context *s, unsigned char a)
|
static void stbiw__write1(stbi__write_context *s, unsigned char a)
|
||||||
{
|
{
|
||||||
if (s->buf_used + 1 > sizeof(s->buffer))
|
if ((size_t)s->buf_used + 1 > sizeof(s->buffer))
|
||||||
stbiw__write_flush(s);
|
stbiw__write_flush(s);
|
||||||
s->buffer[s->buf_used++] = a;
|
s->buffer[s->buf_used++] = a;
|
||||||
}
|
}
|
||||||
@ -405,7 +406,7 @@ static void stbiw__write1(stbi__write_context* s, unsigned char a)
|
|||||||
static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c)
|
static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
if (s->buf_used + 3 > sizeof(s->buffer))
|
if ((size_t)s->buf_used + 3 > sizeof(s->buffer))
|
||||||
stbiw__write_flush(s);
|
stbiw__write_flush(s);
|
||||||
n = s->buf_used;
|
n = s->buf_used;
|
||||||
s->buf_used = n+3;
|
s->buf_used = n+3;
|
||||||
@ -460,8 +461,7 @@ static void stbiw__write_pixels(stbi__write_context* s, int rgb_dir, int vdir, i
|
|||||||
|
|
||||||
if (vdir < 0) {
|
if (vdir < 0) {
|
||||||
j_end = -1; j = y-1;
|
j_end = -1; j = y-1;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
j_end = y; j = 0;
|
j_end = y; j = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -479,8 +479,7 @@ static int stbiw__outfile(stbi__write_context* s, int rgb_dir, int vdir, int x,
|
|||||||
{
|
{
|
||||||
if (y < 0 || x < 0) {
|
if (y < 0 || x < 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
va_list v;
|
va_list v;
|
||||||
va_start(v, fmt);
|
va_start(v, fmt);
|
||||||
stbiw__writefv(s, fmt, v);
|
stbiw__writefv(s, fmt, v);
|
||||||
@ -492,11 +491,22 @@ static int stbiw__outfile(stbi__write_context* s, int rgb_dir, int vdir, int x,
|
|||||||
|
|
||||||
static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data)
|
static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data)
|
||||||
{
|
{
|
||||||
|
if (comp != 4) {
|
||||||
|
// write RGB bitmap
|
||||||
int pad = (-x*3) & 3;
|
int pad = (-x*3) & 3;
|
||||||
return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad,
|
return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad,
|
||||||
"11 4 22 4" "4 44 22 444444",
|
"11 4 22 4" "4 44 22 444444",
|
||||||
'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header
|
'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header
|
||||||
40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header
|
40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header
|
||||||
|
} else {
|
||||||
|
// RGBA bitmaps need a v4 header
|
||||||
|
// use BI_BITFIELDS mode with 32bpp and alpha mask
|
||||||
|
// (straight BI_RGB with alpha mask doesn't work in most readers)
|
||||||
|
return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *)data,1,0,
|
||||||
|
"11 4 22 4" "4 44 22 444444 4444 4 444 444 444 444",
|
||||||
|
'B', 'M', 14+108+x*y*4, 0, 0, 14+108, // file header
|
||||||
|
108, x,y, 1,32, 3,0,0,0,0,0, 0xff0000,0xff00,0xff,0xff000000u, 0, 0,0,0, 0,0,0, 0,0,0, 0,0,0); // bitmap V4 header
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)
|
STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)
|
||||||
@ -514,8 +524,7 @@ STBIWDEF int stbi_write_bmp(char const* filename, int x, int y, int comp, const
|
|||||||
int r = stbi_write_bmp_core(&s, x, y, comp, data);
|
int r = stbi_write_bmp_core(&s, x, y, comp, data);
|
||||||
stbi__end_write_file(&s);
|
stbi__end_write_file(&s);
|
||||||
return r;
|
return r;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif //!STBI_WRITE_NO_STDIO
|
#endif //!STBI_WRITE_NO_STDIO
|
||||||
@ -532,8 +541,7 @@ static int stbi_write_tga_core(stbi__write_context* s, int x, int y, int comp, v
|
|||||||
if (!stbi_write_tga_with_rle) {
|
if (!stbi_write_tga_with_rle) {
|
||||||
return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0,
|
return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0,
|
||||||
"111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8);
|
"111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
int i,j,k;
|
int i,j,k;
|
||||||
int jend, jdir;
|
int jend, jdir;
|
||||||
|
|
||||||
@ -543,8 +551,7 @@ static int stbi_write_tga_core(stbi__write_context* s, int x, int y, int comp, v
|
|||||||
j = 0;
|
j = 0;
|
||||||
jend = y;
|
jend = y;
|
||||||
jdir = 1;
|
jdir = 1;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
j = y-1;
|
j = y-1;
|
||||||
jend = -1;
|
jend = -1;
|
||||||
jdir = -1;
|
jdir = -1;
|
||||||
@ -567,19 +574,16 @@ static int stbi_write_tga_core(stbi__write_context* s, int x, int y, int comp, v
|
|||||||
if (memcmp(prev, row + k * comp, comp)) {
|
if (memcmp(prev, row + k * comp, comp)) {
|
||||||
prev += comp;
|
prev += comp;
|
||||||
++len;
|
++len;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
--len;
|
--len;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
for (k = i + 2; k < x && len < 128; ++k) {
|
for (k = i + 2; k < x && len < 128; ++k) {
|
||||||
if (!memcmp(begin, row + k * comp, comp)) {
|
if (!memcmp(begin, row + k * comp, comp)) {
|
||||||
++len;
|
++len;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -592,8 +596,7 @@ static int stbi_write_tga_core(stbi__write_context* s, int x, int y, int comp, v
|
|||||||
for (k = 0; k < len; ++k) {
|
for (k = 0; k < len; ++k) {
|
||||||
stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp);
|
stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
unsigned char header = STBIW_UCHAR(len - 129);
|
unsigned char header = STBIW_UCHAR(len - 129);
|
||||||
stbiw__write1(s, header);
|
stbiw__write1(s, header);
|
||||||
stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin);
|
stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin);
|
||||||
@ -620,8 +623,7 @@ STBIWDEF int stbi_write_tga(char const* filename, int x, int y, int comp, const
|
|||||||
int r = stbi_write_tga_core(&s, x, y, comp, (void *) data);
|
int r = stbi_write_tga_core(&s, x, y, comp, (void *) data);
|
||||||
stbi__end_write_file(&s);
|
stbi__end_write_file(&s);
|
||||||
return r;
|
return r;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -632,6 +634,8 @@ STBIWDEF int stbi_write_tga(char const* filename, int x, int y, int comp, const
|
|||||||
|
|
||||||
#define stbiw__max(a, b) ((a) > (b) ? (a) : (b))
|
#define stbiw__max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
|
#ifndef STBI_WRITE_NO_STDIO
|
||||||
|
|
||||||
static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)
|
static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)
|
||||||
{
|
{
|
||||||
int exponent;
|
int exponent;
|
||||||
@ -639,8 +643,7 @@ static void stbiw__linear_to_rgbe(unsigned char* rgbe, float* linear)
|
|||||||
|
|
||||||
if (maxcomp < 1e-32f) {
|
if (maxcomp < 1e-32f) {
|
||||||
rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0;
|
rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp;
|
float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp;
|
||||||
|
|
||||||
rgbe[0] = (unsigned char)(linear[0] * normalize);
|
rgbe[0] = (unsigned char)(linear[0] * normalize);
|
||||||
@ -692,8 +695,7 @@ static void stbiw__write_hdr_scanline(stbi__write_context* s, int width, int nco
|
|||||||
stbiw__linear_to_rgbe(rgbe, linear);
|
stbiw__linear_to_rgbe(rgbe, linear);
|
||||||
s->func(s->context, rgbe, 4);
|
s->func(s->context, rgbe, 4);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
int c,r;
|
int c,r;
|
||||||
/* encode into scratch buffer */
|
/* encode into scratch buffer */
|
||||||
for (x=0; x < width; x++) {
|
for (x=0; x < width; x++) {
|
||||||
@ -768,7 +770,7 @@ static int stbi_write_hdr_core(stbi__write_context* s, int x, int y, int comp, f
|
|||||||
char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n";
|
char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n";
|
||||||
s->func(s->context, header, sizeof(header)-1);
|
s->func(s->context, header, sizeof(header)-1);
|
||||||
|
|
||||||
#ifdef __STDC_WANT_SECURE_LIB__
|
#ifdef __STDC_LIB_EXT1__
|
||||||
len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x);
|
len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x);
|
||||||
#else
|
#else
|
||||||
len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x);
|
len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x);
|
||||||
@ -789,7 +791,6 @@ STBIWDEF int stbi_write_hdr_to_func(stbi_write_func* func, void* context, int x,
|
|||||||
return stbi_write_hdr_core(&s, x, y, comp, (float *) data);
|
return stbi_write_hdr_core(&s, x, y, comp, (float *) data);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef STBI_WRITE_NO_STDIO
|
|
||||||
STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data)
|
STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data)
|
||||||
{
|
{
|
||||||
stbi__write_context s = { 0 };
|
stbi__write_context s = { 0 };
|
||||||
@ -797,8 +798,7 @@ STBIWDEF int stbi_write_hdr(char const* filename, int x, int y, int comp, const
|
|||||||
int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data);
|
int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data);
|
||||||
stbi__end_write_file(&s);
|
stbi__end_write_file(&s);
|
||||||
return r;
|
return r;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif // STBI_WRITE_NO_STDIO
|
#endif // STBI_WRITE_NO_STDIO
|
||||||
@ -964,8 +964,7 @@ STBIWDEF unsigned char* stbi_zlib_compress(unsigned char* data, int data_len, in
|
|||||||
stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5);
|
stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5);
|
||||||
if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]);
|
if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]);
|
||||||
i += best;
|
i += best;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
stbiw__zlib_huffb(data[i]);
|
stbiw__zlib_huffb(data[i]);
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
@ -982,6 +981,23 @@ STBIWDEF unsigned char* stbi_zlib_compress(unsigned char* data, int data_len, in
|
|||||||
(void) stbiw__sbfree(hash_table[i]);
|
(void) stbiw__sbfree(hash_table[i]);
|
||||||
STBIW_FREE(hash_table);
|
STBIW_FREE(hash_table);
|
||||||
|
|
||||||
|
// store uncompressed instead if compression was worse
|
||||||
|
if (stbiw__sbn(out) > data_len + 2 + ((data_len+32766)/32767)*5) {
|
||||||
|
stbiw__sbn(out) = 2; // truncate to DEFLATE 32K window and FLEVEL = 1
|
||||||
|
for (j = 0; j < data_len;) {
|
||||||
|
int blocklen = data_len - j;
|
||||||
|
if (blocklen > 32767) blocklen = 32767;
|
||||||
|
stbiw__sbpush(out, data_len - j == blocklen); // BFINAL = ?, BTYPE = 0 -- no compression
|
||||||
|
stbiw__sbpush(out, STBIW_UCHAR(blocklen)); // LEN
|
||||||
|
stbiw__sbpush(out, STBIW_UCHAR(blocklen >> 8));
|
||||||
|
stbiw__sbpush(out, STBIW_UCHAR(~blocklen)); // NLEN
|
||||||
|
stbiw__sbpush(out, STBIW_UCHAR(~blocklen >> 8));
|
||||||
|
memcpy(out+stbiw__sbn(out), data+j, blocklen);
|
||||||
|
stbiw__sbn(out) += blocklen;
|
||||||
|
j += blocklen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
// compute adler32 on input
|
// compute adler32 on input
|
||||||
unsigned int s1=1, s2=0;
|
unsigned int s1=1, s2=0;
|
||||||
@ -1132,8 +1148,7 @@ STBIWDEF unsigned char* stbi_write_png_to_mem(const unsigned char* pixels, int s
|
|||||||
if (force_filter > -1) {
|
if (force_filter > -1) {
|
||||||
filter_type = force_filter;
|
filter_type = force_filter;
|
||||||
stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer);
|
stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer);
|
||||||
}
|
} else { // Estimate the best filter by running through all of them:
|
||||||
else { // Estimate the best filter by running through all of them:
|
|
||||||
int best_filter = 0, best_filter_val = 0x7fffffff, est, i;
|
int best_filter = 0, best_filter_val = 0x7fffffff, est, i;
|
||||||
for (filter_type = 0; filter_type < 5; filter_type++) {
|
for (filter_type = 0; filter_type < 5; filter_type++) {
|
||||||
stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer);
|
stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer);
|
||||||
@ -1341,8 +1356,7 @@ static int stbiw__jpg_processDU(stbi__write_context* s, int* bitBuf, int* bitCnt
|
|||||||
diff = DU[0] - DC;
|
diff = DU[0] - DC;
|
||||||
if (diff == 0) {
|
if (diff == 0) {
|
||||||
stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[0]);
|
stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[0]);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
unsigned short bits[2];
|
unsigned short bits[2];
|
||||||
stbiw__jpg_calcBits(diff, bits);
|
stbiw__jpg_calcBits(diff, bits);
|
||||||
stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[bits[1]]);
|
stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[bits[1]]);
|
||||||
@ -1554,8 +1568,7 @@ static int stbi_write_jpg_core(stbi__write_context* s, int width, int height, in
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
for(y = 0; y < height; y += 8) {
|
for(y = 0; y < height; y += 8) {
|
||||||
for(x = 0; x < width; x += 8) {
|
for(x = 0; x < width; x += 8) {
|
||||||
float Y[64], U[64], V[64];
|
float Y[64], U[64], V[64];
|
||||||
@ -1607,8 +1620,7 @@ STBIWDEF int stbi_write_jpg(char const* filename, int x, int y, int comp, const
|
|||||||
int r = stbi_write_jpg_core(&s, x, y, comp, data, quality);
|
int r = stbi_write_jpg_core(&s, x, y, comp, data, quality);
|
||||||
stbi__end_write_file(&s);
|
stbi__end_write_file(&s);
|
||||||
return r;
|
return r;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1616,6 +1628,10 @@ STBIWDEF int stbi_write_jpg(char const* filename, int x, int y, int comp, const
|
|||||||
#endif // STB_IMAGE_WRITE_IMPLEMENTATION
|
#endif // STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
|
|
||||||
/* Revision history
|
/* Revision history
|
||||||
|
1.16 (2021-07-11)
|
||||||
|
make Deflate code emit uncompressed blocks when it would otherwise expand
|
||||||
|
support writing BMPs with alpha channel
|
||||||
|
1.15 (2020-07-13) unknown
|
||||||
1.14 (2020-02-02) updated JPEG writer to downsample chroma channels
|
1.14 (2020-02-02) updated JPEG writer to downsample chroma channels
|
||||||
1.13
|
1.13
|
||||||
1.12
|
1.12
|
||||||
|
|||||||
@ -1,9 +1,15 @@
|
|||||||
// stb_rect_pack.h - v1.00 - public domain - rectangle packing
|
// stb_rect_pack.h - v1.01 - public domain - rectangle packing
|
||||||
// Sean Barrett 2014
|
// Sean Barrett 2014
|
||||||
//
|
//
|
||||||
// Useful for e.g. packing rectangular textures into an atlas.
|
// Useful for e.g. packing rectangular textures into an atlas.
|
||||||
// Does not do rotation.
|
// Does not do rotation.
|
||||||
//
|
//
|
||||||
|
// Before #including,
|
||||||
|
//
|
||||||
|
// #define STB_RECT_PACK_IMPLEMENTATION
|
||||||
|
//
|
||||||
|
// in the file that you want to have the implementation.
|
||||||
|
//
|
||||||
// Not necessarily the awesomest packing method, but better than
|
// Not necessarily the awesomest packing method, but better than
|
||||||
// the totally naive one in stb_truetype (which is primarily what
|
// the totally naive one in stb_truetype (which is primarily what
|
||||||
// this is meant to replace).
|
// this is meant to replace).
|
||||||
@ -35,6 +41,7 @@
|
|||||||
//
|
//
|
||||||
// Version history:
|
// Version history:
|
||||||
//
|
//
|
||||||
|
// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section
|
||||||
// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles
|
// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles
|
||||||
// 0.99 (2019-02-07) warning fixes
|
// 0.99 (2019-02-07) warning fixes
|
||||||
// 0.11 (2017-03-03) return packing success/fail result
|
// 0.11 (2017-03-03) return packing success/fail result
|
||||||
@ -75,11 +82,10 @@ extern "C" {
|
|||||||
typedef struct stbrp_node stbrp_node;
|
typedef struct stbrp_node stbrp_node;
|
||||||
typedef struct stbrp_rect stbrp_rect;
|
typedef struct stbrp_rect stbrp_rect;
|
||||||
|
|
||||||
#ifdef STBRP_LARGE_RECTS
|
|
||||||
typedef int stbrp_coord;
|
typedef int stbrp_coord;
|
||||||
#else
|
|
||||||
typedef unsigned short stbrp_coord;
|
#define STBRP__MAXVAL 0x7fffffff
|
||||||
#endif
|
// Mostly for internal use, but this is the maximum supported coordinate value.
|
||||||
|
|
||||||
STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects);
|
STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects);
|
||||||
// Assign packed locations to rectangles. The rectangles are of type
|
// Assign packed locations to rectangles. The rectangles are of type
|
||||||
@ -209,8 +215,10 @@ extern "C" {
|
|||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define STBRP__NOTUSED(v) (void)(v)
|
#define STBRP__NOTUSED(v) (void)(v)
|
||||||
|
#define STBRP__CDECL __cdecl
|
||||||
#else
|
#else
|
||||||
#define STBRP__NOTUSED(v) (void)sizeof(v)
|
#define STBRP__NOTUSED(v) (void)sizeof(v)
|
||||||
|
#define STBRP__CDECL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@ -253,9 +261,6 @@ STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context* context, int allow_ou
|
|||||||
STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)
|
STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
#ifndef STBRP_LARGE_RECTS
|
|
||||||
STBRP_ASSERT(width <= 0xffff && height <= 0xffff);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (i=0; i < num_nodes-1; ++i)
|
for (i=0; i < num_nodes-1; ++i)
|
||||||
nodes[i].next = &nodes[i+1];
|
nodes[i].next = &nodes[i+1];
|
||||||
@ -274,11 +279,7 @@ STBRP_DEF void stbrp_init_target(stbrp_context* context, int width, int height,
|
|||||||
context->extra[0].y = 0;
|
context->extra[0].y = 0;
|
||||||
context->extra[0].next = &context->extra[1];
|
context->extra[0].next = &context->extra[1];
|
||||||
context->extra[1].x = (stbrp_coord) width;
|
context->extra[1].x = (stbrp_coord) width;
|
||||||
#ifdef STBRP_LARGE_RECTS
|
|
||||||
context->extra[1].y = (1<<30);
|
context->extra[1].y = (1<<30);
|
||||||
#else
|
|
||||||
context->extra[1].y = 65535;
|
|
||||||
#endif
|
|
||||||
context->extra[1].next = NULL;
|
context->extra[1].next = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,8 +319,7 @@ static int stbrp__skyline_find_min_y(stbrp_context* c, stbrp_node* first, int x0
|
|||||||
visited_width += node->next->x - x0;
|
visited_width += node->next->x - x0;
|
||||||
else
|
else
|
||||||
visited_width += node->next->x - node->x;
|
visited_width += node->next->x - node->x;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// add waste area
|
// add waste area
|
||||||
int under_width = node->next->x - node->x;
|
int under_width = node->next->x - node->x;
|
||||||
if (under_width + visited_width > width)
|
if (under_width + visited_width > width)
|
||||||
@ -369,8 +369,7 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context* c, int widt
|
|||||||
best_y = y;
|
best_y = y;
|
||||||
best = prev;
|
best = prev;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// best-fit
|
// best-fit
|
||||||
if (y + height <= c->height) {
|
if (y + height <= c->height) {
|
||||||
// can only use it if it first vertically
|
// can only use it if it first vertically
|
||||||
@ -475,8 +474,7 @@ static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context* context, i
|
|||||||
stbrp_node *next = cur->next;
|
stbrp_node *next = cur->next;
|
||||||
cur->next = node;
|
cur->next = node;
|
||||||
cur = next;
|
cur = next;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
*res.prev_link = node;
|
*res.prev_link = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -523,7 +521,7 @@ static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context* context, i
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rect_height_compare(const void* a, const void* b)
|
static int STBRP__CDECL rect_height_compare(const void *a, const void *b)
|
||||||
{
|
{
|
||||||
const stbrp_rect *p = (const stbrp_rect *) a;
|
const stbrp_rect *p = (const stbrp_rect *) a;
|
||||||
const stbrp_rect *q = (const stbrp_rect *) b;
|
const stbrp_rect *q = (const stbrp_rect *) b;
|
||||||
@ -534,19 +532,13 @@ static int rect_height_compare(const void* a, const void* b)
|
|||||||
return (p->w > q->w) ? -1 : (p->w < q->w);
|
return (p->w > q->w) ? -1 : (p->w < q->w);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rect_original_order(const void* a, const void* b)
|
static int STBRP__CDECL rect_original_order(const void *a, const void *b)
|
||||||
{
|
{
|
||||||
const stbrp_rect *p = (const stbrp_rect *) a;
|
const stbrp_rect *p = (const stbrp_rect *) a;
|
||||||
const stbrp_rect *q = (const stbrp_rect *) b;
|
const stbrp_rect *q = (const stbrp_rect *) b;
|
||||||
return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);
|
return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef STBRP_LARGE_RECTS
|
|
||||||
#define STBRP__MAXVAL 0xffffffff
|
|
||||||
#else
|
|
||||||
#define STBRP__MAXVAL 0xffff
|
|
||||||
#endif
|
|
||||||
|
|
||||||
STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)
|
STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)
|
||||||
{
|
{
|
||||||
int i, all_rects_packed = 1;
|
int i, all_rects_packed = 1;
|
||||||
@ -562,14 +554,12 @@ STBRP_DEF int stbrp_pack_rects(stbrp_context* context, stbrp_rect* rects, int nu
|
|||||||
for (i=0; i < num_rects; ++i) {
|
for (i=0; i < num_rects; ++i) {
|
||||||
if (rects[i].w == 0 || rects[i].h == 0) {
|
if (rects[i].w == 0 || rects[i].h == 0) {
|
||||||
rects[i].x = rects[i].y = 0; // empty rect needs no space
|
rects[i].x = rects[i].y = 0; // empty rect needs no space
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);
|
stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);
|
||||||
if (fr.prev_link) {
|
if (fr.prev_link) {
|
||||||
rects[i].x = (stbrp_coord) fr.x;
|
rects[i].x = (stbrp_coord) fr.x;
|
||||||
rects[i].y = (stbrp_coord) fr.y;
|
rects[i].y = (stbrp_coord) fr.y;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
rects[i].x = rects[i].y = STBRP__MAXVAL;
|
rects[i].x = rects[i].y = STBRP__MAXVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user