106 #ifndef STBI_INCLUDE_STB_IMAGE_H
107 #define STBI_INCLUDE_STB_IMAGE_H
306 #ifndef STBI_NO_STDIO
308 #endif // 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);
399 #endif // STBI_NO_HDR
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);
404 #endif // STBI_NO_LINEAR
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);
412 #endif // STBI_NO_STDIO
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);
467 #endif // STBI_INCLUDE_STB_IMAGE_H
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>
629 #if _MSC_VER >= 1400 // not VC6
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;
657 #else // assume GCC-style if not VC++
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);
762 #endif // !STBI_NO_STDIO
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);
1302 #endif // !STBI_NO_STDIO
1304 #endif // !STBI_NO_LINEAR
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);
1350 #endif // !STBI_NO_STDIO
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; }
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;
1401 s->img_buffer = s->buffer_start;
1402 s->img_buffer_end = s->buffer_start + n;
1406 stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1408 if (s->img_buffer < s->img_buffer_end)
1409 return *s->img_buffer++;
1410 if (s->read_from_callbacks) {
1411 stbi__refill_buffer(s);
1412 return *s->img_buffer++;
1417 stbi_inline
static int stbi__at_eof(stbi__context *s)
1420 if (!(s->io.eof)(s->io_user_data))
return 0;
1423 if (s->read_from_callbacks == 0)
return 1;
1426 return s->img_buffer >= s->img_buffer_end;
1429 static void stbi__skip(stbi__context *s,
int n)
1432 s->img_buffer = s->img_buffer_end;
1436 int blen = (int) (s->img_buffer_end - s->img_buffer);
1438 s->img_buffer = s->img_buffer_end;
1439 (s->io.skip)(s->io_user_data, n - blen);
1446 static int stbi__getn(stbi__context *s, stbi_uc *buffer,
int n)
1449 int blen = (int) (s->img_buffer_end - s->img_buffer);
1453 memcpy(buffer, s->img_buffer, blen);
1455 count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
1456 res = (count == (n-blen));
1457 s->img_buffer = s->img_buffer_end;
1462 if (s->img_buffer+n <= s->img_buffer_end) {
1463 memcpy(buffer, s->img_buffer, n);
1470 static int stbi__get16be(stbi__context *s)
1472 int z = stbi__get8(s);
1473 return (z << 8) + stbi__get8(s);
1476 static stbi__uint32 stbi__get32be(stbi__context *s)
1478 stbi__uint32 z = stbi__get16be(s);
1479 return (z << 16) + stbi__get16be(s);
1482 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1485 static int stbi__get16le(stbi__context *s)
1487 int z = stbi__get8(s);
1488 return z + (stbi__get8(s) << 8);
1493 static stbi__uint32 stbi__get32le(stbi__context *s)
1495 stbi__uint32 z = stbi__get16le(s);
1496 return z + (stbi__get16le(s) << 16);
1500 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
1514 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1516 return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
1519 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1522 unsigned char *good;
1524 if (req_comp == img_n)
return data;
1525 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1527 good = (
unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
1530 return stbi__errpuc(
"outofmem",
"Out of memory");
1533 for (j=0; j < (int) y; ++j) {
1534 unsigned char *src = data + j * x * img_n ;
1535 unsigned char *dest = good + j * x * req_comp;
1537 #define STBI__COMBO(a,b) ((a)*8+(b))
1538 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1541 switch (STBI__COMBO(img_n, req_comp)) {
1542 STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; }
break;
1543 STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1544 STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; }
break;
1545 STBI__CASE(2,1) { dest[0]=src[0]; }
break;
1546 STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1547 STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; }
break;
1548 STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; }
break;
1549 STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); }
break;
1550 STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; }
break;
1551 STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); }
break;
1552 STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; }
break;
1553 STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; }
break;
1554 default: STBI_ASSERT(0);
1563 static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b)
1565 return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
1568 static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1573 if (req_comp == img_n)
return data;
1574 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1576 good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
1579 return (stbi__uint16 *) stbi__errpuc(
"outofmem",
"Out of memory");
1582 for (j=0; j < (int) y; ++j) {
1583 stbi__uint16 *src = data + j * x * img_n ;
1584 stbi__uint16 *dest = good + j * x * req_comp;
1586 #define STBI__COMBO(a,b) ((a)*8+(b))
1587 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1590 switch (STBI__COMBO(img_n, req_comp)) {
1591 STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; }
break;
1592 STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1593 STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; }
break;
1594 STBI__CASE(2,1) { dest[0]=src[0]; }
break;
1595 STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1596 STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; }
break;
1597 STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; }
break;
1598 STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); }
break;
1599 STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; }
break;
1600 STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); }
break;
1601 STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; }
break;
1602 STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; }
break;
1603 default: STBI_ASSERT(0);
1612 #ifndef STBI_NO_LINEAR
1613 static float *stbi__ldr_to_hdr(stbi_uc *data,
int x,
int y,
int comp)
1617 if (!data)
return NULL;
1618 output = (
float *) stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1619 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1621 if (comp & 1) n = comp;
else n = comp-1;
1622 for (i=0; i < x*y; ++i) {
1623 for (k=0; k < n; ++k) {
1624 output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1626 if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
1634 #define stbi__float2int(x) ((int) (x))
1635 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1639 if (!data)
return NULL;
1640 output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
1641 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1643 if (comp & 1) n = comp;
else n = comp-1;
1644 for (i=0; i < x*y; ++i) {
1645 for (k=0; k < n; ++k) {
1646 float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1648 if (z > 255) z = 255;
1649 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1652 float z = data[i*comp+k] * 255 + 0.5f;
1654 if (z > 255) z = 255;
1655 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1684 #ifndef STBI_NO_JPEG
1687 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
1691 stbi_uc fast[1 << FAST_BITS];
1693 stbi__uint16 code[256];
1694 stbi_uc values[256];
1696 unsigned int maxcode[18];
1703 stbi__huffman huff_dc[4];
1704 stbi__huffman huff_ac[4];
1705 stbi__uint16 dequant[4][64];
1706 stbi__int16 fast_ac[4][1 << FAST_BITS];
1709 int img_h_max, img_v_max;
1710 int img_mcu_x, img_mcu_y;
1711 int img_mcu_w, img_mcu_h;
1724 void *raw_data, *raw_coeff;
1727 int coeff_w, coeff_h;
1730 stbi__uint32 code_buffer;
1732 unsigned char marker;
1742 int app14_color_transform;
1745 int scan_n, order[4];
1746 int restart_interval, todo;
1749 void (*idct_block_kernel)(stbi_uc *out,
int out_stride,
short data[64]);
1750 void (*YCbCr_to_RGB_kernel)(stbi_uc *out,
const stbi_uc *y,
const stbi_uc *pcb,
const stbi_uc *pcr,
int count,
int step);
1751 stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs);
1754 static int stbi__build_huffman(stbi__huffman *h,
int *count)
1759 for (i=0; i < 16; ++i)
1760 for (j=0; j < count[i]; ++j)
1761 h->size[k++] = (stbi_uc) (i+1);
1767 for(j=1; j <= 16; ++j) {
1769 h->delta[j] = k - code;
1770 if (h->size[k] == j) {
1771 while (h->size[k] == j)
1772 h->code[k++] = (stbi__uint16) (code++);
1773 if (code-1 >= (1u << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1776 h->maxcode[j] = code << (16-j);
1779 h->maxcode[j] = 0xffffffff;
1782 memset(h->fast, 255, 1 << FAST_BITS);
1783 for (i=0; i < k; ++i) {
1785 if (s <= FAST_BITS) {
1786 int c = h->code[i] << (FAST_BITS-s);
1787 int m = 1 << (FAST_BITS-s);
1788 for (j=0; j < m; ++j) {
1789 h->fast[c+j] = (stbi_uc) i;
1798 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1801 for (i=0; i < (1 << FAST_BITS); ++i) {
1802 stbi_uc fast = h->fast[i];
1805 int rs = h->values[fast];
1806 int run = (rs >> 4) & 15;
1807 int magbits = rs & 15;
1808 int len = h->size[fast];
1810 if (magbits && len + magbits <= FAST_BITS) {
1812 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1813 int m = 1 << (magbits - 1);
1814 if (k < m) k += (~0U << magbits) + 1;
1816 if (k >= -128 && k <= 127)
1817 fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
1823 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1826 unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
1828 int c = stbi__get8(j->s);
1829 while (c == 0xff) c = stbi__get8(j->s);
1831 j->marker = (
unsigned char) c;
1836 j->code_buffer |= b << (24 - j->code_bits);
1838 }
while (j->code_bits <= 24);
1842 static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1845 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1850 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1854 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1858 if (s > j->code_bits)
1860 j->code_buffer <<= s;
1862 return h->values[k];
1871 temp = j->code_buffer >> 16;
1872 for (k=FAST_BITS+1 ; ; ++k)
1873 if (temp < h->maxcode[k])
1881 if (k > j->code_bits)
1885 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1886 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1890 j->code_buffer <<= k;
1891 return h->values[c];
1895 static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1899 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1903 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1905 sgn = (stbi__int32)j->code_buffer >> 31;
1906 k = stbi_lrot(j->code_buffer, n);
1907 STBI_ASSERT(n >= 0 && n < (
int) (
sizeof(stbi__bmask)/
sizeof(*stbi__bmask)));
1908 j->code_buffer = k & ~stbi__bmask[n];
1909 k &= stbi__bmask[n];
1911 return k + (stbi__jbias[n] & ~sgn);
1915 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
1918 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1919 k = stbi_lrot(j->code_buffer, n);
1920 j->code_buffer = k & ~stbi__bmask[n];
1921 k &= stbi__bmask[n];
1926 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
1929 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1931 j->code_buffer <<= 1;
1933 return k & 0x80000000;
1938 static const stbi_uc stbi__jpeg_dezigzag[64+15] =
1940 0, 1, 8, 16, 9, 2, 3, 10,
1941 17, 24, 32, 25, 18, 11, 4, 5,
1942 12, 19, 26, 33, 40, 48, 41, 34,
1943 27, 20, 13, 6, 7, 14, 21, 28,
1944 35, 42, 49, 56, 57, 50, 43, 36,
1945 29, 22, 15, 23, 30, 37, 44, 51,
1946 58, 59, 52, 45, 38, 31, 39, 46,
1947 53, 60, 61, 54, 47, 55, 62, 63,
1949 63, 63, 63, 63, 63, 63, 63, 63,
1950 63, 63, 63, 63, 63, 63, 63
1954 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)
1959 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1960 t = stbi__jpeg_huff_decode(j, hdc);
1961 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1964 memset(data,0,64*
sizeof(data[0]));
1966 diff = t ? stbi__extend_receive(j, t) : 0;
1967 dc = j->img_comp[b].dc_pred + diff;
1968 j->img_comp[b].dc_pred = dc;
1969 data[0] = (short) (dc * dequant[0]);
1976 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1977 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1982 j->code_buffer <<= s;
1985 zig = stbi__jpeg_dezigzag[k++];
1986 data[zig] = (short) ((r >> 8) * dequant[zig]);
1988 int rs = stbi__jpeg_huff_decode(j, hac);
1989 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1993 if (rs != 0xf0)
break;
1998 zig = stbi__jpeg_dezigzag[k++];
1999 data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
2006 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
2010 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2012 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2014 if (j->succ_high == 0) {
2016 memset(data,0,64*
sizeof(data[0]));
2017 t = stbi__jpeg_huff_decode(j, hdc);
2018 diff = t ? stbi__extend_receive(j, t) : 0;
2020 dc = j->img_comp[b].dc_pred + diff;
2021 j->img_comp[b].dc_pred = dc;
2022 data[0] = (short) (dc << j->succ_low);
2025 if (stbi__jpeg_get_bit(j))
2026 data[0] += (
short) (1 << j->succ_low);
2033 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
2036 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2038 if (j->succ_high == 0) {
2039 int shift = j->succ_low;
2050 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2051 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2056 j->code_buffer <<= s;
2058 zig = stbi__jpeg_dezigzag[k++];
2059 data[zig] = (short) ((r >> 8) << shift);
2061 int rs = stbi__jpeg_huff_decode(j, hac);
2062 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2067 j->eob_run = (1 << r);
2069 j->eob_run += stbi__jpeg_get_bits(j, r);
2076 zig = stbi__jpeg_dezigzag[k++];
2077 data[zig] = (short) (stbi__extend_receive(j,s) << shift);
2080 }
while (k <= j->spec_end);
2084 short bit = (short) (1 << j->succ_low);
2088 for (k = j->spec_start; k <= j->spec_end; ++k) {
2089 short *p = &data[stbi__jpeg_dezigzag[k]];
2091 if (stbi__jpeg_get_bit(j))
2092 if ((*p & bit)==0) {
2103 int rs = stbi__jpeg_huff_decode(j, hac);
2104 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2109 j->eob_run = (1 << r) - 1;
2111 j->eob_run += stbi__jpeg_get_bits(j, r);
2119 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2121 if (stbi__jpeg_get_bit(j))
2128 while (k <= j->spec_end) {
2129 short *p = &data[stbi__jpeg_dezigzag[k++]];
2131 if (stbi__jpeg_get_bit(j))
2132 if ((*p & bit)==0) {
2146 }
while (k <= j->spec_end);
2153 stbi_inline
static stbi_uc stbi__clamp(
int x)
2156 if ((
unsigned int) x > 255) {
2157 if (x < 0)
return 0;
2158 if (x > 255)
return 255;
2163 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
2164 #define stbi__fsh(x) ((x) * 4096)
2167 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2168 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2171 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
2172 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
2173 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
2176 t0 = stbi__fsh(p2+p3); \
2177 t1 = stbi__fsh(p2-p3); \
2190 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
2191 t0 = t0*stbi__f2f( 0.298631336f); \
2192 t1 = t1*stbi__f2f( 2.053119869f); \
2193 t2 = t2*stbi__f2f( 3.072711026f); \
2194 t3 = t3*stbi__f2f( 1.501321110f); \
2195 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
2196 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
2197 p3 = p3*stbi__f2f(-1.961570560f); \
2198 p4 = p4*stbi__f2f(-0.390180644f); \
2204 static void stbi__idct_block(stbi_uc *out,
int out_stride,
short data[64])
2206 int i,val[64],*v=val;
2211 for (i=0; i < 8; ++i,++d, ++v) {
2213 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
2214 && d[40]==0 && d[48]==0 && d[56]==0) {
2219 int dcterm = d[0]*4;
2220 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2222 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
2225 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2226 v[ 0] = (x0+t3) >> 10;
2227 v[56] = (x0-t3) >> 10;
2228 v[ 8] = (x1+t2) >> 10;
2229 v[48] = (x1-t2) >> 10;
2230 v[16] = (x2+t1) >> 10;
2231 v[40] = (x2-t1) >> 10;
2232 v[24] = (x3+t0) >> 10;
2233 v[32] = (x3-t0) >> 10;
2237 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
2239 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
2246 x0 += 65536 + (128<<17);
2247 x1 += 65536 + (128<<17);
2248 x2 += 65536 + (128<<17);
2249 x3 += 65536 + (128<<17);
2252 o[0] = stbi__clamp((x0+t3) >> 17);
2253 o[7] = stbi__clamp((x0-t3) >> 17);
2254 o[1] = stbi__clamp((x1+t2) >> 17);
2255 o[6] = stbi__clamp((x1-t2) >> 17);
2256 o[2] = stbi__clamp((x2+t1) >> 17);
2257 o[5] = stbi__clamp((x2-t1) >> 17);
2258 o[3] = stbi__clamp((x3+t0) >> 17);
2259 o[4] = stbi__clamp((x3-t0) >> 17);
2267 static void stbi__idct_simd(stbi_uc *out,
int out_stride,
short data[64])
2270 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2274 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2278 #define dct_rot(out0,out1, x,y,c0,c1) \
2279 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2280 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2281 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2282 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2283 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2284 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2287 #define dct_widen(out, in) \
2288 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2289 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2292 #define dct_wadd(out, a, b) \
2293 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2294 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2297 #define dct_wsub(out, a, b) \
2298 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2299 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2302 #define dct_bfly32o(out0, out1, a,b,bias,s) \
2304 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2305 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2306 dct_wadd(sum, abiased, b); \
2307 dct_wsub(dif, abiased, b); \
2308 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2309 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2313 #define dct_interleave8(a, b) \
2315 a = _mm_unpacklo_epi8(a, b); \
2316 b = _mm_unpackhi_epi8(tmp, b)
2319 #define dct_interleave16(a, b) \
2321 a = _mm_unpacklo_epi16(a, b); \
2322 b = _mm_unpackhi_epi16(tmp, b)
2324 #define dct_pass(bias,shift) \
2327 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2328 __m128i sum04 = _mm_add_epi16(row0, row4); \
2329 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2330 dct_widen(t0e, sum04); \
2331 dct_widen(t1e, dif04); \
2332 dct_wadd(x0, t0e, t3e); \
2333 dct_wsub(x3, t0e, t3e); \
2334 dct_wadd(x1, t1e, t2e); \
2335 dct_wsub(x2, t1e, t2e); \
2337 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2338 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2339 __m128i sum17 = _mm_add_epi16(row1, row7); \
2340 __m128i sum35 = _mm_add_epi16(row3, row5); \
2341 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2342 dct_wadd(x4, y0o, y4o); \
2343 dct_wadd(x5, y1o, y5o); \
2344 dct_wadd(x6, y2o, y5o); \
2345 dct_wadd(x7, y3o, y4o); \
2346 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2347 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2348 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2349 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2352 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2353 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2354 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2355 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2356 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2357 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2358 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2359 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
2362 __m128i bias_0 = _mm_set1_epi32(512);
2363 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2366 row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
2367 row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
2368 row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
2369 row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
2370 row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
2371 row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
2372 row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
2373 row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
2376 dct_pass(bias_0, 10);
2380 dct_interleave16(row0, row4);
2381 dct_interleave16(row1, row5);
2382 dct_interleave16(row2, row6);
2383 dct_interleave16(row3, row7);
2386 dct_interleave16(row0, row2);
2387 dct_interleave16(row1, row3);
2388 dct_interleave16(row4, row6);
2389 dct_interleave16(row5, row7);
2392 dct_interleave16(row0, row1);
2393 dct_interleave16(row2, row3);
2394 dct_interleave16(row4, row5);
2395 dct_interleave16(row6, row7);
2399 dct_pass(bias_1, 17);
2403 __m128i p0 = _mm_packus_epi16(row0, row1);
2404 __m128i p1 = _mm_packus_epi16(row2, row3);
2405 __m128i p2 = _mm_packus_epi16(row4, row5);
2406 __m128i p3 = _mm_packus_epi16(row6, row7);
2409 dct_interleave8(p0, p2);
2410 dct_interleave8(p1, p3);
2413 dct_interleave8(p0, p1);
2414 dct_interleave8(p2, p3);
2417 dct_interleave8(p0, p2);
2418 dct_interleave8(p1, p3);
2421 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2422 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2423 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2424 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2425 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2426 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2427 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2428 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2437 #undef dct_interleave8
2438 #undef dct_interleave16
2448 static void stbi__idct_simd(stbi_uc *out,
int out_stride,
short data[64])
2450 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2452 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2453 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2454 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2455 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2456 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2457 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2458 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2459 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2460 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2461 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2462 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2463 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2465 #define dct_long_mul(out, inq, coeff) \
2466 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2467 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2469 #define dct_long_mac(out, acc, inq, coeff) \
2470 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2471 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2473 #define dct_widen(out, inq) \
2474 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2475 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2478 #define dct_wadd(out, a, b) \
2479 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2480 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2483 #define dct_wsub(out, a, b) \
2484 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2485 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2488 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2490 dct_wadd(sum, a, b); \
2491 dct_wsub(dif, a, b); \
2492 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2493 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2496 #define dct_pass(shiftop, shift) \
2499 int16x8_t sum26 = vaddq_s16(row2, row6); \
2500 dct_long_mul(p1e, sum26, rot0_0); \
2501 dct_long_mac(t2e, p1e, row6, rot0_1); \
2502 dct_long_mac(t3e, p1e, row2, rot0_2); \
2503 int16x8_t sum04 = vaddq_s16(row0, row4); \
2504 int16x8_t dif04 = vsubq_s16(row0, row4); \
2505 dct_widen(t0e, sum04); \
2506 dct_widen(t1e, dif04); \
2507 dct_wadd(x0, t0e, t3e); \
2508 dct_wsub(x3, t0e, t3e); \
2509 dct_wadd(x1, t1e, t2e); \
2510 dct_wsub(x2, t1e, t2e); \
2512 int16x8_t sum15 = vaddq_s16(row1, row5); \
2513 int16x8_t sum17 = vaddq_s16(row1, row7); \
2514 int16x8_t sum35 = vaddq_s16(row3, row5); \
2515 int16x8_t sum37 = vaddq_s16(row3, row7); \
2516 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2517 dct_long_mul(p5o, sumodd, rot1_0); \
2518 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2519 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2520 dct_long_mul(p3o, sum37, rot2_0); \
2521 dct_long_mul(p4o, sum15, rot2_1); \
2522 dct_wadd(sump13o, p1o, p3o); \
2523 dct_wadd(sump24o, p2o, p4o); \
2524 dct_wadd(sump23o, p2o, p3o); \
2525 dct_wadd(sump14o, p1o, p4o); \
2526 dct_long_mac(x4, sump13o, row7, rot3_0); \
2527 dct_long_mac(x5, sump24o, row5, rot3_1); \
2528 dct_long_mac(x6, sump23o, row3, rot3_2); \
2529 dct_long_mac(x7, sump14o, row1, rot3_3); \
2530 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2531 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2532 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2533 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2537 row0 = vld1q_s16(data + 0*8);
2538 row1 = vld1q_s16(data + 1*8);
2539 row2 = vld1q_s16(data + 2*8);
2540 row3 = vld1q_s16(data + 3*8);
2541 row4 = vld1q_s16(data + 4*8);
2542 row5 = vld1q_s16(data + 5*8);
2543 row6 = vld1q_s16(data + 6*8);
2544 row7 = vld1q_s16(data + 7*8);
2547 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2550 dct_pass(vrshrn_n_s32, 10);
2556 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2557 #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]); }
2558 #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)); }
2561 dct_trn16(row0, row1);
2562 dct_trn16(row2, row3);
2563 dct_trn16(row4, row5);
2564 dct_trn16(row6, row7);
2567 dct_trn32(row0, row2);
2568 dct_trn32(row1, row3);
2569 dct_trn32(row4, row6);
2570 dct_trn32(row5, row7);
2573 dct_trn64(row0, row4);
2574 dct_trn64(row1, row5);
2575 dct_trn64(row2, row6);
2576 dct_trn64(row3, row7);
2587 dct_pass(vshrn_n_s32, 16);
2591 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2592 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2593 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2594 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2595 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2596 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2597 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2598 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2601 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2602 #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]); }
2603 #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]); }
2615 dct_trn8_16(p0, p2);
2616 dct_trn8_16(p1, p3);
2617 dct_trn8_16(p4, p6);
2618 dct_trn8_16(p5, p7);
2621 dct_trn8_32(p0, p4);
2622 dct_trn8_32(p1, p5);
2623 dct_trn8_32(p2, p6);
2624 dct_trn8_32(p3, p7);
2627 vst1_u8(out, p0); out += out_stride;
2628 vst1_u8(out, p1); out += out_stride;
2629 vst1_u8(out, p2); out += out_stride;
2630 vst1_u8(out, p3); out += out_stride;
2631 vst1_u8(out, p4); out += out_stride;
2632 vst1_u8(out, p5); out += out_stride;
2633 vst1_u8(out, p6); out += out_stride;
2652 #define STBI__MARKER_none 0xff
2656 static stbi_uc stbi__get_marker(stbi__jpeg *j)
2659 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2660 x = stbi__get8(j->s);
2661 if (x != 0xff)
return STBI__MARKER_none;
2663 x = stbi__get8(j->s);
2669 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2673 static void stbi__jpeg_reset(stbi__jpeg *j)
2678 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;
2679 j->marker = STBI__MARKER_none;
2680 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2686 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2688 stbi__jpeg_reset(z);
2689 if (!z->progressive) {
2690 if (z->scan_n == 1) {
2692 STBI_SIMD_ALIGN(
short, data[64]);
2693 int n = z->order[0];
2698 int w = (z->img_comp[n].x+7) >> 3;
2699 int h = (z->img_comp[n].y+7) >> 3;
2700 for (j=0; j < h; ++j) {
2701 for (i=0; i < w; ++i) {
2702 int ha = z->img_comp[n].ha;
2703 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;
2704 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2706 if (--z->todo <= 0) {
2707 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2710 if (!STBI__RESTART(z->marker))
return 1;
2711 stbi__jpeg_reset(z);
2718 STBI_SIMD_ALIGN(
short, data[64]);
2719 for (j=0; j < z->img_mcu_y; ++j) {
2720 for (i=0; i < z->img_mcu_x; ++i) {
2722 for (k=0; k < z->scan_n; ++k) {
2723 int n = z->order[k];
2726 for (y=0; y < z->img_comp[n].v; ++y) {
2727 for (x=0; x < z->img_comp[n].h; ++x) {
2728 int x2 = (i*z->img_comp[n].h + x)*8;
2729 int y2 = (j*z->img_comp[n].v + y)*8;
2730 int ha = z->img_comp[n].ha;
2731 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;
2732 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2738 if (--z->todo <= 0) {
2739 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2740 if (!STBI__RESTART(z->marker))
return 1;
2741 stbi__jpeg_reset(z);
2748 if (z->scan_n == 1) {
2750 int n = z->order[0];
2755 int w = (z->img_comp[n].x+7) >> 3;
2756 int h = (z->img_comp[n].y+7) >> 3;
2757 for (j=0; j < h; ++j) {
2758 for (i=0; i < w; ++i) {
2759 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2760 if (z->spec_start == 0) {
2761 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2764 int ha = z->img_comp[n].ha;
2765 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2769 if (--z->todo <= 0) {
2770 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2771 if (!STBI__RESTART(z->marker))
return 1;
2772 stbi__jpeg_reset(z);
2779 for (j=0; j < z->img_mcu_y; ++j) {
2780 for (i=0; i < z->img_mcu_x; ++i) {
2782 for (k=0; k < z->scan_n; ++k) {
2783 int n = z->order[k];
2786 for (y=0; y < z->img_comp[n].v; ++y) {
2787 for (x=0; x < z->img_comp[n].h; ++x) {
2788 int x2 = (i*z->img_comp[n].h + x);
2789 int y2 = (j*z->img_comp[n].v + y);
2790 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2791 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2798 if (--z->todo <= 0) {
2799 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2800 if (!STBI__RESTART(z->marker))
return 1;
2801 stbi__jpeg_reset(z);
2810 static void stbi__jpeg_dequantize(
short *data, stbi__uint16 *dequant)
2813 for (i=0; i < 64; ++i)
2814 data[i] *= dequant[i];
2817 static void stbi__jpeg_finish(stbi__jpeg *z)
2819 if (z->progressive) {
2822 for (n=0; n < z->s->img_n; ++n) {
2823 int w = (z->img_comp[n].x+7) >> 3;
2824 int h = (z->img_comp[n].y+7) >> 3;
2825 for (j=0; j < h; ++j) {
2826 for (i=0; i < w; ++i) {
2827 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2828 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2829 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2836 static int stbi__process_marker(stbi__jpeg *z,
int m)
2840 case STBI__MARKER_none:
2841 return stbi__err(
"expected marker",
"Corrupt JPEG");
2844 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2845 z->restart_interval = stbi__get16be(z->s);
2849 L = stbi__get16be(z->s)-2;
2851 int q = stbi__get8(z->s);
2852 int p = q >> 4, sixteen = (p != 0);
2854 if (p != 0 && p != 1)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2855 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2857 for (i=0; i < 64; ++i)
2858 z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
2859 L -= (sixteen ? 129 : 65);
2864 L = stbi__get16be(z->s)-2;
2867 int sizes[16],i,n=0;
2868 int q = stbi__get8(z->s);
2871 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2872 for (i=0; i < 16; ++i) {
2873 sizes[i] = stbi__get8(z->s);
2878 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
2879 v = z->huff_dc[th].values;
2881 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
2882 v = z->huff_ac[th].values;
2884 for (i=0; i < n; ++i)
2885 v[i] = stbi__get8(z->s);
2887 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2894 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2895 L = stbi__get16be(z->s);
2898 return stbi__err(
"bad COM len",
"Corrupt JPEG");
2900 return stbi__err(
"bad APP len",
"Corrupt JPEG");
2904 if (m == 0xE0 && L >= 5) {
2905 static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0'};
2908 for (i=0; i < 5; ++i)
2909 if (stbi__get8(z->s) != tag[i])
2914 }
else if (m == 0xEE && L >= 12) {
2915 static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0'};
2918 for (i=0; i < 6; ++i)
2919 if (stbi__get8(z->s) != tag[i])
2924 stbi__get16be(z->s);
2925 stbi__get16be(z->s);
2926 z->app14_color_transform = stbi__get8(z->s);
2931 stbi__skip(z->s, L);
2935 return stbi__err(
"unknown marker",
"Corrupt JPEG");
2939 static int stbi__process_scan_header(stbi__jpeg *z)
2942 int Ls = stbi__get16be(z->s);
2943 z->scan_n = stbi__get8(z->s);
2944 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");
2945 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2946 for (i=0; i < z->scan_n; ++i) {
2947 int id = stbi__get8(z->s), which;
2948 int q = stbi__get8(z->s);
2949 for (which = 0; which < z->s->img_n; ++which)
2950 if (z->img_comp[which].id ==
id)
2952 if (which == z->s->img_n)
return 0;
2953 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2954 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2955 z->order[i] = which;
2960 z->spec_start = stbi__get8(z->s);
2961 z->spec_end = stbi__get8(z->s);
2962 aa = stbi__get8(z->s);
2963 z->succ_high = (aa >> 4);
2964 z->succ_low = (aa & 15);
2965 if (z->progressive) {
2966 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2967 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2969 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2970 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2978 static int stbi__free_jpeg_components(stbi__jpeg *z,
int ncomp,
int why)
2981 for (i=0; i < ncomp; ++i) {
2982 if (z->img_comp[i].raw_data) {
2983 STBI_FREE(z->img_comp[i].raw_data);
2984 z->img_comp[i].raw_data = NULL;
2985 z->img_comp[i].data = NULL;
2987 if (z->img_comp[i].raw_coeff) {
2988 STBI_FREE(z->img_comp[i].raw_coeff);
2989 z->img_comp[i].raw_coeff = 0;
2990 z->img_comp[i].coeff = 0;
2992 if (z->img_comp[i].linebuf) {
2993 STBI_FREE(z->img_comp[i].linebuf);
2994 z->img_comp[i].linebuf = NULL;
3000 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
3002 stbi__context *s = z->s;
3003 int Lf,p,i,q, h_max=1,v_max=1,c;
3004 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3005 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
3006 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
3007 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
3009 if (c != 3 && c != 1 && c != 4)
return stbi__err(
"bad component count",
"Corrupt JPEG");
3011 for (i=0; i < c; ++i) {
3012 z->img_comp[i].data = NULL;
3013 z->img_comp[i].linebuf = NULL;
3016 if (Lf != 8+3*s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3019 for (i=0; i < s->img_n; ++i) {
3020 static const unsigned char rgb[3] = {
'R',
'G',
'B' };
3021 z->img_comp[i].id = stbi__get8(s);
3022 if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3025 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");
3026 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");
3027 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
3030 if (scan != STBI__SCAN_load)
return 1;
3032 if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0))
return stbi__err(
"too large",
"Image too large to decode");
3034 for (i=0; i < s->img_n; ++i) {
3035 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
3036 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
3040 z->img_h_max = h_max;
3041 z->img_v_max = v_max;
3042 z->img_mcu_w = h_max * 8;
3043 z->img_mcu_h = v_max * 8;
3045 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
3046 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
3048 for (i=0; i < s->img_n; ++i) {
3050 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
3051 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
3059 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3060 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3061 z->img_comp[i].coeff = 0;
3062 z->img_comp[i].raw_coeff = 0;
3063 z->img_comp[i].linebuf = NULL;
3064 z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3065 if (z->img_comp[i].raw_data == NULL)
3066 return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem",
"Out of memory"));
3068 z->img_comp[i].data = (stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
3069 if (z->progressive) {
3071 z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3072 z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3073 z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2,
sizeof(
short), 15);
3074 if (z->img_comp[i].raw_coeff == NULL)
3075 return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem",
"Out of memory"));
3076 z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
3084 #define stbi__DNL(x) ((x) == 0xdc)
3085 #define stbi__SOI(x) ((x) == 0xd8)
3086 #define stbi__EOI(x) ((x) == 0xd9)
3087 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3088 #define stbi__SOS(x) ((x) == 0xda)
3090 #define stbi__SOF_progressive(x) ((x) == 0xc2)
3092 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
3096 z->app14_color_transform = -1;
3097 z->marker = STBI__MARKER_none;
3098 m = stbi__get_marker(z);
3099 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
3100 if (scan == STBI__SCAN_type)
return 1;
3101 m = stbi__get_marker(z);
3102 while (!stbi__SOF(m)) {
3103 if (!stbi__process_marker(z,m))
return 0;
3104 m = stbi__get_marker(z);
3105 while (m == STBI__MARKER_none) {
3107 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
3108 m = stbi__get_marker(z);
3111 z->progressive = stbi__SOF_progressive(m);
3112 if (!stbi__process_frame_header(z, scan))
return 0;
3117 static int stbi__decode_jpeg_image(stbi__jpeg *j)
3120 for (m = 0; m < 4; m++) {
3121 j->img_comp[m].raw_data = NULL;
3122 j->img_comp[m].raw_coeff = NULL;
3124 j->restart_interval = 0;
3125 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
3126 m = stbi__get_marker(j);
3127 while (!stbi__EOI(m)) {
3129 if (!stbi__process_scan_header(j))
return 0;
3130 if (!stbi__parse_entropy_coded_data(j))
return 0;
3131 if (j->marker == STBI__MARKER_none ) {
3133 while (!stbi__at_eof(j->s)) {
3134 int x = stbi__get8(j->s);
3136 j->marker = stbi__get8(j->s);
3142 }
else if (stbi__DNL(m)) {
3143 int Ld = stbi__get16be(j->s);
3144 stbi__uint32 NL = stbi__get16be(j->s);
3145 if (Ld != 4)
return stbi__err(
"bad DNL len",
"Corrupt JPEG");
3146 if (NL != j->s->img_y)
return stbi__err(
"bad DNL height",
"Corrupt JPEG");
3148 if (!stbi__process_marker(j, m))
return 0;
3150 m = stbi__get_marker(j);
3153 stbi__jpeg_finish(j);
3159 typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
3162 #define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3164 static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3167 STBI_NOTUSED(in_far);
3173 static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3178 for (i=0; i < w; ++i)
3179 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
3183 static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3187 stbi_uc *input = in_near;
3191 out[0] = out[1] = input[0];
3196 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
3197 for (i=1; i < w-1; ++i) {
3198 int n = 3*input[i]+2;
3199 out[i*2+0] = stbi__div4(n+input[i-1]);
3200 out[i*2+1] = stbi__div4(n+input[i+1]);
3202 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
3203 out[i*2+1] = input[w-1];
3205 STBI_NOTUSED(in_far);
3211 #define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3213 static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3218 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3222 t1 = 3*in_near[0] + in_far[0];
3223 out[0] = stbi__div4(t1+2);
3224 for (i=1; i < w; ++i) {
3226 t1 = 3*in_near[i]+in_far[i];
3227 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3228 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3230 out[w*2-1] = stbi__div4(t1+2);
3237 #if defined(STBI_SSE2) || defined(STBI_NEON)
3238 static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3244 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3248 t1 = 3*in_near[0] + in_far[0];
3252 for (; i < ((w-1) & ~7); i += 8) {
3253 #if defined(STBI_SSE2)
3256 __m128i zero = _mm_setzero_si128();
3257 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
3258 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
3259 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3260 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3261 __m128i diff = _mm_sub_epi16(farw, nearw);
3262 __m128i nears = _mm_slli_epi16(nearw, 2);
3263 __m128i curr = _mm_add_epi16(nears, diff);
3270 __m128i prv0 = _mm_slli_si128(curr, 2);
3271 __m128i nxt0 = _mm_srli_si128(curr, 2);
3272 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3273 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
3279 __m128i bias = _mm_set1_epi16(8);
3280 __m128i curs = _mm_slli_epi16(curr, 2);
3281 __m128i prvd = _mm_sub_epi16(prev, curr);
3282 __m128i nxtd = _mm_sub_epi16(next, curr);
3283 __m128i curb = _mm_add_epi16(curs, bias);
3284 __m128i even = _mm_add_epi16(prvd, curb);
3285 __m128i odd = _mm_add_epi16(nxtd, curb);
3288 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3289 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3290 __m128i de0 = _mm_srli_epi16(int0, 4);
3291 __m128i de1 = _mm_srli_epi16(int1, 4);
3294 __m128i outv = _mm_packus_epi16(de0, de1);
3295 _mm_storeu_si128((__m128i *) (out + i*2), outv);
3296 #elif defined(STBI_NEON)
3299 uint8x8_t farb = vld1_u8(in_far + i);
3300 uint8x8_t nearb = vld1_u8(in_near + i);
3301 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3302 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3303 int16x8_t curr = vaddq_s16(nears, diff);
3310 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3311 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3312 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3313 int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3319 int16x8_t curs = vshlq_n_s16(curr, 2);
3320 int16x8_t prvd = vsubq_s16(prev, curr);
3321 int16x8_t nxtd = vsubq_s16(next, curr);
3322 int16x8_t even = vaddq_s16(curs, prvd);
3323 int16x8_t odd = vaddq_s16(curs, nxtd);
3327 o.val[0] = vqrshrun_n_s16(even, 4);
3328 o.val[1] = vqrshrun_n_s16(odd, 4);
3329 vst2_u8(out + i*2, o);
3333 t1 = 3*in_near[i+7] + in_far[i+7];
3337 t1 = 3*in_near[i] + in_far[i];
3338 out[i*2] = stbi__div16(3*t1 + t0 + 8);
3340 for (++i; i < w; ++i) {
3342 t1 = 3*in_near[i]+in_far[i];
3343 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3344 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3346 out[w*2-1] = stbi__div4(t1+2);
3354 static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3358 STBI_NOTUSED(in_far);
3359 for (i=0; i < w; ++i)
3360 for (j=0; j < hs; ++j)
3361 out[i*hs+j] = in_near[i];
3367 #define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3368 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)
3371 for (i=0; i < count; ++i) {
3372 int y_fixed = (y[i] << 20) + (1<<19);
3374 int cr = pcr[i] - 128;
3375 int cb = pcb[i] - 128;
3376 r = y_fixed + cr* stbi__float2fixed(1.40200f);
3377 g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3378 b = y_fixed + cb* stbi__float2fixed(1.77200f);
3382 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3383 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3384 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3385 out[0] = (stbi_uc)r;
3386 out[1] = (stbi_uc)g;
3387 out[2] = (stbi_uc)b;
3393 #if defined(STBI_SSE2) || defined(STBI_NEON)
3394 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)
3404 __m128i signflip = _mm_set1_epi8(-0x80);
3405 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200f*4096.0f+0.5f));
3406 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
3407 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
3408 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200f*4096.0f+0.5f));
3409 __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
3410 __m128i xw = _mm_set1_epi16(255);
3412 for (; i+7 < count; i += 8) {
3414 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3415 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3416 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3417 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3418 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3421 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3422 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3423 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3426 __m128i yws = _mm_srli_epi16(yw, 4);
3427 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3428 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3429 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3430 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3431 __m128i rws = _mm_add_epi16(cr0, yws);
3432 __m128i gwt = _mm_add_epi16(cb0, yws);
3433 __m128i bws = _mm_add_epi16(yws, cb1);
3434 __m128i gws = _mm_add_epi16(gwt, cr1);
3437 __m128i rw = _mm_srai_epi16(rws, 4);
3438 __m128i bw = _mm_srai_epi16(bws, 4);
3439 __m128i gw = _mm_srai_epi16(gws, 4);
3442 __m128i brb = _mm_packus_epi16(rw, bw);
3443 __m128i gxb = _mm_packus_epi16(gw, xw);
3446 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3447 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3448 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3449 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3452 _mm_storeu_si128((__m128i *) (out + 0), o0);
3453 _mm_storeu_si128((__m128i *) (out + 16), o1);
3463 uint8x8_t signflip = vdup_n_u8(0x80);
3464 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200f*4096.0f+0.5f));
3465 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
3466 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
3467 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200f*4096.0f+0.5f));
3469 for (; i+7 < count; i += 8) {
3471 uint8x8_t y_bytes = vld1_u8(y + i);
3472 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3473 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3474 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3475 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3478 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3479 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3480 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3483 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3484 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3485 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3486 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3487 int16x8_t rws = vaddq_s16(yws, cr0);
3488 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3489 int16x8_t bws = vaddq_s16(yws, cb1);
3493 o.val[0] = vqrshrun_n_s16(rws, 4);
3494 o.val[1] = vqrshrun_n_s16(gws, 4);
3495 o.val[2] = vqrshrun_n_s16(bws, 4);
3496 o.val[3] = vdup_n_u8(255);
3505 for (; i < count; ++i) {
3506 int y_fixed = (y[i] << 20) + (1<<19);
3508 int cr = pcr[i] - 128;
3509 int cb = pcb[i] - 128;
3510 r = y_fixed + cr* stbi__float2fixed(1.40200f);
3511 g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3512 b = y_fixed + cb* stbi__float2fixed(1.77200f);
3516 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3517 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3518 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3519 out[0] = (stbi_uc)r;
3520 out[1] = (stbi_uc)g;
3521 out[2] = (stbi_uc)b;
3529 static void stbi__setup_jpeg(stbi__jpeg *j)
3531 j->idct_block_kernel = stbi__idct_block;
3532 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3533 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3536 if (stbi__sse2_available()) {
3537 j->idct_block_kernel = stbi__idct_simd;
3538 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3539 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3544 j->idct_block_kernel = stbi__idct_simd;
3545 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3546 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3551 static void stbi__cleanup_jpeg(stbi__jpeg *j)
3553 stbi__free_jpeg_components(j, j->s->img_n, 0);
3558 resample_row_func resample;
3559 stbi_uc *line0,*line1;
3567 static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
3569 unsigned int t = x*y + 128;
3570 return (stbi_uc) ((t + (t >>8)) >> 8);
3573 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3575 int n, decode_n, is_rgb;
3579 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3582 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3585 n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3587 is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3589 if (z->s->img_n == 3 && n < 3 && !is_rgb)
3592 decode_n = z->s->img_n;
3599 stbi_uc *coutput[4];
3601 stbi__resample res_comp[4];
3603 for (k=0; k < decode_n; ++k) {
3604 stbi__resample *r = &res_comp[k];
3608 z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
3609 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3611 r->hs = z->img_h_max / z->img_comp[k].h;
3612 r->vs = z->img_v_max / z->img_comp[k].v;
3613 r->ystep = r->vs >> 1;
3614 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3616 r->line0 = r->line1 = z->img_comp[k].data;
3618 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3619 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3620 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3621 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3622 else r->resample = stbi__resample_row_generic;
3626 output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3627 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3630 for (j=0; j < z->s->img_y; ++j) {
3631 stbi_uc *out = output + n * z->s->img_x * j;
3632 for (k=0; k < decode_n; ++k) {
3633 stbi__resample *r = &res_comp[k];
3634 int y_bot = r->ystep >= (r->vs >> 1);
3635 coutput[k] = r->resample(z->img_comp[k].linebuf,
3636 y_bot ? r->line1 : r->line0,
3637 y_bot ? r->line0 : r->line1,
3639 if (++r->ystep >= r->vs) {
3641 r->line0 = r->line1;
3642 if (++r->ypos < z->img_comp[k].y)
3643 r->line1 += z->img_comp[k].w2;
3647 stbi_uc *y = coutput[0];
3648 if (z->s->img_n == 3) {
3650 for (i=0; i < z->s->img_x; ++i) {
3652 out[1] = coutput[1][i];
3653 out[2] = coutput[2][i];
3658 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3660 }
else if (z->s->img_n == 4) {
3661 if (z->app14_color_transform == 0) {
3662 for (i=0; i < z->s->img_x; ++i) {
3663 stbi_uc m = coutput[3][i];
3664 out[0] = stbi__blinn_8x8(coutput[0][i], m);
3665 out[1] = stbi__blinn_8x8(coutput[1][i], m);
3666 out[2] = stbi__blinn_8x8(coutput[2][i], m);
3670 }
else if (z->app14_color_transform == 2) {
3671 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3672 for (i=0; i < z->s->img_x; ++i) {
3673 stbi_uc m = coutput[3][i];
3674 out[0] = stbi__blinn_8x8(255 - out[0], m);
3675 out[1] = stbi__blinn_8x8(255 - out[1], m);
3676 out[2] = stbi__blinn_8x8(255 - out[2], m);
3680 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3683 for (i=0; i < z->s->img_x; ++i) {
3684 out[0] = out[1] = out[2] = y[i];
3691 for (i=0; i < z->s->img_x; ++i)
3692 *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3694 for (i=0; i < z->s->img_x; ++i, out += 2) {
3695 out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3699 }
else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
3700 for (i=0; i < z->s->img_x; ++i) {
3701 stbi_uc m = coutput[3][i];
3702 stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
3703 stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
3704 stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
3705 out[0] = stbi__compute_y(r, g, b);
3709 }
else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
3710 for (i=0; i < z->s->img_x; ++i) {
3711 out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
3716 stbi_uc *y = coutput[0];
3718 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3720 for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3724 stbi__cleanup_jpeg(z);
3725 *out_x = z->s->img_x;
3726 *out_y = z->s->img_y;
3727 if (comp) *comp = z->s->img_n >= 3 ? 3 : 1;
3732 static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
3734 unsigned char* result;
3735 stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(
sizeof(stbi__jpeg));
3738 stbi__setup_jpeg(j);
3739 result = load_jpeg_image(j, x,y,comp,req_comp);
3744 static int stbi__jpeg_test(stbi__context *s)
3747 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
3749 stbi__setup_jpeg(j);
3750 r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
3756 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
3758 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3759 stbi__rewind( j->s );
3762 if (x) *x = j->s->img_x;
3763 if (y) *y = j->s->img_y;
3764 if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
3768 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
3771 stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(
sizeof(stbi__jpeg)));
3773 result = stbi__jpeg_info_raw(j, x, y, comp);
3786 #ifndef STBI_NO_ZLIB
3789 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
3790 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
3796 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3797 stbi__uint16 firstcode[16];
3799 stbi__uint16 firstsymbol[16];
3801 stbi__uint16 value[288];
3804 stbi_inline
static int stbi__bitreverse16(
int n)
3806 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3807 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3808 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3809 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3813 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3815 STBI_ASSERT(bits <= 16);
3818 return stbi__bitreverse16(v) >> (16-bits);
3821 static int stbi__zbuild_huffman(stbi__zhuffman *z,
const stbi_uc *sizelist,
int num)
3824 int code, next_code[16], sizes[17];
3827 memset(sizes, 0,
sizeof(sizes));
3828 memset(z->fast, 0,
sizeof(z->fast));
3829 for (i=0; i < num; ++i)
3830 ++sizes[sizelist[i]];
3832 for (i=1; i < 16; ++i)
3833 if (sizes[i] > (1 << i))
3834 return stbi__err(
"bad sizes",
"Corrupt PNG");
3836 for (i=1; i < 16; ++i) {
3837 next_code[i] = code;
3838 z->firstcode[i] = (stbi__uint16) code;
3839 z->firstsymbol[i] = (stbi__uint16) k;
3840 code = (code + sizes[i]);
3842 if (code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3843 z->maxcode[i] = code << (16-i);
3847 z->maxcode[16] = 0x10000;
3848 for (i=0; i < num; ++i) {
3849 int s = sizelist[i];
3851 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3852 stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
3853 z->size [c] = (stbi_uc ) s;
3854 z->value[c] = (stbi__uint16) i;
3855 if (s <= STBI__ZFAST_BITS) {
3856 int j = stbi__bit_reverse(next_code[s],s);
3857 while (j < (1 << STBI__ZFAST_BITS)) {
3876 stbi_uc *zbuffer, *zbuffer_end;
3878 stbi__uint32 code_buffer;
3885 stbi__zhuffman z_length, z_distance;
3888 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
3890 if (z->zbuffer >= z->zbuffer_end)
return 0;
3891 return *z->zbuffer++;
3894 static void stbi__fill_bits(stbi__zbuf *z)
3897 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3898 z->code_buffer |= (
unsigned int) stbi__zget8(z) << z->num_bits;
3900 }
while (z->num_bits <= 24);
3903 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
3906 if (z->num_bits < n) stbi__fill_bits(z);
3907 k = z->code_buffer & ((1 << n) - 1);
3908 z->code_buffer >>= n;
3913 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
3918 k = stbi__bit_reverse(a->code_buffer, 16);
3919 for (s=STBI__ZFAST_BITS+1; ; ++s)
3920 if (k < z->maxcode[s])
3922 if (s == 16)
return -1;
3924 b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
3925 STBI_ASSERT(z->size[b] == s);
3926 a->code_buffer >>= s;
3931 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3934 if (a->num_bits < 16) stbi__fill_bits(a);
3935 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3938 a->code_buffer >>= s;
3942 return stbi__zhuffman_decode_slowpath(a, z);
3945 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
3948 int cur, limit, old_limit;
3950 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3951 cur = (int) (z->zout - z->zout_start);
3952 limit = old_limit = (int) (z->zout_end - z->zout_start);
3953 while (cur + n > limit)
3955 q = (
char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
3956 STBI_NOTUSED(old_limit);
3957 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
3960 z->zout_end = q + limit;
3964 static const int stbi__zlength_base[31] = {
3965 3,4,5,6,7,8,9,10,11,13,
3966 15,17,19,23,27,31,35,43,51,59,
3967 67,83,99,115,131,163,195,227,258,0,0 };
3969 static const int stbi__zlength_extra[31]=
3970 { 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 };
3972 static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3973 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
3975 static const int stbi__zdist_extra[32] =
3976 { 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};
3978 static int stbi__parse_huffman_block(stbi__zbuf *a)
3980 char *zout = a->zout;
3982 int z = stbi__zhuffman_decode(a, &a->z_length);
3984 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3985 if (zout >= a->zout_end) {
3986 if (!stbi__zexpand(a, zout, 1))
return 0;
3998 len = stbi__zlength_base[z];
3999 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
4000 z = stbi__zhuffman_decode(a, &a->z_distance);
4001 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4002 dist = stbi__zdist_base[z];
4003 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
4004 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
4005 if (zout + len > a->zout_end) {
4006 if (!stbi__zexpand(a, zout, len))
return 0;
4009 p = (stbi_uc *) (zout - dist);
4012 if (len) {
do *zout++ = v;
while (--len); }
4014 if (len) {
do *zout++ = *p++;
while (--len); }
4020 static int stbi__compute_huffman_codes(stbi__zbuf *a)
4022 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 };
4023 stbi__zhuffman z_codelength;
4024 stbi_uc lencodes[286+32+137];
4025 stbi_uc codelength_sizes[19];
4028 int hlit = stbi__zreceive(a,5) + 257;
4029 int hdist = stbi__zreceive(a,5) + 1;
4030 int hclen = stbi__zreceive(a,4) + 4;
4031 int ntot = hlit + hdist;
4033 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4034 for (i=0; i < hclen; ++i) {
4035 int s = stbi__zreceive(a,3);
4036 codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
4038 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
4042 int c = stbi__zhuffman_decode(a, &z_codelength);
4043 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4045 lencodes[n++] = (stbi_uc) c;
4049 c = stbi__zreceive(a,2)+3;
4050 if (n == 0)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4051 fill = lencodes[n-1];
4053 c = stbi__zreceive(a,3)+3;
4055 STBI_ASSERT(c == 18);
4056 c = stbi__zreceive(a,7)+11;
4058 if (ntot - n < c)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4059 memset(lencodes+n, fill, c);
4063 if (n != ntot)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4064 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
4065 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
4069 static int stbi__parse_uncompressed_block(stbi__zbuf *a)
4073 if (a->num_bits & 7)
4074 stbi__zreceive(a, a->num_bits & 7);
4077 while (a->num_bits > 0) {
4078 header[k++] = (stbi_uc) (a->code_buffer & 255);
4079 a->code_buffer >>= 8;
4082 STBI_ASSERT(a->num_bits == 0);
4085 header[k++] = stbi__zget8(a);
4086 len = header[1] * 256 + header[0];
4087 nlen = header[3] * 256 + header[2];
4088 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4089 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
4090 if (a->zout + len > a->zout_end)
4091 if (!stbi__zexpand(a, a->zout, len))
return 0;
4092 memcpy(a->zout, a->zbuffer, len);
4098 static int stbi__parse_zlib_header(stbi__zbuf *a)
4100 int cmf = stbi__zget8(a);
4103 int flg = stbi__zget8(a);
4104 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4105 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
4106 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
4111 static const stbi_uc stbi__zdefault_length[288] =
4113 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,
4114 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,
4115 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,
4116 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,
4117 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,
4118 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,
4119 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,
4120 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,
4121 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
4123 static const stbi_uc stbi__zdefault_distance[32] =
4125 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
4140 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
4144 if (!stbi__parse_zlib_header(a))
return 0;
4148 final = stbi__zreceive(a,1);
4149 type = stbi__zreceive(a,2);
4151 if (!stbi__parse_uncompressed_block(a))
return 0;
4152 }
else if (type == 3) {
4157 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288))
return 0;
4158 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
4160 if (!stbi__compute_huffman_codes(a))
return 0;
4162 if (!stbi__parse_huffman_block(a))
return 0;
4168 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
4170 a->zout_start = obuf;
4172 a->zout_end = obuf + olen;
4173 a->z_expandable = exp;
4175 return stbi__parse_zlib(a, parse_header);
4178 STBIDEF
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer,
int len,
int initial_size,
int *outlen)
4181 char *p = (
char *) stbi__malloc(initial_size);
4182 if (p == NULL)
return NULL;
4183 a.zbuffer = (stbi_uc *) buffer;
4184 a.zbuffer_end = (stbi_uc *) buffer + len;
4185 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4186 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4187 return a.zout_start;
4189 STBI_FREE(a.zout_start);
4194 STBIDEF
char *stbi_zlib_decode_malloc(
char const *buffer,
int len,
int *outlen)
4196 return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
4199 STBIDEF
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer,
int len,
int initial_size,
int *outlen,
int parse_header)
4202 char *p = (
char *) stbi__malloc(initial_size);
4203 if (p == NULL)
return NULL;
4204 a.zbuffer = (stbi_uc *) buffer;
4205 a.zbuffer_end = (stbi_uc *) buffer + len;
4206 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4207 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4208 return a.zout_start;
4210 STBI_FREE(a.zout_start);
4215 STBIDEF
int stbi_zlib_decode_buffer(
char *obuffer,
int olen,
char const *ibuffer,
int ilen)
4218 a.zbuffer = (stbi_uc *) ibuffer;
4219 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
4220 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4221 return (
int) (a.zout - a.zout_start);
4226 STBIDEF
char *stbi_zlib_decode_noheader_malloc(
char const *buffer,
int len,
int *outlen)
4229 char *p = (
char *) stbi__malloc(16384);
4230 if (p == NULL)
return NULL;
4231 a.zbuffer = (stbi_uc *) buffer;
4232 a.zbuffer_end = (stbi_uc *) buffer+len;
4233 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4234 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4235 return a.zout_start;
4237 STBI_FREE(a.zout_start);
4242 STBIDEF
int stbi_zlib_decode_noheader_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen)
4245 a.zbuffer = (stbi_uc *) ibuffer;
4246 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
4247 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4248 return (
int) (a.zout - a.zout_start);
4267 stbi__uint32 length;
4271 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
4274 c.length = stbi__get32be(s);
4275 c.type = stbi__get32be(s);
4279 static int stbi__check_png_header(stbi__context *s)
4281 static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4283 for (i=0; i < 8; ++i)
4284 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
4291 stbi_uc *idata, *expanded, *out;
4307 static stbi_uc first_row_filter[5] =
4316 static int stbi__paeth(
int a,
int b,
int c)
4322 if (pa <= pb && pa <= pc)
return a;
4323 if (pb <= pc)
return b;
4327 static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4330 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)
4332 int bytes = (depth == 16? 2 : 1);
4333 stbi__context *s = a->s;
4334 stbi__uint32 i,j,stride = x*out_n*bytes;
4335 stbi__uint32 img_len, img_width_bytes;
4337 int img_n = s->img_n;
4339 int output_bytes = out_n*bytes;
4340 int filter_bytes = img_n*bytes;
4343 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
4344 a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0);
4345 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
4347 if (!stbi__mad3sizes_valid(img_n, x, depth, 7))
return stbi__err(
"too large",
"Corrupt PNG");
4348 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4349 img_len = (img_width_bytes + 1) * y;
4354 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4356 for (j=0; j < y; ++j) {
4357 stbi_uc *cur = a->out + stride*j;
4359 int filter = *raw++;
4362 return stbi__err(
"invalid filter",
"Corrupt PNG");
4365 STBI_ASSERT(img_width_bytes <= x);
4366 cur += x*out_n - img_width_bytes;
4368 width = img_width_bytes;
4370 prior = cur - stride;
4373 if (j == 0) filter = first_row_filter[filter];
4376 for (k=0; k < filter_bytes; ++k) {
4378 case STBI__F_none : cur[k] = raw[k];
break;
4379 case STBI__F_sub : cur[k] = raw[k];
break;
4380 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4381 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
4382 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
4383 case STBI__F_avg_first : cur[k] = raw[k];
break;
4384 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4394 }
else if (depth == 16) {
4395 if (img_n != out_n) {
4396 cur[filter_bytes] = 255;
4397 cur[filter_bytes+1] = 255;
4399 raw += filter_bytes;
4400 cur += output_bytes;
4401 prior += output_bytes;
4409 if (depth < 8 || img_n == out_n) {
4410 int nk = (width - 1)*filter_bytes;
4411 #define STBI__CASE(f) \
4413 for (k=0; k < nk; ++k)
4416 case STBI__F_none: memcpy(cur, raw, nk);
break;
4417 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); }
break;
4418 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4419 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); }
break;
4420 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); }
break;
4421 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); }
break;
4422 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); }
break;
4427 STBI_ASSERT(img_n+1 == out_n);
4428 #define STBI__CASE(f) \
4430 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4431 for (k=0; k < filter_bytes; ++k)
4433 STBI__CASE(STBI__F_none) { cur[k] = raw[k]; }
break;
4434 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); }
break;
4435 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4436 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); }
break;
4437 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); }
break;
4438 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); }
break;
4439 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); }
break;
4446 cur = a->out + stride*j;
4447 for (i=0; i < x; ++i,cur+=output_bytes) {
4448 cur[filter_bytes+1] = 255;
4458 for (j=0; j < y; ++j) {
4459 stbi_uc *cur = a->out + stride*j;
4460 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
4463 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4472 for (k=x*img_n; k >= 2; k-=2, ++in) {
4473 *cur++ = scale * ((*in >> 4) );
4474 *cur++ = scale * ((*in ) & 0x0f);
4476 if (k > 0) *cur++ = scale * ((*in >> 4) );
4477 }
else if (depth == 2) {
4478 for (k=x*img_n; k >= 4; k-=4, ++in) {
4479 *cur++ = scale * ((*in >> 6) );
4480 *cur++ = scale * ((*in >> 4) & 0x03);
4481 *cur++ = scale * ((*in >> 2) & 0x03);
4482 *cur++ = scale * ((*in ) & 0x03);
4484 if (k > 0) *cur++ = scale * ((*in >> 6) );
4485 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4486 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4487 }
else if (depth == 1) {
4488 for (k=x*img_n; k >= 8; k-=8, ++in) {
4489 *cur++ = scale * ((*in >> 7) );
4490 *cur++ = scale * ((*in >> 6) & 0x01);
4491 *cur++ = scale * ((*in >> 5) & 0x01);
4492 *cur++ = scale * ((*in >> 4) & 0x01);
4493 *cur++ = scale * ((*in >> 3) & 0x01);
4494 *cur++ = scale * ((*in >> 2) & 0x01);
4495 *cur++ = scale * ((*in >> 1) & 0x01);
4496 *cur++ = scale * ((*in ) & 0x01);
4498 if (k > 0) *cur++ = scale * ((*in >> 7) );
4499 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4500 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4501 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4502 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4503 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4504 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4506 if (img_n != out_n) {
4509 cur = a->out + stride*j;
4511 for (q=x-1; q >= 0; --q) {
4513 cur[q*2+0] = cur[q];
4516 STBI_ASSERT(img_n == 3);
4517 for (q=x-1; q >= 0; --q) {
4519 cur[q*4+2] = cur[q*3+2];
4520 cur[q*4+1] = cur[q*3+1];
4521 cur[q*4+0] = cur[q*3+0];
4526 }
else if (depth == 16) {
4531 stbi_uc *cur = a->out;
4532 stbi__uint16 *cur16 = (stbi__uint16*)cur;
4534 for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
4535 *cur16 = (cur[0] << 8) | cur[1];
4542 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)
4544 int bytes = (depth == 16 ? 2 : 1);
4545 int out_bytes = out_n * bytes;
4549 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4552 final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4553 for (p=0; p < 7; ++p) {
4554 int xorig[] = { 0,4,0,2,0,1,0 };
4555 int yorig[] = { 0,0,4,0,2,0,1 };
4556 int xspc[] = { 8,8,4,4,2,2,1 };
4557 int yspc[] = { 8,8,8,4,4,2,2 };
4560 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4561 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4563 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4564 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4568 for (j=0; j < y; ++j) {
4569 for (i=0; i < x; ++i) {
4570 int out_y = j*yspc[p]+yorig[p];
4571 int out_x = i*xspc[p]+xorig[p];
4572 memcpy(
final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
4573 a->out + (j*x+i)*out_bytes, out_bytes);
4577 image_data += img_len;
4578 image_data_len -= img_len;
4586 static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3],
int out_n)
4588 stbi__context *s = z->s;
4589 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4590 stbi_uc *p = z->out;
4594 STBI_ASSERT(out_n == 2 || out_n == 4);
4597 for (i=0; i < pixel_count; ++i) {
4598 p[1] = (p[0] == tc[0] ? 0 : 255);
4602 for (i=0; i < pixel_count; ++i) {
4603 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4611 static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3],
int out_n)
4613 stbi__context *s = z->s;
4614 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4615 stbi__uint16 *p = (stbi__uint16*) z->out;
4619 STBI_ASSERT(out_n == 2 || out_n == 4);
4622 for (i = 0; i < pixel_count; ++i) {
4623 p[1] = (p[0] == tc[0] ? 0 : 65535);
4627 for (i = 0; i < pixel_count; ++i) {
4628 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4636 static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette,
int len,
int pal_img_n)
4638 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4639 stbi_uc *p, *temp_out, *orig = a->out;
4641 p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4642 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4647 if (pal_img_n == 3) {
4648 for (i=0; i < pixel_count; ++i) {
4651 p[1] = palette[n+1];
4652 p[2] = palette[n+2];
4656 for (i=0; i < pixel_count; ++i) {
4659 p[1] = palette[n+1];
4660 p[2] = palette[n+2];
4661 p[3] = palette[n+3];
4673 static int stbi__unpremultiply_on_load = 0;
4674 static int stbi__de_iphone_flag = 0;
4676 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply)
4678 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4681 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert)
4683 stbi__de_iphone_flag = flag_true_if_should_convert;
4686 static void stbi__de_iphone(stbi__png *z)
4688 stbi__context *s = z->s;
4689 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4690 stbi_uc *p = z->out;
4692 if (s->img_out_n == 3) {
4693 for (i=0; i < pixel_count; ++i) {
4700 STBI_ASSERT(s->img_out_n == 4);
4701 if (stbi__unpremultiply_on_load) {
4703 for (i=0; i < pixel_count; ++i) {
4707 stbi_uc half = a / 2;
4708 p[0] = (p[2] * 255 + half) / a;
4709 p[1] = (p[1] * 255 + half) / a;
4710 p[2] = ( t * 255 + half) / a;
4719 for (i=0; i < pixel_count; ++i) {
4729 #define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
4731 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
4733 stbi_uc palette[1024], pal_img_n=0;
4734 stbi_uc has_trans=0, tc[3];
4735 stbi__uint16 tc16[3];
4736 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4737 int first=1,k,interlace=0, color=0, is_iphone=0;
4738 stbi__context *s = z->s;
4744 if (!stbi__check_png_header(s))
return 0;
4746 if (scan == STBI__SCAN_type)
return 1;
4749 stbi__pngchunk c = stbi__get_chunk_header(s);
4751 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4753 stbi__skip(s, c.length);
4755 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4757 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4759 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4760 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4761 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4762 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");
4763 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4764 if (color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4765 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4766 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4767 filter= stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4768 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4769 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4771 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4772 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4773 if (scan == STBI__SCAN_header)
return 1;
4778 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4784 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4785 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4786 if (c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4787 pal_len = c.length / 3;
4788 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4789 for (i=0; i < pal_len; ++i) {
4790 palette[i*4+0] = stbi__get8(s);
4791 palette[i*4+1] = stbi__get8(s);
4792 palette[i*4+2] = stbi__get8(s);
4793 palette[i*4+3] = 255;
4798 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4799 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4800 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4802 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4803 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4804 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4806 for (i=0; i < c.length; ++i)
4807 palette[i*4+3] = stbi__get8(s);
4809 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4810 if (c.length != (stbi__uint32) s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4812 if (z->depth == 16) {
4813 for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s);
4815 for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth];
4821 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4822 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4823 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4824 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4825 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
4826 if (ioff + c.length > idata_limit) {
4827 stbi__uint32 idata_limit_old = idata_limit;
4829 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4830 while (ioff + c.length > idata_limit)
4832 STBI_NOTUSED(idata_limit_old);
4833 p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4836 if (!stbi__getn(s, z->idata+ioff,c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4841 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4842 stbi__uint32 raw_len, bpl;
4843 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4844 if (scan != STBI__SCAN_load)
return 1;
4845 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4847 bpl = (s->img_x * z->depth + 7) / 8;
4848 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4849 z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((
char *) z->idata, ioff, raw_len, (
int *) &raw_len, !is_iphone);
4850 if (z->expanded == NULL)
return 0;
4851 STBI_FREE(z->idata); z->idata = NULL;
4852 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
4853 s->img_out_n = s->img_n+1;
4855 s->img_out_n = s->img_n;
4856 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace))
return 0;
4858 if (z->depth == 16) {
4859 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
return 0;
4861 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4864 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4868 s->img_n = pal_img_n;
4869 s->img_out_n = pal_img_n;
4870 if (req_comp >= 3) s->img_out_n = req_comp;
4871 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4873 }
else if (has_trans) {
4877 STBI_FREE(z->expanded); z->expanded = NULL;
4883 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4884 if ((c.type & (1 << 29)) == 0) {
4885 #ifndef STBI_NO_FAILURE_STRINGS
4887 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4888 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4889 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4890 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4891 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4893 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4895 stbi__skip(s, c.length);
4903 static void *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp, stbi__result_info *ri)
4906 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4907 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4909 ri->bits_per_channel = 8;
4911 ri->bits_per_channel = p->depth;
4914 if (req_comp && req_comp != p->s->img_out_n) {
4915 if (ri->bits_per_channel == 8)
4916 result = stbi__convert_format((
unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4918 result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4919 p->s->img_out_n = req_comp;
4920 if (result == NULL)
return result;
4924 if (n) *n = p->s->img_n;
4926 STBI_FREE(p->out); p->out = NULL;
4927 STBI_FREE(p->expanded); p->expanded = NULL;
4928 STBI_FREE(p->idata); p->idata = NULL;
4933 static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
4937 return stbi__do_png(&p, x,y,comp,req_comp, ri);
4940 static int stbi__png_test(stbi__context *s)
4943 r = stbi__check_png_header(s);
4948 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
4950 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
4951 stbi__rewind( p->s );
4954 if (x) *x = p->s->img_x;
4955 if (y) *y = p->s->img_y;
4956 if (comp) *comp = p->s->img_n;
4960 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
4964 return stbi__png_info_raw(&p, x, y, comp);
4967 static int stbi__png_is16(stbi__context *s)
4971 if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
4973 if (p.depth != 16) {
4984 static int stbi__bmp_test_raw(stbi__context *s)
4988 if (stbi__get8(s) !=
'B')
return 0;
4989 if (stbi__get8(s) !=
'M')
return 0;
4994 sz = stbi__get32le(s);
4995 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4999 static int stbi__bmp_test(stbi__context *s)
5001 int r = stbi__bmp_test_raw(s);
5008 static int stbi__high_bit(
unsigned int z)
5011 if (z == 0)
return -1;
5012 if (z >= 0x10000) n += 16, z >>= 16;
5013 if (z >= 0x00100) n += 8, z >>= 8;
5014 if (z >= 0x00010) n += 4, z >>= 4;
5015 if (z >= 0x00004) n += 2, z >>= 2;
5016 if (z >= 0x00002) n += 1, z >>= 1;
5020 static int stbi__bitcount(
unsigned int a)
5022 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
5023 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
5024 a = (a + (a >> 4)) & 0x0f0f0f0f;
5026 a = (a + (a >> 16));
5033 static int stbi__shiftsigned(
int v,
int shift,
int bits)
5035 static unsigned int mul_table[9] = {
5037 0xff, 0x55, 0x49, 0x11,
5038 0x21, 0x41, 0x81, 0x01,
5040 static unsigned int shift_table[9] = {
5047 STBI_ASSERT(v >= 0 && v < 256);
5049 STBI_ASSERT(bits >= 0 && bits <= 8);
5050 return (
int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
5055 int bpp, offset, hsz;
5056 unsigned int mr,mg,mb,ma, all_a;
5059 static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
5062 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5066 info->offset = stbi__get32le(s);
5067 info->hsz = hsz = stbi__get32le(s);
5068 info->mr = info->mg = info->mb = info->ma = 0;
5070 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5072 s->img_x = stbi__get16le(s);
5073 s->img_y = stbi__get16le(s);
5075 s->img_x = stbi__get32le(s);
5076 s->img_y = stbi__get32le(s);
5078 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5079 info->bpp = stbi__get16le(s);
5081 int compress = stbi__get32le(s);
5082 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5088 if (hsz == 40 || hsz == 56) {
5095 if (info->bpp == 16 || info->bpp == 32) {
5096 if (compress == 0) {
5097 if (info->bpp == 32) {
5098 info->mr = 0xffu << 16;
5099 info->mg = 0xffu << 8;
5100 info->mb = 0xffu << 0;
5101 info->ma = 0xffu << 24;
5104 info->mr = 31u << 10;
5105 info->mg = 31u << 5;
5106 info->mb = 31u << 0;
5108 }
else if (compress == 3) {
5109 info->mr = stbi__get32le(s);
5110 info->mg = stbi__get32le(s);
5111 info->mb = stbi__get32le(s);
5113 if (info->mr == info->mg && info->mg == info->mb) {
5115 return stbi__errpuc(
"bad BMP",
"bad BMP");
5118 return stbi__errpuc(
"bad BMP",
"bad BMP");
5122 if (hsz != 108 && hsz != 124)
5123 return stbi__errpuc(
"bad BMP",
"bad BMP");
5124 info->mr = stbi__get32le(s);
5125 info->mg = stbi__get32le(s);
5126 info->mb = stbi__get32le(s);
5127 info->ma = stbi__get32le(s);
5129 for (i=0; i < 12; ++i)
5143 static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5146 unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
5147 stbi_uc pal[256][4];
5148 int psize=0,i,j,width;
5149 int flip_vertically, pad, target;
5150 stbi__bmp_data info;
5154 if (stbi__bmp_parse_header(s, &info) == NULL)
5157 flip_vertically = ((int) s->img_y) > 0;
5158 s->img_y = abs((
int) s->img_y);
5166 if (info.hsz == 12) {
5168 psize = (info.offset - 14 - 24) / 3;
5171 psize = (info.offset - 14 - info.hsz) >> 2;
5174 s->img_n = ma ? 4 : 3;
5175 if (req_comp && req_comp >= 3)
5181 if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5182 return stbi__errpuc(
"too large",
"Corrupt BMP");
5184 out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5185 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5186 if (info.bpp < 16) {
5188 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
5189 for (i=0; i < psize; ++i) {
5190 pal[i][2] = stbi__get8(s);
5191 pal[i][1] = stbi__get8(s);
5192 pal[i][0] = stbi__get8(s);
5193 if (info.hsz != 12) stbi__get8(s);
5196 stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5197 if (info.bpp == 1) width = (s->img_x + 7) >> 3;
5198 else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5199 else if (info.bpp == 8) width = s->img_x;
5200 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
5202 if (info.bpp == 1) {
5203 for (j=0; j < (int) s->img_y; ++j) {
5204 int bit_offset = 7, v = stbi__get8(s);
5205 for (i=0; i < (int) s->img_x; ++i) {
5206 int color = (v>>bit_offset)&0x1;
5207 out[z++] = pal[color][0];
5208 out[z++] = pal[color][1];
5209 out[z++] = pal[color][2];
5210 if((--bit_offset) < 0) {
5218 for (j=0; j < (int) s->img_y; ++j) {
5219 for (i=0; i < (int) s->img_x; i += 2) {
5220 int v=stbi__get8(s),v2=0;
5221 if (info.bpp == 4) {
5225 out[z++] = pal[v][0];
5226 out[z++] = pal[v][1];
5227 out[z++] = pal[v][2];
5228 if (target == 4) out[z++] = 255;
5229 if (i+1 == (
int) s->img_x)
break;
5230 v = (info.bpp == 8) ? stbi__get8(s) : v2;
5231 out[z++] = pal[v][0];
5232 out[z++] = pal[v][1];
5233 out[z++] = pal[v][2];
5234 if (target == 4) out[z++] = 255;
5240 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
5243 stbi__skip(s, info.offset - 14 - info.hsz);
5244 if (info.bpp == 24) width = 3 * s->img_x;
5245 else if (info.bpp == 16) width = 2*s->img_x;
5248 if (info.bpp == 24) {
5250 }
else if (info.bpp == 32) {
5251 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5255 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5257 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
5258 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
5259 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
5260 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
5262 for (j=0; j < (int) s->img_y; ++j) {
5264 for (i=0; i < (int) s->img_x; ++i) {
5266 out[z+2] = stbi__get8(s);
5267 out[z+1] = stbi__get8(s);
5268 out[z+0] = stbi__get8(s);
5270 a = (easy == 2 ? stbi__get8(s) : 255);
5272 if (target == 4) out[z++] = a;
5276 for (i=0; i < (int) s->img_x; ++i) {
5277 stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
5279 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5280 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5281 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5282 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5284 if (target == 4) out[z++] = STBI__BYTECAST(a);
5292 if (target == 4 && all_a == 0)
5293 for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
5296 if (flip_vertically) {
5298 for (j=0; j < (int) s->img_y>>1; ++j) {
5299 stbi_uc *p1 = out + j *s->img_x*target;
5300 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
5301 for (i=0; i < (int) s->img_x*target; ++i) {
5302 t = p1[i], p1[i] = p2[i], p2[i] = t;
5307 if (req_comp && req_comp != target) {
5308 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
5309 if (out == NULL)
return out;
5314 if (comp) *comp = s->img_n;
5323 static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
5326 if (is_rgb16) *is_rgb16 = 0;
5327 switch(bits_per_pixel) {
5328 case 8:
return STBI_grey;
5329 case 16:
if(is_grey)
return STBI_grey_alpha;
5331 case 15:
if(is_rgb16) *is_rgb16 = 1;
5334 case 32:
return bits_per_pixel/8;
5339 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
5341 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5342 int sz, tga_colormap_type;
5344 tga_colormap_type = stbi__get8(s);
5345 if( tga_colormap_type > 1 ) {
5349 tga_image_type = stbi__get8(s);
5350 if ( tga_colormap_type == 1 ) {
5351 if (tga_image_type != 1 && tga_image_type != 9) {
5357 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5362 tga_colormap_bpp = sz;
5364 if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5369 tga_colormap_bpp = 0;
5371 tga_w = stbi__get16le(s);
5376 tga_h = stbi__get16le(s);
5381 tga_bits_per_pixel = stbi__get8(s);
5383 if (tga_colormap_bpp != 0) {
5384 if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5390 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5392 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5400 if (comp) *comp = tga_comp;
5404 static int stbi__tga_test(stbi__context *s)
5407 int sz, tga_color_type;
5409 tga_color_type = stbi__get8(s);
5410 if ( tga_color_type > 1 )
goto errorEnd;
5412 if ( tga_color_type == 1 ) {
5413 if (sz != 1 && sz != 9)
goto errorEnd;
5416 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5419 if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) )
goto errorEnd;
5422 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5423 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5425 if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) )
goto errorEnd;
5426 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5436 static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
5438 stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5439 stbi__uint16 fiveBitMask = 31;
5441 int r = (px >> 10) & fiveBitMask;
5442 int g = (px >> 5) & fiveBitMask;
5443 int b = px & fiveBitMask;
5445 out[0] = (stbi_uc)((r * 255)/31);
5446 out[1] = (stbi_uc)((g * 255)/31);
5447 out[2] = (stbi_uc)((b * 255)/31);
5455 static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5458 int tga_offset = stbi__get8(s);
5459 int tga_indexed = stbi__get8(s);
5460 int tga_image_type = stbi__get8(s);
5462 int tga_palette_start = stbi__get16le(s);
5463 int tga_palette_len = stbi__get16le(s);
5464 int tga_palette_bits = stbi__get8(s);
5465 int tga_x_origin = stbi__get16le(s);
5466 int tga_y_origin = stbi__get16le(s);
5467 int tga_width = stbi__get16le(s);
5468 int tga_height = stbi__get16le(s);
5469 int tga_bits_per_pixel = stbi__get8(s);
5470 int tga_comp, tga_rgb16=0;
5471 int tga_inverted = stbi__get8(s);
5474 unsigned char *tga_data;
5475 unsigned char *tga_palette = NULL;
5477 unsigned char raw_data[4] = {0};
5479 int RLE_repeating = 0;
5480 int read_next_pixel = 1;
5484 if ( tga_image_type >= 8 )
5486 tga_image_type -= 8;
5489 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5492 if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5493 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5496 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5501 if (comp) *comp = tga_comp;
5503 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5504 return stbi__errpuc(
"too large",
"Corrupt TGA");
5506 tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5507 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
5510 stbi__skip(s, tga_offset );
5512 if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
5513 for (i=0; i < tga_height; ++i) {
5514 int row = tga_inverted ? tga_height -i - 1 : i;
5515 stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5516 stbi__getn(s, tga_row, tga_width * tga_comp);
5523 stbi__skip(s, tga_palette_start );
5525 tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5527 STBI_FREE(tga_data);
5528 return stbi__errpuc(
"outofmem",
"Out of memory");
5531 stbi_uc *pal_entry = tga_palette;
5532 STBI_ASSERT(tga_comp == STBI_rgb);
5533 for (i=0; i < tga_palette_len; ++i) {
5534 stbi__tga_read_rgb16(s, pal_entry);
5535 pal_entry += tga_comp;
5537 }
else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5538 STBI_FREE(tga_data);
5539 STBI_FREE(tga_palette);
5540 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5544 for (i=0; i < tga_width * tga_height; ++i)
5549 if ( RLE_count == 0 )
5552 int RLE_cmd = stbi__get8(s);
5553 RLE_count = 1 + (RLE_cmd & 127);
5554 RLE_repeating = RLE_cmd >> 7;
5555 read_next_pixel = 1;
5556 }
else if ( !RLE_repeating )
5558 read_next_pixel = 1;
5562 read_next_pixel = 1;
5565 if ( read_next_pixel )
5571 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5572 if ( pal_idx >= tga_palette_len ) {
5576 pal_idx *= tga_comp;
5577 for (j = 0; j < tga_comp; ++j) {
5578 raw_data[j] = tga_palette[pal_idx+j];
5580 }
else if(tga_rgb16) {
5581 STBI_ASSERT(tga_comp == STBI_rgb);
5582 stbi__tga_read_rgb16(s, raw_data);
5585 for (j = 0; j < tga_comp; ++j) {
5586 raw_data[j] = stbi__get8(s);
5590 read_next_pixel = 0;
5594 for (j = 0; j < tga_comp; ++j)
5595 tga_data[i*tga_comp+j] = raw_data[j];
5603 for (j = 0; j*2 < tga_height; ++j)
5605 int index1 = j * tga_width * tga_comp;
5606 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5607 for (i = tga_width * tga_comp; i > 0; --i)
5609 unsigned char temp = tga_data[index1];
5610 tga_data[index1] = tga_data[index2];
5611 tga_data[index2] = temp;
5618 if ( tga_palette != NULL )
5620 STBI_FREE( tga_palette );
5625 if (tga_comp >= 3 && !tga_rgb16)
5627 unsigned char* tga_pixel = tga_data;
5628 for (i=0; i < tga_width * tga_height; ++i)
5630 unsigned char temp = tga_pixel[0];
5631 tga_pixel[0] = tga_pixel[2];
5632 tga_pixel[2] = temp;
5633 tga_pixel += tga_comp;
5638 if (req_comp && req_comp != tga_comp)
5639 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5643 tga_palette_start = tga_palette_len = tga_palette_bits =
5644 tga_x_origin = tga_y_origin = 0;
5654 static int stbi__psd_test(stbi__context *s)
5656 int r = (stbi__get32be(s) == 0x38425053);
5661 static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p,
int pixelCount)
5663 int count, nleft, len;
5666 while ((nleft = pixelCount - count) > 0) {
5667 len = stbi__get8(s);
5670 }
else if (len < 128) {
5673 if (len > nleft)
return 0;
5680 }
else if (len > 128) {
5685 if (len > nleft)
return 0;
5686 val = stbi__get8(s);
5699 static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
5702 int channelCount, compression;
5710 if (stbi__get32be(s) != 0x38425053)
5711 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5714 if (stbi__get16be(s) != 1)
5715 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5721 channelCount = stbi__get16be(s);
5722 if (channelCount < 0 || channelCount > 16)
5723 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5726 h = stbi__get32be(s);
5727 w = stbi__get32be(s);
5730 bitdepth = stbi__get16be(s);
5731 if (bitdepth != 8 && bitdepth != 16)
5732 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
5744 if (stbi__get16be(s) != 3)
5745 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5748 stbi__skip(s,stbi__get32be(s) );
5751 stbi__skip(s, stbi__get32be(s) );
5754 stbi__skip(s, stbi__get32be(s) );
5760 compression = stbi__get16be(s);
5761 if (compression > 1)
5762 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5765 if (!stbi__mad3sizes_valid(4, w, h, 0))
5766 return stbi__errpuc(
"too large",
"Corrupt PSD");
5770 if (!compression && bitdepth == 16 && bpc == 16) {
5771 out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
5772 ri->bits_per_channel = 16;
5774 out = (stbi_uc *) stbi__malloc(4 * w*h);
5776 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5794 stbi__skip(s, h * channelCount * 2 );
5797 for (channel = 0; channel < 4; channel++) {
5801 if (channel >= channelCount) {
5803 for (i = 0; i < pixelCount; i++, p += 4)
5804 *p = (channel == 3 ? 255 : 0);
5807 if (!stbi__psd_decode_rle(s, p, pixelCount)) {
5809 return stbi__errpuc(
"corrupt",
"bad RLE data");
5819 for (channel = 0; channel < 4; channel++) {
5820 if (channel >= channelCount) {
5822 if (bitdepth == 16 && bpc == 16) {
5823 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
5824 stbi__uint16 val = channel == 3 ? 65535 : 0;
5825 for (i = 0; i < pixelCount; i++, q += 4)
5828 stbi_uc *p = out+channel;
5829 stbi_uc val = channel == 3 ? 255 : 0;
5830 for (i = 0; i < pixelCount; i++, p += 4)
5834 if (ri->bits_per_channel == 16) {
5835 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
5836 for (i = 0; i < pixelCount; i++, q += 4)
5837 *q = (stbi__uint16) stbi__get16be(s);
5839 stbi_uc *p = out+channel;
5840 if (bitdepth == 16) {
5841 for (i = 0; i < pixelCount; i++, p += 4)
5842 *p = (stbi_uc) (stbi__get16be(s) >> 8);
5844 for (i = 0; i < pixelCount; i++, p += 4)
5853 if (channelCount >= 4) {
5854 if (ri->bits_per_channel == 16) {
5855 for (i=0; i < w*h; ++i) {
5856 stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
5857 if (pixel[3] != 0 && pixel[3] != 65535) {
5858 float a = pixel[3] / 65535.0f;
5859 float ra = 1.0f / a;
5860 float inv_a = 65535.0f * (1 - ra);
5861 pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
5862 pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
5863 pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
5867 for (i=0; i < w*h; ++i) {
5868 unsigned char *pixel = out + 4*i;
5869 if (pixel[3] != 0 && pixel[3] != 255) {
5870 float a = pixel[3] / 255.0f;
5871 float ra = 1.0f / a;
5872 float inv_a = 255.0f * (1 - ra);
5873 pixel[0] = (
unsigned char) (pixel[0]*ra + inv_a);
5874 pixel[1] = (
unsigned char) (pixel[1]*ra + inv_a);
5875 pixel[2] = (
unsigned char) (pixel[2]*ra + inv_a);
5882 if (req_comp && req_comp != 4) {
5883 if (ri->bits_per_channel == 16)
5884 out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
5886 out = stbi__convert_format(out, 4, req_comp, w, h);
5887 if (out == NULL)
return out;
5890 if (comp) *comp = 4;
5906 static int stbi__pic_is4(stbi__context *s,
const char *str)
5910 if (stbi__get8(s) != (stbi_uc)str[i])
5916 static int stbi__pic_test_core(stbi__context *s)
5920 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
5926 if (!stbi__pic_is4(s,
"PICT"))
5934 stbi_uc size,type,channel;
5937 static stbi_uc *stbi__readval(stbi__context *s,
int channel, stbi_uc *dest)
5941 for (i=0; i<4; ++i, mask>>=1) {
5942 if (channel & mask) {
5943 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
5944 dest[i]=stbi__get8(s);
5951 static void stbi__copyval(
int channel,stbi_uc *dest,
const stbi_uc *src)
5955 for (i=0;i<4; ++i, mask>>=1)
5960 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp, stbi_uc *result)
5962 int act_comp=0,num_packets=0,y,chained;
5963 stbi__pic_packet packets[10];
5968 stbi__pic_packet *packet;
5970 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
5971 return stbi__errpuc(
"bad format",
"too many packets");
5973 packet = &packets[num_packets++];
5975 chained = stbi__get8(s);
5976 packet->size = stbi__get8(s);
5977 packet->type = stbi__get8(s);
5978 packet->channel = stbi__get8(s);
5980 act_comp |= packet->channel;
5982 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
5983 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
5986 *comp = (act_comp & 0x10 ? 4 : 3);
5988 for(y=0; y<height; ++y) {
5991 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
5992 stbi__pic_packet *packet = &packets[packet_idx];
5993 stbi_uc *dest = result+y*width*4;
5995 switch (packet->type) {
5997 return stbi__errpuc(
"bad format",
"packet has bad compression type");
6002 for(x=0;x<width;++x, dest+=4)
6003 if (!stbi__readval(s,packet->channel,dest))
6013 stbi_uc count,value[4];
6015 count=stbi__get8(s);
6016 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6019 count = (stbi_uc) left;
6021 if (!stbi__readval(s,packet->channel,value))
return 0;
6023 for(i=0; i<count; ++i,dest+=4)
6024 stbi__copyval(packet->channel,dest,value);
6033 int count = stbi__get8(s), i;
6034 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6040 count = stbi__get16be(s);
6044 return stbi__errpuc(
"bad file",
"scanline overrun");
6046 if (!stbi__readval(s,packet->channel,value))
6049 for(i=0;i<count;++i, dest += 4)
6050 stbi__copyval(packet->channel,dest,value);
6053 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
6055 for(i=0;i<count;++i, dest+=4)
6056 if (!stbi__readval(s,packet->channel,dest))
6070 static void *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp, stbi__result_info *ri)
6073 int i, x,y, internal_comp;
6076 if (!comp) comp = &internal_comp;
6078 for (i=0; i<92; ++i)
6081 x = stbi__get16be(s);
6082 y = stbi__get16be(s);
6083 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
6084 if (!stbi__mad3sizes_valid(x, y, 4, 0))
return stbi__errpuc(
"too large",
"PIC image too large to decode");
6091 result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
6092 memset(result, 0xff, x*y*4);
6094 if (!stbi__pic_load_core(s,x,y,comp, result)) {
6100 if (req_comp == 0) req_comp = *comp;
6101 result=stbi__convert_format(result,4,req_comp,x,y);
6106 static int stbi__pic_test(stbi__context *s)
6108 int r = stbi__pic_test_core(s);
6129 stbi_uc *background;
6131 int flags, bgindex, ratio, transparent, eflags;
6132 stbi_uc pal[256][4];
6133 stbi_uc lpal[256][4];
6134 stbi__gif_lzw codes[8192];
6135 stbi_uc *color_table;
6138 int start_x, start_y;
6145 static int stbi__gif_test_raw(stbi__context *s)
6148 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
6150 if (sz !=
'9' && sz !=
'7')
return 0;
6151 if (stbi__get8(s) !=
'a')
return 0;
6155 static int stbi__gif_test(stbi__context *s)
6157 int r = stbi__gif_test_raw(s);
6162 static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4],
int num_entries,
int transp)
6165 for (i=0; i < num_entries; ++i) {
6166 pal[i][2] = stbi__get8(s);
6167 pal[i][1] = stbi__get8(s);
6168 pal[i][0] = stbi__get8(s);
6169 pal[i][3] = transp == i ? 0 : 255;
6173 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
6176 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
6177 return stbi__err(
"not GIF",
"Corrupt GIF");
6179 version = stbi__get8(s);
6180 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
6181 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
6183 stbi__g_failure_reason =
"";
6184 g->w = stbi__get16le(s);
6185 g->h = stbi__get16le(s);
6186 g->flags = stbi__get8(s);
6187 g->bgindex = stbi__get8(s);
6188 g->ratio = stbi__get8(s);
6189 g->transparent = -1;
6191 if (comp != 0) *comp = 4;
6193 if (is_info)
return 1;
6195 if (g->flags & 0x80)
6196 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
6201 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
6203 stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
6204 if (!stbi__gif_header(s, g, comp, 1)) {
6215 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6222 if (g->codes[code].prefix >= 0)
6223 stbi__out_gif_code(g, g->codes[code].prefix);
6225 if (g->cur_y >= g->max_y)
return;
6227 idx = g->cur_x + g->cur_y;
6229 g->history[idx / 4] = 1;
6231 c = &g->color_table[g->codes[code].suffix * 4];
6240 if (g->cur_x >= g->max_x) {
6241 g->cur_x = g->start_x;
6242 g->cur_y += g->step;
6244 while (g->cur_y >= g->max_y && g->parse > 0) {
6245 g->step = (1 << g->parse) * g->line_size;
6246 g->cur_y = g->start_y + (g->step >> 1);
6252 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
6255 stbi__int32 len, init_code;
6257 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6260 lzw_cs = stbi__get8(s);
6261 if (lzw_cs > 12)
return NULL;
6262 clear = 1 << lzw_cs;
6264 codesize = lzw_cs + 1;
6265 codemask = (1 << codesize) - 1;
6268 for (init_code = 0; init_code < clear; init_code++) {
6269 g->codes[init_code].prefix = -1;
6270 g->codes[init_code].first = (stbi_uc) init_code;
6271 g->codes[init_code].suffix = (stbi_uc) init_code;
6280 if (valid_bits < codesize) {
6282 len = stbi__get8(s);
6287 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
6290 stbi__int32 code = bits & codemask;
6292 valid_bits -= codesize;
6294 if (code == clear) {
6295 codesize = lzw_cs + 1;
6296 codemask = (1 << codesize) - 1;
6300 }
else if (code == clear + 1) {
6302 while ((len = stbi__get8(s)) > 0)
6305 }
else if (code <= avail) {
6307 return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6311 p = &g->codes[avail++];
6313 return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6316 p->prefix = (stbi__int16) oldcode;
6317 p->first = g->codes[oldcode].first;
6318 p->suffix = (code == avail) ? p->first : g->codes[code].first;
6319 }
else if (code == avail)
6320 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6322 stbi__out_gif_code(g, (stbi__uint16) code);
6324 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6326 codemask = (1 << codesize) - 1;
6331 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6339 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp, stbi_uc *two_back)
6349 if (!stbi__gif_header(s, g, comp,0))
return 0;
6350 g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
6351 g->background = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
6352 g->history = (stbi_uc *) stbi__malloc(g->w * g->h);
6353 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
6358 memset( g->out, 0x00, 4 * g->w * g->h );
6359 memset( g->background, 0x00, 4 * g->w * g->h );
6360 memset( g->history, 0x00, g->w * g->h );
6364 dispose = (g->eflags & 0x1C) >> 2;
6365 pcount = g->w * g->h;
6367 if ((dispose == 3) && (two_back == 0)) {
6372 for (pi = 0; pi < pcount; ++pi) {
6373 if (g->history[pi]) {
6374 memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
6377 }
else if (dispose == 2) {
6379 for (pi = 0; pi < pcount; ++pi) {
6380 if (g->history[pi]) {
6381 memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
6392 memcpy( g->background, g->out, 4 * g->w * g->h );
6396 memset( g->history, 0x00, g->w * g->h );
6399 int tag = stbi__get8(s);
6403 stbi__int32 x, y, w, h;
6406 x = stbi__get16le(s);
6407 y = stbi__get16le(s);
6408 w = stbi__get16le(s);
6409 h = stbi__get16le(s);
6410 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6411 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6413 g->line_size = g->w * 4;
6415 g->start_y = y * g->line_size;
6416 g->max_x = g->start_x + w * 4;
6417 g->max_y = g->start_y + h * g->line_size;
6418 g->cur_x = g->start_x;
6419 g->cur_y = g->start_y;
6421 g->lflags = stbi__get8(s);
6423 if (g->lflags & 0x40) {
6424 g->step = 8 * g->line_size;
6427 g->step = g->line_size;
6431 if (g->lflags & 0x80) {
6432 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6433 g->color_table = (stbi_uc *) g->lpal;
6434 }
else if (g->flags & 0x80) {
6435 g->color_table = (stbi_uc *) g->pal;
6437 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6439 o = stbi__process_gif_raster(s, g);
6440 if (o == NULL)
return NULL;
6443 pcount = g->w * g->h;
6444 if (first_frame && (g->bgindex > 0)) {
6446 for (pi = 0; pi < pcount; ++pi) {
6447 if (g->history[pi] == 0) {
6448 g->pal[g->bgindex][3] = 255;
6449 memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
6460 int ext = stbi__get8(s);
6462 len = stbi__get8(s);
6464 g->eflags = stbi__get8(s);
6465 g->delay = 10 * stbi__get16le(s);
6468 if (g->transparent >= 0) {
6469 g->pal[g->transparent][3] = 255;
6471 if (g->eflags & 0x01) {
6472 g->transparent = stbi__get8(s);
6473 if (g->transparent >= 0) {
6474 g->pal[g->transparent][3] = 0;
6479 g->transparent = -1;
6486 while ((len = stbi__get8(s)) != 0) {
6493 return (stbi_uc *) s;
6496 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6501 static void *stbi__load_gif_main(stbi__context *s,
int **delays,
int *x,
int *y,
int *z,
int *comp,
int req_comp)
6503 if (stbi__gif_test(s)) {
6507 stbi_uc *two_back = 0;
6510 memset(&g, 0,
sizeof(g));
6516 u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
6517 if (u == (stbi_uc *) s) u = 0;
6523 stride = g.w * g.h * 4;
6526 out = (stbi_uc*) STBI_REALLOC( out, layers * stride );
6528 *delays = (
int*) STBI_REALLOC( *delays,
sizeof(
int) * layers );
6531 out = (stbi_uc*)stbi__malloc( layers * stride );
6533 *delays = (
int*) stbi__malloc( layers *
sizeof(
int) );
6536 memcpy( out + ((layers - 1) * stride), u, stride );
6538 two_back = out - 2 * stride;
6542 (*delays)[layers - 1U] = g.delay;
6549 STBI_FREE(g.history);
6550 STBI_FREE(g.background);
6553 if (req_comp && req_comp != 4)
6554 out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
6559 return stbi__errpuc(
"not GIF",
"Image was not as a gif type.");
6563 static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6567 memset(&g, 0,
sizeof(g));
6569 u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
6570 if (u == (stbi_uc *) s) u = 0;
6577 if (req_comp && req_comp != 4)
6578 u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
6582 STBI_FREE(g.history);
6583 STBI_FREE(g.background);
6588 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
6590 return stbi__gif_info_raw(s,x,y,comp);
6598 static int stbi__hdr_test_core(stbi__context *s,
const char *signature)
6601 for (i=0; signature[i]; ++i)
6602 if (stbi__get8(s) != signature[i])
6608 static int stbi__hdr_test(stbi__context* s)
6610 int r = stbi__hdr_test_core(s,
"#?RADIANCE\n");
6613 r = stbi__hdr_test_core(s,
"#?RGBE\n");
6619 #define STBI__HDR_BUFLEN 1024
6620 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
6625 c = (char) stbi__get8(z);
6627 while (!stbi__at_eof(z) && c !=
'\n') {
6629 if (len == STBI__HDR_BUFLEN-1) {
6631 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
6635 c = (char) stbi__get8(z);
6642 static void stbi__hdr_convert(
float *output, stbi_uc *input,
int req_comp)
6644 if ( input[3] != 0 ) {
6647 f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
6649 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
6651 output[0] = input[0] * f1;
6652 output[1] = input[1] * f1;
6653 output[2] = input[2] * f1;
6655 if (req_comp == 2) output[1] = 1;
6656 if (req_comp == 4) output[3] = 1;
6659 case 4: output[3] = 1;
6660 case 3: output[0] = output[1] = output[2] = 0;
6662 case 2: output[1] = 1;
6663 case 1: output[0] = 0;
6669 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6671 char buffer[STBI__HDR_BUFLEN];
6678 unsigned char count, value;
6679 int i, j, k, c1,c2, z;
6680 const char *headerToken;
6684 headerToken = stbi__hdr_gettoken(s,buffer);
6685 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
6686 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
6690 token = stbi__hdr_gettoken(s,buffer);
6691 if (token[0] == 0)
break;
6692 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6695 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
6699 token = stbi__hdr_gettoken(s,buffer);
6700 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6702 height = (int) strtol(token, &token, 10);
6703 while (*token ==
' ') ++token;
6704 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6706 width = (int) strtol(token, NULL, 10);
6711 if (comp) *comp = 3;
6712 if (req_comp == 0) req_comp = 3;
6714 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
6715 return stbi__errpf(
"too large",
"HDR image is too large");
6718 hdr_data = (
float *) stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
6720 return stbi__errpf(
"outofmem",
"Out of memory");
6724 if ( width < 8 || width >= 32768) {
6726 for (j=0; j < height; ++j) {
6727 for (i=0; i < width; ++i) {
6730 stbi__getn(s, rgbe, 4);
6731 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
6738 for (j = 0; j < height; ++j) {
6741 len = stbi__get8(s);
6742 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
6746 rgbe[0] = (stbi_uc) c1;
6747 rgbe[1] = (stbi_uc) c2;
6748 rgbe[2] = (stbi_uc) len;
6749 rgbe[3] = (stbi_uc) stbi__get8(s);
6750 stbi__hdr_convert(hdr_data, rgbe, req_comp);
6753 STBI_FREE(scanline);
6754 goto main_decode_loop;
6757 len |= stbi__get8(s);
6758 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
6759 if (scanline == NULL) {
6760 scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
6762 STBI_FREE(hdr_data);
6763 return stbi__errpf(
"outofmem",
"Out of memory");
6767 for (k = 0; k < 4; ++k) {
6770 while ((nleft = width - i) > 0) {
6771 count = stbi__get8(s);
6774 value = stbi__get8(s);
6776 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6777 for (z = 0; z < count; ++z)
6778 scanline[i++ * 4 + k] = value;
6781 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6782 for (z = 0; z < count; ++z)
6783 scanline[i++ * 4 + k] = stbi__get8(s);
6787 for (i=0; i < width; ++i)
6788 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
6791 STBI_FREE(scanline);
6797 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
6799 char buffer[STBI__HDR_BUFLEN];
6806 if (!comp) comp = &dummy;
6808 if (stbi__hdr_test(s) == 0) {
6814 token = stbi__hdr_gettoken(s,buffer);
6815 if (token[0] == 0)
break;
6816 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6823 token = stbi__hdr_gettoken(s,buffer);
6824 if (strncmp(token,
"-Y ", 3)) {
6829 *y = (int) strtol(token, &token, 10);
6830 while (*token ==
' ') ++token;
6831 if (strncmp(token,
"+X ", 3)) {
6836 *x = (int) strtol(token, NULL, 10);
6840 #endif // STBI_NO_HDR
6843 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
6846 stbi__bmp_data info;
6849 p = stbi__bmp_parse_header(s, &info);
6853 if (x) *x = s->img_x;
6854 if (y) *y = s->img_y;
6855 if (comp) *comp = info.ma ? 4 : 3;
6861 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
6863 int channelCount, dummy, depth;
6866 if (!comp) comp = &dummy;
6867 if (stbi__get32be(s) != 0x38425053) {
6871 if (stbi__get16be(s) != 1) {
6876 channelCount = stbi__get16be(s);
6877 if (channelCount < 0 || channelCount > 16) {
6881 *y = stbi__get32be(s);
6882 *x = stbi__get32be(s);
6883 depth = stbi__get16be(s);
6884 if (depth != 8 && depth != 16) {
6888 if (stbi__get16be(s) != 3) {
6896 static int stbi__psd_is16(stbi__context *s)
6898 int channelCount, depth;
6899 if (stbi__get32be(s) != 0x38425053) {
6903 if (stbi__get16be(s) != 1) {
6908 channelCount = stbi__get16be(s);
6909 if (channelCount < 0 || channelCount > 16) {
6913 (void) stbi__get32be(s);
6914 (void) stbi__get32be(s);
6915 depth = stbi__get16be(s);
6925 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
6927 int act_comp=0,num_packets=0,chained,dummy;
6928 stbi__pic_packet packets[10];
6932 if (!comp) comp = &dummy;
6934 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
6941 *x = stbi__get16be(s);
6942 *y = stbi__get16be(s);
6943 if (stbi__at_eof(s)) {
6947 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
6955 stbi__pic_packet *packet;
6957 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
6960 packet = &packets[num_packets++];
6961 chained = stbi__get8(s);
6962 packet->size = stbi__get8(s);
6963 packet->type = stbi__get8(s);
6964 packet->channel = stbi__get8(s);
6965 act_comp |= packet->channel;
6967 if (stbi__at_eof(s)) {
6971 if (packet->size != 8) {
6977 *comp = (act_comp & 0x10 ? 4 : 3);
6997 static int stbi__pnm_test(stbi__context *s)
7000 p = (char) stbi__get8(s);
7001 t = (char) stbi__get8(s);
7002 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7009 static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
7014 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
7019 if (comp) *comp = s->img_n;
7021 if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
7022 return stbi__errpuc(
"too large",
"PNM too large");
7024 out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
7025 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
7026 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
7028 if (req_comp && req_comp != s->img_n) {
7029 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7030 if (out == NULL)
return out;
7035 static int stbi__pnm_isspace(
char c)
7037 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
7040 static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
7043 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7044 *c = (char) stbi__get8(s);
7046 if (stbi__at_eof(s) || *c !=
'#')
7049 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r' )
7050 *c = (
char) stbi__get8(s);
7054 static int stbi__pnm_isdigit(
char c)
7056 return c >=
'0' && c <=
'9';
7059 static int stbi__pnm_getinteger(stbi__context *s,
char *c)
7063 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7064 value = value*10 + (*c -
'0');
7065 *c = (char) stbi__get8(s);
7071 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
7078 if (!comp) comp = &dummy;
7083 p = (char) stbi__get8(s);
7084 t = (char) stbi__get8(s);
7085 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7090 *comp = (t ==
'6') ? 3 : 1;
7092 c = (char) stbi__get8(s);
7093 stbi__pnm_skip_whitespace(s, &c);
7095 *x = stbi__pnm_getinteger(s, &c);
7096 stbi__pnm_skip_whitespace(s, &c);
7098 *y = stbi__pnm_getinteger(s, &c);
7099 stbi__pnm_skip_whitespace(s, &c);
7101 maxv = stbi__pnm_getinteger(s, &c);
7104 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
7110 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
7112 #ifndef STBI_NO_JPEG
7113 if (stbi__jpeg_info(s, x, y, comp))
return 1;
7117 if (stbi__png_info(s, x, y, comp))
return 1;
7121 if (stbi__gif_info(s, x, y, comp))
return 1;
7125 if (stbi__bmp_info(s, x, y, comp))
return 1;
7129 if (stbi__psd_info(s, x, y, comp))
return 1;
7133 if (stbi__pic_info(s, x, y, comp))
return 1;
7137 if (stbi__pnm_info(s, x, y, comp))
return 1;
7141 if (stbi__hdr_info(s, x, y, comp))
return 1;
7146 if (stbi__tga_info(s, x, y, comp))
7149 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
7152 static int stbi__is_16_main(stbi__context *s)
7155 if (stbi__png_is16(s))
return 1;
7159 if (stbi__psd_is16(s))
return 1;
7165 #ifndef STBI_NO_STDIO
7166 STBIDEF
int stbi_info(
char const *filename,
int *x,
int *y,
int *comp)
7168 FILE *f = stbi__fopen(filename,
"rb");
7170 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7171 result = stbi_info_from_file(f, x, y, comp);
7176 STBIDEF
int stbi_info_from_file(FILE *f,
int *x,
int *y,
int *comp)
7180 long pos = ftell(f);
7181 stbi__start_file(&s, f);
7182 r = stbi__info_main(&s,x,y,comp);
7183 fseek(f,pos,SEEK_SET);
7187 STBIDEF
int stbi_is_16_bit(
char const *filename)
7189 FILE *f = stbi__fopen(filename,
"rb");
7191 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7192 result = stbi_is_16_bit_from_file(f);
7197 STBIDEF
int stbi_is_16_bit_from_file(FILE *f)
7201 long pos = ftell(f);
7202 stbi__start_file(&s, f);
7203 r = stbi__is_16_main(&s);
7204 fseek(f,pos,SEEK_SET);
7207 #endif // !STBI_NO_STDIO
7209 STBIDEF
int stbi_info_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp)
7212 stbi__start_mem(&s,buffer,len);
7213 return stbi__info_main(&s,x,y,comp);
7216 STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const *c,
void *user,
int *x,
int *y,
int *comp)
7220 return stbi__info_main(&s,x,y,comp);
7223 STBIDEF
int stbi_is_16_bit_from_memory(stbi_uc
const *buffer,
int len)
7226 stbi__start_mem(&s,buffer,len);
7227 return stbi__is_16_main(&s);
7230 STBIDEF
int stbi_is_16_bit_from_callbacks(
stbi_io_callbacks const *c,
void *user)
7234 return stbi__is_16_main(&s);
7237 #endif // STB_IMAGE_IMPLEMENTATION
Definition: stb_image.h:344