123#ifndef STBI_INCLUDE_STB_IMAGE_H
124#define STBI_INCLUDE_STB_IMAGE_H
343#define STBI_VERSION 1
356typedef unsigned char stbi_uc;
357typedef unsigned short stbi_us;
364#ifdef STB_IMAGE_STATIC
365#define STBIDEF static
367#define STBIDEF extern
382 int (*read) (
void* user,
char* data,
int size);
383 void (*skip) (
void* user,
int n);
384 int (*eof) (
void* user);
392 STBIDEF stbi_uc* stbi_load_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
393 STBIDEF stbi_uc* stbi_load_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
396 STBIDEF stbi_uc* stbi_load(
char const* filename,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
397 STBIDEF stbi_uc* stbi_load_from_file(FILE* f,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
402 STBIDEF stbi_uc* stbi_load_gif_from_memory(stbi_uc
const* buffer,
int len,
int** delays,
int* x,
int* y,
int* z,
int* comp,
int req_comp);
405#ifdef STBI_WINDOWS_UTF8
406 STBIDEF
int stbi_convert_wchar_to_utf8(
char* buffer,
size_t bufferlen,
const wchar_t* input);
414 STBIDEF stbi_us* stbi_load_16_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
415 STBIDEF stbi_us* stbi_load_16_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
418 STBIDEF stbi_us* stbi_load_16(
char const* filename,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
419 STBIDEF stbi_us* stbi_load_from_file_16(FILE* f,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
426#ifndef STBI_NO_LINEAR
427 STBIDEF
float* stbi_loadf_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
428 STBIDEF
float* stbi_loadf_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
431 STBIDEF
float* stbi_loadf(
char const* filename,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
432 STBIDEF
float* stbi_loadf_from_file(FILE* f,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
437 STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma);
438 STBIDEF
void stbi_hdr_to_ldr_scale(
float scale);
441#ifndef STBI_NO_LINEAR
442 STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma);
443 STBIDEF
void stbi_ldr_to_hdr_scale(
float scale);
447 STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const* clbk,
void* user);
448 STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const* buffer,
int len);
450 STBIDEF
int stbi_is_hdr(
char const* filename);
451 STBIDEF
int stbi_is_hdr_from_file(FILE* f);
457 STBIDEF
const char* stbi_failure_reason(
void);
460 STBIDEF
void stbi_image_free(
void* retval_from_stbi_load);
463 STBIDEF
int stbi_info_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* comp);
464 STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* comp);
465 STBIDEF
int stbi_is_16_bit_from_memory(stbi_uc
const* buffer,
int len);
466 STBIDEF
int stbi_is_16_bit_from_callbacks(
stbi_io_callbacks const* clbk,
void* user);
469 STBIDEF
int stbi_info(
char const* filename,
int* x,
int* y,
int* comp);
470 STBIDEF
int stbi_info_from_file(FILE* f,
int* x,
int* y,
int* comp);
471 STBIDEF
int stbi_is_16_bit(
char const* filename);
472 STBIDEF
int stbi_is_16_bit_from_file(FILE* f);
480 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply);
484 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert);
487 STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip);
492 STBIDEF
void stbi_set_flip_vertically_on_load_thread(
int flag_true_if_should_flip);
496 STBIDEF
char* stbi_zlib_decode_malloc_guesssize(
const char* buffer,
int len,
int initial_size,
int* outlen);
497 STBIDEF
char* stbi_zlib_decode_malloc_guesssize_headerflag(
const char* buffer,
int len,
int initial_size,
int* outlen,
int parse_header);
498 STBIDEF
char* stbi_zlib_decode_malloc(
const char* buffer,
int len,
int* outlen);
499 STBIDEF
int stbi_zlib_decode_buffer(
char* obuffer,
int olen,
const char* ibuffer,
int ilen);
501 STBIDEF
char* stbi_zlib_decode_noheader_malloc(
const char* buffer,
int len,
int* outlen);
502 STBIDEF
int stbi_zlib_decode_noheader_buffer(
char* obuffer,
int olen,
const char* ibuffer,
int ilen);
514#ifdef STB_IMAGE_IMPLEMENTATION
516#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
517 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
518 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
519 || defined(STBI_ONLY_ZLIB)
520#ifndef STBI_ONLY_JPEG
549#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
560#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
570#define STBI_ASSERT(x) assert(x)
574#define STBI_EXTERN extern "C"
576#define STBI_EXTERN extern
582#define stbi_inline inline
587#define stbi_inline __forceinline
590#ifndef STBI_NO_THREAD_LOCALS
591#if defined(__cplusplus) && __cplusplus >= 201103L
592#define STBI_THREAD_LOCAL thread_local
593#elif defined(__GNUC__) && __GNUC__ < 5
594#define STBI_THREAD_LOCAL __thread
595#elif defined(_MSC_VER)
596#define STBI_THREAD_LOCAL __declspec(thread)
597#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
598#define STBI_THREAD_LOCAL _Thread_local
601#ifndef STBI_THREAD_LOCAL
603#define STBI_THREAD_LOCAL __thread
609typedef unsigned short stbi__uint16;
610typedef signed short stbi__int16;
611typedef unsigned int stbi__uint32;
612typedef signed int stbi__int32;
622typedef unsigned char validate_uint32[
sizeof(stbi__uint32) == 4 ? 1 : -1];
625#define STBI_NOTUSED(v) (void)(v)
627#define STBI_NOTUSED(v) (void)sizeof(v)
631#define STBI_HAS_LROTL
635#define stbi_lrot(x,y) _lrotl(x,y)
637#define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
640#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
642#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
645#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
649#define STBI_MALLOC(sz) malloc(sz)
650#define STBI_REALLOC(p,newsz) realloc(p,newsz)
651#define STBI_FREE(p) free(p)
654#ifndef STBI_REALLOC_SIZED
655#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
659#if defined(__x86_64__) || defined(_M_X64)
660#define STBI__X64_TARGET
661#elif defined(__i386) || defined(_M_IX86)
662#define STBI__X86_TARGET
665#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
676#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
691#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
693#include <emmintrin.h>
699static int stbi__cpuid3(
void)
706static int stbi__cpuid3(
void)
718#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
720#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
721static int stbi__sse2_available(
void)
723 int info3 = stbi__cpuid3();
724 return ((info3 >> 26) & 1) != 0;
729#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
731#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
732static int stbi__sse2_available(
void)
745#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
752#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
755#ifndef STBI_SIMD_ALIGN
756#define STBI_SIMD_ALIGN(type, name) type name
759#ifndef STBI_MAX_DIMENSIONS
760#define STBI_MAX_DIMENSIONS (1 << 24)
771 stbi__uint32 img_x, img_y;
772 int img_n, img_out_n;
777 int read_from_callbacks;
779 stbi_uc buffer_start[128];
780 int callback_already_read;
782 stbi_uc* img_buffer, * img_buffer_end;
783 stbi_uc* img_buffer_original, * img_buffer_original_end;
787static void stbi__refill_buffer(stbi__context* s);
790static void stbi__start_mem(stbi__context* s, stbi_uc
const* buffer,
int len)
793 s->read_from_callbacks = 0;
794 s->callback_already_read = 0;
795 s->img_buffer = s->img_buffer_original = (stbi_uc*)buffer;
796 s->img_buffer_end = s->img_buffer_original_end = (stbi_uc*)buffer + len;
800static void stbi__start_callbacks(stbi__context* s,
stbi_io_callbacks* c,
void* user)
803 s->io_user_data = user;
804 s->buflen =
sizeof(s->buffer_start);
805 s->read_from_callbacks = 1;
806 s->callback_already_read = 0;
807 s->img_buffer = s->img_buffer_original = s->buffer_start;
808 stbi__refill_buffer(s);
809 s->img_buffer_original_end = s->img_buffer_end;
814static int stbi__stdio_read(
void* user,
char* data,
int size)
816 return (
int)fread(data, 1, size, (FILE*)user);
819static void stbi__stdio_skip(
void* user,
int n)
822 fseek((FILE*)user, n, SEEK_CUR);
823 ch = fgetc((FILE*)user);
825 ungetc(ch, (FILE*)user);
829static int stbi__stdio_eof(
void* user)
831 return feof((FILE*)user) || ferror((FILE*)user);
841static void stbi__start_file(stbi__context* s, FILE* f)
843 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void*)f);
850static void stbi__rewind(stbi__context* s)
855 s->img_buffer = s->img_buffer_original;
856 s->img_buffer_end = s->img_buffer_original_end;
867 int bits_per_channel;
873static int stbi__jpeg_test(stbi__context* s);
874static void* stbi__jpeg_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
875static int stbi__jpeg_info(stbi__context* s,
int* x,
int* y,
int* comp);
879static int stbi__png_test(stbi__context* s);
880static void* stbi__png_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
881static int stbi__png_info(stbi__context* s,
int* x,
int* y,
int* comp);
882static int stbi__png_is16(stbi__context* s);
886static int stbi__bmp_test(stbi__context* s);
887static void* stbi__bmp_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
888static int stbi__bmp_info(stbi__context* s,
int* x,
int* y,
int* comp);
892static int stbi__tga_test(stbi__context* s);
893static void* stbi__tga_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
894static int stbi__tga_info(stbi__context* s,
int* x,
int* y,
int* comp);
898static int stbi__psd_test(stbi__context* s);
899static void* stbi__psd_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri,
int bpc);
900static int stbi__psd_info(stbi__context* s,
int* x,
int* y,
int* comp);
901static int stbi__psd_is16(stbi__context* s);
905static int stbi__hdr_test(stbi__context* s);
906static float* stbi__hdr_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
907static int stbi__hdr_info(stbi__context* s,
int* x,
int* y,
int* comp);
911static int stbi__pic_test(stbi__context* s);
912static void* stbi__pic_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
913static int stbi__pic_info(stbi__context* s,
int* x,
int* y,
int* comp);
917static int stbi__gif_test(stbi__context* s);
918static void* stbi__gif_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
919static void* stbi__load_gif_main(stbi__context* s,
int** delays,
int* x,
int* y,
int* z,
int* comp,
int req_comp);
920static int stbi__gif_info(stbi__context* s,
int* x,
int* y,
int* comp);
924static int stbi__pnm_test(stbi__context* s);
925static void* stbi__pnm_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
926static int stbi__pnm_info(stbi__context* s,
int* x,
int* y,
int* comp);
930#ifdef STBI_THREAD_LOCAL
933const char* stbi__g_failure_reason;
935STBIDEF
const char* stbi_failure_reason(
void)
937 return stbi__g_failure_reason;
940#ifndef STBI_NO_FAILURE_STRINGS
941static int stbi__err(
const char* str)
943 stbi__g_failure_reason = str;
948static void* stbi__malloc(
size_t size)
950 return STBI_MALLOC(size);
965static int stbi__addsizes_valid(
int a,
int b)
972 return a <= INT_MAX - b;
977static int stbi__mul2sizes_valid(
int a,
int b)
979 if (a < 0 || b < 0)
return 0;
980 if (b == 0)
return 1;
982 return a <= INT_MAX / b;
985#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
987static int stbi__mad2sizes_valid(
int a,
int b,
int add)
989 return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a * b, add);
994static int stbi__mad3sizes_valid(
int a,
int b,
int c,
int add)
996 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) &&
997 stbi__addsizes_valid(a * b * c, add);
1001#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
1002static int stbi__mad4sizes_valid(
int a,
int b,
int c,
int d,
int add)
1004 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) &&
1005 stbi__mul2sizes_valid(a * b * c, d) && stbi__addsizes_valid(a * b * c * d, add);
1009#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1011static void* stbi__malloc_mad2(
int a,
int b,
int add)
1013 if (!stbi__mad2sizes_valid(a, b, add))
return NULL;
1014 return stbi__malloc(a * b + add);
1018static void* stbi__malloc_mad3(
int a,
int b,
int c,
int add)
1020 if (!stbi__mad3sizes_valid(a, b, c, add))
return NULL;
1021 return stbi__malloc(a * b * c + add);
1024#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
1025static void* stbi__malloc_mad4(
int a,
int b,
int c,
int d,
int add)
1027 if (!stbi__mad4sizes_valid(a, b, c, d, add))
return NULL;
1028 return stbi__malloc(a * b * c * d + add);
1036#ifdef STBI_NO_FAILURE_STRINGS
1037#define stbi__err(x,y) 0
1038#elif defined(STBI_FAILURE_USERMSG)
1039#define stbi__err(x,y) stbi__err(y)
1041#define stbi__err(x,y) stbi__err(x)
1044#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
1045#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
1047STBIDEF
void stbi_image_free(
void* retval_from_stbi_load)
1049 STBI_FREE(retval_from_stbi_load);
1052#ifndef STBI_NO_LINEAR
1053static float* stbi__ldr_to_hdr(stbi_uc* data,
int x,
int y,
int comp);
1057static stbi_uc* stbi__hdr_to_ldr(
float* data,
int x,
int y,
int comp);
1060static int stbi__vertically_flip_on_load_global = 0;
1062STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip)
1064 stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
1067#ifndef STBI_THREAD_LOCAL
1068#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global
1070static STBI_THREAD_LOCAL
int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
1072STBIDEF
void stbi_set_flip_vertically_on_load_thread(
int flag_true_if_should_flip)
1074 stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
1075 stbi__vertically_flip_on_load_set = 1;
1078#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \
1079 ? stbi__vertically_flip_on_load_local \
1080 : stbi__vertically_flip_on_load_global)
1083static void* stbi__load_main(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri,
int bpc)
1085 memset(ri, 0,
sizeof(*ri));
1086 ri->bits_per_channel = 8;
1087 ri->channel_order = STBI_ORDER_RGB;
1088 ri->num_channels = 0;
1091 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s, x, y, comp, req_comp, ri);
1094 if (stbi__png_test(s))
return stbi__png_load(s, x, y, comp, req_comp, ri);
1097 if (stbi__bmp_test(s))
return stbi__bmp_load(s, x, y, comp, req_comp, ri);
1100 if (stbi__gif_test(s))
return stbi__gif_load(s, x, y, comp, req_comp, ri);
1103 if (stbi__psd_test(s))
return stbi__psd_load(s, x, y, comp, req_comp, ri, bpc);
1108 if (stbi__pic_test(s))
return stbi__pic_load(s, x, y, comp, req_comp, ri);
1111 if (stbi__pnm_test(s))
return stbi__pnm_load(s, x, y, comp, req_comp, ri);
1115 if (stbi__hdr_test(s)) {
1116 float* hdr = stbi__hdr_load(s, x, y, comp, req_comp, ri);
1117 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
1123 if (stbi__tga_test(s))
1124 return stbi__tga_load(s, x, y, comp, req_comp, ri);
1127 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
1130static stbi_uc* stbi__convert_16_to_8(stbi__uint16* orig,
int w,
int h,
int channels)
1133 int img_len = w * h * channels;
1136 reduced = (stbi_uc*)stbi__malloc(img_len);
1137 if (reduced == NULL)
return stbi__errpuc(
"outofmem",
"Out of memory");
1139 for (i = 0; i < img_len; ++i)
1140 reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF);
1146static stbi__uint16* stbi__convert_8_to_16(stbi_uc* orig,
int w,
int h,
int channels)
1149 int img_len = w * h * channels;
1150 stbi__uint16* enlarged;
1152 enlarged = (stbi__uint16*)stbi__malloc(img_len * 2);
1153 if (enlarged == NULL)
return (stbi__uint16*)stbi__errpuc(
"outofmem",
"Out of memory");
1155 for (i = 0; i < img_len; ++i)
1156 enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]);
1162static void stbi__vertical_flip(
void* image,
int w,
int h,
int bytes_per_pixel)
1165 size_t bytes_per_row = (size_t)w * bytes_per_pixel;
1167 stbi_uc* bytes = (stbi_uc*)image;
1169 for (row = 0; row < (h >> 1); row++) {
1170 stbi_uc* row0 = bytes + row * bytes_per_row;
1171 stbi_uc* row1 = bytes + (h - row - 1) * bytes_per_row;
1173 size_t bytes_left = bytes_per_row;
1174 while (bytes_left) {
1175 size_t bytes_copy = (bytes_left <
sizeof(temp)) ? bytes_left : sizeof(temp);
1176 memcpy(temp, row0, bytes_copy);
1177 memcpy(row0, row1, bytes_copy);
1178 memcpy(row1, temp, bytes_copy);
1181 bytes_left -= bytes_copy;
1187static void stbi__vertical_flip_slices(
void* image,
int w,
int h,
int z,
int bytes_per_pixel)
1190 int slice_size = w * h * bytes_per_pixel;
1192 stbi_uc* bytes = (stbi_uc*)image;
1193 for (slice = 0; slice < z; ++slice) {
1194 stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
1195 bytes += slice_size;
1200static unsigned char* stbi__load_and_postprocess_8bit(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp)
1202 stbi__result_info ri;
1203 void* result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1209 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1211 if (ri.bits_per_channel != 8) {
1212 result = stbi__convert_16_to_8((stbi__uint16*)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1213 ri.bits_per_channel = 8;
1218 if (stbi__vertically_flip_on_load) {
1219 int channels = req_comp ? req_comp : *comp;
1220 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi_uc));
1223 return (
unsigned char*)result;
1226static stbi__uint16* stbi__load_and_postprocess_16bit(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp)
1228 stbi__result_info ri;
1229 void* result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1235 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1237 if (ri.bits_per_channel != 16) {
1238 result = stbi__convert_8_to_16((stbi_uc*)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1239 ri.bits_per_channel = 16;
1245 if (stbi__vertically_flip_on_load) {
1246 int channels = req_comp ? req_comp : *comp;
1247 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi__uint16));
1250 return (stbi__uint16*)result;
1253#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
1254static void stbi__float_postprocess(
float* result,
int* x,
int* y,
int* comp,
int req_comp)
1256 if (stbi__vertically_flip_on_load && result != NULL) {
1257 int channels = req_comp ? req_comp : *comp;
1258 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
float));
1263#ifndef STBI_NO_STDIO
1265#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
1266STBI_EXTERN __declspec(dllimport)
int __stdcall MultiByteToWideChar(
unsigned int cp,
unsigned long flags,
const char* str,
int cbmb,
wchar_t* widestr,
int cchwide);
1267STBI_EXTERN __declspec(dllimport)
int __stdcall WideCharToMultiByte(
unsigned int cp,
unsigned long flags,
const wchar_t* widestr,
int cchwide,
char* str,
int cbmb,
const char* defchar,
int* used_default);
1270#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
1271STBIDEF
int stbi_convert_wchar_to_utf8(
char* buffer,
size_t bufferlen,
const wchar_t* input)
1273 return WideCharToMultiByte(65001 , 0, input, -1, buffer, (
int)bufferlen, NULL, NULL);
1277static FILE* stbi__fopen(
char const* filename,
char const* mode)
1280#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
1282 wchar_t wFilename[1024];
1283 if (0 == MultiByteToWideChar(65001 , 0, filename, -1, wFilename,
sizeof(wFilename)))
1286 if (0 == MultiByteToWideChar(65001 , 0, mode, -1, wMode,
sizeof(wMode)))
1290 if (0 != _wfopen_s(&f, wFilename, wMode))
1293 f = _wfopen(wFilename, wMode);
1296#elif defined(_MSC_VER) && _MSC_VER >= 1400
1297 if (0 != fopen_s(&f, filename, mode))
1300 f = fopen(filename, mode);
1306STBIDEF stbi_uc* stbi_load(
char const* filename,
int* x,
int* y,
int* comp,
int req_comp)
1308 FILE* f = stbi__fopen(filename,
"rb");
1309 unsigned char* result;
1310 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1311 result = stbi_load_from_file(f, x, y, comp, req_comp);
1316STBIDEF stbi_uc* stbi_load_from_file(FILE* f,
int* x,
int* y,
int* comp,
int req_comp)
1318 unsigned char* result;
1320 stbi__start_file(&s, f);
1321 result = stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1324 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
1329STBIDEF stbi__uint16* stbi_load_from_file_16(FILE* f,
int* x,
int* y,
int* comp,
int req_comp)
1331 stbi__uint16* result;
1333 stbi__start_file(&s, f);
1334 result = stbi__load_and_postprocess_16bit(&s, x, y, comp, req_comp);
1337 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
1342STBIDEF stbi_us* stbi_load_16(
char const* filename,
int* x,
int* y,
int* comp,
int req_comp)
1344 FILE* f = stbi__fopen(filename,
"rb");
1345 stbi__uint16* result;
1346 if (!f)
return (stbi_us*)stbi__errpuc(
"can't fopen",
"Unable to open file");
1347 result = stbi_load_from_file_16(f, x, y, comp, req_comp);
1355STBIDEF stbi_us* stbi_load_16_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* channels_in_file,
int desired_channels)
1358 stbi__start_mem(&s, buffer, len);
1359 return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels);
1362STBIDEF stbi_us* stbi_load_16_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* channels_in_file,
int desired_channels)
1366 return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels);
1369STBIDEF stbi_uc* stbi_load_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* comp,
int req_comp)
1372 stbi__start_mem(&s, buffer, len);
1373 return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1376STBIDEF stbi_uc* stbi_load_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* comp,
int req_comp)
1380 return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1384STBIDEF stbi_uc* stbi_load_gif_from_memory(stbi_uc
const* buffer,
int len,
int** delays,
int* x,
int* y,
int* z,
int* comp,
int req_comp)
1386 unsigned char* result;
1388 stbi__start_mem(&s, buffer, len);
1390 result = (
unsigned char*)stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
1391 if (stbi__vertically_flip_on_load) {
1392 stbi__vertical_flip_slices(result, *x, *y, *z, *comp);
1399#ifndef STBI_NO_LINEAR
1400static float* stbi__loadf_main(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp)
1402 unsigned char* data;
1404 if (stbi__hdr_test(s)) {
1405 stbi__result_info ri;
1406 float* hdr_data = stbi__hdr_load(s, x, y, comp, req_comp, &ri);
1408 stbi__float_postprocess(hdr_data, x, y, comp, req_comp);
1412 data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
1414 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1415 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1418STBIDEF
float* stbi_loadf_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* comp,
int req_comp)
1421 stbi__start_mem(&s, buffer, len);
1422 return stbi__loadf_main(&s, x, y, comp, req_comp);
1425STBIDEF
float* stbi_loadf_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* comp,
int req_comp)
1429 return stbi__loadf_main(&s, x, y, comp, req_comp);
1432#ifndef STBI_NO_STDIO
1433STBIDEF
float* stbi_loadf(
char const* filename,
int* x,
int* y,
int* comp,
int req_comp)
1436 FILE* f = stbi__fopen(filename,
"rb");
1437 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1438 result = stbi_loadf_from_file(f, x, y, comp, req_comp);
1443STBIDEF
float* stbi_loadf_from_file(FILE* f,
int* x,
int* y,
int* comp,
int req_comp)
1446 stbi__start_file(&s, f);
1447 return stbi__loadf_main(&s, x, y, comp, req_comp);
1457STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const* buffer,
int len)
1461 stbi__start_mem(&s, buffer, len);
1462 return stbi__hdr_test(&s);
1464 STBI_NOTUSED(buffer);
1470#ifndef STBI_NO_STDIO
1471STBIDEF
int stbi_is_hdr(
char const* filename)
1473 FILE* f = stbi__fopen(filename,
"rb");
1476 result = stbi_is_hdr_from_file(f);
1482STBIDEF
int stbi_is_hdr_from_file(FILE* f)
1485 long pos = ftell(f);
1488 stbi__start_file(&s, f);
1489 res = stbi__hdr_test(&s);
1490 fseek(f, pos, SEEK_SET);
1499STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const* clbk,
void* user)
1504 return stbi__hdr_test(&s);
1512#ifndef STBI_NO_LINEAR
1513static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f;
1515STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma) { stbi__l2h_gamma = gamma; }
1516STBIDEF
void stbi_ldr_to_hdr_scale(
float scale) { stbi__l2h_scale =
scale; }
1519static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f;
1521STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma) { stbi__h2l_gamma_i = 1 / gamma; }
1522STBIDEF
void stbi_hdr_to_ldr_scale(
float scale) { stbi__h2l_scale_i = 1 /
scale; }
1532 STBI__SCAN_load = 0,
1537static void stbi__refill_buffer(stbi__context* s)
1539 int n = (s->io.read)(s->io_user_data, (
char*)s->buffer_start, s->buflen);
1540 s->callback_already_read += (int)(s->img_buffer - s->img_buffer_original);
1544 s->read_from_callbacks = 0;
1545 s->img_buffer = s->buffer_start;
1546 s->img_buffer_end = s->buffer_start + 1;
1550 s->img_buffer = s->buffer_start;
1551 s->img_buffer_end = s->buffer_start + n;
1555stbi_inline
static stbi_uc stbi__get8(stbi__context* s)
1557 if (s->img_buffer < s->img_buffer_end)
1558 return *s->img_buffer++;
1559 if (s->read_from_callbacks) {
1560 stbi__refill_buffer(s);
1561 return *s->img_buffer++;
1566#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1569stbi_inline
static int stbi__at_eof(stbi__context* s)
1572 if (!(s->io.eof)(s->io_user_data))
return 0;
1575 if (s->read_from_callbacks == 0)
return 1;
1578 return s->img_buffer >= s->img_buffer_end;
1582#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)
1585static void stbi__skip(stbi__context* s,
int n)
1589 s->img_buffer = s->img_buffer_end;
1593 int blen = (int)(s->img_buffer_end - s->img_buffer);
1595 s->img_buffer = s->img_buffer_end;
1596 (s->io.skip)(s->io_user_data, n - blen);
1604#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
1607static int stbi__getn(stbi__context* s, stbi_uc* buffer,
int n)
1610 int blen = (int)(s->img_buffer_end - s->img_buffer);
1614 memcpy(buffer, s->img_buffer, blen);
1616 count = (s->io.read)(s->io_user_data, (
char*)buffer + blen, n - blen);
1617 res = (count == (n - blen));
1618 s->img_buffer = s->img_buffer_end;
1623 if (s->img_buffer + n <= s->img_buffer_end) {
1624 memcpy(buffer, s->img_buffer, n);
1633#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1636static int stbi__get16be(stbi__context* s)
1638 int z = stbi__get8(s);
1639 return (z << 8) + stbi__get8(s);
1643#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1646static stbi__uint32 stbi__get32be(stbi__context* s)
1648 stbi__uint32 z = stbi__get16be(s);
1649 return (z << 16) + stbi__get16be(s);
1653#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1656static int stbi__get16le(stbi__context* s)
1658 int z = stbi__get8(s);
1659 return z + (stbi__get8(s) << 8);
1664static stbi__uint32 stbi__get32le(stbi__context* s)
1666 stbi__uint32 z = stbi__get16le(s);
1667 return z + (stbi__get16le(s) << 16);
1671#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255))
1673#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1687static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1689 return (stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1693#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1696static unsigned char* stbi__convert_format(
unsigned char* data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1699 unsigned char* good;
1701 if (req_comp == img_n)
return data;
1702 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1704 good = (
unsigned char*)stbi__malloc_mad3(req_comp, x, y, 0);
1707 return stbi__errpuc(
"outofmem",
"Out of memory");
1710 for (j = 0; j < (int)y; ++j) {
1711 unsigned char* src = data + j * x * img_n;
1712 unsigned char* dest = good + j * x * req_comp;
1714#define STBI__COMBO(a,b) ((a)*8+(b))
1715#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1718 switch (STBI__COMBO(img_n, req_comp)) {
1719 STBI__CASE(1, 2) { dest[0] = src[0]; dest[1] = 255; }
break;
1720 STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1721 STBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = 255; }
break;
1722 STBI__CASE(2, 1) { dest[0] = src[0]; }
break;
1723 STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1724 STBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = src[1]; }
break;
1725 STBI__CASE(3, 4) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; dest[3] = 255; }
break;
1726 STBI__CASE(3, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); }
break;
1727 STBI__CASE(3, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); dest[1] = 255; }
break;
1728 STBI__CASE(4, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); }
break;
1729 STBI__CASE(4, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); dest[1] = src[3]; }
break;
1730 STBI__CASE(4, 3) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; }
break;
1731 default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good);
return stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1741#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1744static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b)
1746 return (stbi__uint16)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1750#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1753static stbi__uint16* stbi__convert_format16(stbi__uint16* data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1758 if (req_comp == img_n)
return data;
1759 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1761 good = (stbi__uint16*)stbi__malloc(req_comp * x * y * 2);
1764 return (stbi__uint16*)stbi__errpuc(
"outofmem",
"Out of memory");
1767 for (j = 0; j < (int)y; ++j) {
1768 stbi__uint16* src = data + j * x * img_n;
1769 stbi__uint16* dest = good + j * x * req_comp;
1771#define STBI__COMBO(a,b) ((a)*8+(b))
1772#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1775 switch (STBI__COMBO(img_n, req_comp)) {
1776 STBI__CASE(1, 2) { dest[0] = src[0]; dest[1] = 0xffff; }
break;
1777 STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1778 STBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = 0xffff; }
break;
1779 STBI__CASE(2, 1) { dest[0] = src[0]; }
break;
1780 STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1781 STBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = src[1]; }
break;
1782 STBI__CASE(3, 4) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; dest[3] = 0xffff; }
break;
1783 STBI__CASE(3, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); }
break;
1784 STBI__CASE(3, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); dest[1] = 0xffff; }
break;
1785 STBI__CASE(4, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); }
break;
1786 STBI__CASE(4, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); dest[1] = src[3]; }
break;
1787 STBI__CASE(4, 3) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; }
break;
1788 default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good);
return (stbi__uint16*)stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1798#ifndef STBI_NO_LINEAR
1799static float* stbi__ldr_to_hdr(stbi_uc* data,
int x,
int y,
int comp)
1803 if (!data)
return NULL;
1804 output = (
float*)stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1805 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1807 if (comp & 1) n = comp;
else n = comp - 1;
1808 for (i = 0; i < x * y; ++i) {
1809 for (k = 0; k < n; ++k) {
1810 output[i * comp + k] = (float)(pow(data[i * comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1814 for (i = 0; i < x * y; ++i) {
1815 output[i * comp + n] = data[i * comp + n] / 255.0f;
1824#define stbi__float2int(x) ((int) (x))
1825static stbi_uc* stbi__hdr_to_ldr(
float* data,
int x,
int y,
int comp)
1829 if (!data)
return NULL;
1830 output = (stbi_uc*)stbi__malloc_mad3(x, y, comp, 0);
1831 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1833 if (comp & 1) n = comp;
else n = comp - 1;
1834 for (i = 0; i < x * y; ++i) {
1835 for (k = 0; k < n; ++k) {
1836 float z = (float)pow(data[i * comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1838 if (z > 255) z = 255;
1839 output[i * comp + k] = (stbi_uc)stbi__float2int(z);
1842 float z = data[i * comp + k] * 255 + 0.5f;
1844 if (z > 255) z = 255;
1845 output[i * comp + k] = (stbi_uc)stbi__float2int(z);
1881 stbi_uc fast[1 << FAST_BITS];
1883 stbi__uint16 code[256];
1884 stbi_uc values[256];
1886 unsigned int maxcode[18];
1893 stbi__huffman huff_dc[4];
1894 stbi__huffman huff_ac[4];
1895 stbi__uint16 dequant[4][64];
1896 stbi__int16 fast_ac[4][1 << FAST_BITS];
1899 int img_h_max, img_v_max;
1900 int img_mcu_x, img_mcu_y;
1901 int img_mcu_w, img_mcu_h;
1914 void* raw_data, * raw_coeff;
1917 int coeff_w, coeff_h;
1920 stbi__uint32 code_buffer;
1922 unsigned char marker;
1932 int app14_color_transform;
1935 int scan_n, order[4];
1936 int restart_interval, todo;
1939 void (*idct_block_kernel)(stbi_uc* out,
int out_stride,
short data[64]);
1940 void (*YCbCr_to_RGB_kernel)(stbi_uc* out,
const stbi_uc* y,
const stbi_uc* pcb,
const stbi_uc* pcr,
int count,
int step);
1941 stbi_uc* (*resample_row_hv_2_kernel)(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs);
1944static int stbi__build_huffman(stbi__huffman* h,
int* count)
1949 for (i = 0; i < 16; ++i)
1950 for (j = 0; j < count[i]; ++j)
1951 h->size[k++] = (stbi_uc)(i + 1);
1957 for (j = 1; j <= 16; ++j) {
1959 h->delta[j] = k - code;
1960 if (h->size[k] == j) {
1961 while (h->size[k] == j)
1962 h->code[k++] = (stbi__uint16)(code++);
1963 if (code - 1 >= (1u << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1966 h->maxcode[j] = code << (16 - j);
1969 h->maxcode[j] = 0xffffffff;
1972 memset(h->fast, 255, 1 << FAST_BITS);
1973 for (i = 0; i < k; ++i) {
1975 if (s <= FAST_BITS) {
1976 int c = h->code[i] << (FAST_BITS - s);
1977 int m = 1 << (FAST_BITS - s);
1978 for (j = 0; j < m; ++j) {
1979 h->fast[c + j] = (stbi_uc)i;
1988static void stbi__build_fast_ac(stbi__int16* fast_ac, stbi__huffman* h)
1991 for (i = 0; i < (1 << FAST_BITS); ++i) {
1992 stbi_uc fast = h->fast[i];
1995 int rs = h->values[fast];
1996 int run = (rs >> 4) & 15;
1997 int magbits = rs & 15;
1998 int len = h->size[fast];
2000 if (magbits && len + magbits <= FAST_BITS) {
2002 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
2003 int m = 1 << (magbits - 1);
2004 if (k < m) k += (~0U << magbits) + 1;
2006 if (k >= -128 && k <= 127)
2007 fast_ac[i] = (stbi__int16)((k * 256) + (run * 16) + (len + magbits));
2013static void stbi__grow_buffer_unsafe(stbi__jpeg* j)
2016 unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
2018 int c = stbi__get8(j->s);
2019 while (c == 0xff) c = stbi__get8(j->s);
2021 j->marker = (
unsigned char)c;
2026 j->code_buffer |= b << (24 - j->code_bits);
2028 }
while (j->code_bits <= 24);
2032static const stbi__uint32 stbi__bmask[17] = { 0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535 };
2035stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg* j, stbi__huffman* h)
2040 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2044 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2048 if (s > j->code_bits)
2050 j->code_buffer <<= s;
2052 return h->values[k];
2061 temp = j->code_buffer >> 16;
2062 for (k = FAST_BITS + 1; ; ++k)
2063 if (temp < h->maxcode[k])
2071 if (k > j->code_bits)
2075 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
2076 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
2080 j->code_buffer <<= k;
2081 return h->values[c];
2085static const int stbi__jbias[16] = { 0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767 };
2089stbi_inline
static int stbi__extend_receive(stbi__jpeg* j,
int n)
2093 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
2095 sgn = (stbi__int32)j->code_buffer >> 31;
2096 k = stbi_lrot(j->code_buffer, n);
2097 if (n < 0 || n >= (
int)(
sizeof(stbi__bmask) /
sizeof(*stbi__bmask)))
return 0;
2098 j->code_buffer = k & ~stbi__bmask[n];
2099 k &= stbi__bmask[n];
2101 return k + (stbi__jbias[n] & ~sgn);
2105stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg* j,
int n)
2108 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
2109 k = stbi_lrot(j->code_buffer, n);
2110 j->code_buffer = k & ~stbi__bmask[n];
2111 k &= stbi__bmask[n];
2116stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg* j)
2119 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
2121 j->code_buffer <<= 1;
2123 return k & 0x80000000;
2128static const stbi_uc stbi__jpeg_dezigzag[64 + 15] =
2130 0, 1, 8, 16, 9, 2, 3, 10,
2131 17, 24, 32, 25, 18, 11, 4, 5,
2132 12, 19, 26, 33, 40, 48, 41, 34,
2133 27, 20, 13, 6, 7, 14, 21, 28,
2134 35, 42, 49, 56, 57, 50, 43, 36,
2135 29, 22, 15, 23, 30, 37, 44, 51,
2136 58, 59, 52, 45, 38, 31, 39, 46,
2137 53, 60, 61, 54, 47, 55, 62, 63,
2139 63, 63, 63, 63, 63, 63, 63, 63,
2140 63, 63, 63, 63, 63, 63, 63
2144static int stbi__jpeg_decode_block(stbi__jpeg* j,
short data[64], stbi__huffman* hdc, stbi__huffman* hac, stbi__int16* fac,
int b, stbi__uint16* dequant)
2149 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2150 t = stbi__jpeg_huff_decode(j, hdc);
2151 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2154 memset(data, 0, 64 *
sizeof(data[0]));
2156 diff = t ? stbi__extend_receive(j, t) : 0;
2157 dc = j->img_comp[b].dc_pred + diff;
2158 j->img_comp[b].dc_pred = dc;
2159 data[0] = (short)(dc * dequant[0]);
2166 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2167 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2172 j->code_buffer <<= s;
2175 zig = stbi__jpeg_dezigzag[k++];
2176 data[zig] = (short)((r >> 8) * dequant[zig]);
2179 int rs = stbi__jpeg_huff_decode(j, hac);
2180 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2184 if (rs != 0xf0)
break;
2190 zig = stbi__jpeg_dezigzag[k++];
2191 data[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]);
2198static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg* j,
short data[64], stbi__huffman* hdc,
int b)
2202 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2204 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2206 if (j->succ_high == 0) {
2208 memset(data, 0, 64 *
sizeof(data[0]));
2209 t = stbi__jpeg_huff_decode(j, hdc);
2210 if (t == -1)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2211 diff = t ? stbi__extend_receive(j, t) : 0;
2213 dc = j->img_comp[b].dc_pred + diff;
2214 j->img_comp[b].dc_pred = dc;
2215 data[0] = (short)(dc << j->succ_low);
2219 if (stbi__jpeg_get_bit(j))
2220 data[0] += (short)(1 << j->succ_low);
2227static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg* j,
short data[64], stbi__huffman* hac, stbi__int16* fac)
2230 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2232 if (j->succ_high == 0) {
2233 int shift = j->succ_low;
2244 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2245 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2250 j->code_buffer <<= s;
2252 zig = stbi__jpeg_dezigzag[k++];
2253 data[zig] = (short)((r >> 8) << shift);
2256 int rs = stbi__jpeg_huff_decode(j, hac);
2257 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2262 j->eob_run = (1 << r);
2264 j->eob_run += stbi__jpeg_get_bits(j, r);
2272 zig = stbi__jpeg_dezigzag[k++];
2273 data[zig] = (short)(stbi__extend_receive(j, s) << shift);
2276 }
while (k <= j->spec_end);
2281 short bit = (short)(1 << j->succ_low);
2285 for (k = j->spec_start; k <= j->spec_end; ++k) {
2286 short* p = &data[stbi__jpeg_dezigzag[k]];
2288 if (stbi__jpeg_get_bit(j))
2289 if ((*p & bit) == 0) {
2301 int rs = stbi__jpeg_huff_decode(j, hac);
2302 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2307 j->eob_run = (1 << r) - 1;
2309 j->eob_run += stbi__jpeg_get_bits(j, r);
2319 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2321 if (stbi__jpeg_get_bit(j))
2328 while (k <= j->spec_end) {
2329 short* p = &data[stbi__jpeg_dezigzag[k++]];
2331 if (stbi__jpeg_get_bit(j))
2332 if ((*p & bit) == 0) {
2347 }
while (k <= j->spec_end);
2354stbi_inline
static stbi_uc stbi__clamp(
int x)
2357 if ((
unsigned int)x > 255) {
2358 if (x < 0)
return 0;
2359 if (x > 255)
return 255;
2364#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
2365#define stbi__fsh(x) ((x) * 4096)
2368#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2369 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2372 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
2373 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
2374 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
2377 t0 = stbi__fsh(p2+p3); \
2378 t1 = stbi__fsh(p2-p3); \
2391 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
2392 t0 = t0*stbi__f2f( 0.298631336f); \
2393 t1 = t1*stbi__f2f( 2.053119869f); \
2394 t2 = t2*stbi__f2f( 3.072711026f); \
2395 t3 = t3*stbi__f2f( 1.501321110f); \
2396 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
2397 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
2398 p3 = p3*stbi__f2f(-1.961570560f); \
2399 p4 = p4*stbi__f2f(-0.390180644f); \
2405static void stbi__idct_block(stbi_uc* out,
int out_stride,
short data[64])
2407 int i, val[64], * v = val;
2412 for (i = 0; i < 8; ++i, ++d, ++v) {
2414 if (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0
2415 && d[40] == 0 && d[48] == 0 && d[56] == 0) {
2420 int dcterm = d[0] * 4;
2421 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2424 STBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56])
2427 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2428 v[0] = (x0 + t3) >> 10;
2429 v[56] = (x0 - t3) >> 10;
2430 v[8] = (x1 + t2) >> 10;
2431 v[48] = (x1 - t2) >> 10;
2432 v[16] = (x2 + t1) >> 10;
2433 v[40] = (x2 - t1) >> 10;
2434 v[24] = (x3 + t0) >> 10;
2435 v[32] = (x3 - t0) >> 10;
2439 for (i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) {
2441 STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7])
2448 x0 += 65536 + (128 << 17);
2449 x1 += 65536 + (128 << 17);
2450 x2 += 65536 + (128 << 17);
2451 x3 += 65536 + (128 << 17);
2454 o[0] = stbi__clamp((x0 + t3) >> 17);
2455 o[7] = stbi__clamp((x0 - t3) >> 17);
2456 o[1] = stbi__clamp((x1 + t2) >> 17);
2457 o[6] = stbi__clamp((x1 - t2) >> 17);
2458 o[2] = stbi__clamp((x2 + t1) >> 17);
2459 o[5] = stbi__clamp((x2 - t1) >> 17);
2460 o[3] = stbi__clamp((x3 + t0) >> 17);
2461 o[4] = stbi__clamp((x3 - t0) >> 17);
2469static void stbi__idct_simd(stbi_uc* out,
int out_stride,
short data[64])
2472 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2476#define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2480#define dct_rot(out0,out1, x,y,c0,c1) \
2481 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2482 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2483 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2484 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2485 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2486 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2489#define dct_widen(out, in) \
2490 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2491 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2494#define dct_wadd(out, a, b) \
2495 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2496 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2499#define dct_wsub(out, a, b) \
2500 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2501 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2504#define dct_bfly32o(out0, out1, a,b,bias,s) \
2506 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2507 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2508 dct_wadd(sum, abiased, b); \
2509 dct_wsub(dif, abiased, b); \
2510 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2511 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2515#define dct_interleave8(a, b) \
2517 a = _mm_unpacklo_epi8(a, b); \
2518 b = _mm_unpackhi_epi8(tmp, b)
2521#define dct_interleave16(a, b) \
2523 a = _mm_unpacklo_epi16(a, b); \
2524 b = _mm_unpackhi_epi16(tmp, b)
2526#define dct_pass(bias,shift) \
2529 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2530 __m128i sum04 = _mm_add_epi16(row0, row4); \
2531 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2532 dct_widen(t0e, sum04); \
2533 dct_widen(t1e, dif04); \
2534 dct_wadd(x0, t0e, t3e); \
2535 dct_wsub(x3, t0e, t3e); \
2536 dct_wadd(x1, t1e, t2e); \
2537 dct_wsub(x2, t1e, t2e); \
2539 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2540 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2541 __m128i sum17 = _mm_add_epi16(row1, row7); \
2542 __m128i sum35 = _mm_add_epi16(row3, row5); \
2543 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2544 dct_wadd(x4, y0o, y4o); \
2545 dct_wadd(x5, y1o, y5o); \
2546 dct_wadd(x6, y2o, y5o); \
2547 dct_wadd(x7, y3o, y4o); \
2548 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2549 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2550 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2551 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2554 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2555 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f));
2556 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2557 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2558 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f));
2559 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f));
2560 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f));
2561 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f));
2564 __m128i bias_0 = _mm_set1_epi32(512);
2565 __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17));
2568 row0 = _mm_load_si128((
const __m128i*) (data + 0 * 8));
2569 row1 = _mm_load_si128((
const __m128i*) (data + 1 * 8));
2570 row2 = _mm_load_si128((
const __m128i*) (data + 2 * 8));
2571 row3 = _mm_load_si128((
const __m128i*) (data + 3 * 8));
2572 row4 = _mm_load_si128((
const __m128i*) (data + 4 * 8));
2573 row5 = _mm_load_si128((
const __m128i*) (data + 5 * 8));
2574 row6 = _mm_load_si128((
const __m128i*) (data + 6 * 8));
2575 row7 = _mm_load_si128((
const __m128i*) (data + 7 * 8));
2578 dct_pass(bias_0, 10);
2582 dct_interleave16(row0, row4);
2583 dct_interleave16(row1, row5);
2584 dct_interleave16(row2, row6);
2585 dct_interleave16(row3, row7);
2588 dct_interleave16(row0, row2);
2589 dct_interleave16(row1, row3);
2590 dct_interleave16(row4, row6);
2591 dct_interleave16(row5, row7);
2594 dct_interleave16(row0, row1);
2595 dct_interleave16(row2, row3);
2596 dct_interleave16(row4, row5);
2597 dct_interleave16(row6, row7);
2601 dct_pass(bias_1, 17);
2605 __m128i p0 = _mm_packus_epi16(row0, row1);
2606 __m128i p1 = _mm_packus_epi16(row2, row3);
2607 __m128i p2 = _mm_packus_epi16(row4, row5);
2608 __m128i p3 = _mm_packus_epi16(row6, row7);
2611 dct_interleave8(p0, p2);
2612 dct_interleave8(p1, p3);
2615 dct_interleave8(p0, p1);
2616 dct_interleave8(p2, p3);
2619 dct_interleave8(p0, p2);
2620 dct_interleave8(p1, p3);
2623 _mm_storel_epi64((__m128i*) out, p0); out += out_stride;
2624 _mm_storel_epi64((__m128i*) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2625 _mm_storel_epi64((__m128i*) out, p2); out += out_stride;
2626 _mm_storel_epi64((__m128i*) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2627 _mm_storel_epi64((__m128i*) out, p1); out += out_stride;
2628 _mm_storel_epi64((__m128i*) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2629 _mm_storel_epi64((__m128i*) out, p3); out += out_stride;
2630 _mm_storel_epi64((__m128i*) out, _mm_shuffle_epi32(p3, 0x4e));
2639#undef dct_interleave8
2640#undef dct_interleave16
2650static void stbi__idct_simd(stbi_uc* out,
int out_stride,
short data[64])
2652 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2654 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2655 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2656 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f));
2657 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f));
2658 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2659 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2660 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2661 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2662 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f));
2663 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f));
2664 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f));
2665 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f));
2667#define dct_long_mul(out, inq, coeff) \
2668 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2669 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2671#define dct_long_mac(out, acc, inq, coeff) \
2672 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2673 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2675#define dct_widen(out, inq) \
2676 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2677 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2680#define dct_wadd(out, a, b) \
2681 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2682 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2685#define dct_wsub(out, a, b) \
2686 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2687 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2690#define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2692 dct_wadd(sum, a, b); \
2693 dct_wsub(dif, a, b); \
2694 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2695 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2698#define dct_pass(shiftop, shift) \
2701 int16x8_t sum26 = vaddq_s16(row2, row6); \
2702 dct_long_mul(p1e, sum26, rot0_0); \
2703 dct_long_mac(t2e, p1e, row6, rot0_1); \
2704 dct_long_mac(t3e, p1e, row2, rot0_2); \
2705 int16x8_t sum04 = vaddq_s16(row0, row4); \
2706 int16x8_t dif04 = vsubq_s16(row0, row4); \
2707 dct_widen(t0e, sum04); \
2708 dct_widen(t1e, dif04); \
2709 dct_wadd(x0, t0e, t3e); \
2710 dct_wsub(x3, t0e, t3e); \
2711 dct_wadd(x1, t1e, t2e); \
2712 dct_wsub(x2, t1e, t2e); \
2714 int16x8_t sum15 = vaddq_s16(row1, row5); \
2715 int16x8_t sum17 = vaddq_s16(row1, row7); \
2716 int16x8_t sum35 = vaddq_s16(row3, row5); \
2717 int16x8_t sum37 = vaddq_s16(row3, row7); \
2718 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2719 dct_long_mul(p5o, sumodd, rot1_0); \
2720 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2721 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2722 dct_long_mul(p3o, sum37, rot2_0); \
2723 dct_long_mul(p4o, sum15, rot2_1); \
2724 dct_wadd(sump13o, p1o, p3o); \
2725 dct_wadd(sump24o, p2o, p4o); \
2726 dct_wadd(sump23o, p2o, p3o); \
2727 dct_wadd(sump14o, p1o, p4o); \
2728 dct_long_mac(x4, sump13o, row7, rot3_0); \
2729 dct_long_mac(x5, sump24o, row5, rot3_1); \
2730 dct_long_mac(x6, sump23o, row3, rot3_2); \
2731 dct_long_mac(x7, sump14o, row1, rot3_3); \
2732 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2733 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2734 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2735 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2739 row0 = vld1q_s16(data + 0 * 8);
2740 row1 = vld1q_s16(data + 1 * 8);
2741 row2 = vld1q_s16(data + 2 * 8);
2742 row3 = vld1q_s16(data + 3 * 8);
2743 row4 = vld1q_s16(data + 4 * 8);
2744 row5 = vld1q_s16(data + 5 * 8);
2745 row6 = vld1q_s16(data + 6 * 8);
2746 row7 = vld1q_s16(data + 7 * 8);
2749 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2752 dct_pass(vrshrn_n_s32, 10);
2758#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2759#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }
2760#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }
2763 dct_trn16(row0, row1);
2764 dct_trn16(row2, row3);
2765 dct_trn16(row4, row5);
2766 dct_trn16(row6, row7);
2769 dct_trn32(row0, row2);
2770 dct_trn32(row1, row3);
2771 dct_trn32(row4, row6);
2772 dct_trn32(row5, row7);
2775 dct_trn64(row0, row4);
2776 dct_trn64(row1, row5);
2777 dct_trn64(row2, row6);
2778 dct_trn64(row3, row7);
2789 dct_pass(vshrn_n_s32, 16);
2793 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2794 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2795 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2796 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2797 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2798 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2799 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2800 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2803#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2804#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }
2805#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }
2817 dct_trn8_16(p0, p2);
2818 dct_trn8_16(p1, p3);
2819 dct_trn8_16(p4, p6);
2820 dct_trn8_16(p5, p7);
2823 dct_trn8_32(p0, p4);
2824 dct_trn8_32(p1, p5);
2825 dct_trn8_32(p2, p6);
2826 dct_trn8_32(p3, p7);
2829 vst1_u8(out, p0); out += out_stride;
2830 vst1_u8(out, p1); out += out_stride;
2831 vst1_u8(out, p2); out += out_stride;
2832 vst1_u8(out, p3); out += out_stride;
2833 vst1_u8(out, p4); out += out_stride;
2834 vst1_u8(out, p5); out += out_stride;
2835 vst1_u8(out, p6); out += out_stride;
2854#define STBI__MARKER_none 0xff
2858static stbi_uc stbi__get_marker(stbi__jpeg* j)
2861 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2862 x = stbi__get8(j->s);
2863 if (x != 0xff)
return STBI__MARKER_none;
2865 x = stbi__get8(j->s);
2871#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2875static void stbi__jpeg_reset(stbi__jpeg* j)
2880 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
2881 j->marker = STBI__MARKER_none;
2882 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2888static int stbi__parse_entropy_coded_data(stbi__jpeg* z)
2890 stbi__jpeg_reset(z);
2891 if (!z->progressive) {
2892 if (z->scan_n == 1) {
2894 STBI_SIMD_ALIGN(
short, data[64]);
2895 int n = z->order[0];
2900 int w = (z->img_comp[n].x + 7) >> 3;
2901 int h = (z->img_comp[n].y + 7) >> 3;
2902 for (j = 0; j < h; ++j) {
2903 for (i = 0; i < w; ++i) {
2904 int ha = z->img_comp[n].ha;
2905 if (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
return 0;
2906 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data);
2908 if (--z->todo <= 0) {
2909 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2912 if (!STBI__RESTART(z->marker))
return 1;
2913 stbi__jpeg_reset(z);
2921 STBI_SIMD_ALIGN(
short, data[64]);
2922 for (j = 0; j < z->img_mcu_y; ++j) {
2923 for (i = 0; i < z->img_mcu_x; ++i) {
2925 for (k = 0; k < z->scan_n; ++k) {
2926 int n = z->order[k];
2929 for (y = 0; y < z->img_comp[n].v; ++y) {
2930 for (x = 0; x < z->img_comp[n].h; ++x) {
2931 int x2 = (i * z->img_comp[n].h + x) * 8;
2932 int y2 = (j * z->img_comp[n].v + y) * 8;
2933 int ha = z->img_comp[n].ha;
2934 if (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
return 0;
2935 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * y2 + x2, z->img_comp[n].w2, data);
2941 if (--z->todo <= 0) {
2942 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2943 if (!STBI__RESTART(z->marker))
return 1;
2944 stbi__jpeg_reset(z);
2952 if (z->scan_n == 1) {
2954 int n = z->order[0];
2959 int w = (z->img_comp[n].x + 7) >> 3;
2960 int h = (z->img_comp[n].y + 7) >> 3;
2961 for (j = 0; j < h; ++j) {
2962 for (i = 0; i < w; ++i) {
2963 short* data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2964 if (z->spec_start == 0) {
2965 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2969 int ha = z->img_comp[n].ha;
2970 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2974 if (--z->todo <= 0) {
2975 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2976 if (!STBI__RESTART(z->marker))
return 1;
2977 stbi__jpeg_reset(z);
2985 for (j = 0; j < z->img_mcu_y; ++j) {
2986 for (i = 0; i < z->img_mcu_x; ++i) {
2988 for (k = 0; k < z->scan_n; ++k) {
2989 int n = z->order[k];
2992 for (y = 0; y < z->img_comp[n].v; ++y) {
2993 for (x = 0; x < z->img_comp[n].h; ++x) {
2994 int x2 = (i * z->img_comp[n].h + x);
2995 int y2 = (j * z->img_comp[n].v + y);
2996 short* data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2997 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
3004 if (--z->todo <= 0) {
3005 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3006 if (!STBI__RESTART(z->marker))
return 1;
3007 stbi__jpeg_reset(z);
3016static void stbi__jpeg_dequantize(
short* data, stbi__uint16* dequant)
3019 for (i = 0; i < 64; ++i)
3020 data[i] *= dequant[i];
3023static void stbi__jpeg_finish(stbi__jpeg* z)
3025 if (z->progressive) {
3028 for (n = 0; n < z->s->img_n; ++n) {
3029 int w = (z->img_comp[n].x + 7) >> 3;
3030 int h = (z->img_comp[n].y + 7) >> 3;
3031 for (j = 0; j < h; ++j) {
3032 for (i = 0; i < w; ++i) {
3033 short* data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
3034 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
3035 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data);
3042static int stbi__process_marker(stbi__jpeg* z,
int m)
3046 case STBI__MARKER_none:
3047 return stbi__err(
"expected marker",
"Corrupt JPEG");
3050 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
3051 z->restart_interval = stbi__get16be(z->s);
3055 L = stbi__get16be(z->s) - 2;
3057 int q = stbi__get8(z->s);
3058 int p = q >> 4, sixteen = (p != 0);
3060 if (p != 0 && p != 1)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
3061 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
3063 for (i = 0; i < 64; ++i)
3064 z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
3065 L -= (sixteen ? 129 : 65);
3070 L = stbi__get16be(z->s) - 2;
3073 int sizes[16], i, n = 0;
3074 int q = stbi__get8(z->s);
3077 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
3078 for (i = 0; i < 16; ++i) {
3079 sizes[i] = stbi__get8(z->s);
3084 if (!stbi__build_huffman(z->huff_dc + th, sizes))
return 0;
3085 v = z->huff_dc[th].values;
3088 if (!stbi__build_huffman(z->huff_ac + th, sizes))
return 0;
3089 v = z->huff_ac[th].values;
3091 for (i = 0; i < n; ++i)
3092 v[i] = stbi__get8(z->s);
3094 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
3101 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
3102 L = stbi__get16be(z->s);
3105 return stbi__err(
"bad COM len",
"Corrupt JPEG");
3107 return stbi__err(
"bad APP len",
"Corrupt JPEG");
3111 if (m == 0xE0 && L >= 5) {
3112 static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0' };
3115 for (i = 0; i < 5; ++i)
3116 if (stbi__get8(z->s) != tag[i])
3122 else if (m == 0xEE && L >= 12) {
3123 static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0' };
3126 for (i = 0; i < 6; ++i)
3127 if (stbi__get8(z->s) != tag[i])
3132 stbi__get16be(z->s);
3133 stbi__get16be(z->s);
3134 z->app14_color_transform = stbi__get8(z->s);
3139 stbi__skip(z->s, L);
3143 return stbi__err(
"unknown marker",
"Corrupt JPEG");
3147static int stbi__process_scan_header(stbi__jpeg* z)
3150 int Ls = stbi__get16be(z->s);
3151 z->scan_n = stbi__get8(z->s);
3152 if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (
int)z->s->img_n)
return stbi__err(
"bad SOS component count",
"Corrupt JPEG");
3153 if (Ls != 6 + 2 * z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
3154 for (i = 0; i < z->scan_n; ++i) {
3155 int id = stbi__get8(z->s), which;
3156 int q = stbi__get8(z->s);
3157 for (which = 0; which < z->s->img_n; ++which)
3158 if (z->img_comp[which].id ==
id)
3160 if (which == z->s->img_n)
return 0;
3161 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
3162 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
3163 z->order[i] = which;
3168 z->spec_start = stbi__get8(z->s);
3169 z->spec_end = stbi__get8(z->s);
3170 aa = stbi__get8(z->s);
3171 z->succ_high = (aa >> 4);
3172 z->succ_low = (aa & 15);
3173 if (z->progressive) {
3174 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
3175 return stbi__err(
"bad SOS",
"Corrupt JPEG");
3178 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3179 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3187static int stbi__free_jpeg_components(stbi__jpeg* z,
int ncomp,
int why)
3190 for (i = 0; i < ncomp; ++i) {
3191 if (z->img_comp[i].raw_data) {
3192 STBI_FREE(z->img_comp[i].raw_data);
3193 z->img_comp[i].raw_data = NULL;
3194 z->img_comp[i].data = NULL;
3196 if (z->img_comp[i].raw_coeff) {
3197 STBI_FREE(z->img_comp[i].raw_coeff);
3198 z->img_comp[i].raw_coeff = 0;
3199 z->img_comp[i].coeff = 0;
3201 if (z->img_comp[i].linebuf) {
3202 STBI_FREE(z->img_comp[i].linebuf);
3203 z->img_comp[i].linebuf = NULL;
3209static int stbi__process_frame_header(stbi__jpeg* z,
int scan)
3211 stbi__context* s = z->s;
3212 int Lf, p, i, q, h_max = 1, v_max = 1, c;
3213 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3214 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
3215 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
3216 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
3217 if (s->img_y > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
3218 if (s->img_x > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
3220 if (c != 3 && c != 1 && c != 4)
return stbi__err(
"bad component count",
"Corrupt JPEG");
3222 for (i = 0; i < c; ++i) {
3223 z->img_comp[i].data = NULL;
3224 z->img_comp[i].linebuf = NULL;
3227 if (Lf != 8 + 3 * s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3230 for (i = 0; i < s->img_n; ++i) {
3231 static const unsigned char rgb[3] = {
'R',
'G',
'B' };
3232 z->img_comp[i].id = stbi__get8(s);
3233 if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3236 z->img_comp[i].h = (q >> 4);
if (!z->img_comp[i].h || z->img_comp[i].h > 4)
return stbi__err(
"bad H",
"Corrupt JPEG");
3237 z->img_comp[i].v = q & 15;
if (!z->img_comp[i].v || z->img_comp[i].v > 4)
return stbi__err(
"bad V",
"Corrupt JPEG");
3238 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
3241 if (scan != STBI__SCAN_load)
return 1;
3243 if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0))
return stbi__err(
"too large",
"Image too large to decode");
3245 for (i = 0; i < s->img_n; ++i) {
3246 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
3247 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
3251 z->img_h_max = h_max;
3252 z->img_v_max = v_max;
3253 z->img_mcu_w = h_max * 8;
3254 z->img_mcu_h = v_max * 8;
3256 z->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w;
3257 z->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h;
3259 for (i = 0; i < s->img_n; ++i) {
3261 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max;
3262 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max;
3270 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3271 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3272 z->img_comp[i].coeff = 0;
3273 z->img_comp[i].raw_coeff = 0;
3274 z->img_comp[i].linebuf = NULL;
3275 z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3276 if (z->img_comp[i].raw_data == NULL)
3277 return stbi__free_jpeg_components(z, i + 1, stbi__err(
"outofmem",
"Out of memory"));
3279 z->img_comp[i].data = (stbi_uc*)(((
size_t)z->img_comp[i].raw_data + 15) & ~15);
3280 if (z->progressive) {
3282 z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3283 z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3284 z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2,
sizeof(
short), 15);
3285 if (z->img_comp[i].raw_coeff == NULL)
3286 return stbi__free_jpeg_components(z, i + 1, stbi__err(
"outofmem",
"Out of memory"));
3287 z->img_comp[i].coeff = (
short*)(((
size_t)z->img_comp[i].raw_coeff + 15) & ~15);
3295#define stbi__DNL(x) ((x) == 0xdc)
3296#define stbi__SOI(x) ((x) == 0xd8)
3297#define stbi__EOI(x) ((x) == 0xd9)
3298#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3299#define stbi__SOS(x) ((x) == 0xda)
3301#define stbi__SOF_progressive(x) ((x) == 0xc2)
3303static int stbi__decode_jpeg_header(stbi__jpeg* z,
int scan)
3307 z->app14_color_transform = -1;
3308 z->marker = STBI__MARKER_none;
3309 m = stbi__get_marker(z);
3310 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
3311 if (scan == STBI__SCAN_type)
return 1;
3312 m = stbi__get_marker(z);
3313 while (!stbi__SOF(m)) {
3314 if (!stbi__process_marker(z, m))
return 0;
3315 m = stbi__get_marker(z);
3316 while (m == STBI__MARKER_none) {
3318 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
3319 m = stbi__get_marker(z);
3322 z->progressive = stbi__SOF_progressive(m);
3323 if (!stbi__process_frame_header(z, scan))
return 0;
3328static int stbi__decode_jpeg_image(stbi__jpeg* j)
3331 for (m = 0; m < 4; m++) {
3332 j->img_comp[m].raw_data = NULL;
3333 j->img_comp[m].raw_coeff = NULL;
3335 j->restart_interval = 0;
3336 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
3337 m = stbi__get_marker(j);
3338 while (!stbi__EOI(m)) {
3340 if (!stbi__process_scan_header(j))
return 0;
3341 if (!stbi__parse_entropy_coded_data(j))
return 0;
3342 if (j->marker == STBI__MARKER_none) {
3344 while (!stbi__at_eof(j->s)) {
3345 int x = stbi__get8(j->s);
3347 j->marker = stbi__get8(j->s);
3354 else if (stbi__DNL(m)) {
3355 int Ld = stbi__get16be(j->s);
3356 stbi__uint32 NL = stbi__get16be(j->s);
3357 if (Ld != 4)
return stbi__err(
"bad DNL len",
"Corrupt JPEG");
3358 if (NL != j->s->img_y)
return stbi__err(
"bad DNL height",
"Corrupt JPEG");
3361 if (!stbi__process_marker(j, m))
return 0;
3363 m = stbi__get_marker(j);
3366 stbi__jpeg_finish(j);
3372typedef stbi_uc* (*resample_row_func)(stbi_uc* out, stbi_uc* in0, stbi_uc* in1,
3375#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3377static stbi_uc* resample_row_1(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3380 STBI_NOTUSED(in_far);
3386static stbi_uc* stbi__resample_row_v_2(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3391 for (i = 0; i < w; ++i)
3392 out[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2);
3396static stbi_uc* stbi__resample_row_h_2(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3400 stbi_uc* input = in_near;
3404 out[0] = out[1] = input[0];
3409 out[1] = stbi__div4(input[0] * 3 + input[1] + 2);
3410 for (i = 1; i < w - 1; ++i) {
3411 int n = 3 * input[i] + 2;
3412 out[i * 2 + 0] = stbi__div4(n + input[i - 1]);
3413 out[i * 2 + 1] = stbi__div4(n + input[i + 1]);
3415 out[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2);
3416 out[i * 2 + 1] = input[w - 1];
3418 STBI_NOTUSED(in_far);
3424#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3426static stbi_uc* stbi__resample_row_hv_2(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3431 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3435 t1 = 3 * in_near[0] + in_far[0];
3436 out[0] = stbi__div4(t1 + 2);
3437 for (i = 1; i < w; ++i) {
3439 t1 = 3 * in_near[i] + in_far[i];
3440 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3441 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3443 out[w * 2 - 1] = stbi__div4(t1 + 2);
3450#if defined(STBI_SSE2) || defined(STBI_NEON)
3451static stbi_uc* stbi__resample_row_hv_2_simd(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3457 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3461 t1 = 3 * in_near[0] + in_far[0];
3465 for (; i < ((w - 1) & ~7); i += 8) {
3466#if defined(STBI_SSE2)
3469 __m128i
zero = _mm_setzero_si128();
3470 __m128i farb = _mm_loadl_epi64((__m128i*) (in_far + i));
3471 __m128i nearb = _mm_loadl_epi64((__m128i*) (in_near + i));
3472 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3473 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3474 __m128i diff = _mm_sub_epi16(farw, nearw);
3475 __m128i nears = _mm_slli_epi16(nearw, 2);
3476 __m128i curr = _mm_add_epi16(nears, diff);
3483 __m128i prv0 = _mm_slli_si128(curr, 2);
3484 __m128i nxt0 = _mm_srli_si128(curr, 2);
3485 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3486 __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7);
3492 __m128i bias = _mm_set1_epi16(8);
3493 __m128i curs = _mm_slli_epi16(curr, 2);
3494 __m128i prvd = _mm_sub_epi16(prev, curr);
3495 __m128i nxtd = _mm_sub_epi16(next, curr);
3496 __m128i curb = _mm_add_epi16(curs, bias);
3497 __m128i even = _mm_add_epi16(prvd, curb);
3498 __m128i odd = _mm_add_epi16(nxtd, curb);
3501 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3502 __m128i
int1 = _mm_unpackhi_epi16(even, odd);
3503 __m128i de0 = _mm_srli_epi16(int0, 4);
3504 __m128i de1 = _mm_srli_epi16(int1, 4);
3507 __m128i outv = _mm_packus_epi16(de0, de1);
3508 _mm_storeu_si128((__m128i*) (out + i * 2), outv);
3509#elif defined(STBI_NEON)
3512 uint8x8_t farb = vld1_u8(in_far + i);
3513 uint8x8_t nearb = vld1_u8(in_near + i);
3514 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3515 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3516 int16x8_t curr = vaddq_s16(nears, diff);
3523 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3524 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3525 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3526 int16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7);
3532 int16x8_t curs = vshlq_n_s16(curr, 2);
3533 int16x8_t prvd = vsubq_s16(prev, curr);
3534 int16x8_t nxtd = vsubq_s16(next, curr);
3535 int16x8_t even = vaddq_s16(curs, prvd);
3536 int16x8_t odd = vaddq_s16(curs, nxtd);
3540 o.val[0] = vqrshrun_n_s16(even, 4);
3541 o.val[1] = vqrshrun_n_s16(odd, 4);
3542 vst2_u8(out + i * 2, o);
3546 t1 = 3 * in_near[i + 7] + in_far[i + 7];
3550 t1 = 3 * in_near[i] + in_far[i];
3551 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3553 for (++i; i < w; ++i) {
3555 t1 = 3 * in_near[i] + in_far[i];
3556 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3557 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3559 out[w * 2 - 1] = stbi__div4(t1 + 2);
3567static stbi_uc* stbi__resample_row_generic(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3571 STBI_NOTUSED(in_far);
3572 for (i = 0; i < w; ++i)
3573 for (j = 0; j < hs; ++j)
3574 out[i * hs + j] = in_near[i];
3580#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3581static void stbi__YCbCr_to_RGB_row(stbi_uc* out,
const stbi_uc* y,
const stbi_uc* pcb,
const stbi_uc* pcr,
int count,
int step)
3584 for (i = 0; i < count; ++i) {
3585 int y_fixed = (y[i] << 20) + (1 << 19);
3587 int cr = pcr[i] - 128;
3588 int cb = pcb[i] - 128;
3589 r = y_fixed + cr * stbi__float2fixed(1.40200f);
3590 g = y_fixed + (cr * -stbi__float2fixed(0.71414f)) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000);
3591 b = y_fixed + cb * stbi__float2fixed(1.77200f);
3595 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3596 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3597 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
3598 out[0] = (stbi_uc)r;
3599 out[1] = (stbi_uc)g;
3600 out[2] = (stbi_uc)b;
3606#if defined(STBI_SSE2) || defined(STBI_NEON)
3607static void stbi__YCbCr_to_RGB_simd(stbi_uc* out, stbi_uc
const* y, stbi_uc
const* pcb, stbi_uc
const* pcr,
int count,
int step)
3617 __m128i signflip = _mm_set1_epi8(-0x80);
3618 __m128i cr_const0 = _mm_set1_epi16((
short)(1.40200f * 4096.0f + 0.5f));
3619 __m128i cr_const1 = _mm_set1_epi16(-(
short)(0.71414f * 4096.0f + 0.5f));
3620 __m128i cb_const0 = _mm_set1_epi16(-(
short)(0.34414f * 4096.0f + 0.5f));
3621 __m128i cb_const1 = _mm_set1_epi16((
short)(1.77200f * 4096.0f + 0.5f));
3622 __m128i y_bias = _mm_set1_epi8((
char)(
unsigned char)128);
3623 __m128i xw = _mm_set1_epi16(255);
3625 for (; i + 7 < count; i += 8) {
3627 __m128i y_bytes = _mm_loadl_epi64((__m128i*) (y + i));
3628 __m128i cr_bytes = _mm_loadl_epi64((__m128i*) (pcr + i));
3629 __m128i cb_bytes = _mm_loadl_epi64((__m128i*) (pcb + i));
3630 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3631 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3634 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3635 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3636 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3639 __m128i yws = _mm_srli_epi16(yw, 4);
3640 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3641 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3642 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3643 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3644 __m128i rws = _mm_add_epi16(cr0, yws);
3645 __m128i gwt = _mm_add_epi16(cb0, yws);
3646 __m128i bws = _mm_add_epi16(yws, cb1);
3647 __m128i gws = _mm_add_epi16(gwt, cr1);
3650 __m128i rw = _mm_srai_epi16(rws, 4);
3651 __m128i bw = _mm_srai_epi16(bws, 4);
3652 __m128i gw = _mm_srai_epi16(gws, 4);
3655 __m128i brb = _mm_packus_epi16(rw, bw);
3656 __m128i gxb = _mm_packus_epi16(gw, xw);
3659 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3660 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3661 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3662 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3665 _mm_storeu_si128((__m128i*) (out + 0), o0);
3666 _mm_storeu_si128((__m128i*) (out + 16), o1);
3676 uint8x8_t signflip = vdup_n_u8(0x80);
3677 int16x8_t cr_const0 = vdupq_n_s16((
short)(1.40200f * 4096.0f + 0.5f));
3678 int16x8_t cr_const1 = vdupq_n_s16(-(
short)(0.71414f * 4096.0f + 0.5f));
3679 int16x8_t cb_const0 = vdupq_n_s16(-(
short)(0.34414f * 4096.0f + 0.5f));
3680 int16x8_t cb_const1 = vdupq_n_s16((
short)(1.77200f * 4096.0f + 0.5f));
3682 for (; i + 7 < count; i += 8) {
3684 uint8x8_t y_bytes = vld1_u8(y + i);
3685 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3686 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3687 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3688 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3691 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3692 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3693 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3696 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3697 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3698 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3699 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3700 int16x8_t rws = vaddq_s16(yws, cr0);
3701 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3702 int16x8_t bws = vaddq_s16(yws, cb1);
3706 o.val[0] = vqrshrun_n_s16(rws, 4);
3707 o.val[1] = vqrshrun_n_s16(gws, 4);
3708 o.val[2] = vqrshrun_n_s16(bws, 4);
3709 o.val[3] = vdup_n_u8(255);
3718 for (; i < count; ++i) {
3719 int y_fixed = (y[i] << 20) + (1 << 19);
3721 int cr = pcr[i] - 128;
3722 int cb = pcb[i] - 128;
3723 r = y_fixed + cr * stbi__float2fixed(1.40200f);
3724 g = y_fixed + cr * -stbi__float2fixed(0.71414f) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000);
3725 b = y_fixed + cb * stbi__float2fixed(1.77200f);
3729 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3730 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3731 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
3732 out[0] = (stbi_uc)r;
3733 out[1] = (stbi_uc)g;
3734 out[2] = (stbi_uc)b;
3742static void stbi__setup_jpeg(stbi__jpeg* j)
3744 j->idct_block_kernel = stbi__idct_block;
3745 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3746 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3749 if (stbi__sse2_available()) {
3750 j->idct_block_kernel = stbi__idct_simd;
3751 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3752 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3757 j->idct_block_kernel = stbi__idct_simd;
3758 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3759 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3764static void stbi__cleanup_jpeg(stbi__jpeg* j)
3766 stbi__free_jpeg_components(j, j->s->img_n, 0);
3771 resample_row_func resample;
3772 stbi_uc* line0, * line1;
3780static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
3782 unsigned int t = x * y + 128;
3783 return (stbi_uc)((t + (t >> 8)) >> 8);
3786static stbi_uc* load_jpeg_image(stbi__jpeg* z,
int* out_x,
int* out_y,
int* comp,
int req_comp)
3788 int n, decode_n, is_rgb;
3792 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3795 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3798 n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3800 is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3802 if (z->s->img_n == 3 && n < 3 && !is_rgb)
3805 decode_n = z->s->img_n;
3812 stbi_uc* coutput[4] = { NULL, NULL, NULL, NULL };
3814 stbi__resample res_comp[4];
3816 for (k = 0; k < decode_n; ++k) {
3817 stbi__resample* r = &res_comp[k];
3821 z->img_comp[k].linebuf = (stbi_uc*)stbi__malloc(z->s->img_x + 3);
3822 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3824 r->hs = z->img_h_max / z->img_comp[k].h;
3825 r->vs = z->img_v_max / z->img_comp[k].v;
3826 r->ystep = r->vs >> 1;
3827 r->w_lores = (z->s->img_x + r->hs - 1) / r->hs;
3829 r->line0 = r->line1 = z->img_comp[k].data;
3831 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3832 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3833 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3834 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3835 else r->resample = stbi__resample_row_generic;
3839 output = (stbi_uc*)stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3840 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3843 for (j = 0; j < z->s->img_y; ++j) {
3844 stbi_uc* out = output + n * z->s->img_x * j;
3845 for (k = 0; k < decode_n; ++k) {
3846 stbi__resample* r = &res_comp[k];
3847 int y_bot = r->ystep >= (r->vs >> 1);
3848 coutput[k] = r->resample(z->img_comp[k].linebuf,
3849 y_bot ? r->line1 : r->line0,
3850 y_bot ? r->line0 : r->line1,
3852 if (++r->ystep >= r->vs) {
3854 r->line0 = r->line1;
3855 if (++r->ypos < z->img_comp[k].y)
3856 r->line1 += z->img_comp[k].w2;
3860 stbi_uc* y = coutput[0];
3861 if (z->s->img_n == 3) {
3863 for (i = 0; i < z->s->img_x; ++i) {
3865 out[1] = coutput[1][i];
3866 out[2] = coutput[2][i];
3872 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3875 else if (z->s->img_n == 4) {
3876 if (z->app14_color_transform == 0) {
3877 for (i = 0; i < z->s->img_x; ++i) {
3878 stbi_uc m = coutput[3][i];
3879 out[0] = stbi__blinn_8x8(coutput[0][i], m);
3880 out[1] = stbi__blinn_8x8(coutput[1][i], m);
3881 out[2] = stbi__blinn_8x8(coutput[2][i], m);
3886 else if (z->app14_color_transform == 2) {
3887 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3888 for (i = 0; i < z->s->img_x; ++i) {
3889 stbi_uc m = coutput[3][i];
3890 out[0] = stbi__blinn_8x8(255 - out[0], m);
3891 out[1] = stbi__blinn_8x8(255 - out[1], m);
3892 out[2] = stbi__blinn_8x8(255 - out[2], m);
3897 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3901 for (i = 0; i < z->s->img_x; ++i) {
3902 out[0] = out[1] = out[2] = y[i];
3910 for (i = 0; i < z->s->img_x; ++i)
3911 *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3913 for (i = 0; i < z->s->img_x; ++i, out += 2) {
3914 out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3919 else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
3920 for (i = 0; i < z->s->img_x; ++i) {
3921 stbi_uc m = coutput[3][i];
3922 stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
3923 stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
3924 stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
3925 out[0] = stbi__compute_y(r, g, b);
3930 else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
3931 for (i = 0; i < z->s->img_x; ++i) {
3932 out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
3938 stbi_uc* y = coutput[0];
3940 for (i = 0; i < z->s->img_x; ++i) out[i] = y[i];
3942 for (i = 0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
3946 stbi__cleanup_jpeg(z);
3947 *out_x = z->s->img_x;
3948 *out_y = z->s->img_y;
3949 if (comp) *comp = z->s->img_n >= 3 ? 3 : 1;
3954static void* stbi__jpeg_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
3956 unsigned char* result;
3957 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
3960 stbi__setup_jpeg(j);
3961 result = load_jpeg_image(j, x, y, comp, req_comp);
3966static int stbi__jpeg_test(stbi__context* s)
3969 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
3971 stbi__setup_jpeg(j);
3972 r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
3978static int stbi__jpeg_info_raw(stbi__jpeg* j,
int* x,
int* y,
int* comp)
3980 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3984 if (x) *x = j->s->img_x;
3985 if (y) *y = j->s->img_y;
3986 if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
3990static int stbi__jpeg_info(stbi__context* s,
int* x,
int* y,
int* comp)
3993 stbi__jpeg* j = (stbi__jpeg*)(stbi__malloc(
sizeof(stbi__jpeg)));
3995 result = stbi__jpeg_info_raw(j, x, y, comp);
4011#define STBI__ZFAST_BITS 9
4012#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
4018 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
4019 stbi__uint16 firstcode[16];
4021 stbi__uint16 firstsymbol[16];
4023 stbi__uint16 value[288];
4026stbi_inline
static int stbi__bitreverse16(
int n)
4028 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
4029 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
4030 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
4031 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
4035stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
4037 STBI_ASSERT(bits <= 16);
4040 return stbi__bitreverse16(v) >> (16 - bits);
4043static int stbi__zbuild_huffman(stbi__zhuffman* z,
const stbi_uc* sizelist,
int num)
4046 int code, next_code[16], sizes[17];
4049 memset(sizes, 0,
sizeof(sizes));
4050 memset(z->fast, 0,
sizeof(z->fast));
4051 for (i = 0; i < num; ++i)
4052 ++sizes[sizelist[i]];
4054 for (i = 1; i < 16; ++i)
4055 if (sizes[i] > (1 << i))
4056 return stbi__err(
"bad sizes",
"Corrupt PNG");
4058 for (i = 1; i < 16; ++i) {
4059 next_code[i] = code;
4060 z->firstcode[i] = (stbi__uint16)code;
4061 z->firstsymbol[i] = (stbi__uint16)k;
4062 code = (code + sizes[i]);
4064 if (code - 1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4065 z->maxcode[i] = code << (16 - i);
4069 z->maxcode[16] = 0x10000;
4070 for (i = 0; i < num; ++i) {
4071 int s = sizelist[i];
4073 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
4074 stbi__uint16 fastv = (stbi__uint16)((s << 9) | i);
4075 z->size[c] = (stbi_uc)s;
4076 z->value[c] = (stbi__uint16)i;
4077 if (s <= STBI__ZFAST_BITS) {
4078 int j = stbi__bit_reverse(next_code[s], s);
4079 while (j < (1 << STBI__ZFAST_BITS)) {
4098 stbi_uc* zbuffer, * zbuffer_end;
4100 stbi__uint32 code_buffer;
4107 stbi__zhuffman z_length, z_distance;
4110stbi_inline
static int stbi__zeof(stbi__zbuf* z)
4112 return (z->zbuffer >= z->zbuffer_end);
4115stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf* z)
4117 return stbi__zeof(z) ? 0 : *z->zbuffer++;
4120static void stbi__fill_bits(stbi__zbuf* z)
4123 if (z->code_buffer >= (1U << z->num_bits)) {
4124 z->zbuffer = z->zbuffer_end;
4127 z->code_buffer |= (
unsigned int)stbi__zget8(z) << z->num_bits;
4129 }
while (z->num_bits <= 24);
4132stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf* z,
int n)
4135 if (z->num_bits < n) stbi__fill_bits(z);
4136 k = z->code_buffer & ((1 << n) - 1);
4137 z->code_buffer >>= n;
4142static int stbi__zhuffman_decode_slowpath(stbi__zbuf* a, stbi__zhuffman* z)
4147 k = stbi__bit_reverse(a->code_buffer, 16);
4148 for (s = STBI__ZFAST_BITS + 1; ; ++s)
4149 if (k < z->maxcode[s])
4151 if (s >= 16)
return -1;
4153 b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s];
4154 if (b >=
sizeof(z->size))
return -1;
4155 if (z->size[b] != s)
return -1;
4156 a->code_buffer >>= s;
4161stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf* a, stbi__zhuffman* z)
4164 if (a->num_bits < 16) {
4165 if (stbi__zeof(a)) {
4170 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
4173 a->code_buffer >>= s;
4177 return stbi__zhuffman_decode_slowpath(a, z);
4180static int stbi__zexpand(stbi__zbuf* z,
char* zout,
int n)
4183 unsigned int cur, limit, old_limit;
4185 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
4186 cur = (
unsigned int)(z->zout - z->zout_start);
4187 limit = old_limit = (unsigned)(z->zout_end - z->zout_start);
4188 if (UINT_MAX - cur < (
unsigned)n)
return stbi__err(
"outofmem",
"Out of memory");
4189 while (cur + n > limit) {
4190 if (limit > UINT_MAX / 2)
return stbi__err(
"outofmem",
"Out of memory");
4193 q = (
char*)STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
4194 STBI_NOTUSED(old_limit);
4195 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4198 z->zout_end = q + limit;
4202static const int stbi__zlength_base[31] = {
4203 3,4,5,6,7,8,9,10,11,13,
4204 15,17,19,23,27,31,35,43,51,59,
4205 67,83,99,115,131,163,195,227,258,0,0 };
4207static const int stbi__zlength_extra[31] =
4208{ 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,0,0 };
4210static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
4211257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0 };
4213static const int stbi__zdist_extra[32] =
4214{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };
4216static int stbi__parse_huffman_block(stbi__zbuf* a)
4218 char* zout = a->zout;
4220 int z = stbi__zhuffman_decode(a, &a->z_length);
4222 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4223 if (zout >= a->zout_end) {
4224 if (!stbi__zexpand(a, zout, 1))
return 0;
4237 len = stbi__zlength_base[z];
4238 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
4239 z = stbi__zhuffman_decode(a, &a->z_distance);
4240 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4241 dist = stbi__zdist_base[z];
4242 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
4243 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
4244 if (zout + len > a->zout_end) {
4245 if (!stbi__zexpand(a, zout, len))
return 0;
4248 p = (stbi_uc*)(zout - dist);
4251 if (len) {
do *zout++ = v;
while (--len); }
4254 if (len) {
do *zout++ = *p++;
while (--len); }
4260static int stbi__compute_huffman_codes(stbi__zbuf* a)
4262 static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
4263 stbi__zhuffman z_codelength;
4264 stbi_uc lencodes[286 + 32 + 137];
4265 stbi_uc codelength_sizes[19];
4268 int hlit = stbi__zreceive(a, 5) + 257;
4269 int hdist = stbi__zreceive(a, 5) + 1;
4270 int hclen = stbi__zreceive(a, 4) + 4;
4271 int ntot = hlit + hdist;
4273 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4274 for (i = 0; i < hclen; ++i) {
4275 int s = stbi__zreceive(a, 3);
4276 codelength_sizes[length_dezigzag[i]] = (stbi_uc)s;
4278 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
4282 int c = stbi__zhuffman_decode(a, &z_codelength);
4283 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4285 lencodes[n++] = (stbi_uc)c;
4289 c = stbi__zreceive(a, 2) + 3;
4290 if (n == 0)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4291 fill = lencodes[n - 1];
4294 c = stbi__zreceive(a, 3) + 3;
4297 c = stbi__zreceive(a, 7) + 11;
4300 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4302 if (ntot - n < c)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4303 memset(lencodes + n, fill, c);
4307 if (n != ntot)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4308 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
4309 if (!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist))
return 0;
4313static int stbi__parse_uncompressed_block(stbi__zbuf* a)
4317 if (a->num_bits & 7)
4318 stbi__zreceive(a, a->num_bits & 7);
4321 while (a->num_bits > 0) {
4322 header[k++] = (stbi_uc)(a->code_buffer & 255);
4323 a->code_buffer >>= 8;
4326 if (a->num_bits < 0)
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4329 header[k++] = stbi__zget8(a);
4330 len = header[1] * 256 + header[0];
4331 nlen = header[3] * 256 + header[2];
4332 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4333 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
4334 if (a->zout + len > a->zout_end)
4335 if (!stbi__zexpand(a, a->zout, len))
return 0;
4336 memcpy(a->zout, a->zbuffer, len);
4342static int stbi__parse_zlib_header(stbi__zbuf* a)
4344 int cmf = stbi__zget8(a);
4347 int flg = stbi__zget8(a);
4348 if (stbi__zeof(a))
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4349 if ((cmf * 256 + flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4350 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
4351 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
4356static const stbi_uc stbi__zdefault_length[288] =
4358 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4359 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4360 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4361 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4362 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4363 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4364 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4365 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4366 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8
4368static const stbi_uc stbi__zdefault_distance[32] =
4370 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
4385static int stbi__parse_zlib(stbi__zbuf* a,
int parse_header)
4389 if (!stbi__parse_zlib_header(a))
return 0;
4393 final = stbi__zreceive(a, 1);
4394 type = stbi__zreceive(a, 2);
4396 if (!stbi__parse_uncompressed_block(a))
return 0;
4398 else if (type == 3) {
4404 if (!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, 288))
return 0;
4405 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
4408 if (!stbi__compute_huffman_codes(a))
return 0;
4410 if (!stbi__parse_huffman_block(a))
return 0;
4416static int stbi__do_zlib(stbi__zbuf* a,
char* obuf,
int olen,
int exp,
int parse_header)
4418 a->zout_start = obuf;
4420 a->zout_end = obuf + olen;
4421 a->z_expandable = exp;
4423 return stbi__parse_zlib(a, parse_header);
4426STBIDEF
char* stbi_zlib_decode_malloc_guesssize(
const char* buffer,
int len,
int initial_size,
int* outlen)
4429 char* p = (
char*)stbi__malloc(initial_size);
4430 if (p == NULL)
return NULL;
4431 a.zbuffer = (stbi_uc*)buffer;
4432 a.zbuffer_end = (stbi_uc*)buffer + len;
4433 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4434 if (outlen) *outlen = (int)(a.zout - a.zout_start);
4435 return a.zout_start;
4438 STBI_FREE(a.zout_start);
4443STBIDEF
char* stbi_zlib_decode_malloc(
char const* buffer,
int len,
int* outlen)
4445 return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
4448STBIDEF
char* stbi_zlib_decode_malloc_guesssize_headerflag(
const char* buffer,
int len,
int initial_size,
int* outlen,
int parse_header)
4451 char* p = (
char*)stbi__malloc(initial_size);
4452 if (p == NULL)
return NULL;
4453 a.zbuffer = (stbi_uc*)buffer;
4454 a.zbuffer_end = (stbi_uc*)buffer + len;
4455 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4456 if (outlen) *outlen = (int)(a.zout - a.zout_start);
4457 return a.zout_start;
4460 STBI_FREE(a.zout_start);
4465STBIDEF
int stbi_zlib_decode_buffer(
char* obuffer,
int olen,
char const* ibuffer,
int ilen)
4468 a.zbuffer = (stbi_uc*)ibuffer;
4469 a.zbuffer_end = (stbi_uc*)ibuffer + ilen;
4470 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4471 return (
int)(a.zout - a.zout_start);
4476STBIDEF
char* stbi_zlib_decode_noheader_malloc(
char const* buffer,
int len,
int* outlen)
4479 char* p = (
char*)stbi__malloc(16384);
4480 if (p == NULL)
return NULL;
4481 a.zbuffer = (stbi_uc*)buffer;
4482 a.zbuffer_end = (stbi_uc*)buffer + len;
4483 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4484 if (outlen) *outlen = (int)(a.zout - a.zout_start);
4485 return a.zout_start;
4488 STBI_FREE(a.zout_start);
4493STBIDEF
int stbi_zlib_decode_noheader_buffer(
char* obuffer,
int olen,
const char* ibuffer,
int ilen)
4496 a.zbuffer = (stbi_uc*)ibuffer;
4497 a.zbuffer_end = (stbi_uc*)ibuffer + ilen;
4498 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4499 return (
int)(a.zout - a.zout_start);
4518 stbi__uint32 length;
4522static stbi__pngchunk stbi__get_chunk_header(stbi__context* s)
4525 c.length = stbi__get32be(s);
4526 c.type = stbi__get32be(s);
4530static int stbi__check_png_header(stbi__context* s)
4532 static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4534 for (i = 0; i < 8; ++i)
4535 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
4542 stbi_uc* idata, * expanded, * out;
4558static stbi_uc first_row_filter[5] =
4567static int stbi__paeth(
int a,
int b,
int c)
4570 int pa =
abs(p - a);
4571 int pb =
abs(p - b);
4572 int pc =
abs(p - c);
4573 if (pa <= pb && pa <= pc)
return a;
4574 if (pb <= pc)
return b;
4578static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4581static int stbi__create_png_image_raw(stbi__png* a, stbi_uc* raw, stbi__uint32 raw_len,
int out_n, stbi__uint32 x, stbi__uint32 y,
int depth,
int color)
4583 int bytes = (depth == 16 ? 2 : 1);
4584 stbi__context* s = a->s;
4585 stbi__uint32 i, j, stride = x * out_n * bytes;
4586 stbi__uint32 img_len, img_width_bytes;
4588 int img_n = s->img_n;
4590 int output_bytes = out_n * bytes;
4591 int filter_bytes = img_n * bytes;
4594 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1);
4595 a->out = (stbi_uc*)stbi__malloc_mad3(x, y, output_bytes, 0);
4596 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
4598 if (!stbi__mad3sizes_valid(img_n, x, depth, 7))
return stbi__err(
"too large",
"Corrupt PNG");
4599 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4600 img_len = (img_width_bytes + 1) * y;
4605 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4607 for (j = 0; j < y; ++j) {
4608 stbi_uc* cur = a->out + stride * j;
4610 int filter = *raw++;
4613 return stbi__err(
"invalid filter",
"Corrupt PNG");
4616 if (img_width_bytes > x)
return stbi__err(
"invalid width",
"Corrupt PNG");
4617 cur += x * out_n - img_width_bytes;
4619 width = img_width_bytes;
4621 prior = cur - stride;
4624 if (j == 0) filter = first_row_filter[filter];
4627 for (k = 0; k < filter_bytes; ++k) {
4629 case STBI__F_none: cur[k] = raw[k];
break;
4630 case STBI__F_sub: cur[k] = raw[k];
break;
4631 case STBI__F_up: cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4632 case STBI__F_avg: cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1));
break;
4633 case STBI__F_paeth: cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0, prior[k], 0));
break;
4634 case STBI__F_avg_first: cur[k] = raw[k];
break;
4635 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4646 else if (depth == 16) {
4647 if (img_n != out_n) {
4648 cur[filter_bytes] = 255;
4649 cur[filter_bytes + 1] = 255;
4651 raw += filter_bytes;
4652 cur += output_bytes;
4653 prior += output_bytes;
4662 if (depth < 8 || img_n == out_n) {
4663 int nk = (width - 1) * filter_bytes;
4664#define STBI__CASE(f) \
4666 for (k=0; k < nk; ++k)
4669 case STBI__F_none: memcpy(cur, raw, nk);
break;
4670 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); }
break;
4671 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4672 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); }
break;
4673 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); }
break;
4674 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); }
break;
4675 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], 0, 0)); }
break;
4681 STBI_ASSERT(img_n + 1 == out_n);
4682#define STBI__CASE(f) \
4684 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4685 for (k=0; k < filter_bytes; ++k)
4687 STBI__CASE(STBI__F_none) { cur[k] = raw[k]; }
break;
4688 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - output_bytes]); }
break;
4689 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4690 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - output_bytes]) >> 1)); }
break;
4691 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], prior[k], prior[k - output_bytes])); }
break;
4692 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - output_bytes] >> 1)); }
break;
4693 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], 0, 0)); }
break;
4700 cur = a->out + stride * j;
4701 for (i = 0; i < x; ++i, cur += output_bytes) {
4702 cur[filter_bytes + 1] = 255;
4712 for (j = 0; j < y; ++j) {
4713 stbi_uc* cur = a->out + stride * j;
4714 stbi_uc* in = a->out + stride * j + x * out_n - img_width_bytes;
4717 stbi_uc
scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4726 for (k = x * img_n; k >= 2; k -= 2, ++in) {
4727 *cur++ =
scale * ((*in >> 4));
4728 *cur++ =
scale * ((*in) & 0x0f);
4730 if (k > 0) *cur++ =
scale * ((*in >> 4));
4732 else if (depth == 2) {
4733 for (k = x * img_n; k >= 4; k -= 4, ++in) {
4734 *cur++ =
scale * ((*in >> 6));
4735 *cur++ =
scale * ((*in >> 4) & 0x03);
4736 *cur++ =
scale * ((*in >> 2) & 0x03);
4737 *cur++ =
scale * ((*in) & 0x03);
4739 if (k > 0) *cur++ =
scale * ((*in >> 6));
4740 if (k > 1) *cur++ =
scale * ((*in >> 4) & 0x03);
4741 if (k > 2) *cur++ =
scale * ((*in >> 2) & 0x03);
4743 else if (depth == 1) {
4744 for (k = x * img_n; k >= 8; k -= 8, ++in) {
4745 *cur++ =
scale * ((*in >> 7));
4746 *cur++ =
scale * ((*in >> 6) & 0x01);
4747 *cur++ =
scale * ((*in >> 5) & 0x01);
4748 *cur++ =
scale * ((*in >> 4) & 0x01);
4749 *cur++ =
scale * ((*in >> 3) & 0x01);
4750 *cur++ =
scale * ((*in >> 2) & 0x01);
4751 *cur++ =
scale * ((*in >> 1) & 0x01);
4752 *cur++ =
scale * ((*in) & 0x01);
4754 if (k > 0) *cur++ =
scale * ((*in >> 7));
4755 if (k > 1) *cur++ =
scale * ((*in >> 6) & 0x01);
4756 if (k > 2) *cur++ =
scale * ((*in >> 5) & 0x01);
4757 if (k > 3) *cur++ =
scale * ((*in >> 4) & 0x01);
4758 if (k > 4) *cur++ =
scale * ((*in >> 3) & 0x01);
4759 if (k > 5) *cur++ =
scale * ((*in >> 2) & 0x01);
4760 if (k > 6) *cur++ =
scale * ((*in >> 1) & 0x01);
4762 if (img_n != out_n) {
4765 cur = a->out + stride * j;
4767 for (q = x - 1; q >= 0; --q) {
4768 cur[q * 2 + 1] = 255;
4769 cur[q * 2 + 0] = cur[q];
4773 STBI_ASSERT(img_n == 3);
4774 for (q = x - 1; q >= 0; --q) {
4775 cur[q * 4 + 3] = 255;
4776 cur[q * 4 + 2] = cur[q * 3 + 2];
4777 cur[q * 4 + 1] = cur[q * 3 + 1];
4778 cur[q * 4 + 0] = cur[q * 3 + 0];
4784 else if (depth == 16) {
4789 stbi_uc* cur = a->out;
4790 stbi__uint16* cur16 = (stbi__uint16*)cur;
4792 for (i = 0; i < x * y * out_n; ++i, cur16++, cur += 2) {
4793 *cur16 = (cur[0] << 8) | cur[1];
4800static int stbi__create_png_image(stbi__png* a, stbi_uc* image_data, stbi__uint32 image_data_len,
int out_n,
int depth,
int color,
int interlaced)
4802 int bytes = (depth == 16 ? 2 : 1);
4803 int out_bytes = out_n * bytes;
4807 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4810 final = (stbi_uc*)stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4811 for (p = 0; p < 7; ++p) {
4812 int xorig[] = { 0,4,0,2,0,1,0 };
4813 int yorig[] = { 0,0,4,0,2,0,1 };
4814 int xspc[] = { 8,8,4,4,2,2,1 };
4815 int yspc[] = { 8,8,8,4,4,2,2 };
4818 x = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p];
4819 y = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p];
4821 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4822 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4826 for (j = 0; j < y; ++j) {
4827 for (i = 0; i < x; ++i) {
4828 int out_y = j * yspc[p] + yorig[p];
4829 int out_x = i * xspc[p] + xorig[p];
4830 memcpy(
final + out_y * a->s->img_x * out_bytes + out_x * out_bytes,
4831 a->out + (j * x + i) * out_bytes, out_bytes);
4835 image_data += img_len;
4836 image_data_len -= img_len;
4844static int stbi__compute_transparency(stbi__png* z, stbi_uc tc[3],
int out_n)
4846 stbi__context* s = z->s;
4847 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4848 stbi_uc* p = z->out;
4852 STBI_ASSERT(out_n == 2 || out_n == 4);
4855 for (i = 0; i < pixel_count; ++i) {
4856 p[1] = (p[0] == tc[0] ? 0 : 255);
4861 for (i = 0; i < pixel_count; ++i) {
4862 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4870static int stbi__compute_transparency16(stbi__png* z, stbi__uint16 tc[3],
int out_n)
4872 stbi__context* s = z->s;
4873 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4874 stbi__uint16* p = (stbi__uint16*)z->out;
4878 STBI_ASSERT(out_n == 2 || out_n == 4);
4881 for (i = 0; i < pixel_count; ++i) {
4882 p[1] = (p[0] == tc[0] ? 0 : 65535);
4887 for (i = 0; i < pixel_count; ++i) {
4888 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4896static int stbi__expand_png_palette(stbi__png* a, stbi_uc* palette,
int len,
int pal_img_n)
4898 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4899 stbi_uc* p, * temp_out, * orig = a->out;
4901 p = (stbi_uc*)stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4902 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4907 if (pal_img_n == 3) {
4908 for (i = 0; i < pixel_count; ++i) {
4909 int n = orig[i] * 4;
4911 p[1] = palette[n + 1];
4912 p[2] = palette[n + 2];
4917 for (i = 0; i < pixel_count; ++i) {
4918 int n = orig[i] * 4;
4920 p[1] = palette[n + 1];
4921 p[2] = palette[n + 2];
4922 p[3] = palette[n + 3];
4934static int stbi__unpremultiply_on_load = 0;
4935static int stbi__de_iphone_flag = 0;
4937STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply)
4939 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4942STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert)
4944 stbi__de_iphone_flag = flag_true_if_should_convert;
4947static void stbi__de_iphone(stbi__png* z)
4949 stbi__context* s = z->s;
4950 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4951 stbi_uc* p = z->out;
4953 if (s->img_out_n == 3) {
4954 for (i = 0; i < pixel_count; ++i) {
4962 STBI_ASSERT(s->img_out_n == 4);
4963 if (stbi__unpremultiply_on_load) {
4965 for (i = 0; i < pixel_count; ++i) {
4969 stbi_uc half = a / 2;
4970 p[0] = (p[2] * 255 + half) / a;
4971 p[1] = (p[1] * 255 + half) / a;
4972 p[2] = (t * 255 + half) / a;
4983 for (i = 0; i < pixel_count; ++i) {
4993#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
4995static int stbi__parse_png_file(stbi__png* z,
int scan,
int req_comp)
4997 stbi_uc palette[1024], pal_img_n = 0;
4998 stbi_uc has_trans = 0, tc[3] = { 0 };
4999 stbi__uint16 tc16[3];
5000 stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0;
5001 int first = 1, k, interlace = 0, color = 0, is_iphone = 0;
5002 stbi__context* s = z->s;
5008 if (!stbi__check_png_header(s))
return 0;
5010 if (scan == STBI__SCAN_type)
return 1;
5013 stbi__pngchunk c = stbi__get_chunk_header(s);
5015 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
5017 stbi__skip(s, c.length);
5019 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
5021 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
5023 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
5024 s->img_x = stbi__get32be(s);
5025 s->img_y = stbi__get32be(s);
5026 if (s->img_y > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
5027 if (s->img_x > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
5028 z->depth = stbi__get8(s);
if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)
return stbi__err(
"1/2/4/8/16-bit only",
"PNG not supported: 1/2/4/8/16-bit only");
5029 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5030 if (color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5031 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5032 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
5033 filter = stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
5034 interlace = stbi__get8(s);
if (interlace > 1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
5035 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
5037 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
5038 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
5039 if (scan == STBI__SCAN_header)
return 1;
5045 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
5051 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
5052 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5053 if (c.length > 256 * 3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5054 pal_len = c.length / 3;
5055 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5056 for (i = 0; i < pal_len; ++i) {
5057 palette[i * 4 + 0] = stbi__get8(s);
5058 palette[i * 4 + 1] = stbi__get8(s);
5059 palette[i * 4 + 2] = stbi__get8(s);
5060 palette[i * 4 + 3] = 255;
5065 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
5066 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5067 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
5069 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
5070 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
5071 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5073 for (i = 0; i < c.length; ++i)
5074 palette[i * 4 + 3] = stbi__get8(s);
5077 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
5078 if (c.length != (stbi__uint32)s->img_n * 2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5080 if (z->depth == 16) {
5081 for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s);
5084 for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth];
5090 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
5091 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5092 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
5093 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
5094 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
5095 if (ioff + c.length > idata_limit) {
5096 stbi__uint32 idata_limit_old = idata_limit;
5098 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
5099 while (ioff + c.length > idata_limit)
5101 STBI_NOTUSED(idata_limit_old);
5102 p = (stbi_uc*)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
5105 if (!stbi__getn(s, z->idata + ioff, c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
5110 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
5111 stbi__uint32 raw_len, bpl;
5112 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5113 if (scan != STBI__SCAN_load)
return 1;
5114 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
5116 bpl = (s->img_x * z->depth + 7) / 8;
5117 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
5118 z->expanded = (stbi_uc*)stbi_zlib_decode_malloc_guesssize_headerflag((
char*)z->idata, ioff, raw_len, (
int*)&raw_len, !is_iphone);
5119 if (z->expanded == NULL)
return 0;
5120 STBI_FREE(z->idata); z->idata = NULL;
5121 if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans)
5122 s->img_out_n = s->img_n + 1;
5124 s->img_out_n = s->img_n;
5125 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace))
return 0;
5127 if (z->depth == 16) {
5128 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
return 0;
5131 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
5134 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
5138 s->img_n = pal_img_n;
5139 s->img_out_n = pal_img_n;
5140 if (req_comp >= 3) s->img_out_n = req_comp;
5141 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
5144 else if (has_trans) {
5148 STBI_FREE(z->expanded); z->expanded = NULL;
5156 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5157 if ((c.type & (1 << 29)) == 0) {
5158#ifndef STBI_NO_FAILURE_STRINGS
5160 static char invalid_chunk[] =
"XXXX PNG chunk not known";
5161 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
5162 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
5163 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
5164 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
5166 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
5168 stbi__skip(s, c.length);
5176static void* stbi__do_png(stbi__png* p,
int* x,
int* y,
int* n,
int req_comp, stbi__result_info* ri)
5178 void* result = NULL;
5179 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
5180 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
5182 ri->bits_per_channel = 8;
5183 else if (p->depth == 16)
5184 ri->bits_per_channel = 16;
5186 return stbi__errpuc(
"bad bits_per_channel",
"PNG not supported: unsupported color depth");
5189 if (req_comp && req_comp != p->s->img_out_n) {
5190 if (ri->bits_per_channel == 8)
5191 result = stbi__convert_format((
unsigned char*)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
5193 result = stbi__convert_format16((stbi__uint16*)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
5194 p->s->img_out_n = req_comp;
5195 if (result == NULL)
return result;
5199 if (n) *n = p->s->img_n;
5201 STBI_FREE(p->out); p->out = NULL;
5202 STBI_FREE(p->expanded); p->expanded = NULL;
5203 STBI_FREE(p->idata); p->idata = NULL;
5208static void* stbi__png_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
5212 return stbi__do_png(&p, x, y, comp, req_comp, ri);
5215static int stbi__png_test(stbi__context* s)
5218 r = stbi__check_png_header(s);
5223static int stbi__png_info_raw(stbi__png* p,
int* x,
int* y,
int* comp)
5225 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
5229 if (x) *x = p->s->img_x;
5230 if (y) *y = p->s->img_y;
5231 if (comp) *comp = p->s->img_n;
5235static int stbi__png_info(stbi__context* s,
int* x,
int* y,
int* comp)
5239 return stbi__png_info_raw(&p, x, y, comp);
5242static int stbi__png_is16(stbi__context* s)
5246 if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5248 if (p.depth != 16) {
5259static int stbi__bmp_test_raw(stbi__context* s)
5263 if (stbi__get8(s) !=
'B')
return 0;
5264 if (stbi__get8(s) !=
'M')
return 0;
5269 sz = stbi__get32le(s);
5270 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5274static int stbi__bmp_test(stbi__context* s)
5276 int r = stbi__bmp_test_raw(s);
5283static int stbi__high_bit(
unsigned int z)
5286 if (z == 0)
return -1;
5287 if (z >= 0x10000) { n += 16; z >>= 16; }
5288 if (z >= 0x00100) { n += 8; z >>= 8; }
5289 if (z >= 0x00010) { n += 4; z >>= 4; }
5290 if (z >= 0x00004) { n += 2; z >>= 2; }
5291 if (z >= 0x00002) { n += 1; }
5295static int stbi__bitcount(
unsigned int a)
5297 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
5298 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
5299 a = (a + (a >> 4)) & 0x0f0f0f0f;
5301 a = (a + (a >> 16));
5308static int stbi__shiftsigned(
unsigned int v,
int shift,
int bits)
5310 static unsigned int mul_table[9] = {
5312 0xff, 0x55, 0x49, 0x11,
5313 0x21, 0x41, 0x81, 0x01,
5315 static unsigned int shift_table[9] = {
5322 STBI_ASSERT(v < 256);
5324 STBI_ASSERT(bits >= 0 && bits <= 8);
5325 return (
int)((unsigned)v * mul_table[bits]) >> shift_table[bits];
5330 int bpp, offset, hsz;
5331 unsigned int mr, mg, mb, ma, all_a;
5335static void* stbi__bmp_parse_header(stbi__context* s, stbi__bmp_data* info)
5338 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5342 info->offset = stbi__get32le(s);
5343 info->hsz = hsz = stbi__get32le(s);
5344 info->mr = info->mg = info->mb = info->ma = 0;
5345 info->extra_read = 14;
5347 if (info->offset < 0)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5349 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5351 s->img_x = stbi__get16le(s);
5352 s->img_y = stbi__get16le(s);
5355 s->img_x = stbi__get32le(s);
5356 s->img_y = stbi__get32le(s);
5358 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5359 info->bpp = stbi__get16le(s);
5361 int compress = stbi__get32le(s);
5362 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5368 if (hsz == 40 || hsz == 56) {
5375 if (info->bpp == 16 || info->bpp == 32) {
5376 if (compress == 0) {
5377 if (info->bpp == 32) {
5378 info->mr = 0xffu << 16;
5379 info->mg = 0xffu << 8;
5380 info->mb = 0xffu << 0;
5381 info->ma = 0xffu << 24;
5385 info->mr = 31u << 10;
5386 info->mg = 31u << 5;
5387 info->mb = 31u << 0;
5390 else if (compress == 3) {
5391 info->mr = stbi__get32le(s);
5392 info->mg = stbi__get32le(s);
5393 info->mb = stbi__get32le(s);
5394 info->extra_read += 12;
5396 if (info->mr == info->mg && info->mg == info->mb) {
5398 return stbi__errpuc(
"bad BMP",
"bad BMP");
5402 return stbi__errpuc(
"bad BMP",
"bad BMP");
5407 if (hsz != 108 && hsz != 124)
5408 return stbi__errpuc(
"bad BMP",
"bad BMP");
5409 info->mr = stbi__get32le(s);
5410 info->mg = stbi__get32le(s);
5411 info->mb = stbi__get32le(s);
5412 info->ma = stbi__get32le(s);
5414 for (i = 0; i < 12; ++i)
5428static void* stbi__bmp_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
5431 unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a;
5432 stbi_uc pal[256][4];
5433 int psize = 0, i, j, width;
5434 int flip_vertically, pad, target;
5435 stbi__bmp_data info;
5439 if (stbi__bmp_parse_header(s, &info) == NULL)
5442 flip_vertically = ((int)s->img_y) > 0;
5443 s->img_y =
abs((
int)s->img_y);
5445 if (s->img_y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5446 if (s->img_x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5454 if (info.hsz == 12) {
5456 psize = (info.offset - info.extra_read - 24) / 3;
5460 psize = (info.offset - info.extra_read - info.hsz) >> 2;
5463 STBI_ASSERT(info.offset == s->callback_already_read + (
int)(s->img_buffer - s->img_buffer_original));
5464 if (info.offset != s->callback_already_read + (s->img_buffer - s->buffer_start)) {
5465 return stbi__errpuc(
"bad offset",
"Corrupt BMP");
5469 if (info.bpp == 24 && ma == 0xff000000)
5472 s->img_n = ma ? 4 : 3;
5473 if (req_comp && req_comp >= 3)
5479 if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5480 return stbi__errpuc(
"too large",
"Corrupt BMP");
5482 out = (stbi_uc*)stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5483 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5484 if (info.bpp < 16) {
5486 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
5487 for (i = 0; i < psize; ++i) {
5488 pal[i][2] = stbi__get8(s);
5489 pal[i][1] = stbi__get8(s);
5490 pal[i][0] = stbi__get8(s);
5491 if (info.hsz != 12) stbi__get8(s);
5494 stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5495 if (info.bpp == 1) width = (s->img_x + 7) >> 3;
5496 else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5497 else if (info.bpp == 8) width = s->img_x;
5498 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
5500 if (info.bpp == 1) {
5501 for (j = 0; j < (int)s->img_y; ++j) {
5502 int bit_offset = 7, v = stbi__get8(s);
5503 for (i = 0; i < (int)s->img_x; ++i) {
5504 int color = (v >> bit_offset) & 0x1;
5505 out[z++] = pal[color][0];
5506 out[z++] = pal[color][1];
5507 out[z++] = pal[color][2];
5508 if (target == 4) out[z++] = 255;
5509 if (i + 1 == (
int)s->img_x)
break;
5510 if ((--bit_offset) < 0) {
5519 for (j = 0; j < (int)s->img_y; ++j) {
5520 for (i = 0; i < (int)s->img_x; i += 2) {
5521 int v = stbi__get8(s), v2 = 0;
5522 if (info.bpp == 4) {
5526 out[z++] = pal[v][0];
5527 out[z++] = pal[v][1];
5528 out[z++] = pal[v][2];
5529 if (target == 4) out[z++] = 255;
5530 if (i + 1 == (
int)s->img_x)
break;
5531 v = (info.bpp == 8) ? stbi__get8(s) : v2;
5532 out[z++] = pal[v][0];
5533 out[z++] = pal[v][1];
5534 out[z++] = pal[v][2];
5535 if (target == 4) out[z++] = 255;
5542 int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0;
5545 stbi__skip(s, info.offset - info.extra_read - info.hsz);
5546 if (info.bpp == 24) width = 3 * s->img_x;
5547 else if (info.bpp == 16) width = 2 * s->img_x;
5550 if (info.bpp == 24) {
5553 else if (info.bpp == 32) {
5554 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5558 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5560 rshift = stbi__high_bit(mr) - 7; rcount = stbi__bitcount(mr);
5561 gshift = stbi__high_bit(mg) - 7; gcount = stbi__bitcount(mg);
5562 bshift = stbi__high_bit(mb) - 7; bcount = stbi__bitcount(mb);
5563 ashift = stbi__high_bit(ma) - 7; acount = stbi__bitcount(ma);
5564 if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5566 for (j = 0; j < (int)s->img_y; ++j) {
5568 for (i = 0; i < (int)s->img_x; ++i) {
5570 out[z + 2] = stbi__get8(s);
5571 out[z + 1] = stbi__get8(s);
5572 out[z + 0] = stbi__get8(s);
5574 a = (easy == 2 ? stbi__get8(s) : 255);
5576 if (target == 4) out[z++] = a;
5581 for (i = 0; i < (int)s->img_x; ++i) {
5582 stbi__uint32 v = (bpp == 16 ? (stbi__uint32)stbi__get16le(s) : stbi__get32le(s));
5584 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5585 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5586 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5587 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5589 if (target == 4) out[z++] = STBI__BYTECAST(a);
5597 if (target == 4 && all_a == 0)
5598 for (i = 4 * s->img_x * s->img_y - 1; i >= 0; i -= 4)
5601 if (flip_vertically) {
5603 for (j = 0; j < (int)s->img_y >> 1; ++j) {
5604 stbi_uc* p1 = out + j * s->img_x * target;
5605 stbi_uc* p2 = out + (s->img_y - 1 - j) * s->img_x * target;
5606 for (i = 0; i < (int)s->img_x * target; ++i) {
5607 t = p1[i]; p1[i] = p2[i]; p2[i] = t;
5612 if (req_comp && req_comp != target) {
5613 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
5614 if (out == NULL)
return out;
5619 if (comp) *comp = s->img_n;
5628static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
5631 if (is_rgb16) *is_rgb16 = 0;
5632 switch (bits_per_pixel) {
5633 case 8:
return STBI_grey;
5634 case 16:
if (is_grey)
return STBI_grey_alpha;
5636 case 15:
if (is_rgb16) *is_rgb16 = 1;
5639 case 32:
return bits_per_pixel / 8;
5644static int stbi__tga_info(stbi__context* s,
int* x,
int* y,
int* comp)
5646 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5647 int sz, tga_colormap_type;
5649 tga_colormap_type = stbi__get8(s);
5650 if (tga_colormap_type > 1) {
5654 tga_image_type = stbi__get8(s);
5655 if (tga_colormap_type == 1) {
5656 if (tga_image_type != 1 && tga_image_type != 9) {
5662 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) {
5667 tga_colormap_bpp = sz;
5670 if ((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11)) {
5675 tga_colormap_bpp = 0;
5677 tga_w = stbi__get16le(s);
5682 tga_h = stbi__get16le(s);
5687 tga_bits_per_pixel = stbi__get8(s);
5689 if (tga_colormap_bpp != 0) {
5690 if ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5696 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5699 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5707 if (comp) *comp = tga_comp;
5711static int stbi__tga_test(stbi__context* s)
5714 int sz, tga_color_type;
5716 tga_color_type = stbi__get8(s);
5717 if (tga_color_type > 1)
goto errorEnd;
5719 if (tga_color_type == 1) {
5720 if (sz != 1 && sz != 9)
goto errorEnd;
5723 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
goto errorEnd;
5727 if ((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11))
goto errorEnd;
5730 if (stbi__get16le(s) < 1)
goto errorEnd;
5731 if (stbi__get16le(s) < 1)
goto errorEnd;
5733 if ((tga_color_type == 1) && (sz != 8) && (sz != 16))
goto errorEnd;
5734 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
goto errorEnd;
5744static void stbi__tga_read_rgb16(stbi__context* s, stbi_uc* out)
5746 stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5747 stbi__uint16 fiveBitMask = 31;
5749 int r = (px >> 10) & fiveBitMask;
5750 int g = (px >> 5) & fiveBitMask;
5751 int b = px & fiveBitMask;
5753 out[0] = (stbi_uc)((r * 255) / 31);
5754 out[1] = (stbi_uc)((g * 255) / 31);
5755 out[2] = (stbi_uc)((b * 255) / 31);
5763static void* stbi__tga_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
5766 int tga_offset = stbi__get8(s);
5767 int tga_indexed = stbi__get8(s);
5768 int tga_image_type = stbi__get8(s);
5770 int tga_palette_start = stbi__get16le(s);
5771 int tga_palette_len = stbi__get16le(s);
5772 int tga_palette_bits = stbi__get8(s);
5773 int tga_x_origin = stbi__get16le(s);
5774 int tga_y_origin = stbi__get16le(s);
5775 int tga_width = stbi__get16le(s);
5776 int tga_height = stbi__get16le(s);
5777 int tga_bits_per_pixel = stbi__get8(s);
5778 int tga_comp, tga_rgb16 = 0;
5779 int tga_inverted = stbi__get8(s);
5782 unsigned char* tga_data;
5783 unsigned char* tga_palette = NULL;
5785 unsigned char raw_data[4] = { 0 };
5787 int RLE_repeating = 0;
5788 int read_next_pixel = 1;
5790 STBI_NOTUSED(tga_x_origin);
5791 STBI_NOTUSED(tga_y_origin);
5793 if (tga_height > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5794 if (tga_width > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5797 if (tga_image_type >= 8)
5799 tga_image_type -= 8;
5802 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5805 if (tga_indexed) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5806 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5809 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5814 if (comp) *comp = tga_comp;
5816 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5817 return stbi__errpuc(
"too large",
"Corrupt TGA");
5819 tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5820 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
5823 stbi__skip(s, tga_offset);
5825 if (!tga_indexed && !tga_is_RLE && !tga_rgb16) {
5826 for (i = 0; i < tga_height; ++i) {
5827 int row = tga_inverted ? tga_height - i - 1 : i;
5828 stbi_uc* tga_row = tga_data + row * tga_width * tga_comp;
5829 stbi__getn(s, tga_row, tga_width * tga_comp);
5836 if (tga_palette_len == 0) {
5837 STBI_FREE(tga_data);
5838 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5842 stbi__skip(s, tga_palette_start);
5844 tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5846 STBI_FREE(tga_data);
5847 return stbi__errpuc(
"outofmem",
"Out of memory");
5850 stbi_uc* pal_entry = tga_palette;
5851 STBI_ASSERT(tga_comp == STBI_rgb);
5852 for (i = 0; i < tga_palette_len; ++i) {
5853 stbi__tga_read_rgb16(s, pal_entry);
5854 pal_entry += tga_comp;
5857 else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5858 STBI_FREE(tga_data);
5859 STBI_FREE(tga_palette);
5860 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5864 for (i = 0; i < tga_width * tga_height; ++i)
5872 int RLE_cmd = stbi__get8(s);
5873 RLE_count = 1 + (RLE_cmd & 127);
5874 RLE_repeating = RLE_cmd >> 7;
5875 read_next_pixel = 1;
5877 else if (!RLE_repeating)
5879 read_next_pixel = 1;
5884 read_next_pixel = 1;
5887 if (read_next_pixel)
5893 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5894 if (pal_idx >= tga_palette_len) {
5898 pal_idx *= tga_comp;
5899 for (j = 0; j < tga_comp; ++j) {
5900 raw_data[j] = tga_palette[pal_idx + j];
5903 else if (tga_rgb16) {
5904 STBI_ASSERT(tga_comp == STBI_rgb);
5905 stbi__tga_read_rgb16(s, raw_data);
5909 for (j = 0; j < tga_comp; ++j) {
5910 raw_data[j] = stbi__get8(s);
5914 read_next_pixel = 0;
5918 for (j = 0; j < tga_comp; ++j)
5919 tga_data[i * tga_comp + j] = raw_data[j];
5927 for (j = 0; j * 2 < tga_height; ++j)
5929 int index1 = j * tga_width * tga_comp;
5930 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5931 for (i = tga_width * tga_comp; i > 0; --i)
5933 unsigned char temp = tga_data[index1];
5934 tga_data[index1] = tga_data[index2];
5935 tga_data[index2] = temp;
5942 if (tga_palette != NULL)
5944 STBI_FREE(tga_palette);
5949 if (tga_comp >= 3 && !tga_rgb16)
5951 unsigned char* tga_pixel = tga_data;
5952 for (i = 0; i < tga_width * tga_height; ++i)
5954 unsigned char temp = tga_pixel[0];
5955 tga_pixel[0] = tga_pixel[2];
5956 tga_pixel[2] = temp;
5957 tga_pixel += tga_comp;
5962 if (req_comp && req_comp != tga_comp)
5963 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5967 tga_palette_start = tga_palette_len = tga_palette_bits =
5968 tga_x_origin = tga_y_origin = 0;
5969 STBI_NOTUSED(tga_palette_start);
5979static int stbi__psd_test(stbi__context* s)
5981 int r = (stbi__get32be(s) == 0x38425053);
5986static int stbi__psd_decode_rle(stbi__context* s, stbi_uc* p,
int pixelCount)
5988 int count, nleft, len;
5991 while ((nleft = pixelCount - count) > 0) {
5992 len = stbi__get8(s);
5996 else if (len < 128) {
5999 if (len > nleft)
return 0;
6007 else if (len > 128) {
6012 if (len > nleft)
return 0;
6013 val = stbi__get8(s);
6026static void* stbi__psd_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri,
int bpc)
6029 int channelCount, compression;
6037 if (stbi__get32be(s) != 0x38425053)
6038 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
6041 if (stbi__get16be(s) != 1)
6042 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
6048 channelCount = stbi__get16be(s);
6049 if (channelCount < 0 || channelCount > 16)
6050 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
6053 h = stbi__get32be(s);
6054 w = stbi__get32be(s);
6056 if (h > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6057 if (w > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6060 bitdepth = stbi__get16be(s);
6061 if (bitdepth != 8 && bitdepth != 16)
6062 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
6074 if (stbi__get16be(s) != 3)
6075 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
6078 stbi__skip(s, stbi__get32be(s));
6081 stbi__skip(s, stbi__get32be(s));
6084 stbi__skip(s, stbi__get32be(s));
6090 compression = stbi__get16be(s);
6091 if (compression > 1)
6092 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
6095 if (!stbi__mad3sizes_valid(4, w, h, 0))
6096 return stbi__errpuc(
"too large",
"Corrupt PSD");
6100 if (!compression && bitdepth == 16 && bpc == 16) {
6101 out = (stbi_uc*)stbi__malloc_mad3(8, w, h, 0);
6102 ri->bits_per_channel = 16;
6105 out = (stbi_uc*)stbi__malloc(4 * w * h);
6107 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6125 stbi__skip(s, h * channelCount * 2);
6128 for (channel = 0; channel < 4; channel++) {
6132 if (channel >= channelCount) {
6134 for (i = 0; i < pixelCount; i++, p += 4)
6135 *p = (channel == 3 ? 255 : 0);
6139 if (!stbi__psd_decode_rle(s, p, pixelCount)) {
6141 return stbi__errpuc(
"corrupt",
"bad RLE data");
6152 for (channel = 0; channel < 4; channel++) {
6153 if (channel >= channelCount) {
6155 if (bitdepth == 16 && bpc == 16) {
6156 stbi__uint16* q = ((stbi__uint16*)out) + channel;
6157 stbi__uint16 val = channel == 3 ? 65535 : 0;
6158 for (i = 0; i < pixelCount; i++, q += 4)
6162 stbi_uc* p = out + channel;
6163 stbi_uc val = channel == 3 ? 255 : 0;
6164 for (i = 0; i < pixelCount; i++, p += 4)
6169 if (ri->bits_per_channel == 16) {
6170 stbi__uint16* q = ((stbi__uint16*)out) + channel;
6171 for (i = 0; i < pixelCount; i++, q += 4)
6172 *q = (stbi__uint16)stbi__get16be(s);
6175 stbi_uc* p = out + channel;
6176 if (bitdepth == 16) {
6177 for (i = 0; i < pixelCount; i++, p += 4)
6178 *p = (stbi_uc)(stbi__get16be(s) >> 8);
6181 for (i = 0; i < pixelCount; i++, p += 4)
6190 if (channelCount >= 4) {
6191 if (ri->bits_per_channel == 16) {
6192 for (i = 0; i < w * h; ++i) {
6193 stbi__uint16* pixel = (stbi__uint16*)out + 4 * i;
6194 if (pixel[3] != 0 && pixel[3] != 65535) {
6195 float a = pixel[3] / 65535.0f;
6196 float ra = 1.0f / a;
6197 float inv_a = 65535.0f * (1 - ra);
6198 pixel[0] = (stbi__uint16)(pixel[0] * ra + inv_a);
6199 pixel[1] = (stbi__uint16)(pixel[1] * ra + inv_a);
6200 pixel[2] = (stbi__uint16)(pixel[2] * ra + inv_a);
6205 for (i = 0; i < w * h; ++i) {
6206 unsigned char* pixel = out + 4 * i;
6207 if (pixel[3] != 0 && pixel[3] != 255) {
6208 float a = pixel[3] / 255.0f;
6209 float ra = 1.0f / a;
6210 float inv_a = 255.0f * (1 - ra);
6211 pixel[0] = (
unsigned char)(pixel[0] * ra + inv_a);
6212 pixel[1] = (
unsigned char)(pixel[1] * ra + inv_a);
6213 pixel[2] = (
unsigned char)(pixel[2] * ra + inv_a);
6220 if (req_comp && req_comp != 4) {
6221 if (ri->bits_per_channel == 16)
6222 out = (stbi_uc*)stbi__convert_format16((stbi__uint16*)out, 4, req_comp, w, h);
6224 out = stbi__convert_format(out, 4, req_comp, w, h);
6225 if (out == NULL)
return out;
6228 if (comp) *comp = 4;
6244static int stbi__pic_is4(stbi__context* s,
const char* str)
6247 for (i = 0; i < 4; ++i)
6248 if (stbi__get8(s) != (stbi_uc)str[i])
6254static int stbi__pic_test_core(stbi__context* s)
6258 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
6261 for (i = 0; i < 84; ++i)
6264 if (!stbi__pic_is4(s,
"PICT"))
6272 stbi_uc size, type, channel;
6275static stbi_uc* stbi__readval(stbi__context* s,
int channel, stbi_uc* dest)
6279 for (i = 0; i < 4; ++i, mask >>= 1) {
6280 if (channel & mask) {
6281 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
6282 dest[i] = stbi__get8(s);
6289static void stbi__copyval(
int channel, stbi_uc* dest,
const stbi_uc* src)
6293 for (i = 0; i < 4; ++i, mask >>= 1)
6298static stbi_uc* stbi__pic_load_core(stbi__context* s,
int width,
int height,
int* comp, stbi_uc* result)
6300 int act_comp = 0, num_packets = 0, y, chained;
6301 stbi__pic_packet packets[10];
6306 stbi__pic_packet* packet;
6308 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
6309 return stbi__errpuc(
"bad format",
"too many packets");
6311 packet = &packets[num_packets++];
6313 chained = stbi__get8(s);
6314 packet->size = stbi__get8(s);
6315 packet->type = stbi__get8(s);
6316 packet->channel = stbi__get8(s);
6318 act_comp |= packet->channel;
6320 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
6321 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
6324 *comp = (act_comp & 0x10 ? 4 : 3);
6326 for (y = 0; y < height; ++y) {
6329 for (packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
6330 stbi__pic_packet* packet = &packets[packet_idx];
6331 stbi_uc* dest = result + y * width * 4;
6333 switch (packet->type) {
6335 return stbi__errpuc(
"bad format",
"packet has bad compression type");
6340 for (x = 0; x < width; ++x, dest += 4)
6341 if (!stbi__readval(s, packet->channel, dest))
6348 int left = width, i;
6351 stbi_uc count, value[4];
6353 count = stbi__get8(s);
6354 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6357 count = (stbi_uc)left;
6359 if (!stbi__readval(s, packet->channel, value))
return 0;
6361 for (i = 0; i < count; ++i, dest += 4)
6362 stbi__copyval(packet->channel, dest, value);
6371 int count = stbi__get8(s), i;
6372 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6378 count = stbi__get16be(s);
6382 return stbi__errpuc(
"bad file",
"scanline overrun");
6384 if (!stbi__readval(s, packet->channel, value))
6387 for (i = 0; i < count; ++i, dest += 4)
6388 stbi__copyval(packet->channel, dest, value);
6392 if (count > left)
return stbi__errpuc(
"bad file",
"scanline overrun");
6394 for (i = 0; i < count; ++i, dest += 4)
6395 if (!stbi__readval(s, packet->channel, dest))
6409static void* stbi__pic_load(stbi__context* s,
int* px,
int* py,
int* comp,
int req_comp, stbi__result_info* ri)
6412 int i, x, y, internal_comp;
6415 if (!comp) comp = &internal_comp;
6417 for (i = 0; i < 92; ++i)
6420 x = stbi__get16be(s);
6421 y = stbi__get16be(s);
6423 if (y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6424 if (x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6426 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
6427 if (!stbi__mad3sizes_valid(x, y, 4, 0))
return stbi__errpuc(
"too large",
"PIC image too large to decode");
6434 result = (stbi_uc*)stbi__malloc_mad3(x, y, 4, 0);
6435 memset(result, 0xff, x * y * 4);
6437 if (!stbi__pic_load_core(s, x, y, comp, result)) {
6443 if (req_comp == 0) req_comp = *comp;
6444 result = stbi__convert_format(result, 4, req_comp, x, y);
6449static int stbi__pic_test(stbi__context* s)
6451 int r = stbi__pic_test_core(s);
6472 stbi_uc* background;
6474 int flags, bgindex, ratio, transparent, eflags;
6475 stbi_uc pal[256][4];
6476 stbi_uc lpal[256][4];
6477 stbi__gif_lzw codes[8192];
6478 stbi_uc* color_table;
6481 int start_x, start_y;
6488static int stbi__gif_test_raw(stbi__context* s)
6491 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
6493 if (sz !=
'9' && sz !=
'7')
return 0;
6494 if (stbi__get8(s) !=
'a')
return 0;
6498static int stbi__gif_test(stbi__context* s)
6500 int r = stbi__gif_test_raw(s);
6505static void stbi__gif_parse_colortable(stbi__context* s, stbi_uc pal[256][4],
int num_entries,
int transp)
6508 for (i = 0; i < num_entries; ++i) {
6509 pal[i][2] = stbi__get8(s);
6510 pal[i][1] = stbi__get8(s);
6511 pal[i][0] = stbi__get8(s);
6512 pal[i][3] = transp == i ? 0 : 255;
6516static int stbi__gif_header(stbi__context* s, stbi__gif* g,
int* comp,
int is_info)
6519 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
6520 return stbi__err(
"not GIF",
"Corrupt GIF");
6522 version = stbi__get8(s);
6523 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
6524 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
6526 stbi__g_failure_reason =
"";
6527 g->w = stbi__get16le(s);
6528 g->h = stbi__get16le(s);
6529 g->flags = stbi__get8(s);
6530 g->bgindex = stbi__get8(s);
6531 g->ratio = stbi__get8(s);
6532 g->transparent = -1;
6534 if (g->w > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
6535 if (g->h > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
6537 if (comp != 0) *comp = 4;
6539 if (is_info)
return 1;
6541 if (g->flags & 0x80)
6542 stbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1);
6547static int stbi__gif_info_raw(stbi__context* s,
int* x,
int* y,
int* comp)
6549 stbi__gif* g = (stbi__gif*)stbi__malloc(
sizeof(stbi__gif));
6550 if (!stbi__gif_header(s, g, comp, 1)) {
6561static void stbi__out_gif_code(stbi__gif* g, stbi__uint16 code)
6568 if (g->codes[code].prefix >= 0)
6569 stbi__out_gif_code(g, g->codes[code].prefix);
6571 if (g->cur_y >= g->max_y)
return;
6573 idx = g->cur_x + g->cur_y;
6575 g->history[idx / 4] = 1;
6577 c = &g->color_table[g->codes[code].suffix * 4];
6586 if (g->cur_x >= g->max_x) {
6587 g->cur_x = g->start_x;
6588 g->cur_y += g->step;
6590 while (g->cur_y >= g->max_y && g->parse > 0) {
6591 g->step = (1 << g->parse) * g->line_size;
6592 g->cur_y = g->start_y + (g->step >> 1);
6598static stbi_uc* stbi__process_gif_raster(stbi__context* s, stbi__gif* g)
6601 stbi__int32 len, init_code;
6603 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6606 lzw_cs = stbi__get8(s);
6607 if (lzw_cs > 12)
return NULL;
6608 clear = 1 << lzw_cs;
6610 codesize = lzw_cs + 1;
6611 codemask = (1 << codesize) - 1;
6614 for (init_code = 0; init_code < clear; init_code++) {
6615 g->codes[init_code].prefix = -1;
6616 g->codes[init_code].first = (stbi_uc)init_code;
6617 g->codes[init_code].suffix = (stbi_uc)init_code;
6626 if (valid_bits < codesize) {
6628 len = stbi__get8(s);
6633 bits |= (stbi__int32)stbi__get8(s) << valid_bits;
6637 stbi__int32 code = bits & codemask;
6639 valid_bits -= codesize;
6641 if (code == clear) {
6642 codesize = lzw_cs + 1;
6643 codemask = (1 << codesize) - 1;
6648 else if (code == clear + 1) {
6650 while ((len = stbi__get8(s)) > 0)
6654 else if (code <= avail) {
6656 return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6660 p = &g->codes[avail++];
6662 return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6665 p->prefix = (stbi__int16)oldcode;
6666 p->first = g->codes[oldcode].first;
6667 p->suffix = (code == avail) ? p->first : g->codes[code].first;
6669 else if (code == avail)
6670 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6672 stbi__out_gif_code(g, (stbi__uint16)code);
6674 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6676 codemask = (1 << codesize) - 1;
6682 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6690static stbi_uc* stbi__gif_load_next(stbi__context* s, stbi__gif* g,
int* comp,
int req_comp, stbi_uc* two_back)
6696 STBI_NOTUSED(req_comp);
6701 if (!stbi__gif_header(s, g, comp, 0))
return 0;
6702 if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
6703 return stbi__errpuc(
"too large",
"GIF image is too large");
6704 pcount = g->w * g->h;
6705 g->out = (stbi_uc*)stbi__malloc(4 * pcount);
6706 g->background = (stbi_uc*)stbi__malloc(4 * pcount);
6707 g->history = (stbi_uc*)stbi__malloc(pcount);
6708 if (!g->out || !g->background || !g->history)
6709 return stbi__errpuc(
"outofmem",
"Out of memory");
6714 memset(g->out, 0x00, 4 * pcount);
6715 memset(g->background, 0x00, 4 * pcount);
6716 memset(g->history, 0x00, pcount);
6721 dispose = (g->eflags & 0x1C) >> 2;
6722 pcount = g->w * g->h;
6724 if ((dispose == 3) && (two_back == 0)) {
6729 for (pi = 0;
pi < pcount; ++
pi) {
6730 if (g->history[pi]) {
6731 memcpy(&g->out[pi * 4], &two_back[pi * 4], 4);
6735 else if (dispose == 2) {
6737 for (pi = 0;
pi < pcount; ++
pi) {
6738 if (g->history[pi]) {
6739 memcpy(&g->out[pi * 4], &g->background[pi * 4], 4);
6751 memcpy(g->background, g->out, 4 * g->w * g->h);
6755 memset(g->history, 0x00, g->w * g->h);
6758 int tag = stbi__get8(s);
6762 stbi__int32 x, y, w, h;
6765 x = stbi__get16le(s);
6766 y = stbi__get16le(s);
6767 w = stbi__get16le(s);
6768 h = stbi__get16le(s);
6769 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6770 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6772 g->line_size = g->w * 4;
6774 g->start_y = y * g->line_size;
6775 g->max_x = g->start_x + w * 4;
6776 g->max_y = g->start_y + h * g->line_size;
6777 g->cur_x = g->start_x;
6778 g->cur_y = g->start_y;
6785 g->cur_y = g->max_y;
6787 g->lflags = stbi__get8(s);
6789 if (g->lflags & 0x40) {
6790 g->step = 8 * g->line_size;
6794 g->step = g->line_size;
6798 if (g->lflags & 0x80) {
6799 stbi__gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6800 g->color_table = (stbi_uc*)g->lpal;
6802 else if (g->flags & 0x80) {
6803 g->color_table = (stbi_uc*)g->pal;
6806 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6808 o = stbi__process_gif_raster(s, g);
6809 if (!o)
return NULL;
6812 pcount = g->w * g->h;
6813 if (first_frame && (g->bgindex > 0)) {
6815 for (pi = 0;
pi < pcount; ++
pi) {
6816 if (g->history[pi] == 0) {
6817 g->pal[g->bgindex][3] = 255;
6818 memcpy(&g->out[pi * 4], &g->pal[g->bgindex], 4);
6829 int ext = stbi__get8(s);
6831 len = stbi__get8(s);
6833 g->eflags = stbi__get8(s);
6834 g->delay = 10 * stbi__get16le(s);
6837 if (g->transparent >= 0) {
6838 g->pal[g->transparent][3] = 255;
6840 if (g->eflags & 0x01) {
6841 g->transparent = stbi__get8(s);
6842 if (g->transparent >= 0) {
6843 g->pal[g->transparent][3] = 0;
6849 g->transparent = -1;
6857 while ((len = stbi__get8(s)) != 0) {
6867 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6872static void* stbi__load_gif_main(stbi__context* s,
int** delays,
int* x,
int* y,
int* z,
int* comp,
int req_comp)
6874 if (stbi__gif_test(s)) {
6878 stbi_uc* two_back = 0;
6882 int delays_size = 0;
6883 memset(&g, 0,
sizeof(g));
6889 u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
6890 if (u == (stbi_uc*)s) u = 0;
6896 stride = g.w * g.h * 4;
6899 void* tmp = (stbi_uc*)STBI_REALLOC_SIZED(out, out_size, layers * stride);
6902 STBI_FREE(g.history);
6903 STBI_FREE(g.background);
6904 return stbi__errpuc(
"outofmem",
"Out of memory");
6907 out = (stbi_uc*)tmp;
6908 out_size = layers * stride;
6912 *delays = (
int*)STBI_REALLOC_SIZED(*delays, delays_size,
sizeof(
int) * layers);
6913 delays_size = layers *
sizeof(int);
6917 out = (stbi_uc*)stbi__malloc(layers * stride);
6918 out_size = layers * stride;
6920 *delays = (
int*)stbi__malloc(layers *
sizeof(
int));
6921 delays_size = layers *
sizeof(int);
6924 memcpy(out + ((layers - 1) * stride), u, stride);
6926 two_back = out - 2 * stride;
6930 (*delays)[layers - 1U] = g.delay;
6937 STBI_FREE(g.history);
6938 STBI_FREE(g.background);
6941 if (req_comp && req_comp != 4)
6942 out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
6948 return stbi__errpuc(
"not GIF",
"Image was not as a gif type.");
6952static void* stbi__gif_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
6956 memset(&g, 0,
sizeof(g));
6959 u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
6960 if (u == (stbi_uc*)s) u = 0;
6967 if (req_comp && req_comp != 4)
6968 u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
6976 STBI_FREE(g.history);
6977 STBI_FREE(g.background);
6982static int stbi__gif_info(stbi__context* s,
int* x,
int* y,
int* comp)
6984 return stbi__gif_info_raw(s, x, y, comp);
6992static int stbi__hdr_test_core(stbi__context* s,
const char* signature)
6995 for (i = 0; signature[i]; ++i)
6996 if (stbi__get8(s) != signature[i])
7002static int stbi__hdr_test(stbi__context* s)
7004 int r = stbi__hdr_test_core(s,
"#?RADIANCE\n");
7007 r = stbi__hdr_test_core(s,
"#?RGBE\n");
7013#define STBI__HDR_BUFLEN 1024
7014static char* stbi__hdr_gettoken(stbi__context* z,
char* buffer)
7019 c = (char)stbi__get8(z);
7021 while (!stbi__at_eof(z) && c !=
'\n') {
7023 if (len == STBI__HDR_BUFLEN - 1) {
7025 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
7029 c = (char)stbi__get8(z);
7036static void stbi__hdr_convert(
float* output, stbi_uc* input,
int req_comp)
7038 if (input[3] != 0) {
7041 f1 = (float)
ldexp(1.0f, input[3] - (
int)(128 + 8));
7043 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
7045 output[0] = input[0] * f1;
7046 output[1] = input[1] * f1;
7047 output[2] = input[2] * f1;
7049 if (req_comp == 2) output[1] = 1;
7050 if (req_comp == 4) output[3] = 1;
7054 case 4: output[3] = 1;
7055 case 3: output[0] = output[1] = output[2] = 0;
7057 case 2: output[1] = 1;
7058 case 1: output[0] = 0;
7064static float* stbi__hdr_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
7066 char buffer[STBI__HDR_BUFLEN];
7073 unsigned char count, value;
7074 int i, j, k, c1, c2, z;
7075 const char* headerToken;
7079 headerToken = stbi__hdr_gettoken(s, buffer);
7080 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
7081 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
7085 token = stbi__hdr_gettoken(s, buffer);
7086 if (token[0] == 0)
break;
7087 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7090 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
7094 token = stbi__hdr_gettoken(s, buffer);
7095 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7097 height = (int)strtol(token, &token, 10);
7098 while (*token ==
' ') ++token;
7099 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7101 width = (int)strtol(token, NULL, 10);
7103 if (height > STBI_MAX_DIMENSIONS)
return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7104 if (width > STBI_MAX_DIMENSIONS)
return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7109 if (comp) *comp = 3;
7110 if (req_comp == 0) req_comp = 3;
7112 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
7113 return stbi__errpf(
"too large",
"HDR image is too large");
7116 hdr_data = (
float*)stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
7118 return stbi__errpf(
"outofmem",
"Out of memory");
7122 if (width < 8 || width >= 32768) {
7124 for (j = 0; j < height; ++j) {
7125 for (i = 0; i < width; ++i) {
7128 stbi__getn(s, rgbe, 4);
7129 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
7137 for (j = 0; j < height; ++j) {
7140 len = stbi__get8(s);
7141 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
7145 rgbe[0] = (stbi_uc)c1;
7146 rgbe[1] = (stbi_uc)c2;
7147 rgbe[2] = (stbi_uc)len;
7148 rgbe[3] = (stbi_uc)stbi__get8(s);
7149 stbi__hdr_convert(hdr_data, rgbe, req_comp);
7152 STBI_FREE(scanline);
7153 goto main_decode_loop;
7156 len |= stbi__get8(s);
7157 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
7158 if (scanline == NULL) {
7159 scanline = (stbi_uc*)stbi__malloc_mad2(width, 4, 0);
7161 STBI_FREE(hdr_data);
7162 return stbi__errpf(
"outofmem",
"Out of memory");
7166 for (k = 0; k < 4; ++k) {
7169 while ((nleft = width - i) > 0) {
7170 count = stbi__get8(s);
7173 value = stbi__get8(s);
7175 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
7176 for (z = 0; z < count; ++z)
7177 scanline[i++ * 4 + k] = value;
7181 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
7182 for (z = 0; z < count; ++z)
7183 scanline[i++ * 4 + k] = stbi__get8(s);
7187 for (i = 0; i < width; ++i)
7188 stbi__hdr_convert(hdr_data + (j * width + i) * req_comp, scanline + i * 4, req_comp);
7191 STBI_FREE(scanline);
7197static int stbi__hdr_info(stbi__context* s,
int* x,
int* y,
int* comp)
7199 char buffer[STBI__HDR_BUFLEN];
7206 if (!comp) comp = &dummy;
7208 if (stbi__hdr_test(s) == 0) {
7214 token = stbi__hdr_gettoken(s, buffer);
7215 if (token[0] == 0)
break;
7216 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7223 token = stbi__hdr_gettoken(s, buffer);
7224 if (strncmp(token,
"-Y ", 3)) {
7229 *y = (int)strtol(token, &token, 10);
7230 while (*token ==
' ') ++token;
7231 if (strncmp(token,
"+X ", 3)) {
7236 *x = (int)strtol(token, NULL, 10);
7243static int stbi__bmp_info(stbi__context* s,
int* x,
int* y,
int* comp)
7246 stbi__bmp_data info;
7249 p = stbi__bmp_parse_header(s, &info);
7253 if (x) *x = s->img_x;
7254 if (y) *y = s->img_y;
7256 if (info.bpp == 24 && info.ma == 0xff000000)
7259 *comp = info.ma ? 4 : 3;
7266static int stbi__psd_info(stbi__context* s,
int* x,
int* y,
int* comp)
7268 int channelCount, dummy, depth;
7271 if (!comp) comp = &dummy;
7272 if (stbi__get32be(s) != 0x38425053) {
7276 if (stbi__get16be(s) != 1) {
7281 channelCount = stbi__get16be(s);
7282 if (channelCount < 0 || channelCount > 16) {
7286 *y = stbi__get32be(s);
7287 *x = stbi__get32be(s);
7288 depth = stbi__get16be(s);
7289 if (depth != 8 && depth != 16) {
7293 if (stbi__get16be(s) != 3) {
7301static int stbi__psd_is16(stbi__context* s)
7303 int channelCount, depth;
7304 if (stbi__get32be(s) != 0x38425053) {
7308 if (stbi__get16be(s) != 1) {
7313 channelCount = stbi__get16be(s);
7314 if (channelCount < 0 || channelCount > 16) {
7318 (void)stbi__get32be(s);
7319 (void)stbi__get32be(s);
7320 depth = stbi__get16be(s);
7330static int stbi__pic_info(stbi__context* s,
int* x,
int* y,
int* comp)
7332 int act_comp = 0, num_packets = 0, chained, dummy;
7333 stbi__pic_packet packets[10];
7337 if (!comp) comp = &dummy;
7339 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
7346 *x = stbi__get16be(s);
7347 *y = stbi__get16be(s);
7348 if (stbi__at_eof(s)) {
7352 if ((*x) != 0 && (1 << 28) / (*x) < (*y)) {
7360 stbi__pic_packet* packet;
7362 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
7365 packet = &packets[num_packets++];
7366 chained = stbi__get8(s);
7367 packet->size = stbi__get8(s);
7368 packet->type = stbi__get8(s);
7369 packet->channel = stbi__get8(s);
7370 act_comp |= packet->channel;
7372 if (stbi__at_eof(s)) {
7376 if (packet->size != 8) {
7382 *comp = (act_comp & 0x10 ? 4 : 3);
7402static int stbi__pnm_test(stbi__context* s)
7405 p = (char)stbi__get8(s);
7406 t = (char)stbi__get8(s);
7407 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7414static void* stbi__pnm_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
7419 if (!stbi__pnm_info(s, (
int*)&s->img_x, (
int*)&s->img_y, (
int*)&s->img_n))
7422 if (s->img_y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
7423 if (s->img_x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
7427 if (comp) *comp = s->img_n;
7429 if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
7430 return stbi__errpuc(
"too large",
"PNM too large");
7432 out = (stbi_uc*)stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
7433 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
7434 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
7436 if (req_comp && req_comp != s->img_n) {
7437 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7438 if (out == NULL)
return out;
7443static int stbi__pnm_isspace(
char c)
7445 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
7448static void stbi__pnm_skip_whitespace(stbi__context* s,
char* c)
7451 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7452 *c = (char)stbi__get8(s);
7454 if (stbi__at_eof(s) || *c !=
'#')
7457 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r')
7458 *c = (char)stbi__get8(s);
7462static int stbi__pnm_isdigit(
char c)
7464 return c >=
'0' && c <=
'9';
7467static int stbi__pnm_getinteger(stbi__context* s,
char* c)
7471 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7472 value = value * 10 + (*c -
'0');
7473 *c = (char)stbi__get8(s);
7479static int stbi__pnm_info(stbi__context* s,
int* x,
int* y,
int* comp)
7486 if (!comp) comp = &dummy;
7491 p = (char)stbi__get8(s);
7492 t = (char)stbi__get8(s);
7493 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7498 *comp = (t ==
'6') ? 3 : 1;
7500 c = (char)stbi__get8(s);
7501 stbi__pnm_skip_whitespace(s, &c);
7503 *x = stbi__pnm_getinteger(s, &c);
7504 stbi__pnm_skip_whitespace(s, &c);
7506 *y = stbi__pnm_getinteger(s, &c);
7507 stbi__pnm_skip_whitespace(s, &c);
7509 maxv = stbi__pnm_getinteger(s, &c);
7512 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
7518static int stbi__info_main(stbi__context* s,
int* x,
int* y,
int* comp)
7521 if (stbi__jpeg_info(s, x, y, comp))
return 1;
7525 if (stbi__png_info(s, x, y, comp))
return 1;
7529 if (stbi__gif_info(s, x, y, comp))
return 1;
7533 if (stbi__bmp_info(s, x, y, comp))
return 1;
7537 if (stbi__psd_info(s, x, y, comp))
return 1;
7541 if (stbi__pic_info(s, x, y, comp))
return 1;
7545 if (stbi__pnm_info(s, x, y, comp))
return 1;
7549 if (stbi__hdr_info(s, x, y, comp))
return 1;
7554 if (stbi__tga_info(s, x, y, comp))
7557 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
7560static int stbi__is_16_main(stbi__context* s)
7563 if (stbi__png_is16(s))
return 1;
7567 if (stbi__psd_is16(s))
return 1;
7573#ifndef STBI_NO_STDIO
7574STBIDEF
int stbi_info(
char const* filename,
int* x,
int* y,
int* comp)
7576 FILE* f = stbi__fopen(filename,
"rb");
7578 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7579 result = stbi_info_from_file(f, x, y, comp);
7584STBIDEF
int stbi_info_from_file(FILE* f,
int* x,
int* y,
int* comp)
7588 long pos = ftell(f);
7589 stbi__start_file(&s, f);
7590 r = stbi__info_main(&s, x, y, comp);
7591 fseek(f, pos, SEEK_SET);
7595STBIDEF
int stbi_is_16_bit(
char const* filename)
7597 FILE* f = stbi__fopen(filename,
"rb");
7599 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7600 result = stbi_is_16_bit_from_file(f);
7605STBIDEF
int stbi_is_16_bit_from_file(FILE* f)
7609 long pos = ftell(f);
7610 stbi__start_file(&s, f);
7611 r = stbi__is_16_main(&s);
7612 fseek(f, pos, SEEK_SET);
7617STBIDEF
int stbi_info_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* comp)
7620 stbi__start_mem(&s, buffer, len);
7621 return stbi__info_main(&s, x, y, comp);
7624STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const* c,
void* user,
int* x,
int* y,
int* comp)
7628 return stbi__info_main(&s, x, y, comp);
7631STBIDEF
int stbi_is_16_bit_from_memory(stbi_uc
const* buffer,
int len)
7634 stbi__start_mem(&s, buffer, len);
7635 return stbi__is_16_main(&s);
7638STBIDEF
int stbi_is_16_bit_from_callbacks(
stbi_io_callbacks const* c,
void* user)
7642 return stbi__is_16_main(&s);
GLM_FUNC_DECL genType step(genType edge, genType x)
Definition func_common.inl:545
GLM_FUNC_DECL GLM_CONSTEXPR genType abs(genType x)
GLM_FUNC_DECL genType ldexp(genType const &x, int const &exp)
Definition func_common.inl:771
GLM_FUNC_DECL GLM_CONSTEXPR genType pi()
Return the pi constant for floating point types.
Definition scalar_constants.inl:13
GLM_FUNC_DECL GLM_CONSTEXPR genType zero()
Definition constants.inl:6
uint32 uint32_t
Definition fwd.hpp:129
int32 int32_t
Definition fwd.hpp:71
uint16 uint16_t
Definition fwd.hpp:115
int16 int16_t
Definition fwd.hpp:57
int int1
integer vector with 1 component. (From GLM_GTX_compatibility extension)
Definition compatibility.hpp:82
Definition stb_image.h:381