106 #ifndef STBI_INCLUDE_STB_IMAGE_H
107 #define STBI_INCLUDE_STB_IMAGE_H
306 #ifndef STBI_NO_STDIO
310 #define STBI_VERSION 1
322 typedef unsigned char stbi_uc;
323 typedef unsigned short stbi_us;
329 #ifdef STB_IMAGE_STATIC
330 #define STBIDEF static
332 #define STBIDEF extern
346 int(*read) (
void* user,
char* data,
int size);
347 void(*skip) (
void* user,
int n);
348 int(*eof) (
void* user);
356 STBIDEF stbi_uc* stbi_load_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
357 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);
359 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);
363 #ifndef STBI_NO_STDIO
364 STBIDEF stbi_uc* stbi_load(
char const* filename,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
365 STBIDEF stbi_uc* stbi_load_from_file(FILE* f,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
374 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);
375 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);
377 #ifndef STBI_NO_STDIO
378 STBIDEF stbi_us* stbi_load_16(
char const* filename,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
379 STBIDEF stbi_us* stbi_load_from_file_16(FILE* f,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
386 #ifndef STBI_NO_LINEAR
387 STBIDEF
float* stbi_loadf_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
388 STBIDEF
float* stbi_loadf_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
390 #ifndef STBI_NO_STDIO
391 STBIDEF
float* stbi_loadf(
char const* filename,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
392 STBIDEF
float* stbi_loadf_from_file(FILE* f,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
397 STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma);
398 STBIDEF
void stbi_hdr_to_ldr_scale(
float scale);
401 #ifndef STBI_NO_LINEAR
402 STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma);
403 STBIDEF
void stbi_ldr_to_hdr_scale(
float scale);
407 STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const* clbk,
void* user);
408 STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const* buffer,
int len);
409 #ifndef STBI_NO_STDIO
410 STBIDEF
int stbi_is_hdr(
char const* filename);
411 STBIDEF
int stbi_is_hdr_from_file(FILE* f);
417 STBIDEF
const char* stbi_failure_reason(
void);
420 STBIDEF
void stbi_image_free(
void* retval_from_stbi_load);
423 STBIDEF
int stbi_info_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* comp);
424 STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* comp);
425 STBIDEF
int stbi_is_16_bit_from_memory(stbi_uc
const* buffer,
int len);
426 STBIDEF
int stbi_is_16_bit_from_callbacks(
stbi_io_callbacks const* clbk,
void* user);
428 #ifndef STBI_NO_STDIO
429 STBIDEF
int stbi_info(
char const* filename,
int* x,
int* y,
int* comp);
430 STBIDEF
int stbi_info_from_file(FILE* f,
int* x,
int* y,
int* comp);
431 STBIDEF
int stbi_is_16_bit(
char const* filename);
432 STBIDEF
int stbi_is_16_bit_from_file(FILE* f);
440 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply);
444 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert);
447 STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip);
451 STBIDEF
char* stbi_zlib_decode_malloc_guesssize(
const char* buffer,
int len,
int initial_size,
int* outlen);
452 STBIDEF
char* stbi_zlib_decode_malloc_guesssize_headerflag(
const char* buffer,
int len,
int initial_size,
int* outlen,
int parse_header);
453 STBIDEF
char* stbi_zlib_decode_malloc(
const char* buffer,
int len,
int* outlen);
454 STBIDEF
int stbi_zlib_decode_buffer(
char* obuffer,
int olen,
const char* ibuffer,
int ilen);
456 STBIDEF
char* stbi_zlib_decode_noheader_malloc(
const char* buffer,
int len,
int* outlen);
457 STBIDEF
int stbi_zlib_decode_noheader_buffer(
char* obuffer,
int olen,
const char* ibuffer,
int ilen);
469 #ifdef STB_IMAGE_IMPLEMENTATION
471 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
472 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
473 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
474 || defined(STBI_ONLY_ZLIB)
475 #ifndef STBI_ONLY_JPEG
478 #ifndef STBI_ONLY_PNG
481 #ifndef STBI_ONLY_BMP
484 #ifndef STBI_ONLY_PSD
487 #ifndef STBI_ONLY_TGA
490 #ifndef STBI_ONLY_GIF
493 #ifndef STBI_ONLY_HDR
496 #ifndef STBI_ONLY_PIC
499 #ifndef STBI_ONLY_PNM
504 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
515 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
519 #ifndef STBI_NO_STDIO
525 #define STBI_ASSERT(x) assert(x)
531 #define stbi_inline inline
536 #define stbi_inline __forceinline
541 typedef unsigned short stbi__uint16;
542 typedef signed short stbi__int16;
543 typedef unsigned int stbi__uint32;
544 typedef signed int stbi__int32;
547 typedef uint16_t stbi__uint16;
548 typedef int16_t stbi__int16;
549 typedef uint32_t stbi__uint32;
550 typedef int32_t stbi__int32;
554 typedef unsigned char validate_uint32[
sizeof(stbi__uint32) == 4 ? 1 : -1];
557 #define STBI_NOTUSED(v) (void)(v)
559 #define STBI_NOTUSED(v) (void)sizeof(v)
563 #define STBI_HAS_LROTL
566 #ifdef STBI_HAS_LROTL
567 #define stbi_lrot(x,y) _lrotl(x,y)
569 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
572 #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
574 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
577 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
581 #define STBI_MALLOC(sz) malloc(sz)
582 #define STBI_REALLOC(p,newsz) realloc(p,newsz)
583 #define STBI_FREE(p) free(p)
586 #ifndef STBI_REALLOC_SIZED
587 #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
591 #if defined(__x86_64__) || defined(_M_X64)
592 #define STBI__X64_TARGET
593 #elif defined(__i386) || defined(_M_IX86)
594 #define STBI__X86_TARGET
597 #if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
608 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
623 #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
625 #include <emmintrin.h>
631 static int stbi__cpuid3(
void)
638 static int stbi__cpuid3(
void)
650 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
652 static int stbi__sse2_available(
void)
654 int info3 = stbi__cpuid3();
655 return ((info3 >> 26) & 1) != 0;
658 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
660 static int stbi__sse2_available(
void)
671 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)
676 #include <arm_neon.h>
678 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
681 #ifndef STBI_SIMD_ALIGN
682 #define STBI_SIMD_ALIGN(type, name) type name
693 stbi__uint32 img_x, img_y;
694 int img_n, img_out_n;
699 int read_from_callbacks;
701 stbi_uc buffer_start[128];
703 stbi_uc* img_buffer, * img_buffer_end;
704 stbi_uc* img_buffer_original, * img_buffer_original_end;
708 static void stbi__refill_buffer(stbi__context* s);
711 static void stbi__start_mem(stbi__context* s, stbi_uc
const* buffer,
int len)
714 s->read_from_callbacks = 0;
715 s->img_buffer = s->img_buffer_original = (stbi_uc*)buffer;
716 s->img_buffer_end = s->img_buffer_original_end = (stbi_uc*)buffer + len;
720 static void stbi__start_callbacks(stbi__context* s,
stbi_io_callbacks* c,
void* user)
723 s->io_user_data = user;
724 s->buflen =
sizeof(s->buffer_start);
725 s->read_from_callbacks = 1;
726 s->img_buffer_original = s->buffer_start;
727 stbi__refill_buffer(s);
728 s->img_buffer_original_end = s->img_buffer_end;
731 #ifndef STBI_NO_STDIO
733 static int stbi__stdio_read(
void* user,
char* data,
int size)
735 return (
int)fread(data, 1, size, (FILE*)user);
738 static void stbi__stdio_skip(
void* user,
int n)
740 fseek((FILE*)user, n, SEEK_CUR);
743 static int stbi__stdio_eof(
void* user)
745 return feof((FILE*)user);
755 static void stbi__start_file(stbi__context* s, FILE* f)
757 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void*)f);
764 static void stbi__rewind(stbi__context* s)
769 s->img_buffer = s->img_buffer_original;
770 s->img_buffer_end = s->img_buffer_original_end;
781 int bits_per_channel;
787 static int stbi__jpeg_test(stbi__context* s);
788 static void* stbi__jpeg_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
789 static int stbi__jpeg_info(stbi__context* s,
int* x,
int* y,
int* comp);
793 static int stbi__png_test(stbi__context* s);
794 static void* stbi__png_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
795 static int stbi__png_info(stbi__context* s,
int* x,
int* y,
int* comp);
796 static int stbi__png_is16(stbi__context* s);
800 static int stbi__bmp_test(stbi__context* s);
801 static void* stbi__bmp_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
802 static int stbi__bmp_info(stbi__context* s,
int* x,
int* y,
int* comp);
806 static int stbi__tga_test(stbi__context* s);
807 static void* stbi__tga_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
808 static int stbi__tga_info(stbi__context* s,
int* x,
int* y,
int* comp);
812 static int stbi__psd_test(stbi__context* s);
813 static void* stbi__psd_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri,
int bpc);
814 static int stbi__psd_info(stbi__context* s,
int* x,
int* y,
int* comp);
815 static int stbi__psd_is16(stbi__context* s);
819 static int stbi__hdr_test(stbi__context* s);
820 static float* stbi__hdr_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
821 static int stbi__hdr_info(stbi__context* s,
int* x,
int* y,
int* comp);
825 static int stbi__pic_test(stbi__context* s);
826 static void* stbi__pic_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
827 static int stbi__pic_info(stbi__context* s,
int* x,
int* y,
int* comp);
831 static int stbi__gif_test(stbi__context* s);
832 static void* stbi__gif_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
833 static void* stbi__load_gif_main(stbi__context* s,
int** delays,
int* x,
int* y,
int* z,
int* comp,
int req_comp);
834 static int stbi__gif_info(stbi__context* s,
int* x,
int* y,
int* comp);
838 static int stbi__pnm_test(stbi__context* s);
839 static void* stbi__pnm_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
840 static int stbi__pnm_info(stbi__context* s,
int* x,
int* y,
int* comp);
844 static const char* stbi__g_failure_reason;
846 STBIDEF
const char* stbi_failure_reason(
void)
848 return stbi__g_failure_reason;
851 static int stbi__err(
const char* str)
853 stbi__g_failure_reason = str;
857 static void* stbi__malloc(
size_t size)
859 return STBI_MALLOC(size);
874 static int stbi__addsizes_valid(
int a,
int b)
881 return a <= INT_MAX - b;
886 static int stbi__mul2sizes_valid(
int a,
int b)
888 if (a < 0 || b < 0)
return 0;
889 if (b == 0)
return 1;
891 return a <= INT_MAX / b;
895 static int stbi__mad2sizes_valid(
int a,
int b,
int add)
897 return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a * b, add);
901 static int stbi__mad3sizes_valid(
int a,
int b,
int c,
int add)
903 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) &&
904 stbi__addsizes_valid(a * b * c, add);
908 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
909 static int stbi__mad4sizes_valid(
int a,
int b,
int c,
int d,
int add)
911 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) &&
912 stbi__mul2sizes_valid(a * b * c, d) && stbi__addsizes_valid(a * b * c * d, add);
917 static void* stbi__malloc_mad2(
int a,
int b,
int add)
919 if (!stbi__mad2sizes_valid(a, b, add))
return NULL;
920 return stbi__malloc(a * b + add);
923 static void* stbi__malloc_mad3(
int a,
int b,
int c,
int add)
925 if (!stbi__mad3sizes_valid(a, b, c, add))
return NULL;
926 return stbi__malloc(a * b * c + add);
929 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
930 static void* stbi__malloc_mad4(
int a,
int b,
int c,
int d,
int add)
932 if (!stbi__mad4sizes_valid(a, b, c, d, add))
return NULL;
933 return stbi__malloc(a * b * c * d + add);
941 #ifdef STBI_NO_FAILURE_STRINGS
942 #define stbi__err(x,y) 0
943 #elif defined(STBI_FAILURE_USERMSG)
944 #define stbi__err(x,y) stbi__err(y)
946 #define stbi__err(x,y) stbi__err(x)
949 #define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
950 #define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
952 STBIDEF
void stbi_image_free(
void* retval_from_stbi_load)
954 STBI_FREE(retval_from_stbi_load);
957 #ifndef STBI_NO_LINEAR
958 static float* stbi__ldr_to_hdr(stbi_uc* data,
int x,
int y,
int comp);
962 static stbi_uc* stbi__hdr_to_ldr(
float* data,
int x,
int y,
int comp);
965 static int stbi__vertically_flip_on_load = 0;
967 STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip)
969 stbi__vertically_flip_on_load = flag_true_if_should_flip;
972 static void* stbi__load_main(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri,
int bpc)
974 memset(ri, 0,
sizeof(*ri));
975 ri->bits_per_channel = 8;
976 ri->channel_order = STBI_ORDER_RGB;
977 ri->num_channels = 0;
980 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s, x, y, comp, req_comp, ri);
983 if (stbi__png_test(s))
return stbi__png_load(s, x, y, comp, req_comp, ri);
986 if (stbi__bmp_test(s))
return stbi__bmp_load(s, x, y, comp, req_comp, ri);
989 if (stbi__gif_test(s))
return stbi__gif_load(s, x, y, comp, req_comp, ri);
992 if (stbi__psd_test(s))
return stbi__psd_load(s, x, y, comp, req_comp, ri, bpc);
995 if (stbi__pic_test(s))
return stbi__pic_load(s, x, y, comp, req_comp, ri);
998 if (stbi__pnm_test(s))
return stbi__pnm_load(s, x, y, comp, req_comp, ri);
1002 if (stbi__hdr_test(s)) {
1003 float* hdr = stbi__hdr_load(s, x, y, comp, req_comp, ri);
1004 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
1010 if (stbi__tga_test(s))
1011 return stbi__tga_load(s, x, y, comp, req_comp, ri);
1014 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
1017 static stbi_uc* stbi__convert_16_to_8(stbi__uint16* orig,
int w,
int h,
int channels)
1020 int img_len = w * h * channels;
1023 reduced = (stbi_uc*)stbi__malloc(img_len);
1024 if (reduced == NULL)
return stbi__errpuc(
"outofmem",
"Out of memory");
1026 for (i = 0; i < img_len; ++i)
1027 reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF);
1033 static stbi__uint16* stbi__convert_8_to_16(stbi_uc* orig,
int w,
int h,
int channels)
1036 int img_len = w * h * channels;
1037 stbi__uint16* enlarged;
1039 enlarged = (stbi__uint16*)stbi__malloc(img_len * 2);
1040 if (enlarged == NULL)
return (stbi__uint16*)stbi__errpuc(
"outofmem",
"Out of memory");
1042 for (i = 0; i < img_len; ++i)
1043 enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]);
1049 static void stbi__vertical_flip(
void* image,
int w,
int h,
int bytes_per_pixel)
1052 size_t bytes_per_row = (size_t)w * bytes_per_pixel;
1054 stbi_uc* bytes = (stbi_uc*)image;
1056 for (row = 0; row < (h >> 1); row++) {
1057 stbi_uc* row0 = bytes + row * bytes_per_row;
1058 stbi_uc* row1 = bytes + (h - row - 1) * bytes_per_row;
1060 size_t bytes_left = bytes_per_row;
1061 while (bytes_left) {
1062 size_t bytes_copy = (bytes_left <
sizeof(temp)) ? bytes_left :
sizeof(temp);
1063 memcpy(temp, row0, bytes_copy);
1064 memcpy(row0, row1, bytes_copy);
1065 memcpy(row1, temp, bytes_copy);
1068 bytes_left -= bytes_copy;
1073 static void stbi__vertical_flip_slices(
void* image,
int w,
int h,
int z,
int bytes_per_pixel)
1076 int slice_size = w * h * bytes_per_pixel;
1078 stbi_uc* bytes = (stbi_uc*)image;
1079 for (slice = 0; slice < z; ++slice) {
1080 stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
1081 bytes += slice_size;
1085 static unsigned char* stbi__load_and_postprocess_8bit(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp)
1087 stbi__result_info ri;
1088 void* result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1093 if (ri.bits_per_channel != 8) {
1094 STBI_ASSERT(ri.bits_per_channel == 16);
1095 result = stbi__convert_16_to_8((stbi__uint16*)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1096 ri.bits_per_channel = 8;
1101 if (stbi__vertically_flip_on_load) {
1102 int channels = req_comp ? req_comp : *comp;
1103 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi_uc));
1106 return (
unsigned char*)result;
1109 static stbi__uint16* stbi__load_and_postprocess_16bit(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp)
1111 stbi__result_info ri;
1112 void* result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1117 if (ri.bits_per_channel != 16) {
1118 STBI_ASSERT(ri.bits_per_channel == 8);
1119 result = stbi__convert_8_to_16((stbi_uc*)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1120 ri.bits_per_channel = 16;
1126 if (stbi__vertically_flip_on_load) {
1127 int channels = req_comp ? req_comp : *comp;
1128 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi__uint16));
1131 return (stbi__uint16*)result;
1134 #if !defined(STBI_NO_HDR) || !defined(STBI_NO_LINEAR)
1135 static void stbi__float_postprocess(
float* result,
int* x,
int* y,
int* comp,
int req_comp)
1137 if (stbi__vertically_flip_on_load && result != NULL) {
1138 int channels = req_comp ? req_comp : *comp;
1139 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
float));
1144 #ifndef STBI_NO_STDIO
1146 static FILE* stbi__fopen(
char const* filename,
char const* mode)
1149 #if defined(_MSC_VER) && _MSC_VER >= 1400
1150 if (0 != fopen_s(&f, filename, mode))
1153 f = fopen(filename, mode);
1159 STBIDEF stbi_uc* stbi_load(
char const* filename,
int* x,
int* y,
int* comp,
int req_comp)
1161 FILE* f = stbi__fopen(filename,
"rb");
1162 unsigned char* result;
1163 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1164 result = stbi_load_from_file(f, x, y, comp, req_comp);
1169 STBIDEF stbi_uc* stbi_load_from_file(FILE* f,
int* x,
int* y,
int* comp,
int req_comp)
1171 unsigned char* result;
1173 stbi__start_file(&s, f);
1174 result = stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1177 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
1182 STBIDEF stbi__uint16* stbi_load_from_file_16(FILE* f,
int* x,
int* y,
int* comp,
int req_comp)
1184 stbi__uint16* result;
1186 stbi__start_file(&s, f);
1187 result = stbi__load_and_postprocess_16bit(&s, x, y, comp, req_comp);
1190 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
1195 STBIDEF stbi_us* stbi_load_16(
char const* filename,
int* x,
int* y,
int* comp,
int req_comp)
1197 FILE* f = stbi__fopen(filename,
"rb");
1198 stbi__uint16* result;
1199 if (!f)
return (stbi_us*)stbi__errpuc(
"can't fopen",
"Unable to open file");
1200 result = stbi_load_from_file_16(f, x, y, comp, req_comp);
1208 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)
1211 stbi__start_mem(&s, buffer, len);
1212 return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels);
1215 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)
1219 return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels);
1222 STBIDEF stbi_uc* stbi_load_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* comp,
int req_comp)
1225 stbi__start_mem(&s, buffer, len);
1226 return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1229 STBIDEF stbi_uc* stbi_load_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* comp,
int req_comp)
1233 return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1237 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)
1239 unsigned char* result;
1241 stbi__start_mem(&s, buffer, len);
1243 result = (
unsigned char*)stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
1244 if (stbi__vertically_flip_on_load) {
1245 stbi__vertical_flip_slices(result, *x, *y, *z, *comp);
1252 #ifndef STBI_NO_LINEAR
1253 static float* stbi__loadf_main(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp)
1255 unsigned char* data;
1257 if (stbi__hdr_test(s)) {
1258 stbi__result_info ri;
1259 float* hdr_data = stbi__hdr_load(s, x, y, comp, req_comp, &ri);
1261 stbi__float_postprocess(hdr_data, x, y, comp, req_comp);
1265 data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
1267 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1268 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1271 STBIDEF
float* stbi_loadf_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* comp,
int req_comp)
1274 stbi__start_mem(&s, buffer, len);
1275 return stbi__loadf_main(&s, x, y, comp, req_comp);
1278 STBIDEF
float* stbi_loadf_from_callbacks(
stbi_io_callbacks const* clbk,
void* user,
int* x,
int* y,
int* comp,
int req_comp)
1282 return stbi__loadf_main(&s, x, y, comp, req_comp);
1285 #ifndef STBI_NO_STDIO
1286 STBIDEF
float* stbi_loadf(
char const* filename,
int* x,
int* y,
int* comp,
int req_comp)
1289 FILE* f = stbi__fopen(filename,
"rb");
1290 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1291 result = stbi_loadf_from_file(f, x, y, comp, req_comp);
1296 STBIDEF
float* stbi_loadf_from_file(FILE* f,
int* x,
int* y,
int* comp,
int req_comp)
1299 stbi__start_file(&s, f);
1300 return stbi__loadf_main(&s, x, y, comp, req_comp);
1310 STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const* buffer,
int len)
1314 stbi__start_mem(&s, buffer, len);
1315 return stbi__hdr_test(&s);
1317 STBI_NOTUSED(buffer);
1323 #ifndef STBI_NO_STDIO
1324 STBIDEF
int stbi_is_hdr(
char const* filename)
1326 FILE* f = stbi__fopen(filename,
"rb");
1329 result = stbi_is_hdr_from_file(f);
1335 STBIDEF
int stbi_is_hdr_from_file(FILE* f)
1338 long pos = ftell(f);
1341 stbi__start_file(&s, f);
1342 res = stbi__hdr_test(&s);
1343 fseek(f, pos, SEEK_SET);
1352 STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const* clbk,
void* user)
1357 return stbi__hdr_test(&s);
1365 #ifndef STBI_NO_LINEAR
1366 static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f;
1368 STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma) { stbi__l2h_gamma = gamma; }
1369 STBIDEF
void stbi_ldr_to_hdr_scale(
float scale) { stbi__l2h_scale = scale; }
1372 static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f;
1374 STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma) { stbi__h2l_gamma_i = 1 / gamma; }
1375 STBIDEF
void stbi_hdr_to_ldr_scale(
float scale) { stbi__h2l_scale_i = 1 / scale; }
1385 STBI__SCAN_load = 0,
1390 static void stbi__refill_buffer(stbi__context* s)
1392 int n = (s->io.read)(s->io_user_data, (
char*)s->buffer_start, s->buflen);
1396 s->read_from_callbacks = 0;
1397 s->img_buffer = s->buffer_start;
1398 s->img_buffer_end = s->buffer_start + 1;
1402 s->img_buffer = s->buffer_start;
1403 s->img_buffer_end = s->buffer_start + n;
1407 stbi_inline
static stbi_uc stbi__get8(stbi__context* s)
1409 if (s->img_buffer < s->img_buffer_end)
1410 return *s->img_buffer++;
1411 if (s->read_from_callbacks) {
1412 stbi__refill_buffer(s);
1413 return *s->img_buffer++;
1418 stbi_inline
static int stbi__at_eof(stbi__context* s)
1421 if (!(s->io.eof)(s->io_user_data))
return 0;
1424 if (s->read_from_callbacks == 0)
return 1;
1427 return s->img_buffer >= s->img_buffer_end;
1430 static void stbi__skip(stbi__context* s,
int n)
1433 s->img_buffer = s->img_buffer_end;
1437 int blen = (int)(s->img_buffer_end - s->img_buffer);
1439 s->img_buffer = s->img_buffer_end;
1440 (s->io.skip)(s->io_user_data, n - blen);
1447 static int stbi__getn(stbi__context* s, stbi_uc* buffer,
int n)
1450 int blen = (int)(s->img_buffer_end - s->img_buffer);
1454 memcpy(buffer, s->img_buffer, blen);
1456 count = (s->io.read)(s->io_user_data, (
char*)buffer + blen, n - blen);
1457 res = (count == (n - blen));
1458 s->img_buffer = s->img_buffer_end;
1463 if (s->img_buffer + n <= s->img_buffer_end) {
1464 memcpy(buffer, s->img_buffer, n);
1472 static int stbi__get16be(stbi__context* s)
1474 int z = stbi__get8(s);
1475 return (z << 8) + stbi__get8(s);
1478 static stbi__uint32 stbi__get32be(stbi__context* s)
1480 stbi__uint32 z = stbi__get16be(s);
1481 return (z << 16) + stbi__get16be(s);
1484 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1487 static int stbi__get16le(stbi__context* s)
1489 int z = stbi__get8(s);
1490 return z + (stbi__get8(s) << 8);
1495 static stbi__uint32 stbi__get32le(stbi__context* s)
1497 stbi__uint32 z = stbi__get16le(s);
1498 return z + (stbi__get16le(s) << 16);
1502 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255))
1516 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1518 return (stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1521 static unsigned char* stbi__convert_format(
unsigned char* data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1524 unsigned char* good;
1526 if (req_comp == img_n)
return data;
1527 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1529 good = (
unsigned char*)stbi__malloc_mad3(req_comp, x, y, 0);
1532 return stbi__errpuc(
"outofmem",
"Out of memory");
1535 for (j = 0; j < (int)y; ++j) {
1536 unsigned char* src = data + j * x * img_n;
1537 unsigned char* dest = good + j * x * req_comp;
1539 #define STBI__COMBO(a,b) ((a)*8+(b))
1540 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1543 switch (STBI__COMBO(img_n, req_comp)) {
1544 STBI__CASE(1, 2) { dest[0] = src[0], dest[1] = 255; }
break;
1545 STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1546 STBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = 255; }
break;
1547 STBI__CASE(2, 1) { dest[0] = src[0]; }
break;
1548 STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1549 STBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = src[1]; }
break;
1550 STBI__CASE(3, 4) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2], dest[3] = 255; }
break;
1551 STBI__CASE(3, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); }
break;
1552 STBI__CASE(3, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = 255; }
break;
1553 STBI__CASE(4, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); }
break;
1554 STBI__CASE(4, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = src[3]; }
break;
1555 STBI__CASE(4, 3) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; }
break;
1556 default: STBI_ASSERT(0);
1565 static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b)
1567 return (stbi__uint16)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1570 static stbi__uint16* stbi__convert_format16(stbi__uint16* data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1575 if (req_comp == img_n)
return data;
1576 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1578 good = (stbi__uint16*)stbi__malloc(req_comp * x * y * 2);
1581 return (stbi__uint16*)stbi__errpuc(
"outofmem",
"Out of memory");
1584 for (j = 0; j < (int)y; ++j) {
1585 stbi__uint16* src = data + j * x * img_n;
1586 stbi__uint16* dest = good + j * x * req_comp;
1588 #define STBI__COMBO(a,b) ((a)*8+(b))
1589 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1592 switch (STBI__COMBO(img_n, req_comp)) {
1593 STBI__CASE(1, 2) { dest[0] = src[0], dest[1] = 0xffff; }
break;
1594 STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1595 STBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = 0xffff; }
break;
1596 STBI__CASE(2, 1) { dest[0] = src[0]; }
break;
1597 STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1598 STBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = src[1]; }
break;
1599 STBI__CASE(3, 4) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2], dest[3] = 0xffff; }
break;
1600 STBI__CASE(3, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); }
break;
1601 STBI__CASE(3, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]), dest[1] = 0xffff; }
break;
1602 STBI__CASE(4, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); }
break;
1603 STBI__CASE(4, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]), dest[1] = src[3]; }
break;
1604 STBI__CASE(4, 3) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; }
break;
1605 default: STBI_ASSERT(0);
1614 #ifndef STBI_NO_LINEAR
1615 static float* stbi__ldr_to_hdr(stbi_uc* data,
int x,
int y,
int comp)
1619 if (!data)
return NULL;
1620 output = (
float*)stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1621 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1623 if (comp & 1) n = comp;
else n = comp - 1;
1624 for (i = 0; i < x * y; ++i) {
1625 for (k = 0; k < n; ++k) {
1626 output[i * comp + k] = (float)(pow(data[i * comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1628 if (k < comp) output[i * comp + k] = data[i * comp + k] / 255.0f;
1636 #define stbi__float2int(x) ((int) (x))
1637 static stbi_uc* stbi__hdr_to_ldr(
float* data,
int x,
int y,
int comp)
1641 if (!data)
return NULL;
1642 output = (stbi_uc*)stbi__malloc_mad3(x, y, comp, 0);
1643 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1645 if (comp & 1) n = comp;
else n = comp - 1;
1646 for (i = 0; i < x * y; ++i) {
1647 for (k = 0; k < n; ++k) {
1648 float z = (float)pow(data[i * comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1650 if (z > 255) z = 255;
1651 output[i * comp + k] = (stbi_uc)stbi__float2int(z);
1654 float z = data[i * comp + k] * 255 + 0.5f;
1656 if (z > 255) z = 255;
1657 output[i * comp + k] = (stbi_uc)stbi__float2int(z);
1686 #ifndef STBI_NO_JPEG
1693 stbi_uc fast[1 << FAST_BITS];
1695 stbi__uint16 code[256];
1696 stbi_uc values[256];
1698 unsigned int maxcode[18];
1705 stbi__huffman huff_dc[4];
1706 stbi__huffman huff_ac[4];
1707 stbi__uint16 dequant[4][64];
1708 stbi__int16 fast_ac[4][1 << FAST_BITS];
1711 int img_h_max, img_v_max;
1712 int img_mcu_x, img_mcu_y;
1713 int img_mcu_w, img_mcu_h;
1726 void* raw_data, * raw_coeff;
1729 int coeff_w, coeff_h;
1732 stbi__uint32 code_buffer;
1734 unsigned char marker;
1744 int app14_color_transform;
1747 int scan_n, order[4];
1748 int restart_interval, todo;
1751 void(*idct_block_kernel)(stbi_uc* out,
int out_stride,
short data[64]);
1752 void(*YCbCr_to_RGB_kernel)(stbi_uc* out,
const stbi_uc* y,
const stbi_uc* pcb,
const stbi_uc* pcr,
int count,
int step);
1753 stbi_uc* (*resample_row_hv_2_kernel)(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs);
1756 static int stbi__build_huffman(stbi__huffman* h,
int* count)
1761 for (i = 0; i < 16; ++i)
1762 for (j = 0; j < count[i]; ++j)
1763 h->size[k++] = (stbi_uc)(i + 1);
1769 for (j = 1; j <= 16; ++j) {
1771 h->delta[j] = k - code;
1772 if (h->size[k] == j) {
1773 while (h->size[k] == j)
1774 h->code[k++] = (stbi__uint16)(code++);
1775 if (code - 1 >= (1u << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1778 h->maxcode[j] = code << (16 - j);
1781 h->maxcode[j] = 0xffffffff;
1784 memset(h->fast, 255, 1 << FAST_BITS);
1785 for (i = 0; i < k; ++i) {
1787 if (s <= FAST_BITS) {
1788 int c = h->code[i] << (FAST_BITS - s);
1789 int m = 1 << (FAST_BITS - s);
1790 for (j = 0; j < m; ++j) {
1791 h->fast[c + j] = (stbi_uc)i;
1800 static void stbi__build_fast_ac(stbi__int16* fast_ac, stbi__huffman* h)
1803 for (i = 0; i < (1 << FAST_BITS); ++i) {
1804 stbi_uc fast = h->fast[i];
1807 int rs = h->values[fast];
1808 int run = (rs >> 4) & 15;
1809 int magbits = rs & 15;
1810 int len = h->size[fast];
1812 if (magbits && len + magbits <= FAST_BITS) {
1814 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1815 int m = 1 << (magbits - 1);
1816 if (k < m) k += (~0U << magbits) + 1;
1818 if (k >= -128 && k <= 127)
1819 fast_ac[i] = (stbi__int16)((k * 256) + (run * 16) + (len + magbits));
1825 static void stbi__grow_buffer_unsafe(stbi__jpeg* j)
1828 unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
1830 int c = stbi__get8(j->s);
1831 while (c == 0xff) c = stbi__get8(j->s);
1833 j->marker = (
unsigned char)c;
1838 j->code_buffer |= b << (24 - j->code_bits);
1840 }
while (j->code_bits <= 24);
1844 static const stbi__uint32 stbi__bmask[17] = { 0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535 };
1847 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg* j, stbi__huffman* h)
1852 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1856 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
1860 if (s > j->code_bits)
1862 j->code_buffer <<= s;
1864 return h->values[k];
1873 temp = j->code_buffer >> 16;
1874 for (k = FAST_BITS + 1; ; ++k)
1875 if (temp < h->maxcode[k])
1883 if (k > j->code_bits)
1887 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1888 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1892 j->code_buffer <<= k;
1893 return h->values[c];
1897 static const int stbi__jbias[16] = { 0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767 };
1901 stbi_inline
static int stbi__extend_receive(stbi__jpeg* j,
int n)
1905 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1907 sgn = (stbi__int32)j->code_buffer >> 31;
1908 k = stbi_lrot(j->code_buffer, n);
1909 STBI_ASSERT(n >= 0 && n < (
int)(
sizeof(stbi__bmask) /
sizeof(*stbi__bmask)));
1910 j->code_buffer = k & ~stbi__bmask[n];
1911 k &= stbi__bmask[n];
1913 return k + (stbi__jbias[n] & ~sgn);
1917 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg* j,
int n)
1920 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1921 k = stbi_lrot(j->code_buffer, n);
1922 j->code_buffer = k & ~stbi__bmask[n];
1923 k &= stbi__bmask[n];
1928 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg* j)
1931 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1933 j->code_buffer <<= 1;
1935 return k & 0x80000000;
1940 static const stbi_uc stbi__jpeg_dezigzag[64 + 15] =
1942 0, 1, 8, 16, 9, 2, 3, 10,
1943 17, 24, 32, 25, 18, 11, 4, 5,
1944 12, 19, 26, 33, 40, 48, 41, 34,
1945 27, 20, 13, 6, 7, 14, 21, 28,
1946 35, 42, 49, 56, 57, 50, 43, 36,
1947 29, 22, 15, 23, 30, 37, 44, 51,
1948 58, 59, 52, 45, 38, 31, 39, 46,
1949 53, 60, 61, 54, 47, 55, 62, 63,
1951 63, 63, 63, 63, 63, 63, 63, 63,
1952 63, 63, 63, 63, 63, 63, 63
1956 static 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)
1961 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1962 t = stbi__jpeg_huff_decode(j, hdc);
1963 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1966 memset(data, 0, 64 *
sizeof(data[0]));
1968 diff = t ? stbi__extend_receive(j, t) : 0;
1969 dc = j->img_comp[b].dc_pred + diff;
1970 j->img_comp[b].dc_pred = dc;
1971 data[0] = (short)(dc * dequant[0]);
1978 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1979 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
1984 j->code_buffer <<= s;
1987 zig = stbi__jpeg_dezigzag[k++];
1988 data[zig] = (short)((r >> 8) * dequant[zig]);
1991 int rs = stbi__jpeg_huff_decode(j, hac);
1992 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1996 if (rs != 0xf0)
break;
2002 zig = stbi__jpeg_dezigzag[k++];
2003 data[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]);
2010 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg* j,
short data[64], stbi__huffman* hdc,
int b)
2014 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2016 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2018 if (j->succ_high == 0) {
2020 memset(data, 0, 64 *
sizeof(data[0]));
2021 t = stbi__jpeg_huff_decode(j, hdc);
2022 diff = t ? stbi__extend_receive(j, t) : 0;
2024 dc = j->img_comp[b].dc_pred + diff;
2025 j->img_comp[b].dc_pred = dc;
2026 data[0] = (short)(dc << j->succ_low);
2030 if (stbi__jpeg_get_bit(j))
2031 data[0] += (
short)(1 << j->succ_low);
2038 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg* j,
short data[64], stbi__huffman* hac, stbi__int16* fac)
2041 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2043 if (j->succ_high == 0) {
2044 int shift = j->succ_low;
2055 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2056 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2061 j->code_buffer <<= s;
2063 zig = stbi__jpeg_dezigzag[k++];
2064 data[zig] = (short)((r >> 8) << shift);
2067 int rs = stbi__jpeg_huff_decode(j, hac);
2068 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2073 j->eob_run = (1 << r);
2075 j->eob_run += stbi__jpeg_get_bits(j, r);
2083 zig = stbi__jpeg_dezigzag[k++];
2084 data[zig] = (short)(stbi__extend_receive(j, s) << shift);
2087 }
while (k <= j->spec_end);
2092 short bit = (short)(1 << j->succ_low);
2096 for (k = j->spec_start; k <= j->spec_end; ++k) {
2097 short* p = &data[stbi__jpeg_dezigzag[k]];
2099 if (stbi__jpeg_get_bit(j))
2100 if ((*p & bit) == 0) {
2112 int rs = stbi__jpeg_huff_decode(j, hac);
2113 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2118 j->eob_run = (1 << r) - 1;
2120 j->eob_run += stbi__jpeg_get_bits(j, r);
2130 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2132 if (stbi__jpeg_get_bit(j))
2139 while (k <= j->spec_end) {
2140 short* p = &data[stbi__jpeg_dezigzag[k++]];
2142 if (stbi__jpeg_get_bit(j))
2143 if ((*p & bit) == 0) {
2158 }
while (k <= j->spec_end);
2165 stbi_inline
static stbi_uc stbi__clamp(
int x)
2168 if ((
unsigned int)x > 255) {
2169 if (x < 0)
return 0;
2170 if (x > 255)
return 255;
2175 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
2176 #define stbi__fsh(x) ((x) * 4096)
2179 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2180 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2183 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
2184 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
2185 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
2188 t0 = stbi__fsh(p2+p3); \
2189 t1 = stbi__fsh(p2-p3); \
2202 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
2203 t0 = t0*stbi__f2f( 0.298631336f); \
2204 t1 = t1*stbi__f2f( 2.053119869f); \
2205 t2 = t2*stbi__f2f( 3.072711026f); \
2206 t3 = t3*stbi__f2f( 1.501321110f); \
2207 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
2208 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
2209 p3 = p3*stbi__f2f(-1.961570560f); \
2210 p4 = p4*stbi__f2f(-0.390180644f); \
2216 static void stbi__idct_block(stbi_uc* out,
int out_stride,
short data[64])
2218 int i, val[64], * v = val;
2223 for (i = 0; i < 8; ++i, ++d, ++v) {
2225 if (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0
2226 && d[40] == 0 && d[48] == 0 && d[56] == 0) {
2231 int dcterm = d[0] * 4;
2232 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2235 STBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56])
2238 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2239 v[0] = (x0 + t3) >> 10;
2240 v[56] = (x0 - t3) >> 10;
2241 v[8] = (x1 + t2) >> 10;
2242 v[48] = (x1 - t2) >> 10;
2243 v[16] = (x2 + t1) >> 10;
2244 v[40] = (x2 - t1) >> 10;
2245 v[24] = (x3 + t0) >> 10;
2246 v[32] = (x3 - t0) >> 10;
2250 for (i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) {
2252 STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7])
2259 x0 += 65536 + (128 << 17);
2260 x1 += 65536 + (128 << 17);
2261 x2 += 65536 + (128 << 17);
2262 x3 += 65536 + (128 << 17);
2265 o[0] = stbi__clamp((x0 + t3) >> 17);
2266 o[7] = stbi__clamp((x0 - t3) >> 17);
2267 o[1] = stbi__clamp((x1 + t2) >> 17);
2268 o[6] = stbi__clamp((x1 - t2) >> 17);
2269 o[2] = stbi__clamp((x2 + t1) >> 17);
2270 o[5] = stbi__clamp((x2 - t1) >> 17);
2271 o[3] = stbi__clamp((x3 + t0) >> 17);
2272 o[4] = stbi__clamp((x3 - t0) >> 17);
2280 static void stbi__idct_simd(stbi_uc* out,
int out_stride,
short data[64])
2283 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2287 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2291 #define dct_rot(out0,out1, x,y,c0,c1) \
2292 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2293 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2294 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2295 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2296 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2297 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2300 #define dct_widen(out, in) \
2301 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2302 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2305 #define dct_wadd(out, a, b) \
2306 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2307 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2310 #define dct_wsub(out, a, b) \
2311 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2312 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2315 #define dct_bfly32o(out0, out1, a,b,bias,s) \
2317 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2318 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2319 dct_wadd(sum, abiased, b); \
2320 dct_wsub(dif, abiased, b); \
2321 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2322 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2326 #define dct_interleave8(a, b) \
2328 a = _mm_unpacklo_epi8(a, b); \
2329 b = _mm_unpackhi_epi8(tmp, b)
2332 #define dct_interleave16(a, b) \
2334 a = _mm_unpacklo_epi16(a, b); \
2335 b = _mm_unpackhi_epi16(tmp, b)
2337 #define dct_pass(bias,shift) \
2340 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2341 __m128i sum04 = _mm_add_epi16(row0, row4); \
2342 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2343 dct_widen(t0e, sum04); \
2344 dct_widen(t1e, dif04); \
2345 dct_wadd(x0, t0e, t3e); \
2346 dct_wsub(x3, t0e, t3e); \
2347 dct_wadd(x1, t1e, t2e); \
2348 dct_wsub(x2, t1e, t2e); \
2350 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2351 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2352 __m128i sum17 = _mm_add_epi16(row1, row7); \
2353 __m128i sum35 = _mm_add_epi16(row3, row5); \
2354 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2355 dct_wadd(x4, y0o, y4o); \
2356 dct_wadd(x5, y1o, y5o); \
2357 dct_wadd(x6, y2o, y5o); \
2358 dct_wadd(x7, y3o, y4o); \
2359 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2360 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2361 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2362 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2365 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2366 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f));
2367 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2368 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2369 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f));
2370 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f));
2371 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f));
2372 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f));
2375 __m128i bias_0 = _mm_set1_epi32(512);
2376 __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17));
2379 row0 = _mm_load_si128((
const __m128i*) (data + 0 * 8));
2380 row1 = _mm_load_si128((
const __m128i*) (data + 1 * 8));
2381 row2 = _mm_load_si128((
const __m128i*) (data + 2 * 8));
2382 row3 = _mm_load_si128((
const __m128i*) (data + 3 * 8));
2383 row4 = _mm_load_si128((
const __m128i*) (data + 4 * 8));
2384 row5 = _mm_load_si128((
const __m128i*) (data + 5 * 8));
2385 row6 = _mm_load_si128((
const __m128i*) (data + 6 * 8));
2386 row7 = _mm_load_si128((
const __m128i*) (data + 7 * 8));
2389 dct_pass(bias_0, 10);
2393 dct_interleave16(row0, row4);
2394 dct_interleave16(row1, row5);
2395 dct_interleave16(row2, row6);
2396 dct_interleave16(row3, row7);
2399 dct_interleave16(row0, row2);
2400 dct_interleave16(row1, row3);
2401 dct_interleave16(row4, row6);
2402 dct_interleave16(row5, row7);
2405 dct_interleave16(row0, row1);
2406 dct_interleave16(row2, row3);
2407 dct_interleave16(row4, row5);
2408 dct_interleave16(row6, row7);
2412 dct_pass(bias_1, 17);
2416 __m128i p0 = _mm_packus_epi16(row0, row1);
2417 __m128i p1 = _mm_packus_epi16(row2, row3);
2418 __m128i p2 = _mm_packus_epi16(row4, row5);
2419 __m128i p3 = _mm_packus_epi16(row6, row7);
2422 dct_interleave8(p0, p2);
2423 dct_interleave8(p1, p3);
2426 dct_interleave8(p0, p1);
2427 dct_interleave8(p2, p3);
2430 dct_interleave8(p0, p2);
2431 dct_interleave8(p1, p3);
2434 _mm_storel_epi64((__m128i*) out, p0); out += out_stride;
2435 _mm_storel_epi64((__m128i*) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2436 _mm_storel_epi64((__m128i*) out, p2); out += out_stride;
2437 _mm_storel_epi64((__m128i*) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2438 _mm_storel_epi64((__m128i*) out, p1); out += out_stride;
2439 _mm_storel_epi64((__m128i*) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2440 _mm_storel_epi64((__m128i*) out, p3); out += out_stride;
2441 _mm_storel_epi64((__m128i*) out, _mm_shuffle_epi32(p3, 0x4e));
2450 #undef dct_interleave8
2451 #undef dct_interleave16
2461 static void stbi__idct_simd(stbi_uc* out,
int out_stride,
short data[64])
2463 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2465 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2466 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2467 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f));
2468 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f));
2469 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2470 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2471 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2472 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2473 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f));
2474 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f));
2475 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f));
2476 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f));
2478 #define dct_long_mul(out, inq, coeff) \
2479 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2480 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2482 #define dct_long_mac(out, acc, inq, coeff) \
2483 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2484 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2486 #define dct_widen(out, inq) \
2487 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2488 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2491 #define dct_wadd(out, a, b) \
2492 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2493 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2496 #define dct_wsub(out, a, b) \
2497 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2498 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2501 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2503 dct_wadd(sum, a, b); \
2504 dct_wsub(dif, a, b); \
2505 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2506 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2509 #define dct_pass(shiftop, shift) \
2512 int16x8_t sum26 = vaddq_s16(row2, row6); \
2513 dct_long_mul(p1e, sum26, rot0_0); \
2514 dct_long_mac(t2e, p1e, row6, rot0_1); \
2515 dct_long_mac(t3e, p1e, row2, rot0_2); \
2516 int16x8_t sum04 = vaddq_s16(row0, row4); \
2517 int16x8_t dif04 = vsubq_s16(row0, row4); \
2518 dct_widen(t0e, sum04); \
2519 dct_widen(t1e, dif04); \
2520 dct_wadd(x0, t0e, t3e); \
2521 dct_wsub(x3, t0e, t3e); \
2522 dct_wadd(x1, t1e, t2e); \
2523 dct_wsub(x2, t1e, t2e); \
2525 int16x8_t sum15 = vaddq_s16(row1, row5); \
2526 int16x8_t sum17 = vaddq_s16(row1, row7); \
2527 int16x8_t sum35 = vaddq_s16(row3, row5); \
2528 int16x8_t sum37 = vaddq_s16(row3, row7); \
2529 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2530 dct_long_mul(p5o, sumodd, rot1_0); \
2531 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2532 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2533 dct_long_mul(p3o, sum37, rot2_0); \
2534 dct_long_mul(p4o, sum15, rot2_1); \
2535 dct_wadd(sump13o, p1o, p3o); \
2536 dct_wadd(sump24o, p2o, p4o); \
2537 dct_wadd(sump23o, p2o, p3o); \
2538 dct_wadd(sump14o, p1o, p4o); \
2539 dct_long_mac(x4, sump13o, row7, rot3_0); \
2540 dct_long_mac(x5, sump24o, row5, rot3_1); \
2541 dct_long_mac(x6, sump23o, row3, rot3_2); \
2542 dct_long_mac(x7, sump14o, row1, rot3_3); \
2543 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2544 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2545 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2546 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2550 row0 = vld1q_s16(data + 0 * 8);
2551 row1 = vld1q_s16(data + 1 * 8);
2552 row2 = vld1q_s16(data + 2 * 8);
2553 row3 = vld1q_s16(data + 3 * 8);
2554 row4 = vld1q_s16(data + 4 * 8);
2555 row5 = vld1q_s16(data + 5 * 8);
2556 row6 = vld1q_s16(data + 6 * 8);
2557 row7 = vld1q_s16(data + 7 * 8);
2560 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2563 dct_pass(vrshrn_n_s32, 10);
2569 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2570 #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]); }
2571 #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)); }
2574 dct_trn16(row0, row1);
2575 dct_trn16(row2, row3);
2576 dct_trn16(row4, row5);
2577 dct_trn16(row6, row7);
2580 dct_trn32(row0, row2);
2581 dct_trn32(row1, row3);
2582 dct_trn32(row4, row6);
2583 dct_trn32(row5, row7);
2586 dct_trn64(row0, row4);
2587 dct_trn64(row1, row5);
2588 dct_trn64(row2, row6);
2589 dct_trn64(row3, row7);
2600 dct_pass(vshrn_n_s32, 16);
2604 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2605 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2606 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2607 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2608 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2609 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2610 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2611 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2614 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2615 #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]); }
2616 #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]); }
2628 dct_trn8_16(p0, p2);
2629 dct_trn8_16(p1, p3);
2630 dct_trn8_16(p4, p6);
2631 dct_trn8_16(p5, p7);
2634 dct_trn8_32(p0, p4);
2635 dct_trn8_32(p1, p5);
2636 dct_trn8_32(p2, p6);
2637 dct_trn8_32(p3, p7);
2640 vst1_u8(out, p0); out += out_stride;
2641 vst1_u8(out, p1); out += out_stride;
2642 vst1_u8(out, p2); out += out_stride;
2643 vst1_u8(out, p3); out += out_stride;
2644 vst1_u8(out, p4); out += out_stride;
2645 vst1_u8(out, p5); out += out_stride;
2646 vst1_u8(out, p6); out += out_stride;
2665 #define STBI__MARKER_none 0xff
2669 static stbi_uc stbi__get_marker(stbi__jpeg * j)
2672 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2673 x = stbi__get8(j->s);
2674 if (x != 0xff)
return STBI__MARKER_none;
2676 x = stbi__get8(j->s);
2682 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2686 static void stbi__jpeg_reset(stbi__jpeg* j)
2691 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;
2692 j->marker = STBI__MARKER_none;
2693 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2699 static int stbi__parse_entropy_coded_data(stbi__jpeg* z)
2701 stbi__jpeg_reset(z);
2702 if (!z->progressive) {
2703 if (z->scan_n == 1) {
2705 STBI_SIMD_ALIGN(
short, data[64]);
2706 int n = z->order[0];
2711 int w = (z->img_comp[n].x + 7) >> 3;
2712 int h = (z->img_comp[n].y + 7) >> 3;
2713 for (j = 0; j < h; ++j) {
2714 for (i = 0; i < w; ++i) {
2715 int ha = z->img_comp[n].ha;
2716 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;
2717 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data);
2719 if (--z->todo <= 0) {
2720 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2723 if (!STBI__RESTART(z->marker))
return 1;
2724 stbi__jpeg_reset(z);
2732 STBI_SIMD_ALIGN(
short, data[64]);
2733 for (j = 0; j < z->img_mcu_y; ++j) {
2734 for (i = 0; i < z->img_mcu_x; ++i) {
2736 for (k = 0; k < z->scan_n; ++k) {
2737 int n = z->order[k];
2740 for (y = 0; y < z->img_comp[n].v; ++y) {
2741 for (x = 0; x < z->img_comp[n].h; ++x) {
2742 int x2 = (i * z->img_comp[n].h + x) * 8;
2743 int y2 = (j * z->img_comp[n].v + y) * 8;
2744 int ha = z->img_comp[n].ha;
2745 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;
2746 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * y2 + x2, z->img_comp[n].w2, data);
2752 if (--z->todo <= 0) {
2753 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2754 if (!STBI__RESTART(z->marker))
return 1;
2755 stbi__jpeg_reset(z);
2763 if (z->scan_n == 1) {
2765 int n = z->order[0];
2770 int w = (z->img_comp[n].x + 7) >> 3;
2771 int h = (z->img_comp[n].y + 7) >> 3;
2772 for (j = 0; j < h; ++j) {
2773 for (i = 0; i < w; ++i) {
2774 short* data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2775 if (z->spec_start == 0) {
2776 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2780 int ha = z->img_comp[n].ha;
2781 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2785 if (--z->todo <= 0) {
2786 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2787 if (!STBI__RESTART(z->marker))
return 1;
2788 stbi__jpeg_reset(z);
2796 for (j = 0; j < z->img_mcu_y; ++j) {
2797 for (i = 0; i < z->img_mcu_x; ++i) {
2799 for (k = 0; k < z->scan_n; ++k) {
2800 int n = z->order[k];
2803 for (y = 0; y < z->img_comp[n].v; ++y) {
2804 for (x = 0; x < z->img_comp[n].h; ++x) {
2805 int x2 = (i * z->img_comp[n].h + x);
2806 int y2 = (j * z->img_comp[n].v + y);
2807 short* data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2808 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2815 if (--z->todo <= 0) {
2816 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2817 if (!STBI__RESTART(z->marker))
return 1;
2818 stbi__jpeg_reset(z);
2827 static void stbi__jpeg_dequantize(
short* data, stbi__uint16* dequant)
2830 for (i = 0; i < 64; ++i)
2831 data[i] *= dequant[i];
2834 static void stbi__jpeg_finish(stbi__jpeg* z)
2836 if (z->progressive) {
2839 for (n = 0; n < z->s->img_n; ++n) {
2840 int w = (z->img_comp[n].x + 7) >> 3;
2841 int h = (z->img_comp[n].y + 7) >> 3;
2842 for (j = 0; j < h; ++j) {
2843 for (i = 0; i < w; ++i) {
2844 short* data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2845 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2846 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data);
2853 static int stbi__process_marker(stbi__jpeg* z,
int m)
2857 case STBI__MARKER_none:
2858 return stbi__err(
"expected marker",
"Corrupt JPEG");
2861 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2862 z->restart_interval = stbi__get16be(z->s);
2866 L = stbi__get16be(z->s) - 2;
2868 int q = stbi__get8(z->s);
2869 int p = q >> 4, sixteen = (p != 0);
2871 if (p != 0 && p != 1)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2872 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2874 for (i = 0; i < 64; ++i)
2875 z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
2876 L -= (sixteen ? 129 : 65);
2881 L = stbi__get16be(z->s) - 2;
2884 int sizes[16], i, n = 0;
2885 int q = stbi__get8(z->s);
2888 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2889 for (i = 0; i < 16; ++i) {
2890 sizes[i] = stbi__get8(z->s);
2895 if (!stbi__build_huffman(z->huff_dc + th, sizes))
return 0;
2896 v = z->huff_dc[th].values;
2899 if (!stbi__build_huffman(z->huff_ac + th, sizes))
return 0;
2900 v = z->huff_ac[th].values;
2902 for (i = 0; i < n; ++i)
2903 v[i] = stbi__get8(z->s);
2905 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2912 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2913 L = stbi__get16be(z->s);
2916 return stbi__err(
"bad COM len",
"Corrupt JPEG");
2918 return stbi__err(
"bad APP len",
"Corrupt JPEG");
2922 if (m == 0xE0 && L >= 5) {
2923 static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0' };
2926 for (i = 0; i < 5; ++i)
2927 if (stbi__get8(z->s) != tag[i])
2933 else if (m == 0xEE && L >= 12) {
2934 static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0' };
2937 for (i = 0; i < 6; ++i)
2938 if (stbi__get8(z->s) != tag[i])
2943 stbi__get16be(z->s);
2944 stbi__get16be(z->s);
2945 z->app14_color_transform = stbi__get8(z->s);
2950 stbi__skip(z->s, L);
2954 return stbi__err(
"unknown marker",
"Corrupt JPEG");
2958 static int stbi__process_scan_header(stbi__jpeg* z)
2961 int Ls = stbi__get16be(z->s);
2962 z->scan_n = stbi__get8(z->s);
2963 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");
2964 if (Ls != 6 + 2 * z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2965 for (i = 0; i < z->scan_n; ++i) {
2966 int id = stbi__get8(z->s), which;
2967 int q = stbi__get8(z->s);
2968 for (which = 0; which < z->s->img_n; ++which)
2969 if (z->img_comp[which].id ==
id)
2971 if (which == z->s->img_n)
return 0;
2972 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2973 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2974 z->order[i] = which;
2979 z->spec_start = stbi__get8(z->s);
2980 z->spec_end = stbi__get8(z->s);
2981 aa = stbi__get8(z->s);
2982 z->succ_high = (aa >> 4);
2983 z->succ_low = (aa & 15);
2984 if (z->progressive) {
2985 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2986 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2989 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2990 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2998 static int stbi__free_jpeg_components(stbi__jpeg* z,
int ncomp,
int why)
3001 for (i = 0; i < ncomp; ++i) {
3002 if (z->img_comp[i].raw_data) {
3003 STBI_FREE(z->img_comp[i].raw_data);
3004 z->img_comp[i].raw_data = NULL;
3005 z->img_comp[i].data = NULL;
3007 if (z->img_comp[i].raw_coeff) {
3008 STBI_FREE(z->img_comp[i].raw_coeff);
3009 z->img_comp[i].raw_coeff = 0;
3010 z->img_comp[i].coeff = 0;
3012 if (z->img_comp[i].linebuf) {
3013 STBI_FREE(z->img_comp[i].linebuf);
3014 z->img_comp[i].linebuf = NULL;
3020 static int stbi__process_frame_header(stbi__jpeg* z,
int scan)
3022 stbi__context* s = z->s;
3023 int Lf, p, i, q, h_max = 1, v_max = 1, c;
3024 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3025 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
3026 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
3027 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
3029 if (c != 3 && c != 1 && c != 4)
return stbi__err(
"bad component count",
"Corrupt JPEG");
3031 for (i = 0; i < c; ++i) {
3032 z->img_comp[i].data = NULL;
3033 z->img_comp[i].linebuf = NULL;
3036 if (Lf != 8 + 3 * s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3039 for (i = 0; i < s->img_n; ++i) {
3040 static const unsigned char rgb[3] = {
'R',
'G',
'B' };
3041 z->img_comp[i].id = stbi__get8(s);
3042 if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3045 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");
3046 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");
3047 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
3050 if (scan != STBI__SCAN_load)
return 1;
3052 if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0))
return stbi__err(
"too large",
"Image too large to decode");
3054 for (i = 0; i < s->img_n; ++i) {
3055 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
3056 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
3060 z->img_h_max = h_max;
3061 z->img_v_max = v_max;
3062 z->img_mcu_w = h_max * 8;
3063 z->img_mcu_h = v_max * 8;
3065 z->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w;
3066 z->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h;
3068 for (i = 0; i < s->img_n; ++i) {
3070 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max;
3071 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max;
3079 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3080 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3081 z->img_comp[i].coeff = 0;
3082 z->img_comp[i].raw_coeff = 0;
3083 z->img_comp[i].linebuf = NULL;
3084 z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3085 if (z->img_comp[i].raw_data == NULL)
3086 return stbi__free_jpeg_components(z, i + 1, stbi__err(
"outofmem",
"Out of memory"));
3088 z->img_comp[i].data = (stbi_uc*)(((
size_t)z->img_comp[i].raw_data + 15) & ~15);
3089 if (z->progressive) {
3091 z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3092 z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3093 z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2,
sizeof(
short), 15);
3094 if (z->img_comp[i].raw_coeff == NULL)
3095 return stbi__free_jpeg_components(z, i + 1, stbi__err(
"outofmem",
"Out of memory"));
3096 z->img_comp[i].coeff = (
short*)(((
size_t)z->img_comp[i].raw_coeff + 15) & ~15);
3104 #define stbi__DNL(x) ((x) == 0xdc)
3105 #define stbi__SOI(x) ((x) == 0xd8)
3106 #define stbi__EOI(x) ((x) == 0xd9)
3107 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3108 #define stbi__SOS(x) ((x) == 0xda)
3110 #define stbi__SOF_progressive(x) ((x) == 0xc2)
3112 static int stbi__decode_jpeg_header(stbi__jpeg* z,
int scan)
3116 z->app14_color_transform = -1;
3117 z->marker = STBI__MARKER_none;
3118 m = stbi__get_marker(z);
3119 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
3120 if (scan == STBI__SCAN_type)
return 1;
3121 m = stbi__get_marker(z);
3122 while (!stbi__SOF(m)) {
3123 if (!stbi__process_marker(z, m))
return 0;
3124 m = stbi__get_marker(z);
3125 while (m == STBI__MARKER_none) {
3127 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
3128 m = stbi__get_marker(z);
3131 z->progressive = stbi__SOF_progressive(m);
3132 if (!stbi__process_frame_header(z, scan))
return 0;
3137 static int stbi__decode_jpeg_image(stbi__jpeg* j)
3140 for (m = 0; m < 4; m++) {
3141 j->img_comp[m].raw_data = NULL;
3142 j->img_comp[m].raw_coeff = NULL;
3144 j->restart_interval = 0;
3145 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
3146 m = stbi__get_marker(j);
3147 while (!stbi__EOI(m)) {
3149 if (!stbi__process_scan_header(j))
return 0;
3150 if (!stbi__parse_entropy_coded_data(j))
return 0;
3151 if (j->marker == STBI__MARKER_none) {
3153 while (!stbi__at_eof(j->s)) {
3154 int x = stbi__get8(j->s);
3156 j->marker = stbi__get8(j->s);
3163 else if (stbi__DNL(m)) {
3164 int Ld = stbi__get16be(j->s);
3165 stbi__uint32 NL = stbi__get16be(j->s);
3166 if (Ld != 4)
return stbi__err(
"bad DNL len",
"Corrupt JPEG");
3167 if (NL != j->s->img_y)
return stbi__err(
"bad DNL height",
"Corrupt JPEG");
3170 if (!stbi__process_marker(j, m))
return 0;
3172 m = stbi__get_marker(j);
3175 stbi__jpeg_finish(j);
3181 typedef stbi_uc* (*resample_row_func)(stbi_uc* out, stbi_uc* in0, stbi_uc* in1,
3184 #define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3186 static stbi_uc* resample_row_1(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3189 STBI_NOTUSED(in_far);
3195 static stbi_uc* stbi__resample_row_v_2(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3200 for (i = 0; i < w; ++i)
3201 out[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2);
3205 static stbi_uc* stbi__resample_row_h_2(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3209 stbi_uc* input = in_near;
3213 out[0] = out[1] = input[0];
3218 out[1] = stbi__div4(input[0] * 3 + input[1] + 2);
3219 for (i = 1; i < w - 1; ++i) {
3220 int n = 3 * input[i] + 2;
3221 out[i * 2 + 0] = stbi__div4(n + input[i - 1]);
3222 out[i * 2 + 1] = stbi__div4(n + input[i + 1]);
3224 out[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2);
3225 out[i * 2 + 1] = input[w - 1];
3227 STBI_NOTUSED(in_far);
3233 #define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3235 static stbi_uc* stbi__resample_row_hv_2(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3240 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3244 t1 = 3 * in_near[0] + in_far[0];
3245 out[0] = stbi__div4(t1 + 2);
3246 for (i = 1; i < w; ++i) {
3248 t1 = 3 * in_near[i] + in_far[i];
3249 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3250 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3252 out[w * 2 - 1] = stbi__div4(t1 + 2);
3259 #if defined(STBI_SSE2) || defined(STBI_NEON)
3260 static stbi_uc* stbi__resample_row_hv_2_simd(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3266 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3270 t1 = 3 * in_near[0] + in_far[0];
3274 for (; i < ((w - 1) & ~7); i += 8) {
3275 #if defined(STBI_SSE2)
3278 __m128i zero = _mm_setzero_si128();
3279 __m128i farb = _mm_loadl_epi64((__m128i*) (in_far + i));
3280 __m128i nearb = _mm_loadl_epi64((__m128i*) (in_near + i));
3281 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3282 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3283 __m128i diff = _mm_sub_epi16(farw, nearw);
3284 __m128i nears = _mm_slli_epi16(nearw, 2);
3285 __m128i curr = _mm_add_epi16(nears, diff);
3292 __m128i prv0 = _mm_slli_si128(curr, 2);
3293 __m128i nxt0 = _mm_srli_si128(curr, 2);
3294 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3295 __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7);
3301 __m128i bias = _mm_set1_epi16(8);
3302 __m128i curs = _mm_slli_epi16(curr, 2);
3303 __m128i prvd = _mm_sub_epi16(prev, curr);
3304 __m128i nxtd = _mm_sub_epi16(next, curr);
3305 __m128i curb = _mm_add_epi16(curs, bias);
3306 __m128i even = _mm_add_epi16(prvd, curb);
3307 __m128i odd = _mm_add_epi16(nxtd, curb);
3310 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3311 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3312 __m128i de0 = _mm_srli_epi16(int0, 4);
3313 __m128i de1 = _mm_srli_epi16(int1, 4);
3316 __m128i outv = _mm_packus_epi16(de0, de1);
3317 _mm_storeu_si128((__m128i*) (out + i * 2), outv);
3318 #elif defined(STBI_NEON)
3321 uint8x8_t farb = vld1_u8(in_far + i);
3322 uint8x8_t nearb = vld1_u8(in_near + i);
3323 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3324 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3325 int16x8_t curr = vaddq_s16(nears, diff);
3332 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3333 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3334 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3335 int16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7);
3341 int16x8_t curs = vshlq_n_s16(curr, 2);
3342 int16x8_t prvd = vsubq_s16(prev, curr);
3343 int16x8_t nxtd = vsubq_s16(next, curr);
3344 int16x8_t even = vaddq_s16(curs, prvd);
3345 int16x8_t odd = vaddq_s16(curs, nxtd);
3349 o.val[0] = vqrshrun_n_s16(even, 4);
3350 o.val[1] = vqrshrun_n_s16(odd, 4);
3351 vst2_u8(out + i * 2, o);
3355 t1 = 3 * in_near[i + 7] + in_far[i + 7];
3359 t1 = 3 * in_near[i] + in_far[i];
3360 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3362 for (++i; i < w; ++i) {
3364 t1 = 3 * in_near[i] + in_far[i];
3365 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3366 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3368 out[w * 2 - 1] = stbi__div4(t1 + 2);
3376 static stbi_uc* stbi__resample_row_generic(stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far,
int w,
int hs)
3380 STBI_NOTUSED(in_far);
3381 for (i = 0; i < w; ++i)
3382 for (j = 0; j < hs; ++j)
3383 out[i * hs + j] = in_near[i];
3389 #define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3390 static 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)
3393 for (i = 0; i < count; ++i) {
3394 int y_fixed = (y[i] << 20) + (1 << 19);
3396 int cr = pcr[i] - 128;
3397 int cb = pcb[i] - 128;
3398 r = y_fixed + cr * stbi__float2fixed(1.40200f);
3399 g = y_fixed + (cr * -stbi__float2fixed(0.71414f)) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000);
3400 b = y_fixed + cb * stbi__float2fixed(1.77200f);
3404 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3405 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3406 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
3407 out[0] = (stbi_uc)r;
3408 out[1] = (stbi_uc)g;
3409 out[2] = (stbi_uc)b;
3415 #if defined(STBI_SSE2) || defined(STBI_NEON)
3416 static 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)
3426 __m128i signflip = _mm_set1_epi8(-0x80);
3427 __m128i cr_const0 = _mm_set1_epi16((
short)(1.40200f * 4096.0f + 0.5f));
3428 __m128i cr_const1 = _mm_set1_epi16(-(
short)(0.71414f * 4096.0f + 0.5f));
3429 __m128i cb_const0 = _mm_set1_epi16(-(
short)(0.34414f * 4096.0f + 0.5f));
3430 __m128i cb_const1 = _mm_set1_epi16((
short)(1.77200f * 4096.0f + 0.5f));
3431 __m128i y_bias = _mm_set1_epi8((
char)(
unsigned char)128);
3432 __m128i xw = _mm_set1_epi16(255);
3434 for (; i + 7 < count; i += 8) {
3436 __m128i y_bytes = _mm_loadl_epi64((__m128i*) (y + i));
3437 __m128i cr_bytes = _mm_loadl_epi64((__m128i*) (pcr + i));
3438 __m128i cb_bytes = _mm_loadl_epi64((__m128i*) (pcb + i));
3439 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3440 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3443 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3444 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3445 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3448 __m128i yws = _mm_srli_epi16(yw, 4);
3449 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3450 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3451 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3452 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3453 __m128i rws = _mm_add_epi16(cr0, yws);
3454 __m128i gwt = _mm_add_epi16(cb0, yws);
3455 __m128i bws = _mm_add_epi16(yws, cb1);
3456 __m128i gws = _mm_add_epi16(gwt, cr1);
3459 __m128i rw = _mm_srai_epi16(rws, 4);
3460 __m128i bw = _mm_srai_epi16(bws, 4);
3461 __m128i gw = _mm_srai_epi16(gws, 4);
3464 __m128i brb = _mm_packus_epi16(rw, bw);
3465 __m128i gxb = _mm_packus_epi16(gw, xw);
3468 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3469 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3470 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3471 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3474 _mm_storeu_si128((__m128i*) (out + 0), o0);
3475 _mm_storeu_si128((__m128i*) (out + 16), o1);
3485 uint8x8_t signflip = vdup_n_u8(0x80);
3486 int16x8_t cr_const0 = vdupq_n_s16((
short)(1.40200f * 4096.0f + 0.5f));
3487 int16x8_t cr_const1 = vdupq_n_s16(-(
short)(0.71414f * 4096.0f + 0.5f));
3488 int16x8_t cb_const0 = vdupq_n_s16(-(
short)(0.34414f * 4096.0f + 0.5f));
3489 int16x8_t cb_const1 = vdupq_n_s16((
short)(1.77200f * 4096.0f + 0.5f));
3491 for (; i + 7 < count; i += 8) {
3493 uint8x8_t y_bytes = vld1_u8(y + i);
3494 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3495 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3496 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3497 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3500 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3501 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3502 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3505 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3506 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3507 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3508 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3509 int16x8_t rws = vaddq_s16(yws, cr0);
3510 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3511 int16x8_t bws = vaddq_s16(yws, cb1);
3515 o.val[0] = vqrshrun_n_s16(rws, 4);
3516 o.val[1] = vqrshrun_n_s16(gws, 4);
3517 o.val[2] = vqrshrun_n_s16(bws, 4);
3518 o.val[3] = vdup_n_u8(255);
3527 for (; i < count; ++i) {
3528 int y_fixed = (y[i] << 20) + (1 << 19);
3530 int cr = pcr[i] - 128;
3531 int cb = pcb[i] - 128;
3532 r = y_fixed + cr * stbi__float2fixed(1.40200f);
3533 g = y_fixed + cr * -stbi__float2fixed(0.71414f) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000);
3534 b = y_fixed + cb * stbi__float2fixed(1.77200f);
3538 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3539 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3540 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
3541 out[0] = (stbi_uc)r;
3542 out[1] = (stbi_uc)g;
3543 out[2] = (stbi_uc)b;
3551 static void stbi__setup_jpeg(stbi__jpeg* j)
3553 j->idct_block_kernel = stbi__idct_block;
3554 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3555 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3558 if (stbi__sse2_available()) {
3559 j->idct_block_kernel = stbi__idct_simd;
3560 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3561 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3566 j->idct_block_kernel = stbi__idct_simd;
3567 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3568 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3573 static void stbi__cleanup_jpeg(stbi__jpeg* j)
3575 stbi__free_jpeg_components(j, j->s->img_n, 0);
3580 resample_row_func resample;
3581 stbi_uc* line0, * line1;
3589 static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
3591 unsigned int t = x * y + 128;
3592 return (stbi_uc)((t + (t >> 8)) >> 8);
3595 static stbi_uc* load_jpeg_image(stbi__jpeg* z,
int* out_x,
int* out_y,
int* comp,
int req_comp)
3597 int n, decode_n, is_rgb;
3601 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3604 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3607 n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3609 is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3611 if (z->s->img_n == 3 && n < 3 && !is_rgb)
3614 decode_n = z->s->img_n;
3621 stbi_uc* coutput[4];
3623 stbi__resample res_comp[4];
3625 for (k = 0; k < decode_n; ++k) {
3626 stbi__resample* r = &res_comp[k];
3630 z->img_comp[k].linebuf = (stbi_uc*)stbi__malloc(z->s->img_x + 3);
3631 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3633 r->hs = z->img_h_max / z->img_comp[k].h;
3634 r->vs = z->img_v_max / z->img_comp[k].v;
3635 r->ystep = r->vs >> 1;
3636 r->w_lores = (z->s->img_x + r->hs - 1) / r->hs;
3638 r->line0 = r->line1 = z->img_comp[k].data;
3640 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3641 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3642 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3643 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3644 else r->resample = stbi__resample_row_generic;
3648 output = (stbi_uc*)stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3649 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3652 for (j = 0; j < z->s->img_y; ++j) {
3653 stbi_uc* out = output + n * z->s->img_x * j;
3654 for (k = 0; k < decode_n; ++k) {
3655 stbi__resample* r = &res_comp[k];
3656 int y_bot = r->ystep >= (r->vs >> 1);
3657 coutput[k] = r->resample(z->img_comp[k].linebuf,
3658 y_bot ? r->line1 : r->line0,
3659 y_bot ? r->line0 : r->line1,
3661 if (++r->ystep >= r->vs) {
3663 r->line0 = r->line1;
3664 if (++r->ypos < z->img_comp[k].y)
3665 r->line1 += z->img_comp[k].w2;
3669 stbi_uc* y = coutput[0];
3670 if (z->s->img_n == 3) {
3672 for (i = 0; i < z->s->img_x; ++i) {
3674 out[1] = coutput[1][i];
3675 out[2] = coutput[2][i];
3681 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3684 else if (z->s->img_n == 4) {
3685 if (z->app14_color_transform == 0) {
3686 for (i = 0; i < z->s->img_x; ++i) {
3687 stbi_uc m = coutput[3][i];
3688 out[0] = stbi__blinn_8x8(coutput[0][i], m);
3689 out[1] = stbi__blinn_8x8(coutput[1][i], m);
3690 out[2] = stbi__blinn_8x8(coutput[2][i], m);
3695 else if (z->app14_color_transform == 2) {
3696 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3697 for (i = 0; i < z->s->img_x; ++i) {
3698 stbi_uc m = coutput[3][i];
3699 out[0] = stbi__blinn_8x8(255 - out[0], m);
3700 out[1] = stbi__blinn_8x8(255 - out[1], m);
3701 out[2] = stbi__blinn_8x8(255 - out[2], m);
3706 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3710 for (i = 0; i < z->s->img_x; ++i) {
3711 out[0] = out[1] = out[2] = y[i];
3719 for (i = 0; i < z->s->img_x; ++i)
3720 * out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3722 for (i = 0; i < z->s->img_x; ++i, out += 2) {
3723 out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3728 else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
3729 for (i = 0; i < z->s->img_x; ++i) {
3730 stbi_uc m = coutput[3][i];
3731 stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
3732 stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
3733 stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
3734 out[0] = stbi__compute_y(r, g, b);
3739 else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
3740 for (i = 0; i < z->s->img_x; ++i) {
3741 out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
3747 stbi_uc* y = coutput[0];
3749 for (i = 0; i < z->s->img_x; ++i) out[i] = y[i];
3751 for (i = 0; i < z->s->img_x; ++i)* out++ = y[i], * out++ = 255;
3755 stbi__cleanup_jpeg(z);
3756 *out_x = z->s->img_x;
3757 *out_y = z->s->img_y;
3758 if (comp)* comp = z->s->img_n >= 3 ? 3 : 1;
3763 static void* stbi__jpeg_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
3765 unsigned char* result;
3766 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
3769 stbi__setup_jpeg(j);
3770 result = load_jpeg_image(j, x, y, comp, req_comp);
3775 static int stbi__jpeg_test(stbi__context* s)
3778 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
3780 stbi__setup_jpeg(j);
3781 r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
3787 static int stbi__jpeg_info_raw(stbi__jpeg* j,
int* x,
int* y,
int* comp)
3789 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3793 if (x)* x = j->s->img_x;
3794 if (y)* y = j->s->img_y;
3795 if (comp)* comp = j->s->img_n >= 3 ? 3 : 1;
3799 static int stbi__jpeg_info(stbi__context* s,
int* x,
int* y,
int* comp)
3802 stbi__jpeg* j = (stbi__jpeg*)(stbi__malloc(
sizeof(stbi__jpeg)));
3804 result = stbi__jpeg_info_raw(j, x, y, comp);
3817 #ifndef STBI_NO_ZLIB
3820 #define STBI__ZFAST_BITS 9
3821 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
3827 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3828 stbi__uint16 firstcode[16];
3830 stbi__uint16 firstsymbol[16];
3832 stbi__uint16 value[288];
3835 stbi_inline
static int stbi__bitreverse16(
int n)
3837 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3838 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3839 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3840 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3844 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3846 STBI_ASSERT(bits <= 16);
3849 return stbi__bitreverse16(v) >> (16 - bits);
3852 static int stbi__zbuild_huffman(stbi__zhuffman* z,
const stbi_uc* sizelist,
int num)
3855 int code, next_code[16], sizes[17];
3858 memset(sizes, 0,
sizeof(sizes));
3859 memset(z->fast, 0,
sizeof(z->fast));
3860 for (i = 0; i < num; ++i)
3861 ++sizes[sizelist[i]];
3863 for (i = 1; i < 16; ++i)
3864 if (sizes[i] > (1 << i))
3865 return stbi__err(
"bad sizes",
"Corrupt PNG");
3867 for (i = 1; i < 16; ++i) {
3868 next_code[i] = code;
3869 z->firstcode[i] = (stbi__uint16)code;
3870 z->firstsymbol[i] = (stbi__uint16)k;
3871 code = (code + sizes[i]);
3873 if (code - 1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3874 z->maxcode[i] = code << (16 - i);
3878 z->maxcode[16] = 0x10000;
3879 for (i = 0; i < num; ++i) {
3880 int s = sizelist[i];
3882 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3883 stbi__uint16 fastv = (stbi__uint16)((s << 9) | i);
3884 z->size[c] = (stbi_uc)s;
3885 z->value[c] = (stbi__uint16)i;
3886 if (s <= STBI__ZFAST_BITS) {
3887 int j = stbi__bit_reverse(next_code[s], s);
3888 while (j < (1 << STBI__ZFAST_BITS)) {
3907 stbi_uc* zbuffer, * zbuffer_end;
3909 stbi__uint32 code_buffer;
3916 stbi__zhuffman z_length, z_distance;
3919 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf* z)
3921 if (z->zbuffer >= z->zbuffer_end)
return 0;
3922 return *z->zbuffer++;
3925 static void stbi__fill_bits(stbi__zbuf* z)
3928 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3929 z->code_buffer |= (
unsigned int)stbi__zget8(z) << z->num_bits;
3931 }
while (z->num_bits <= 24);
3934 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf* z,
int n)
3937 if (z->num_bits < n) stbi__fill_bits(z);
3938 k = z->code_buffer & ((1 << n) - 1);
3939 z->code_buffer >>= n;
3944 static int stbi__zhuffman_decode_slowpath(stbi__zbuf* a, stbi__zhuffman* z)
3949 k = stbi__bit_reverse(a->code_buffer, 16);
3950 for (s = STBI__ZFAST_BITS + 1; ; ++s)
3951 if (k < z->maxcode[s])
3953 if (s == 16)
return -1;
3955 b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s];
3956 STBI_ASSERT(z->size[b] == s);
3957 a->code_buffer >>= s;
3962 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf* a, stbi__zhuffman* z)
3965 if (a->num_bits < 16) stbi__fill_bits(a);
3966 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3969 a->code_buffer >>= s;
3973 return stbi__zhuffman_decode_slowpath(a, z);
3976 static int stbi__zexpand(stbi__zbuf* z,
char* zout,
int n)
3979 int cur, limit, old_limit;
3981 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3982 cur = (int)(z->zout - z->zout_start);
3983 limit = old_limit = (int)(z->zout_end - z->zout_start);
3984 while (cur + n > limit)
3986 q = (
char*)STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
3987 STBI_NOTUSED(old_limit);
3988 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
3991 z->zout_end = q + limit;
3995 static const int stbi__zlength_base[31] = {
3996 3,4,5,6,7,8,9,10,11,13,
3997 15,17,19,23,27,31,35,43,51,59,
3998 67,83,99,115,131,163,195,227,258,0,0 };
4000 static const int stbi__zlength_extra[31] =
4001 { 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 };
4003 static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
4004 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0 };
4006 static const int stbi__zdist_extra[32] =
4007 { 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 };
4009 static int stbi__parse_huffman_block(stbi__zbuf* a)
4011 char* zout = a->zout;
4013 int z = stbi__zhuffman_decode(a, &a->z_length);
4015 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4016 if (zout >= a->zout_end) {
4017 if (!stbi__zexpand(a, zout, 1))
return 0;
4030 len = stbi__zlength_base[z];
4031 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
4032 z = stbi__zhuffman_decode(a, &a->z_distance);
4033 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4034 dist = stbi__zdist_base[z];
4035 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
4036 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
4037 if (zout + len > a->zout_end) {
4038 if (!stbi__zexpand(a, zout, len))
return 0;
4041 p = (stbi_uc*)(zout - dist);
4044 if (len) {
do *zout++ = v;
while (--len); }
4047 if (len) {
do *zout++ = *p++;
while (--len); }
4053 static int stbi__compute_huffman_codes(stbi__zbuf* a)
4055 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 };
4056 stbi__zhuffman z_codelength;
4057 stbi_uc lencodes[286 + 32 + 137];
4058 stbi_uc codelength_sizes[19];
4061 int hlit = stbi__zreceive(a, 5) + 257;
4062 int hdist = stbi__zreceive(a, 5) + 1;
4063 int hclen = stbi__zreceive(a, 4) + 4;
4064 int ntot = hlit + hdist;
4066 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4067 for (i = 0; i < hclen; ++i) {
4068 int s = stbi__zreceive(a, 3);
4069 codelength_sizes[length_dezigzag[i]] = (stbi_uc)s;
4071 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
4075 int c = stbi__zhuffman_decode(a, &z_codelength);
4076 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4078 lencodes[n++] = (stbi_uc)c;
4082 c = stbi__zreceive(a, 2) + 3;
4083 if (n == 0)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4084 fill = lencodes[n - 1];
4087 c = stbi__zreceive(a, 3) + 3;
4089 STBI_ASSERT(c == 18);
4090 c = stbi__zreceive(a, 7) + 11;
4092 if (ntot - n < c)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4093 memset(lencodes + n, fill, c);
4097 if (n != ntot)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4098 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
4099 if (!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist))
return 0;
4103 static int stbi__parse_uncompressed_block(stbi__zbuf* a)
4107 if (a->num_bits & 7)
4108 stbi__zreceive(a, a->num_bits & 7);
4111 while (a->num_bits > 0) {
4112 header[k++] = (stbi_uc)(a->code_buffer & 255);
4113 a->code_buffer >>= 8;
4116 STBI_ASSERT(a->num_bits == 0);
4119 header[k++] = stbi__zget8(a);
4120 len = header[1] * 256 + header[0];
4121 nlen = header[3] * 256 + header[2];
4122 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4123 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
4124 if (a->zout + len > a->zout_end)
4125 if (!stbi__zexpand(a, a->zout, len))
return 0;
4126 memcpy(a->zout, a->zbuffer, len);
4132 static int stbi__parse_zlib_header(stbi__zbuf* a)
4134 int cmf = stbi__zget8(a);
4137 int flg = stbi__zget8(a);
4138 if ((cmf * 256 + flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4139 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
4140 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
4145 static const stbi_uc stbi__zdefault_length[288] =
4147 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,
4148 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,
4149 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,
4150 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,
4151 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,
4152 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,
4153 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,
4154 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,
4155 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
4157 static const stbi_uc stbi__zdefault_distance[32] =
4159 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
4174 static int stbi__parse_zlib(stbi__zbuf* a,
int parse_header)
4178 if (!stbi__parse_zlib_header(a))
return 0;
4182 final = stbi__zreceive(a, 1);
4183 type = stbi__zreceive(a, 2);
4185 if (!stbi__parse_uncompressed_block(a))
return 0;
4187 else if (type == 3) {
4193 if (!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, 288))
return 0;
4194 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
4197 if (!stbi__compute_huffman_codes(a))
return 0;
4199 if (!stbi__parse_huffman_block(a))
return 0;
4205 static int stbi__do_zlib(stbi__zbuf* a,
char* obuf,
int olen,
int exp,
int parse_header)
4207 a->zout_start = obuf;
4209 a->zout_end = obuf + olen;
4210 a->z_expandable = exp;
4212 return stbi__parse_zlib(a, parse_header);
4215 STBIDEF
char* stbi_zlib_decode_malloc_guesssize(
const char* buffer,
int len,
int initial_size,
int* outlen)
4218 char* p = (
char*)stbi__malloc(initial_size);
4219 if (p == NULL)
return NULL;
4220 a.zbuffer = (stbi_uc*)buffer;
4221 a.zbuffer_end = (stbi_uc*)buffer + len;
4222 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4223 if (outlen)* outlen = (int)(a.zout - a.zout_start);
4224 return a.zout_start;
4227 STBI_FREE(a.zout_start);
4232 STBIDEF
char* stbi_zlib_decode_malloc(
char const* buffer,
int len,
int* outlen)
4234 return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
4237 STBIDEF
char* stbi_zlib_decode_malloc_guesssize_headerflag(
const char* buffer,
int len,
int initial_size,
int* outlen,
int parse_header)
4240 char* p = (
char*)stbi__malloc(initial_size);
4241 if (p == NULL)
return NULL;
4242 a.zbuffer = (stbi_uc*)buffer;
4243 a.zbuffer_end = (stbi_uc*)buffer + len;
4244 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4245 if (outlen)* outlen = (int)(a.zout - a.zout_start);
4246 return a.zout_start;
4249 STBI_FREE(a.zout_start);
4254 STBIDEF
int stbi_zlib_decode_buffer(
char* obuffer,
int olen,
char const* ibuffer,
int ilen)
4257 a.zbuffer = (stbi_uc*)ibuffer;
4258 a.zbuffer_end = (stbi_uc*)ibuffer + ilen;
4259 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4260 return (
int)(a.zout - a.zout_start);
4265 STBIDEF
char* stbi_zlib_decode_noheader_malloc(
char const* buffer,
int len,
int* outlen)
4268 char* p = (
char*)stbi__malloc(16384);
4269 if (p == NULL)
return NULL;
4270 a.zbuffer = (stbi_uc*)buffer;
4271 a.zbuffer_end = (stbi_uc*)buffer + len;
4272 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4273 if (outlen)* outlen = (int)(a.zout - a.zout_start);
4274 return a.zout_start;
4277 STBI_FREE(a.zout_start);
4282 STBIDEF
int stbi_zlib_decode_noheader_buffer(
char* obuffer,
int olen,
const char* ibuffer,
int ilen)
4285 a.zbuffer = (stbi_uc*)ibuffer;
4286 a.zbuffer_end = (stbi_uc*)ibuffer + ilen;
4287 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4288 return (
int)(a.zout - a.zout_start);
4307 stbi__uint32 length;
4311 static stbi__pngchunk stbi__get_chunk_header(stbi__context* s)
4314 c.length = stbi__get32be(s);
4315 c.type = stbi__get32be(s);
4319 static int stbi__check_png_header(stbi__context* s)
4321 static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4323 for (i = 0; i < 8; ++i)
4324 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
4331 stbi_uc* idata, * expanded, * out;
4347 static stbi_uc first_row_filter[5] =
4356 static int stbi__paeth(
int a,
int b,
int c)
4359 int pa = abs(p - a);
4360 int pb = abs(p - b);
4361 int pc = abs(p - c);
4362 if (pa <= pb && pa <= pc)
return a;
4363 if (pb <= pc)
return b;
4367 static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4370 static 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)
4372 int bytes = (depth == 16 ? 2 : 1);
4373 stbi__context* s = a->s;
4374 stbi__uint32 i, j, stride = x * out_n * bytes;
4375 stbi__uint32 img_len, img_width_bytes;
4377 int img_n = s->img_n;
4379 int output_bytes = out_n * bytes;
4380 int filter_bytes = img_n * bytes;
4383 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1);
4384 a->out = (stbi_uc*)stbi__malloc_mad3(x, y, output_bytes, 0);
4385 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
4387 if (!stbi__mad3sizes_valid(img_n, x, depth, 7))
return stbi__err(
"too large",
"Corrupt PNG");
4388 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4389 img_len = (img_width_bytes + 1) * y;
4394 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4396 for (j = 0; j < y; ++j) {
4397 stbi_uc* cur = a->out + stride * j;
4399 int filter = *raw++;
4402 return stbi__err(
"invalid filter",
"Corrupt PNG");
4405 STBI_ASSERT(img_width_bytes <= x);
4406 cur += x * out_n - img_width_bytes;
4408 width = img_width_bytes;
4410 prior = cur - stride;
4413 if (j == 0) filter = first_row_filter[filter];
4416 for (k = 0; k < filter_bytes; ++k) {
4418 case STBI__F_none: cur[k] = raw[k];
break;
4419 case STBI__F_sub: cur[k] = raw[k];
break;
4420 case STBI__F_up: cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4421 case STBI__F_avg: cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1));
break;
4422 case STBI__F_paeth: cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0, prior[k], 0));
break;
4423 case STBI__F_avg_first: cur[k] = raw[k];
break;
4424 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4435 else if (depth == 16) {
4436 if (img_n != out_n) {
4437 cur[filter_bytes] = 255;
4438 cur[filter_bytes + 1] = 255;
4440 raw += filter_bytes;
4441 cur += output_bytes;
4442 prior += output_bytes;
4451 if (depth < 8 || img_n == out_n) {
4452 int nk = (width - 1) * filter_bytes;
4453 #define STBI__CASE(f) \
4455 for (k=0; k < nk; ++k)
4458 case STBI__F_none: memcpy(cur, raw, nk);
break;
4459 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); }
break;
4460 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4461 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); }
break;
4462 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); }
break;
4463 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); }
break;
4464 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], 0, 0)); }
break;
4470 STBI_ASSERT(img_n + 1 == out_n);
4471 #define STBI__CASE(f) \
4473 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4474 for (k=0; k < filter_bytes; ++k)
4476 STBI__CASE(STBI__F_none) { cur[k] = raw[k]; }
break;
4477 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - output_bytes]); }
break;
4478 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4479 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - output_bytes]) >> 1)); }
break;
4480 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], prior[k], prior[k - output_bytes])); }
break;
4481 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - output_bytes] >> 1)); }
break;
4482 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], 0, 0)); }
break;
4489 cur = a->out + stride * j;
4490 for (i = 0; i < x; ++i, cur += output_bytes) {
4491 cur[filter_bytes + 1] = 255;
4501 for (j = 0; j < y; ++j) {
4502 stbi_uc* cur = a->out + stride * j;
4503 stbi_uc* in = a->out + stride * j + x * out_n - img_width_bytes;
4506 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4515 for (k = x * img_n; k >= 2; k -= 2, ++in) {
4516 *cur++ = scale * ((*in >> 4));
4517 *cur++ = scale * ((*in) & 0x0f);
4519 if (k > 0)* cur++ = scale * ((*in >> 4));
4521 else if (depth == 2) {
4522 for (k = x * img_n; k >= 4; k -= 4, ++in) {
4523 *cur++ = scale * ((*in >> 6));
4524 *cur++ = scale * ((*in >> 4) & 0x03);
4525 *cur++ = scale * ((*in >> 2) & 0x03);
4526 *cur++ = scale * ((*in) & 0x03);
4528 if (k > 0)* cur++ = scale * ((*in >> 6));
4529 if (k > 1)* cur++ = scale * ((*in >> 4) & 0x03);
4530 if (k > 2)* cur++ = scale * ((*in >> 2) & 0x03);
4532 else if (depth == 1) {
4533 for (k = x * img_n; k >= 8; k -= 8, ++in) {
4534 *cur++ = scale * ((*in >> 7));
4535 *cur++ = scale * ((*in >> 6) & 0x01);
4536 *cur++ = scale * ((*in >> 5) & 0x01);
4537 *cur++ = scale * ((*in >> 4) & 0x01);
4538 *cur++ = scale * ((*in >> 3) & 0x01);
4539 *cur++ = scale * ((*in >> 2) & 0x01);
4540 *cur++ = scale * ((*in >> 1) & 0x01);
4541 *cur++ = scale * ((*in) & 0x01);
4543 if (k > 0)* cur++ = scale * ((*in >> 7));
4544 if (k > 1)* cur++ = scale * ((*in >> 6) & 0x01);
4545 if (k > 2)* cur++ = scale * ((*in >> 5) & 0x01);
4546 if (k > 3)* cur++ = scale * ((*in >> 4) & 0x01);
4547 if (k > 4)* cur++ = scale * ((*in >> 3) & 0x01);
4548 if (k > 5)* cur++ = scale * ((*in >> 2) & 0x01);
4549 if (k > 6)* cur++ = scale * ((*in >> 1) & 0x01);
4551 if (img_n != out_n) {
4554 cur = a->out + stride * j;
4556 for (q = x - 1; q >= 0; --q) {
4557 cur[q * 2 + 1] = 255;
4558 cur[q * 2 + 0] = cur[q];
4562 STBI_ASSERT(img_n == 3);
4563 for (q = x - 1; q >= 0; --q) {
4564 cur[q * 4 + 3] = 255;
4565 cur[q * 4 + 2] = cur[q * 3 + 2];
4566 cur[q * 4 + 1] = cur[q * 3 + 1];
4567 cur[q * 4 + 0] = cur[q * 3 + 0];
4573 else if (depth == 16) {
4578 stbi_uc* cur = a->out;
4579 stbi__uint16* cur16 = (stbi__uint16*)cur;
4581 for (i = 0; i < x * y * out_n; ++i, cur16++, cur += 2) {
4582 *cur16 = (cur[0] << 8) | cur[1];
4589 static 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)
4591 int bytes = (depth == 16 ? 2 : 1);
4592 int out_bytes = out_n * bytes;
4596 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4599 final = (stbi_uc*)stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4600 for (p = 0; p < 7; ++p) {
4601 int xorig[] = { 0,4,0,2,0,1,0 };
4602 int yorig[] = { 0,0,4,0,2,0,1 };
4603 int xspc[] = { 8,8,4,4,2,2,1 };
4604 int yspc[] = { 8,8,8,4,4,2,2 };
4607 x = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p];
4608 y = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p];
4610 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4611 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4615 for (j = 0; j < y; ++j) {
4616 for (i = 0; i < x; ++i) {
4617 int out_y = j * yspc[p] + yorig[p];
4618 int out_x = i * xspc[p] + xorig[p];
4619 memcpy(
final + out_y * a->s->img_x * out_bytes + out_x * out_bytes,
4620 a->out + (j * x + i) * out_bytes, out_bytes);
4624 image_data += img_len;
4625 image_data_len -= img_len;
4633 static int stbi__compute_transparency(stbi__png* z, stbi_uc tc[3],
int out_n)
4635 stbi__context* s = z->s;
4636 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4637 stbi_uc* p = z->out;
4641 STBI_ASSERT(out_n == 2 || out_n == 4);
4644 for (i = 0; i < pixel_count; ++i) {
4645 p[1] = (p[0] == tc[0] ? 0 : 255);
4650 for (i = 0; i < pixel_count; ++i) {
4651 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4659 static int stbi__compute_transparency16(stbi__png* z, stbi__uint16 tc[3],
int out_n)
4661 stbi__context* s = z->s;
4662 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4663 stbi__uint16* p = (stbi__uint16*)z->out;
4667 STBI_ASSERT(out_n == 2 || out_n == 4);
4670 for (i = 0; i < pixel_count; ++i) {
4671 p[1] = (p[0] == tc[0] ? 0 : 65535);
4676 for (i = 0; i < pixel_count; ++i) {
4677 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4685 static int stbi__expand_png_palette(stbi__png* a, stbi_uc* palette,
int len,
int pal_img_n)
4687 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4688 stbi_uc* p, * temp_out, * orig = a->out;
4690 p = (stbi_uc*)stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4691 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4696 if (pal_img_n == 3) {
4697 for (i = 0; i < pixel_count; ++i) {
4698 int n = orig[i] * 4;
4700 p[1] = palette[n + 1];
4701 p[2] = palette[n + 2];
4706 for (i = 0; i < pixel_count; ++i) {
4707 int n = orig[i] * 4;
4709 p[1] = palette[n + 1];
4710 p[2] = palette[n + 2];
4711 p[3] = palette[n + 3];
4723 static int stbi__unpremultiply_on_load = 0;
4724 static int stbi__de_iphone_flag = 0;
4726 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply)
4728 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4731 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert)
4733 stbi__de_iphone_flag = flag_true_if_should_convert;
4736 static void stbi__de_iphone(stbi__png* z)
4738 stbi__context* s = z->s;
4739 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4740 stbi_uc* p = z->out;
4742 if (s->img_out_n == 3) {
4743 for (i = 0; i < pixel_count; ++i) {
4751 STBI_ASSERT(s->img_out_n == 4);
4752 if (stbi__unpremultiply_on_load) {
4754 for (i = 0; i < pixel_count; ++i) {
4758 stbi_uc half = a / 2;
4759 p[0] = (p[2] * 255 + half) / a;
4760 p[1] = (p[1] * 255 + half) / a;
4761 p[2] = (t * 255 + half) / a;
4772 for (i = 0; i < pixel_count; ++i) {
4782 #define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
4784 static int stbi__parse_png_file(stbi__png* z,
int scan,
int req_comp)
4786 stbi_uc palette[1024], pal_img_n = 0;
4787 stbi_uc has_trans = 0, tc[3];
4788 stbi__uint16 tc16[3];
4789 stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0;
4790 int first = 1, k, interlace = 0, color = 0, is_iphone = 0;
4791 stbi__context* s = z->s;
4797 if (!stbi__check_png_header(s))
return 0;
4799 if (scan == STBI__SCAN_type)
return 1;
4802 stbi__pngchunk c = stbi__get_chunk_header(s);
4804 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4806 stbi__skip(s, c.length);
4808 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4810 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4812 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4813 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4814 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4815 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");
4816 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4817 if (color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4818 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4819 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4820 filter = stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4821 interlace = stbi__get8(s);
if (interlace > 1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4822 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4824 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4825 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4826 if (scan == STBI__SCAN_header)
return 1;
4832 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4838 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4839 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4840 if (c.length > 256 * 3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4841 pal_len = c.length / 3;
4842 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4843 for (i = 0; i < pal_len; ++i) {
4844 palette[i * 4 + 0] = stbi__get8(s);
4845 palette[i * 4 + 1] = stbi__get8(s);
4846 palette[i * 4 + 2] = stbi__get8(s);
4847 palette[i * 4 + 3] = 255;
4852 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4853 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4854 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4856 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4857 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4858 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4860 for (i = 0; i < c.length; ++i)
4861 palette[i * 4 + 3] = stbi__get8(s);
4864 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4865 if (c.length != (stbi__uint32)s->img_n * 2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4867 if (z->depth == 16) {
4868 for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s);
4871 for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth];
4877 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4878 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4879 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4880 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4881 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
4882 if (ioff + c.length > idata_limit) {
4883 stbi__uint32 idata_limit_old = idata_limit;
4885 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4886 while (ioff + c.length > idata_limit)
4888 STBI_NOTUSED(idata_limit_old);
4889 p = (stbi_uc*)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4892 if (!stbi__getn(s, z->idata + ioff, c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4897 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4898 stbi__uint32 raw_len, bpl;
4899 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4900 if (scan != STBI__SCAN_load)
return 1;
4901 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4903 bpl = (s->img_x * z->depth + 7) / 8;
4904 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4905 z->expanded = (stbi_uc*)stbi_zlib_decode_malloc_guesssize_headerflag((
char*)z->idata, ioff, raw_len, (
int*)& raw_len, !is_iphone);
4906 if (z->expanded == NULL)
return 0;
4907 STBI_FREE(z->idata); z->idata = NULL;
4908 if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans)
4909 s->img_out_n = s->img_n + 1;
4911 s->img_out_n = s->img_n;
4912 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace))
return 0;
4914 if (z->depth == 16) {
4915 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
return 0;
4918 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4921 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4925 s->img_n = pal_img_n;
4926 s->img_out_n = pal_img_n;
4927 if (req_comp >= 3) s->img_out_n = req_comp;
4928 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4931 else if (has_trans) {
4935 STBI_FREE(z->expanded); z->expanded = NULL;
4941 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4942 if ((c.type & (1 << 29)) == 0) {
4943 #ifndef STBI_NO_FAILURE_STRINGS
4945 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4946 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4947 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4948 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4949 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4951 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4953 stbi__skip(s, c.length);
4961 static void* stbi__do_png(stbi__png* p,
int* x,
int* y,
int* n,
int req_comp, stbi__result_info* ri)
4963 void* result = NULL;
4964 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4965 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4967 ri->bits_per_channel = 8;
4969 ri->bits_per_channel = p->depth;
4972 if (req_comp && req_comp != p->s->img_out_n) {
4973 if (ri->bits_per_channel == 8)
4974 result = stbi__convert_format((
unsigned char*)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4976 result = stbi__convert_format16((stbi__uint16*)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4977 p->s->img_out_n = req_comp;
4978 if (result == NULL)
return result;
4982 if (n)* n = p->s->img_n;
4984 STBI_FREE(p->out); p->out = NULL;
4985 STBI_FREE(p->expanded); p->expanded = NULL;
4986 STBI_FREE(p->idata); p->idata = NULL;
4991 static void* stbi__png_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
4995 return stbi__do_png(&p, x, y, comp, req_comp, ri);
4998 static int stbi__png_test(stbi__context* s)
5001 r = stbi__check_png_header(s);
5006 static int stbi__png_info_raw(stbi__png* p,
int* x,
int* y,
int* comp)
5008 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
5012 if (x)* x = p->s->img_x;
5013 if (y)* y = p->s->img_y;
5014 if (comp)* comp = p->s->img_n;
5018 static int stbi__png_info(stbi__context* s,
int* x,
int* y,
int* comp)
5022 return stbi__png_info_raw(&p, x, y, comp);
5025 static int stbi__png_is16(stbi__context* s)
5029 if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5031 if (p.depth != 16) {
5042 static int stbi__bmp_test_raw(stbi__context* s)
5046 if (stbi__get8(s) !=
'B')
return 0;
5047 if (stbi__get8(s) !=
'M')
return 0;
5052 sz = stbi__get32le(s);
5053 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5057 static int stbi__bmp_test(stbi__context* s)
5059 int r = stbi__bmp_test_raw(s);
5066 static int stbi__high_bit(
unsigned int z)
5069 if (z == 0)
return -1;
5070 if (z >= 0x10000) n += 16, z >>= 16;
5071 if (z >= 0x00100) n += 8, z >>= 8;
5072 if (z >= 0x00010) n += 4, z >>= 4;
5073 if (z >= 0x00004) n += 2, z >>= 2;
5074 if (z >= 0x00002) n += 1, z >>= 1;
5078 static int stbi__bitcount(
unsigned int a)
5080 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
5081 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
5082 a = (a + (a >> 4)) & 0x0f0f0f0f;
5084 a = (a + (a >> 16));
5091 static int stbi__shiftsigned(
int v,
int shift,
int bits)
5093 static unsigned int mul_table[9] = {
5095 0xff, 0x55, 0x49, 0x11,
5096 0x21, 0x41, 0x81, 0x01,
5098 static unsigned int shift_table[9] = {
5105 STBI_ASSERT(v >= 0 && v < 256);
5107 STBI_ASSERT(bits >= 0 && bits <= 8);
5108 return (
int)((unsigned)v * mul_table[bits]) >> shift_table[bits];
5113 int bpp, offset, hsz;
5114 unsigned int mr, mg, mb, ma, all_a;
5117 static void* stbi__bmp_parse_header(stbi__context* s, stbi__bmp_data* info)
5120 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5124 info->offset = stbi__get32le(s);
5125 info->hsz = hsz = stbi__get32le(s);
5126 info->mr = info->mg = info->mb = info->ma = 0;
5128 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5130 s->img_x = stbi__get16le(s);
5131 s->img_y = stbi__get16le(s);
5134 s->img_x = stbi__get32le(s);
5135 s->img_y = stbi__get32le(s);
5137 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5138 info->bpp = stbi__get16le(s);
5140 int compress = stbi__get32le(s);
5141 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5147 if (hsz == 40 || hsz == 56) {
5154 if (info->bpp == 16 || info->bpp == 32) {
5155 if (compress == 0) {
5156 if (info->bpp == 32) {
5157 info->mr = 0xffu << 16;
5158 info->mg = 0xffu << 8;
5159 info->mb = 0xffu << 0;
5160 info->ma = 0xffu << 24;
5164 info->mr = 31u << 10;
5165 info->mg = 31u << 5;
5166 info->mb = 31u << 0;
5169 else if (compress == 3) {
5170 info->mr = stbi__get32le(s);
5171 info->mg = stbi__get32le(s);
5172 info->mb = stbi__get32le(s);
5174 if (info->mr == info->mg && info->mg == info->mb) {
5176 return stbi__errpuc(
"bad BMP",
"bad BMP");
5180 return stbi__errpuc(
"bad BMP",
"bad BMP");
5185 if (hsz != 108 && hsz != 124)
5186 return stbi__errpuc(
"bad BMP",
"bad BMP");
5187 info->mr = stbi__get32le(s);
5188 info->mg = stbi__get32le(s);
5189 info->mb = stbi__get32le(s);
5190 info->ma = stbi__get32le(s);
5192 for (i = 0; i < 12; ++i)
5206 static void* stbi__bmp_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
5209 unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a;
5210 stbi_uc pal[256][4];
5211 int psize = 0, i, j, width;
5212 int flip_vertically, pad, target;
5213 stbi__bmp_data info;
5217 if (stbi__bmp_parse_header(s, &info) == NULL)
5220 flip_vertically = ((int)s->img_y) > 0;
5221 s->img_y = abs((
int)s->img_y);
5229 if (info.hsz == 12) {
5231 psize = (info.offset - 14 - 24) / 3;
5235 psize = (info.offset - 14 - info.hsz) >> 2;
5238 s->img_n = ma ? 4 : 3;
5239 if (req_comp && req_comp >= 3)
5245 if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5246 return stbi__errpuc(
"too large",
"Corrupt BMP");
5248 out = (stbi_uc*)stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5249 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5250 if (info.bpp < 16) {
5252 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
5253 for (i = 0; i < psize; ++i) {
5254 pal[i][2] = stbi__get8(s);
5255 pal[i][1] = stbi__get8(s);
5256 pal[i][0] = stbi__get8(s);
5257 if (info.hsz != 12) stbi__get8(s);
5260 stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5261 if (info.bpp == 1) width = (s->img_x + 7) >> 3;
5262 else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5263 else if (info.bpp == 8) width = s->img_x;
5264 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
5266 if (info.bpp == 1) {
5267 for (j = 0; j < (int)s->img_y; ++j) {
5268 int bit_offset = 7, v = stbi__get8(s);
5269 for (i = 0; i < (int)s->img_x; ++i) {
5270 int color = (v >> bit_offset) & 0x1;
5271 out[z++] = pal[color][0];
5272 out[z++] = pal[color][1];
5273 out[z++] = pal[color][2];
5274 if ((--bit_offset) < 0) {
5283 for (j = 0; j < (int)s->img_y; ++j) {
5284 for (i = 0; i < (int)s->img_x; i += 2) {
5285 int v = stbi__get8(s), v2 = 0;
5286 if (info.bpp == 4) {
5290 out[z++] = pal[v][0];
5291 out[z++] = pal[v][1];
5292 out[z++] = pal[v][2];
5293 if (target == 4) out[z++] = 255;
5294 if (i + 1 == (
int)s->img_x)
break;
5295 v = (info.bpp == 8) ? stbi__get8(s) : v2;
5296 out[z++] = pal[v][0];
5297 out[z++] = pal[v][1];
5298 out[z++] = pal[v][2];
5299 if (target == 4) out[z++] = 255;
5306 int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0;
5309 stbi__skip(s, info.offset - 14 - info.hsz);
5310 if (info.bpp == 24) width = 3 * s->img_x;
5311 else if (info.bpp == 16) width = 2 * s->img_x;
5314 if (info.bpp == 24) {
5317 else if (info.bpp == 32) {
5318 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5322 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5324 rshift = stbi__high_bit(mr) - 7; rcount = stbi__bitcount(mr);
5325 gshift = stbi__high_bit(mg) - 7; gcount = stbi__bitcount(mg);
5326 bshift = stbi__high_bit(mb) - 7; bcount = stbi__bitcount(mb);
5327 ashift = stbi__high_bit(ma) - 7; acount = stbi__bitcount(ma);
5329 for (j = 0; j < (int)s->img_y; ++j) {
5331 for (i = 0; i < (int)s->img_x; ++i) {
5333 out[z + 2] = stbi__get8(s);
5334 out[z + 1] = stbi__get8(s);
5335 out[z + 0] = stbi__get8(s);
5337 a = (easy == 2 ? stbi__get8(s) : 255);
5339 if (target == 4) out[z++] = a;
5344 for (i = 0; i < (int)s->img_x; ++i) {
5345 stbi__uint32 v = (bpp == 16 ? (stbi__uint32)stbi__get16le(s) : stbi__get32le(s));
5347 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5348 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5349 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5350 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5352 if (target == 4) out[z++] = STBI__BYTECAST(a);
5360 if (target == 4 && all_a == 0)
5361 for (i = 4 * s->img_x * s->img_y - 1; i >= 0; i -= 4)
5364 if (flip_vertically) {
5366 for (j = 0; j < (int)s->img_y >> 1; ++j) {
5367 stbi_uc* p1 = out + j * s->img_x * target;
5368 stbi_uc* p2 = out + (s->img_y - 1 - j) * s->img_x * target;
5369 for (i = 0; i < (int)s->img_x * target; ++i) {
5370 t = p1[i], p1[i] = p2[i], p2[i] = t;
5375 if (req_comp && req_comp != target) {
5376 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
5377 if (out == NULL)
return out;
5382 if (comp)* comp = s->img_n;
5391 static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
5394 if (is_rgb16)* is_rgb16 = 0;
5395 switch (bits_per_pixel) {
5396 case 8:
return STBI_grey;
5397 case 16:
if (is_grey)
return STBI_grey_alpha;
5399 case 15:
if (is_rgb16) * is_rgb16 = 1;
5402 case 32:
return bits_per_pixel / 8;
5407 static int stbi__tga_info(stbi__context* s,
int* x,
int* y,
int* comp)
5409 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5410 int sz, tga_colormap_type;
5412 tga_colormap_type = stbi__get8(s);
5413 if (tga_colormap_type > 1) {
5417 tga_image_type = stbi__get8(s);
5418 if (tga_colormap_type == 1) {
5419 if (tga_image_type != 1 && tga_image_type != 9) {
5425 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) {
5430 tga_colormap_bpp = sz;
5433 if ((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11)) {
5438 tga_colormap_bpp = 0;
5440 tga_w = stbi__get16le(s);
5445 tga_h = stbi__get16le(s);
5450 tga_bits_per_pixel = stbi__get8(s);
5452 if (tga_colormap_bpp != 0) {
5453 if ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5459 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5462 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5470 if (comp)* comp = tga_comp;
5474 static int stbi__tga_test(stbi__context* s)
5477 int sz, tga_color_type;
5479 tga_color_type = stbi__get8(s);
5480 if (tga_color_type > 1)
goto errorEnd;
5482 if (tga_color_type == 1) {
5483 if (sz != 1 && sz != 9)
goto errorEnd;
5486 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
goto errorEnd;
5490 if ((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11))
goto errorEnd;
5493 if (stbi__get16le(s) < 1)
goto errorEnd;
5494 if (stbi__get16le(s) < 1)
goto errorEnd;
5496 if ((tga_color_type == 1) && (sz != 8) && (sz != 16))
goto errorEnd;
5497 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
goto errorEnd;
5507 static void stbi__tga_read_rgb16(stbi__context* s, stbi_uc* out)
5509 stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5510 stbi__uint16 fiveBitMask = 31;
5512 int r = (px >> 10) & fiveBitMask;
5513 int g = (px >> 5) & fiveBitMask;
5514 int b = px & fiveBitMask;
5516 out[0] = (stbi_uc)((r * 255) / 31);
5517 out[1] = (stbi_uc)((g * 255) / 31);
5518 out[2] = (stbi_uc)((b * 255) / 31);
5526 static void* stbi__tga_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
5529 int tga_offset = stbi__get8(s);
5530 int tga_indexed = stbi__get8(s);
5531 int tga_image_type = stbi__get8(s);
5533 int tga_palette_start = stbi__get16le(s);
5534 int tga_palette_len = stbi__get16le(s);
5535 int tga_palette_bits = stbi__get8(s);
5536 int tga_x_origin = stbi__get16le(s);
5537 int tga_y_origin = stbi__get16le(s);
5538 int tga_width = stbi__get16le(s);
5539 int tga_height = stbi__get16le(s);
5540 int tga_bits_per_pixel = stbi__get8(s);
5541 int tga_comp, tga_rgb16 = 0;
5542 int tga_inverted = stbi__get8(s);
5545 unsigned char* tga_data;
5546 unsigned char* tga_palette = NULL;
5548 unsigned char raw_data[4] = { 0 };
5550 int RLE_repeating = 0;
5551 int read_next_pixel = 1;
5555 if (tga_image_type >= 8)
5557 tga_image_type -= 8;
5560 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5563 if (tga_indexed) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5564 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5567 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5572 if (comp)* comp = tga_comp;
5574 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5575 return stbi__errpuc(
"too large",
"Corrupt TGA");
5577 tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5578 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
5581 stbi__skip(s, tga_offset);
5583 if (!tga_indexed && !tga_is_RLE && !tga_rgb16) {
5584 for (i = 0; i < tga_height; ++i) {
5585 int row = tga_inverted ? tga_height - i - 1 : i;
5586 stbi_uc* tga_row = tga_data + row * tga_width * tga_comp;
5587 stbi__getn(s, tga_row, tga_width * tga_comp);
5595 stbi__skip(s, tga_palette_start);
5597 tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5599 STBI_FREE(tga_data);
5600 return stbi__errpuc(
"outofmem",
"Out of memory");
5603 stbi_uc* pal_entry = tga_palette;
5604 STBI_ASSERT(tga_comp == STBI_rgb);
5605 for (i = 0; i < tga_palette_len; ++i) {
5606 stbi__tga_read_rgb16(s, pal_entry);
5607 pal_entry += tga_comp;
5610 else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5611 STBI_FREE(tga_data);
5612 STBI_FREE(tga_palette);
5613 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5617 for (i = 0; i < tga_width * tga_height; ++i)
5625 int RLE_cmd = stbi__get8(s);
5626 RLE_count = 1 + (RLE_cmd & 127);
5627 RLE_repeating = RLE_cmd >> 7;
5628 read_next_pixel = 1;
5630 else if (!RLE_repeating)
5632 read_next_pixel = 1;
5637 read_next_pixel = 1;
5640 if (read_next_pixel)
5646 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5647 if (pal_idx >= tga_palette_len) {
5651 pal_idx *= tga_comp;
5652 for (j = 0; j < tga_comp; ++j) {
5653 raw_data[j] = tga_palette[pal_idx + j];
5656 else if (tga_rgb16) {
5657 STBI_ASSERT(tga_comp == STBI_rgb);
5658 stbi__tga_read_rgb16(s, raw_data);
5662 for (j = 0; j < tga_comp; ++j) {
5663 raw_data[j] = stbi__get8(s);
5667 read_next_pixel = 0;
5671 for (j = 0; j < tga_comp; ++j)
5672 tga_data[i * tga_comp + j] = raw_data[j];
5680 for (j = 0; j * 2 < tga_height; ++j)
5682 int index1 = j * tga_width * tga_comp;
5683 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5684 for (i = tga_width * tga_comp; i > 0; --i)
5686 unsigned char temp = tga_data[index1];
5687 tga_data[index1] = tga_data[index2];
5688 tga_data[index2] = temp;
5695 if (tga_palette != NULL)
5697 STBI_FREE(tga_palette);
5702 if (tga_comp >= 3 && !tga_rgb16)
5704 unsigned char* tga_pixel = tga_data;
5705 for (i = 0; i < tga_width * tga_height; ++i)
5707 unsigned char temp = tga_pixel[0];
5708 tga_pixel[0] = tga_pixel[2];
5709 tga_pixel[2] = temp;
5710 tga_pixel += tga_comp;
5715 if (req_comp && req_comp != tga_comp)
5716 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5720 tga_palette_start = tga_palette_len = tga_palette_bits =
5721 tga_x_origin = tga_y_origin = 0;
5731 static int stbi__psd_test(stbi__context* s)
5733 int r = (stbi__get32be(s) == 0x38425053);
5738 static int stbi__psd_decode_rle(stbi__context* s, stbi_uc* p,
int pixelCount)
5740 int count, nleft, len;
5743 while ((nleft = pixelCount - count) > 0) {
5744 len = stbi__get8(s);
5748 else if (len < 128) {
5751 if (len > nleft)
return 0;
5759 else if (len > 128) {
5764 if (len > nleft)
return 0;
5765 val = stbi__get8(s);
5778 static void* stbi__psd_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri,
int bpc)
5781 int channelCount, compression;
5789 if (stbi__get32be(s) != 0x38425053)
5790 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5793 if (stbi__get16be(s) != 1)
5794 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5800 channelCount = stbi__get16be(s);
5801 if (channelCount < 0 || channelCount > 16)
5802 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5805 h = stbi__get32be(s);
5806 w = stbi__get32be(s);
5809 bitdepth = stbi__get16be(s);
5810 if (bitdepth != 8 && bitdepth != 16)
5811 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
5823 if (stbi__get16be(s) != 3)
5824 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5827 stbi__skip(s, stbi__get32be(s));
5830 stbi__skip(s, stbi__get32be(s));
5833 stbi__skip(s, stbi__get32be(s));
5839 compression = stbi__get16be(s);
5840 if (compression > 1)
5841 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5844 if (!stbi__mad3sizes_valid(4, w, h, 0))
5845 return stbi__errpuc(
"too large",
"Corrupt PSD");
5849 if (!compression && bitdepth == 16 && bpc == 16) {
5850 out = (stbi_uc*)stbi__malloc_mad3(8, w, h, 0);
5851 ri->bits_per_channel = 16;
5854 out = (stbi_uc*)stbi__malloc(4 * w * h);
5856 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5874 stbi__skip(s, h * channelCount * 2);
5877 for (channel = 0; channel < 4; channel++) {
5881 if (channel >= channelCount) {
5883 for (i = 0; i < pixelCount; i++, p += 4)
5884 * p = (channel == 3 ? 255 : 0);
5888 if (!stbi__psd_decode_rle(s, p, pixelCount)) {
5890 return stbi__errpuc(
"corrupt",
"bad RLE data");
5901 for (channel = 0; channel < 4; channel++) {
5902 if (channel >= channelCount) {
5904 if (bitdepth == 16 && bpc == 16) {
5905 stbi__uint16* q = ((stbi__uint16*)out) + channel;
5906 stbi__uint16 val = channel == 3 ? 65535 : 0;
5907 for (i = 0; i < pixelCount; i++, q += 4)
5911 stbi_uc* p = out + channel;
5912 stbi_uc val = channel == 3 ? 255 : 0;
5913 for (i = 0; i < pixelCount; i++, p += 4)
5918 if (ri->bits_per_channel == 16) {
5919 stbi__uint16* q = ((stbi__uint16*)out) + channel;
5920 for (i = 0; i < pixelCount; i++, q += 4)
5921 * q = (stbi__uint16)stbi__get16be(s);
5924 stbi_uc* p = out + channel;
5925 if (bitdepth == 16) {
5926 for (i = 0; i < pixelCount; i++, p += 4)
5927 * p = (stbi_uc)(stbi__get16be(s) >> 8);
5930 for (i = 0; i < pixelCount; i++, p += 4)
5931 * p = stbi__get8(s);
5939 if (channelCount >= 4) {
5940 if (ri->bits_per_channel == 16) {
5941 for (i = 0; i < w * h; ++i) {
5942 stbi__uint16* pixel = (stbi__uint16*)out + 4 * i;
5943 if (pixel[3] != 0 && pixel[3] != 65535) {
5944 float a = pixel[3] / 65535.0f;
5945 float ra = 1.0f / a;
5946 float inv_a = 65535.0f * (1 - ra);
5947 pixel[0] = (stbi__uint16)(pixel[0] * ra + inv_a);
5948 pixel[1] = (stbi__uint16)(pixel[1] * ra + inv_a);
5949 pixel[2] = (stbi__uint16)(pixel[2] * ra + inv_a);
5954 for (i = 0; i < w * h; ++i) {
5955 unsigned char* pixel = out + 4 * i;
5956 if (pixel[3] != 0 && pixel[3] != 255) {
5957 float a = pixel[3] / 255.0f;
5958 float ra = 1.0f / a;
5959 float inv_a = 255.0f * (1 - ra);
5960 pixel[0] = (
unsigned char)(pixel[0] * ra + inv_a);
5961 pixel[1] = (
unsigned char)(pixel[1] * ra + inv_a);
5962 pixel[2] = (
unsigned char)(pixel[2] * ra + inv_a);
5969 if (req_comp && req_comp != 4) {
5970 if (ri->bits_per_channel == 16)
5971 out = (stbi_uc*)stbi__convert_format16((stbi__uint16*)out, 4, req_comp, w, h);
5973 out = stbi__convert_format(out, 4, req_comp, w, h);
5974 if (out == NULL)
return out;
5977 if (comp)* comp = 4;
5993 static int stbi__pic_is4(stbi__context* s,
const char* str)
5996 for (i = 0; i < 4; ++i)
5997 if (stbi__get8(s) != (stbi_uc)str[i])
6003 static int stbi__pic_test_core(stbi__context* s)
6007 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
6010 for (i = 0; i < 84; ++i)
6013 if (!stbi__pic_is4(s,
"PICT"))
6021 stbi_uc size, type, channel;
6024 static stbi_uc* stbi__readval(stbi__context* s,
int channel, stbi_uc* dest)
6028 for (i = 0; i < 4; ++i, mask >>= 1) {
6029 if (channel & mask) {
6030 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
6031 dest[i] = stbi__get8(s);
6038 static void stbi__copyval(
int channel, stbi_uc* dest,
const stbi_uc* src)
6042 for (i = 0; i < 4; ++i, mask >>= 1)
6047 static stbi_uc* stbi__pic_load_core(stbi__context* s,
int width,
int height,
int* comp, stbi_uc* result)
6049 int act_comp = 0, num_packets = 0, y, chained;
6050 stbi__pic_packet packets[10];
6055 stbi__pic_packet* packet;
6057 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
6058 return stbi__errpuc(
"bad format",
"too many packets");
6060 packet = &packets[num_packets++];
6062 chained = stbi__get8(s);
6063 packet->size = stbi__get8(s);
6064 packet->type = stbi__get8(s);
6065 packet->channel = stbi__get8(s);
6067 act_comp |= packet->channel;
6069 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
6070 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
6073 *comp = (act_comp & 0x10 ? 4 : 3);
6075 for (y = 0; y < height; ++y) {
6078 for (packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
6079 stbi__pic_packet* packet = &packets[packet_idx];
6080 stbi_uc* dest = result + y * width * 4;
6082 switch (packet->type) {
6084 return stbi__errpuc(
"bad format",
"packet has bad compression type");
6089 for (x = 0; x < width; ++x, dest += 4)
6090 if (!stbi__readval(s, packet->channel, dest))
6097 int left = width, i;
6100 stbi_uc count, value[4];
6102 count = stbi__get8(s);
6103 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6106 count = (stbi_uc)left;
6108 if (!stbi__readval(s, packet->channel, value))
return 0;
6110 for (i = 0; i < count; ++i, dest += 4)
6111 stbi__copyval(packet->channel, dest, value);
6120 int count = stbi__get8(s), i;
6121 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6127 count = stbi__get16be(s);
6131 return stbi__errpuc(
"bad file",
"scanline overrun");
6133 if (!stbi__readval(s, packet->channel, value))
6136 for (i = 0; i < count; ++i, dest += 4)
6137 stbi__copyval(packet->channel, dest, value);
6141 if (count > left)
return stbi__errpuc(
"bad file",
"scanline overrun");
6143 for (i = 0; i < count; ++i, dest += 4)
6144 if (!stbi__readval(s, packet->channel, dest))
6158 static void* stbi__pic_load(stbi__context* s,
int* px,
int* py,
int* comp,
int req_comp, stbi__result_info* ri)
6161 int i, x, y, internal_comp;
6164 if (!comp) comp = &internal_comp;
6166 for (i = 0; i < 92; ++i)
6169 x = stbi__get16be(s);
6170 y = stbi__get16be(s);
6171 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
6172 if (!stbi__mad3sizes_valid(x, y, 4, 0))
return stbi__errpuc(
"too large",
"PIC image too large to decode");
6179 result = (stbi_uc*)stbi__malloc_mad3(x, y, 4, 0);
6180 memset(result, 0xff, x * y * 4);
6182 if (!stbi__pic_load_core(s, x, y, comp, result)) {
6188 if (req_comp == 0) req_comp = *comp;
6189 result = stbi__convert_format(result, 4, req_comp, x, y);
6194 static int stbi__pic_test(stbi__context* s)
6196 int r = stbi__pic_test_core(s);
6217 stbi_uc* background;
6219 int flags, bgindex, ratio, transparent, eflags;
6220 stbi_uc pal[256][4];
6221 stbi_uc lpal[256][4];
6222 stbi__gif_lzw codes[8192];
6223 stbi_uc* color_table;
6226 int start_x, start_y;
6233 static int stbi__gif_test_raw(stbi__context* s)
6236 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
6238 if (sz !=
'9' && sz !=
'7')
return 0;
6239 if (stbi__get8(s) !=
'a')
return 0;
6243 static int stbi__gif_test(stbi__context* s)
6245 int r = stbi__gif_test_raw(s);
6250 static void stbi__gif_parse_colortable(stbi__context* s, stbi_uc pal[256][4],
int num_entries,
int transp)
6253 for (i = 0; i < num_entries; ++i) {
6254 pal[i][2] = stbi__get8(s);
6255 pal[i][1] = stbi__get8(s);
6256 pal[i][0] = stbi__get8(s);
6257 pal[i][3] = transp == i ? 0 : 255;
6261 static int stbi__gif_header(stbi__context* s, stbi__gif* g,
int* comp,
int is_info)
6264 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
6265 return stbi__err(
"not GIF",
"Corrupt GIF");
6267 version = stbi__get8(s);
6268 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
6269 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
6271 stbi__g_failure_reason =
"";
6272 g->w = stbi__get16le(s);
6273 g->h = stbi__get16le(s);
6274 g->flags = stbi__get8(s);
6275 g->bgindex = stbi__get8(s);
6276 g->ratio = stbi__get8(s);
6277 g->transparent = -1;
6279 if (comp != 0)* comp = 4;
6281 if (is_info)
return 1;
6283 if (g->flags & 0x80)
6284 stbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1);
6289 static int stbi__gif_info_raw(stbi__context* s,
int* x,
int* y,
int* comp)
6291 stbi__gif* g = (stbi__gif*)stbi__malloc(
sizeof(stbi__gif));
6292 if (!stbi__gif_header(s, g, comp, 1)) {
6303 static void stbi__out_gif_code(stbi__gif* g, stbi__uint16 code)
6310 if (g->codes[code].prefix >= 0)
6311 stbi__out_gif_code(g, g->codes[code].prefix);
6313 if (g->cur_y >= g->max_y)
return;
6315 idx = g->cur_x + g->cur_y;
6317 g->history[idx / 4] = 1;
6319 c = &g->color_table[g->codes[code].suffix * 4];
6328 if (g->cur_x >= g->max_x) {
6329 g->cur_x = g->start_x;
6330 g->cur_y += g->step;
6332 while (g->cur_y >= g->max_y && g->parse > 0) {
6333 g->step = (1 << g->parse) * g->line_size;
6334 g->cur_y = g->start_y + (g->step >> 1);
6340 static stbi_uc* stbi__process_gif_raster(stbi__context* s, stbi__gif* g)
6343 stbi__int32 len, init_code;
6345 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6348 lzw_cs = stbi__get8(s);
6349 if (lzw_cs > 12)
return NULL;
6350 clear = 1 << lzw_cs;
6352 codesize = lzw_cs + 1;
6353 codemask = (1 << codesize) - 1;
6356 for (init_code = 0; init_code < clear; init_code++) {
6357 g->codes[init_code].prefix = -1;
6358 g->codes[init_code].first = (stbi_uc)init_code;
6359 g->codes[init_code].suffix = (stbi_uc)init_code;
6368 if (valid_bits < codesize) {
6370 len = stbi__get8(s);
6375 bits |= (stbi__int32)stbi__get8(s) << valid_bits;
6379 stbi__int32 code = bits & codemask;
6381 valid_bits -= codesize;
6383 if (code == clear) {
6384 codesize = lzw_cs + 1;
6385 codemask = (1 << codesize) - 1;
6390 else if (code == clear + 1) {
6392 while ((len = stbi__get8(s)) > 0)
6396 else if (code <= avail) {
6398 return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6402 p = &g->codes[avail++];
6404 return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6407 p->prefix = (stbi__int16)oldcode;
6408 p->first = g->codes[oldcode].first;
6409 p->suffix = (code == avail) ? p->first : g->codes[code].first;
6411 else if (code == avail)
6412 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6414 stbi__out_gif_code(g, (stbi__uint16)code);
6416 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6418 codemask = (1 << codesize) - 1;
6424 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6432 static stbi_uc* stbi__gif_load_next(stbi__context* s, stbi__gif* g,
int* comp,
int req_comp, stbi_uc* two_back)
6442 if (!stbi__gif_header(s, g, comp, 0))
return 0;
6443 g->out = (stbi_uc*)stbi__malloc(4 * g->w * g->h);
6444 g->background = (stbi_uc*)stbi__malloc(4 * g->w * g->h);
6445 g->history = (stbi_uc*)stbi__malloc(g->w * g->h);
6446 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
6451 memset(g->out, 0x00, 4 * g->w * g->h);
6452 memset(g->background, 0x00, 4 * g->w * g->h);
6453 memset(g->history, 0x00, g->w * g->h);
6458 dispose = (g->eflags & 0x1C) >> 2;
6459 pcount = g->w * g->h;
6461 if ((dispose == 3) && (two_back == 0)) {
6466 for (piv = 0; piv < pcount; ++piv) {
6467 if (g->history[piv]) {
6468 memcpy(&g->out[piv * 4], &two_back[piv * 4], 4);
6472 else if (dispose == 2) {
6474 for (piv = 0; piv < pcount; ++piv) {
6475 if (g->history[piv]) {
6476 memcpy(&g->out[piv * 4], &g->background[piv * 4], 4);
6488 memcpy(g->background, g->out, 4 * g->w * g->h);
6492 memset(g->history, 0x00, g->w * g->h);
6495 int tag = stbi__get8(s);
6499 stbi__int32 x, y, w, h;
6502 x = stbi__get16le(s);
6503 y = stbi__get16le(s);
6504 w = stbi__get16le(s);
6505 h = stbi__get16le(s);
6506 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6507 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6509 g->line_size = g->w * 4;
6511 g->start_y = y * g->line_size;
6512 g->max_x = g->start_x + w * 4;
6513 g->max_y = g->start_y + h * g->line_size;
6514 g->cur_x = g->start_x;
6515 g->cur_y = g->start_y;
6517 g->lflags = stbi__get8(s);
6519 if (g->lflags & 0x40) {
6520 g->step = 8 * g->line_size;
6524 g->step = g->line_size;
6528 if (g->lflags & 0x80) {
6529 stbi__gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6530 g->color_table = (stbi_uc*)g->lpal;
6532 else if (g->flags & 0x80) {
6533 g->color_table = (stbi_uc*)g->pal;
6536 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6538 o = stbi__process_gif_raster(s, g);
6539 if (o == NULL)
return NULL;
6542 pcount = g->w * g->h;
6543 if (first_frame && (g->bgindex > 0)) {
6545 for (piv = 0; piv < pcount; ++piv) {
6546 if (g->history[piv] == 0) {
6547 g->pal[g->bgindex][3] = 255;
6548 memcpy(&g->out[piv * 4], &g->pal[g->bgindex], 4);
6559 int ext = stbi__get8(s);
6561 len = stbi__get8(s);
6563 g->eflags = stbi__get8(s);
6564 g->delay = 10 * stbi__get16le(s);
6567 if (g->transparent >= 0) {
6568 g->pal[g->transparent][3] = 255;
6570 if (g->eflags & 0x01) {
6571 g->transparent = stbi__get8(s);
6572 if (g->transparent >= 0) {
6573 g->pal[g->transparent][3] = 0;
6579 g->transparent = -1;
6587 while ((len = stbi__get8(s)) != 0) {
6597 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6602 static void* stbi__load_gif_main(stbi__context* s,
int** delays,
int* x,
int* y,
int* z,
int* comp,
int req_comp)
6604 if (stbi__gif_test(s)) {
6608 stbi_uc* two_back = 0;
6611 memset(&g, 0,
sizeof(g));
6617 u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
6618 if (u == (stbi_uc*)s) u = 0;
6624 stride = g.w * g.h * 4;
6627 out = (stbi_uc*)STBI_REALLOC(out, layers * stride);
6629 *delays = (
int*)STBI_REALLOC(*delays,
sizeof(
int) * layers);
6633 out = (stbi_uc*)stbi__malloc(layers * stride);
6635 *delays = (
int*)stbi__malloc(layers *
sizeof(
int));
6638 memcpy(out + ((layers - 1) * stride), u, stride);
6640 two_back = out - 2 * stride;
6644 (*delays)[layers - 1U] = g.delay;
6651 STBI_FREE(g.history);
6652 STBI_FREE(g.background);
6655 if (req_comp && req_comp != 4)
6656 out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
6662 return stbi__errpuc(
"not GIF",
"Image was not as a gif type.");
6666 static void* stbi__gif_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
6670 memset(&g, 0,
sizeof(g));
6672 u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
6673 if (u == (stbi_uc*)s) u = 0;
6680 if (req_comp && req_comp != 4)
6681 u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
6685 STBI_FREE(g.history);
6686 STBI_FREE(g.background);
6691 static int stbi__gif_info(stbi__context* s,
int* x,
int* y,
int* comp)
6693 return stbi__gif_info_raw(s, x, y, comp);
6701 static int stbi__hdr_test_core(stbi__context* s,
const char* signature)
6704 for (i = 0; signature[i]; ++i)
6705 if (stbi__get8(s) != signature[i])
6711 static int stbi__hdr_test(stbi__context* s)
6713 int r = stbi__hdr_test_core(s,
"#?RADIANCE\n");
6716 r = stbi__hdr_test_core(s,
"#?RGBE\n");
6722 #define STBI__HDR_BUFLEN 1024
6723 static char* stbi__hdr_gettoken(stbi__context * z,
char* buffer)
6728 c = (char)stbi__get8(z);
6730 while (!stbi__at_eof(z) && c !=
'\n') {
6732 if (len == STBI__HDR_BUFLEN - 1) {
6734 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
6738 c = (char)stbi__get8(z);
6745 static void stbi__hdr_convert(
float* output, stbi_uc* input,
int req_comp)
6747 if (input[3] != 0) {
6750 f1 = (float)ldexp(1.0f, input[3] - (
int)(128 + 8));
6752 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
6754 output[0] = input[0] * f1;
6755 output[1] = input[1] * f1;
6756 output[2] = input[2] * f1;
6758 if (req_comp == 2) output[1] = 1;
6759 if (req_comp == 4) output[3] = 1;
6763 case 4: output[3] = 1;
6764 case 3: output[0] = output[1] = output[2] = 0;
6766 case 2: output[1] = 1;
6767 case 1: output[0] = 0;
6773 static float* stbi__hdr_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
6775 char buffer[STBI__HDR_BUFLEN];
6782 unsigned char count, value;
6783 int i, j, k, c1, c2, z;
6784 const char* headerToken;
6788 headerToken = stbi__hdr_gettoken(s, buffer);
6789 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
6790 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
6794 token = stbi__hdr_gettoken(s, buffer);
6795 if (token[0] == 0)
break;
6796 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6799 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
6803 token = stbi__hdr_gettoken(s, buffer);
6804 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6806 height = (int)strtol(token, &token, 10);
6807 while (*token ==
' ') ++token;
6808 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6810 width = (int)strtol(token, NULL, 10);
6815 if (comp)* comp = 3;
6816 if (req_comp == 0) req_comp = 3;
6818 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
6819 return stbi__errpf(
"too large",
"HDR image is too large");
6822 hdr_data = (
float*)stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
6824 return stbi__errpf(
"outofmem",
"Out of memory");
6828 if (width < 8 || width >= 32768) {
6830 for (j = 0; j < height; ++j) {
6831 for (i = 0; i < width; ++i) {
6834 stbi__getn(s, rgbe, 4);
6835 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
6843 for (j = 0; j < height; ++j) {
6846 len = stbi__get8(s);
6847 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
6851 rgbe[0] = (stbi_uc)c1;
6852 rgbe[1] = (stbi_uc)c2;
6853 rgbe[2] = (stbi_uc)len;
6854 rgbe[3] = (stbi_uc)stbi__get8(s);
6855 stbi__hdr_convert(hdr_data, rgbe, req_comp);
6858 STBI_FREE(scanline);
6859 goto main_decode_loop;
6862 len |= stbi__get8(s);
6863 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
6864 if (scanline == NULL) {
6865 scanline = (stbi_uc*)stbi__malloc_mad2(width, 4, 0);
6867 STBI_FREE(hdr_data);
6868 return stbi__errpf(
"outofmem",
"Out of memory");
6872 for (k = 0; k < 4; ++k) {
6875 while ((nleft = width - i) > 0) {
6876 count = stbi__get8(s);
6879 value = stbi__get8(s);
6881 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6882 for (z = 0; z < count; ++z)
6883 scanline[i++ * 4 + k] = value;
6887 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6888 for (z = 0; z < count; ++z)
6889 scanline[i++ * 4 + k] = stbi__get8(s);
6893 for (i = 0; i < width; ++i)
6894 stbi__hdr_convert(hdr_data + (j * width + i) * req_comp, scanline + i * 4, req_comp);
6897 STBI_FREE(scanline);
6903 static int stbi__hdr_info(stbi__context* s,
int* x,
int* y,
int* comp)
6905 char buffer[STBI__HDR_BUFLEN];
6912 if (!comp) comp = &dummy;
6914 if (stbi__hdr_test(s) == 0) {
6920 token = stbi__hdr_gettoken(s, buffer);
6921 if (token[0] == 0)
break;
6922 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6929 token = stbi__hdr_gettoken(s, buffer);
6930 if (strncmp(token,
"-Y ", 3)) {
6935 *y = (int)strtol(token, &token, 10);
6936 while (*token ==
' ') ++token;
6937 if (strncmp(token,
"+X ", 3)) {
6942 *x = (int)strtol(token, NULL, 10);
6949 static int stbi__bmp_info(stbi__context* s,
int* x,
int* y,
int* comp)
6952 stbi__bmp_data info;
6955 p = stbi__bmp_parse_header(s, &info);
6959 if (x)* x = s->img_x;
6960 if (y)* y = s->img_y;
6961 if (comp)* comp = info.ma ? 4 : 3;
6967 static int stbi__psd_info(stbi__context* s,
int* x,
int* y,
int* comp)
6969 int channelCount, dummy, depth;
6972 if (!comp) comp = &dummy;
6973 if (stbi__get32be(s) != 0x38425053) {
6977 if (stbi__get16be(s) != 1) {
6982 channelCount = stbi__get16be(s);
6983 if (channelCount < 0 || channelCount > 16) {
6987 *y = stbi__get32be(s);
6988 *x = stbi__get32be(s);
6989 depth = stbi__get16be(s);
6990 if (depth != 8 && depth != 16) {
6994 if (stbi__get16be(s) != 3) {
7002 static int stbi__psd_is16(stbi__context* s)
7004 int channelCount, depth;
7005 if (stbi__get32be(s) != 0x38425053) {
7009 if (stbi__get16be(s) != 1) {
7014 channelCount = stbi__get16be(s);
7015 if (channelCount < 0 || channelCount > 16) {
7019 (void)stbi__get32be(s);
7020 (void)stbi__get32be(s);
7021 depth = stbi__get16be(s);
7031 static int stbi__pic_info(stbi__context* s,
int* x,
int* y,
int* comp)
7033 int act_comp = 0, num_packets = 0, chained, dummy;
7034 stbi__pic_packet packets[10];
7038 if (!comp) comp = &dummy;
7040 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
7047 *x = stbi__get16be(s);
7048 *y = stbi__get16be(s);
7049 if (stbi__at_eof(s)) {
7053 if ((*x) != 0 && (1 << 28) / (*x) < (*y)) {
7061 stbi__pic_packet* packet;
7063 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
7066 packet = &packets[num_packets++];
7067 chained = stbi__get8(s);
7068 packet->size = stbi__get8(s);
7069 packet->type = stbi__get8(s);
7070 packet->channel = stbi__get8(s);
7071 act_comp |= packet->channel;
7073 if (stbi__at_eof(s)) {
7077 if (packet->size != 8) {
7083 *comp = (act_comp & 0x10 ? 4 : 3);
7103 static int stbi__pnm_test(stbi__context* s)
7106 p = (char)stbi__get8(s);
7107 t = (char)stbi__get8(s);
7108 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7115 static void* stbi__pnm_load(stbi__context* s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
7120 if (!stbi__pnm_info(s, (
int*)& s->img_x, (
int*)& s->img_y, (
int*)& s->img_n))
7125 if (comp)* comp = s->img_n;
7127 if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
7128 return stbi__errpuc(
"too large",
"PNM too large");
7130 out = (stbi_uc*)stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
7131 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
7132 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
7134 if (req_comp && req_comp != s->img_n) {
7135 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7136 if (out == NULL)
return out;
7141 static int stbi__pnm_isspace(
char c)
7143 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
7146 static void stbi__pnm_skip_whitespace(stbi__context* s,
char* c)
7149 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7150 * c = (char)stbi__get8(s);
7152 if (stbi__at_eof(s) || *c !=
'#')
7155 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r')
7156 * c = (
char)stbi__get8(s);
7160 static int stbi__pnm_isdigit(
char c)
7162 return c >=
'0' && c <=
'9';
7165 static int stbi__pnm_getinteger(stbi__context* s,
char* c)
7169 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7170 value = value * 10 + (*c -
'0');
7171 *c = (char)stbi__get8(s);
7177 static int stbi__pnm_info(stbi__context* s,
int* x,
int* y,
int* comp)
7184 if (!comp) comp = &dummy;
7189 p = (char)stbi__get8(s);
7190 t = (char)stbi__get8(s);
7191 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7196 *comp = (t ==
'6') ? 3 : 1;
7198 c = (char)stbi__get8(s);
7199 stbi__pnm_skip_whitespace(s, &c);
7201 *x = stbi__pnm_getinteger(s, &c);
7202 stbi__pnm_skip_whitespace(s, &c);
7204 *y = stbi__pnm_getinteger(s, &c);
7205 stbi__pnm_skip_whitespace(s, &c);
7207 maxv = stbi__pnm_getinteger(s, &c);
7210 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
7216 static int stbi__info_main(stbi__context* s,
int* x,
int* y,
int* comp)
7218 #ifndef STBI_NO_JPEG
7219 if (stbi__jpeg_info(s, x, y, comp))
return 1;
7223 if (stbi__png_info(s, x, y, comp))
return 1;
7227 if (stbi__gif_info(s, x, y, comp))
return 1;
7231 if (stbi__bmp_info(s, x, y, comp))
return 1;
7235 if (stbi__psd_info(s, x, y, comp))
return 1;
7239 if (stbi__pic_info(s, x, y, comp))
return 1;
7243 if (stbi__pnm_info(s, x, y, comp))
return 1;
7247 if (stbi__hdr_info(s, x, y, comp))
return 1;
7252 if (stbi__tga_info(s, x, y, comp))
7255 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
7258 static int stbi__is_16_main(stbi__context* s)
7261 if (stbi__png_is16(s))
return 1;
7265 if (stbi__psd_is16(s))
return 1;
7271 #ifndef STBI_NO_STDIO
7272 STBIDEF
int stbi_info(
char const* filename,
int* x,
int* y,
int* comp)
7274 FILE* f = stbi__fopen(filename,
"rb");
7276 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7277 result = stbi_info_from_file(f, x, y, comp);
7282 STBIDEF
int stbi_info_from_file(FILE* f,
int* x,
int* y,
int* comp)
7286 long pos = ftell(f);
7287 stbi__start_file(&s, f);
7288 r = stbi__info_main(&s, x, y, comp);
7289 fseek(f, pos, SEEK_SET);
7293 STBIDEF
int stbi_is_16_bit(
char const* filename)
7295 FILE* f = stbi__fopen(filename,
"rb");
7297 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7298 result = stbi_is_16_bit_from_file(f);
7303 STBIDEF
int stbi_is_16_bit_from_file(FILE* f)
7307 long pos = ftell(f);
7308 stbi__start_file(&s, f);
7309 r = stbi__is_16_main(&s);
7310 fseek(f, pos, SEEK_SET);
7315 STBIDEF
int stbi_info_from_memory(stbi_uc
const* buffer,
int len,
int* x,
int* y,
int* comp)
7318 stbi__start_mem(&s, buffer, len);
7319 return stbi__info_main(&s, x, y, comp);
7322 STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const* c,
void* user,
int* x,
int* y,
int* comp)
7326 return stbi__info_main(&s, x, y, comp);
7329 STBIDEF
int stbi_is_16_bit_from_memory(stbi_uc
const* buffer,
int len)
7332 stbi__start_mem(&s, buffer, len);
7333 return stbi__is_16_main(&s);
7336 STBIDEF
int stbi_is_16_bit_from_callbacks(
stbi_io_callbacks const* c,
void* user)
7340 return stbi__is_16_main(&s);
Definition: stb_image.h:345