110#ifndef STBI_INCLUDE_STB_IMAGE_H
111#define STBI_INCLUDE_STB_IMAGE_H
323#define STBI_VERSION 1
336typedef unsigned char stbi_uc;
337typedef unsigned short stbi_us;
344#ifdef STB_IMAGE_STATIC
345#define STBIDEF static
347#define STBIDEF extern
362 int (*read) (
void *user,
char *data,
int size);
363 void (*skip) (
void *user,
int n);
364 int (*eof) (
void *user);
372STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc
const *buffer,
int len ,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
373STBIDEF stbi_uc *stbi_load_from_callbacks(
stbi_io_callbacks const *clbk ,
void *user,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
376STBIDEF stbi_uc *stbi_load (
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
377STBIDEF stbi_uc *stbi_load_from_file (FILE *f,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
382STBIDEF 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);
385#ifdef STBI_WINDOWS_UTF8
386STBIDEF
int stbi_convert_wchar_to_utf8(
char *buffer,
size_t bufferlen,
const wchar_t* input);
394STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
395STBIDEF 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);
398STBIDEF stbi_us *stbi_load_16 (
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
399STBIDEF stbi_us *stbi_load_from_file_16(FILE *f,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
406#ifndef STBI_NO_LINEAR
407 STBIDEF
float *stbi_loadf_from_memory (stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
408 STBIDEF
float *stbi_loadf_from_callbacks (
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
410 #ifndef STBI_NO_STDIO
411 STBIDEF
float *stbi_loadf (
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
412 STBIDEF
float *stbi_loadf_from_file (FILE *f,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
417 STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma);
418 STBIDEF
void stbi_hdr_to_ldr_scale(
float scale);
421#ifndef STBI_NO_LINEAR
422 STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma);
423 STBIDEF
void stbi_ldr_to_hdr_scale(
float scale);
427STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk,
void *user);
428STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const *buffer,
int len);
430STBIDEF
int stbi_is_hdr (
char const *filename);
431STBIDEF
int stbi_is_hdr_from_file(FILE *f);
437STBIDEF
const char *stbi_failure_reason (
void);
440STBIDEF
void stbi_image_free (
void *retval_from_stbi_load);
443STBIDEF
int stbi_info_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp);
444STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp);
445STBIDEF
int stbi_is_16_bit_from_memory(stbi_uc
const *buffer,
int len);
446STBIDEF
int stbi_is_16_bit_from_callbacks(
stbi_io_callbacks const *clbk,
void *user);
449STBIDEF
int stbi_info (
char const *filename,
int *x,
int *y,
int *comp);
450STBIDEF
int stbi_info_from_file (FILE *f,
int *x,
int *y,
int *comp);
451STBIDEF
int stbi_is_16_bit (
char const *filename);
452STBIDEF
int stbi_is_16_bit_from_file(FILE *f);
460STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply);
464STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert);
467STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip);
471STBIDEF
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer,
int len,
int initial_size,
int *outlen);
472STBIDEF
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer,
int len,
int initial_size,
int *outlen,
int parse_header);
473STBIDEF
char *stbi_zlib_decode_malloc(
const char *buffer,
int len,
int *outlen);
474STBIDEF
int stbi_zlib_decode_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen);
476STBIDEF
char *stbi_zlib_decode_noheader_malloc(
const char *buffer,
int len,
int *outlen);
477STBIDEF
int stbi_zlib_decode_noheader_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen);
489#ifdef STB_IMAGE_IMPLEMENTATION
491#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
492 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
493 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
494 || defined(STBI_ONLY_ZLIB)
495 #ifndef STBI_ONLY_JPEG
498 #ifndef STBI_ONLY_PNG
501 #ifndef STBI_ONLY_BMP
504 #ifndef STBI_ONLY_PSD
507 #ifndef STBI_ONLY_TGA
510 #ifndef STBI_ONLY_GIF
513 #ifndef STBI_ONLY_HDR
516 #ifndef STBI_ONLY_PIC
519 #ifndef STBI_ONLY_PNM
524#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
535#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
545#define STBI_ASSERT(x) assert(x)
549#define STBI_EXTERN extern "C"
551#define STBI_EXTERN extern
557 #define stbi_inline inline
562 #define stbi_inline __forceinline
567typedef unsigned short stbi__uint16;
568typedef signed short stbi__int16;
569typedef unsigned int stbi__uint32;
570typedef signed int stbi__int32;
573typedef uint16_t stbi__uint16;
574typedef int16_t stbi__int16;
575typedef uint32_t stbi__uint32;
576typedef int32_t stbi__int32;
580typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
583#define STBI_NOTUSED(v) (void)(v)
585#define STBI_NOTUSED(v) (void)sizeof(v)
589#define STBI_HAS_LROTL
593 #define stbi_lrot(x,y) _lrotl(x,y)
595 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
598#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
600#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
603#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
607#define STBI_MALLOC(sz) malloc(sz)
608#define STBI_REALLOC(p,newsz) realloc(p,newsz)
609#define STBI_FREE(p) free(p)
612#ifndef STBI_REALLOC_SIZED
613#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
617#if defined(__x86_64__) || defined(_M_X64)
618#define STBI__X64_TARGET
619#elif defined(__i386) || defined(_M_IX86)
620#define STBI__X86_TARGET
623#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
634#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
649#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
651#include <emmintrin.h>
657static int stbi__cpuid3(
void)
664static int stbi__cpuid3(
void)
676#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
678#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
679static int stbi__sse2_available(
void)
681 int info3 = stbi__cpuid3();
682 return ((info3 >> 26) & 1) != 0;
687#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
689#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
690static int stbi__sse2_available(
void)
703#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
710#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
713#ifndef STBI_SIMD_ALIGN
714#define STBI_SIMD_ALIGN(type, name) type name
725 stbi__uint32 img_x, img_y;
726 int img_n, img_out_n;
731 int read_from_callbacks;
733 stbi_uc buffer_start[128];
735 stbi_uc *img_buffer, *img_buffer_end;
736 stbi_uc *img_buffer_original, *img_buffer_original_end;
740static void stbi__refill_buffer(stbi__context *s);
743static void stbi__start_mem(stbi__context *s, stbi_uc
const *buffer,
int len)
746 s->read_from_callbacks = 0;
747 s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
748 s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
752static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user)
755 s->io_user_data = user;
756 s->buflen =
sizeof(s->buffer_start);
757 s->read_from_callbacks = 1;
758 s->img_buffer_original = s->buffer_start;
759 stbi__refill_buffer(s);
760 s->img_buffer_original_end = s->img_buffer_end;
765static int stbi__stdio_read(
void *user,
char *data,
int size)
767 return (
int) fread(data,1,size,(FILE*) user);
770static void stbi__stdio_skip(
void *user,
int n)
772 fseek((FILE*) user, n, SEEK_CUR);
775static int stbi__stdio_eof(
void *user)
777 return feof((FILE*) user);
787static void stbi__start_file(stbi__context *s, FILE *f)
789 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *) f);
796static void stbi__rewind(stbi__context *s)
801 s->img_buffer = s->img_buffer_original;
802 s->img_buffer_end = s->img_buffer_original_end;
813 int bits_per_channel;
819static int stbi__jpeg_test(stbi__context *s);
820static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
821static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
825static int stbi__png_test(stbi__context *s);
826static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
827static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
828static int stbi__png_is16(stbi__context *s);
832static int stbi__bmp_test(stbi__context *s);
833static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
834static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
838static int stbi__tga_test(stbi__context *s);
839static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
840static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
844static int stbi__psd_test(stbi__context *s);
845static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc);
846static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
847static int stbi__psd_is16(stbi__context *s);
851static int stbi__hdr_test(stbi__context *s);
852static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
853static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
857static int stbi__pic_test(stbi__context *s);
858static void *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
859static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
863static int stbi__gif_test(stbi__context *s);
864static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
865static void *stbi__load_gif_main(stbi__context *s,
int **delays,
int *x,
int *y,
int *z,
int *comp,
int req_comp);
866static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
870static int stbi__pnm_test(stbi__context *s);
871static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
872static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
876static const char *stbi__g_failure_reason;
878STBIDEF
const char *stbi_failure_reason(
void)
880 return stbi__g_failure_reason;
883static int stbi__err(
const char *str)
885 stbi__g_failure_reason = str;
889static void *stbi__malloc(
size_t size)
891 return STBI_MALLOC(size);
906static int stbi__addsizes_valid(
int a,
int b)
913 return a <= INT_MAX - b;
918static int stbi__mul2sizes_valid(
int a,
int b)
920 if (a < 0 || b < 0)
return 0;
921 if (b == 0)
return 1;
923 return a <= INT_MAX/b;
927static int stbi__mad2sizes_valid(
int a,
int b,
int add)
929 return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
933static int stbi__mad3sizes_valid(
int a,
int b,
int c,
int add)
935 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
936 stbi__addsizes_valid(a*b*c, add);
940#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
941static int stbi__mad4sizes_valid(
int a,
int b,
int c,
int d,
int add)
943 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
944 stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
949static void *stbi__malloc_mad2(
int a,
int b,
int add)
951 if (!stbi__mad2sizes_valid(a, b, add))
return NULL;
952 return stbi__malloc(a*b + add);
955static void *stbi__malloc_mad3(
int a,
int b,
int c,
int add)
957 if (!stbi__mad3sizes_valid(a, b, c, add))
return NULL;
958 return stbi__malloc(a*b*c + add);
961#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
962static void *stbi__malloc_mad4(
int a,
int b,
int c,
int d,
int add)
964 if (!stbi__mad4sizes_valid(a, b, c, d, add))
return NULL;
965 return stbi__malloc(a*b*c*d + add);
973#ifdef STBI_NO_FAILURE_STRINGS
974 #define stbi__err(x,y) 0
975#elif defined(STBI_FAILURE_USERMSG)
976 #define stbi__err(x,y) stbi__err(y)
978 #define stbi__err(x,y) stbi__err(x)
981#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
982#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
984STBIDEF
void stbi_image_free(
void *retval_from_stbi_load)
986 STBI_FREE(retval_from_stbi_load);
989#ifndef STBI_NO_LINEAR
990static float *stbi__ldr_to_hdr(stbi_uc *data,
int x,
int y,
int comp);
994static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
997static int stbi__vertically_flip_on_load = 0;
999STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip)
1001 stbi__vertically_flip_on_load = flag_true_if_should_flip;
1004static void *stbi__load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
1006 memset(ri, 0,
sizeof(*ri));
1007 ri->bits_per_channel = 8;
1008 ri->channel_order = STBI_ORDER_RGB;
1009 ri->num_channels = 0;
1011 #ifndef STBI_NO_JPEG
1012 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
1015 if (stbi__png_test(s))
return stbi__png_load(s,x,y,comp,req_comp, ri);
1018 if (stbi__bmp_test(s))
return stbi__bmp_load(s,x,y,comp,req_comp, ri);
1021 if (stbi__gif_test(s))
return stbi__gif_load(s,x,y,comp,req_comp, ri);
1024 if (stbi__psd_test(s))
return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
1027 if (stbi__pic_test(s))
return stbi__pic_load(s,x,y,comp,req_comp, ri);
1030 if (stbi__pnm_test(s))
return stbi__pnm_load(s,x,y,comp,req_comp, ri);
1034 if (stbi__hdr_test(s)) {
1035 float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
1036 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
1042 if (stbi__tga_test(s))
1043 return stbi__tga_load(s,x,y,comp,req_comp, ri);
1046 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
1049static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig,
int w,
int h,
int channels)
1052 int img_len = w * h * channels;
1055 reduced = (stbi_uc *) stbi__malloc(img_len);
1056 if (reduced == NULL)
return stbi__errpuc(
"outofmem",
"Out of memory");
1058 for (i = 0; i < img_len; ++i)
1059 reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF);
1065static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig,
int w,
int h,
int channels)
1068 int img_len = w * h * channels;
1069 stbi__uint16 *enlarged;
1071 enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
1072 if (enlarged == NULL)
return (stbi__uint16 *) stbi__errpuc(
"outofmem",
"Out of memory");
1074 for (i = 0; i < img_len; ++i)
1075 enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]);
1081static void stbi__vertical_flip(
void *image,
int w,
int h,
int bytes_per_pixel)
1084 size_t bytes_per_row = (size_t)w * bytes_per_pixel;
1086 stbi_uc *bytes = (stbi_uc *)image;
1088 for (row = 0; row < (h>>1); row++) {
1089 stbi_uc *row0 = bytes + row*bytes_per_row;
1090 stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
1092 size_t bytes_left = bytes_per_row;
1093 while (bytes_left) {
1094 size_t bytes_copy = (bytes_left <
sizeof(temp)) ? bytes_left :
sizeof(temp);
1095 memcpy(temp, row0, bytes_copy);
1096 memcpy(row0, row1, bytes_copy);
1097 memcpy(row1, temp, bytes_copy);
1100 bytes_left -= bytes_copy;
1106static void stbi__vertical_flip_slices(
void *image,
int w,
int h,
int z,
int bytes_per_pixel)
1109 int slice_size = w * h * bytes_per_pixel;
1111 stbi_uc *bytes = (stbi_uc *)image;
1112 for (slice = 0; slice < z; ++slice) {
1113 stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
1114 bytes += slice_size;
1119static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1121 stbi__result_info ri;
1122 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1127 if (ri.bits_per_channel != 8) {
1128 STBI_ASSERT(ri.bits_per_channel == 16);
1129 result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1130 ri.bits_per_channel = 8;
1135 if (stbi__vertically_flip_on_load) {
1136 int channels = req_comp ? req_comp : *comp;
1137 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi_uc));
1140 return (
unsigned char *) result;
1143static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1145 stbi__result_info ri;
1146 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1151 if (ri.bits_per_channel != 16) {
1152 STBI_ASSERT(ri.bits_per_channel == 8);
1153 result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1154 ri.bits_per_channel = 16;
1160 if (stbi__vertically_flip_on_load) {
1161 int channels = req_comp ? req_comp : *comp;
1162 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi__uint16));
1165 return (stbi__uint16 *) result;
1168#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
1169static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp)
1171 if (stbi__vertically_flip_on_load && result != NULL) {
1172 int channels = req_comp ? req_comp : *comp;
1173 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
float));
1178#ifndef STBI_NO_STDIO
1180#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
1181STBI_EXTERN __declspec(dllimport)
int __stdcall MultiByteToWideChar(
unsigned int cp,
unsigned long flags,
const char *str,
int cbmb,
wchar_t *widestr,
int cchwide);
1182STBI_EXTERN __declspec(dllimport)
int __stdcall WideCharToMultiByte(
unsigned int cp,
unsigned long flags,
const wchar_t *widestr,
int cchwide,
char *str,
int cbmb,
const char *defchar,
int *used_default);
1185#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
1186STBIDEF
int stbi_convert_wchar_to_utf8(
char *buffer,
size_t bufferlen,
const wchar_t* input)
1188 return WideCharToMultiByte(65001 , 0, input, -1, buffer, (
int) bufferlen, NULL, NULL);
1192static FILE *stbi__fopen(
char const *filename,
char const *mode)
1195#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
1197 wchar_t wFilename[1024];
1198 if (0 == MultiByteToWideChar(65001 , 0, filename, -1, wFilename,
sizeof(wFilename)))
1201 if (0 == MultiByteToWideChar(65001 , 0, mode, -1, wMode,
sizeof(wMode)))
1205 if (0 != _wfopen_s(&f, wFilename, wMode))
1208 f = _wfopen(wFilename, wMode);
1211#elif defined(_MSC_VER) && _MSC_VER >= 1400
1212 if (0 != fopen_s(&f, filename, mode))
1215 f = fopen(filename, mode);
1221STBIDEF stbi_uc *stbi_load(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1223 FILE *f = stbi__fopen(filename,
"rb");
1224 unsigned char *result;
1225 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1226 result = stbi_load_from_file(f,x,y,comp,req_comp);
1231STBIDEF stbi_uc *stbi_load_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp)
1233 unsigned char *result;
1235 stbi__start_file(&s,f);
1236 result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1239 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1244STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f,
int *x,
int *y,
int *comp,
int req_comp)
1246 stbi__uint16 *result;
1248 stbi__start_file(&s,f);
1249 result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
1252 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1257STBIDEF stbi_us *stbi_load_16(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1259 FILE *f = stbi__fopen(filename,
"rb");
1260 stbi__uint16 *result;
1261 if (!f)
return (stbi_us *) stbi__errpuc(
"can't fopen",
"Unable to open file");
1262 result = stbi_load_from_file_16(f,x,y,comp,req_comp);
1270STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *channels_in_file,
int desired_channels)
1273 stbi__start_mem(&s,buffer,len);
1274 return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1277STBIDEF 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)
1281 return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1284STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp)
1287 stbi__start_mem(&s,buffer,len);
1288 return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1291STBIDEF stbi_uc *stbi_load_from_callbacks(
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp,
int req_comp)
1295 return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1299STBIDEF 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)
1301 unsigned char *result;
1303 stbi__start_mem(&s,buffer,len);
1305 result = (
unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
1306 if (stbi__vertically_flip_on_load) {
1307 stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
1314#ifndef STBI_NO_LINEAR
1315static float *stbi__loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1317 unsigned char *data;
1319 if (stbi__hdr_test(s)) {
1320 stbi__result_info ri;
1321 float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
1323 stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1327 data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
1329 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1330 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1333STBIDEF
float *stbi_loadf_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp)
1336 stbi__start_mem(&s,buffer,len);
1337 return stbi__loadf_main(&s,x,y,comp,req_comp);
1340STBIDEF
float *stbi_loadf_from_callbacks(
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp,
int req_comp)
1344 return stbi__loadf_main(&s,x,y,comp,req_comp);
1347#ifndef STBI_NO_STDIO
1348STBIDEF
float *stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1351 FILE *f = stbi__fopen(filename,
"rb");
1352 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1353 result = stbi_loadf_from_file(f,x,y,comp,req_comp);
1358STBIDEF
float *stbi_loadf_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp)
1361 stbi__start_file(&s,f);
1362 return stbi__loadf_main(&s,x,y,comp,req_comp);
1372STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const *buffer,
int len)
1376 stbi__start_mem(&s,buffer,len);
1377 return stbi__hdr_test(&s);
1379 STBI_NOTUSED(buffer);
1385#ifndef STBI_NO_STDIO
1386STBIDEF
int stbi_is_hdr (
char const *filename)
1388 FILE *f = stbi__fopen(filename,
"rb");
1391 result = stbi_is_hdr_from_file(f);
1397STBIDEF
int stbi_is_hdr_from_file(FILE *f)
1400 long pos = ftell(f);
1403 stbi__start_file(&s,f);
1404 res = stbi__hdr_test(&s);
1405 fseek(f, pos, SEEK_SET);
1414STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk,
void *user)
1419 return stbi__hdr_test(&s);
1427#ifndef STBI_NO_LINEAR
1428static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1430STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma) { stbi__l2h_gamma = gamma; }
1431STBIDEF
void stbi_ldr_to_hdr_scale(
float scale) { stbi__l2h_scale = scale; }
1434static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1436STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma) { stbi__h2l_gamma_i = 1/gamma; }
1437STBIDEF
void stbi_hdr_to_ldr_scale(
float scale) { stbi__h2l_scale_i = 1/scale; }
1452static void stbi__refill_buffer(stbi__context *s)
1454 int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
1458 s->read_from_callbacks = 0;
1459 s->img_buffer = s->buffer_start;
1460 s->img_buffer_end = s->buffer_start+1;
1463 s->img_buffer = s->buffer_start;
1464 s->img_buffer_end = s->buffer_start + n;
1468stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1470 if (s->img_buffer < s->img_buffer_end)
1471 return *s->img_buffer++;
1472 if (s->read_from_callbacks) {
1473 stbi__refill_buffer(s);
1474 return *s->img_buffer++;
1479stbi_inline
static int stbi__at_eof(stbi__context *s)
1482 if (!(s->io.eof)(s->io_user_data))
return 0;
1485 if (s->read_from_callbacks == 0)
return 1;
1488 return s->img_buffer >= s->img_buffer_end;
1491static void stbi__skip(stbi__context *s,
int n)
1494 s->img_buffer = s->img_buffer_end;
1498 int blen = (int) (s->img_buffer_end - s->img_buffer);
1500 s->img_buffer = s->img_buffer_end;
1501 (s->io.skip)(s->io_user_data, n - blen);
1508static int stbi__getn(stbi__context *s, stbi_uc *buffer,
int n)
1511 int blen = (int) (s->img_buffer_end - s->img_buffer);
1515 memcpy(buffer, s->img_buffer, blen);
1517 count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
1518 res = (count == (n-blen));
1519 s->img_buffer = s->img_buffer_end;
1524 if (s->img_buffer+n <= s->img_buffer_end) {
1525 memcpy(buffer, s->img_buffer, n);
1532static int stbi__get16be(stbi__context *s)
1534 int z = stbi__get8(s);
1535 return (z << 8) + stbi__get8(s);
1538static stbi__uint32 stbi__get32be(stbi__context *s)
1540 stbi__uint32 z = stbi__get16be(s);
1541 return (z << 16) + stbi__get16be(s);
1544#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1547static int stbi__get16le(stbi__context *s)
1549 int z = stbi__get8(s);
1550 return z + (stbi__get8(s) << 8);
1555static stbi__uint32 stbi__get32le(stbi__context *s)
1557 stbi__uint32 z = stbi__get16le(s);
1558 return z + (stbi__get16le(s) << 16);
1562#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255))
1576static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1578 return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
1581static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1584 unsigned char *good;
1586 if (req_comp == img_n)
return data;
1587 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1589 good = (
unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
1592 return stbi__errpuc(
"outofmem",
"Out of memory");
1595 for (j=0; j < (int) y; ++j) {
1596 unsigned char *src = data + j * x * img_n ;
1597 unsigned char *dest = good + j * x * req_comp;
1599 #define STBI__COMBO(a,b) ((a)*8+(b))
1600 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1603 switch (STBI__COMBO(img_n, req_comp)) {
1604 STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; }
break;
1605 STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1606 STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; }
break;
1607 STBI__CASE(2,1) { dest[0]=src[0]; }
break;
1608 STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1609 STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; }
break;
1610 STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; }
break;
1611 STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); }
break;
1612 STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; }
break;
1613 STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); }
break;
1614 STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; }
break;
1615 STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; }
break;
1616 default: STBI_ASSERT(0);
1625static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b)
1627 return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
1630static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1635 if (req_comp == img_n)
return data;
1636 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1638 good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
1641 return (stbi__uint16 *) stbi__errpuc(
"outofmem",
"Out of memory");
1644 for (j=0; j < (int) y; ++j) {
1645 stbi__uint16 *src = data + j * x * img_n ;
1646 stbi__uint16 *dest = good + j * x * req_comp;
1648 #define STBI__COMBO(a,b) ((a)*8+(b))
1649 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1652 switch (STBI__COMBO(img_n, req_comp)) {
1653 STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; }
break;
1654 STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1655 STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; }
break;
1656 STBI__CASE(2,1) { dest[0]=src[0]; }
break;
1657 STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1658 STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; }
break;
1659 STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; }
break;
1660 STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); }
break;
1661 STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; }
break;
1662 STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); }
break;
1663 STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; }
break;
1664 STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; }
break;
1665 default: STBI_ASSERT(0);
1674#ifndef STBI_NO_LINEAR
1675static float *stbi__ldr_to_hdr(stbi_uc *data,
int x,
int y,
int comp)
1679 if (!data)
return NULL;
1680 output = (
float *) stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1681 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1683 if (comp & 1) n = comp;
else n = comp-1;
1684 for (i=0; i < x*y; ++i) {
1685 for (k=0; k < n; ++k) {
1686 output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1690 for (i=0; i < x*y; ++i) {
1691 output[i*comp + n] = data[i*comp + n]/255.0f;
1700#define stbi__float2int(x) ((int) (x))
1701static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1705 if (!data)
return NULL;
1706 output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
1707 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1709 if (comp & 1) n = comp;
else n = comp-1;
1710 for (i=0; i < x*y; ++i) {
1711 for (k=0; k < n; ++k) {
1712 float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1714 if (z > 255) z = 255;
1715 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1718 float z = data[i*comp+k] * 255 + 0.5f;
1720 if (z > 255) z = 255;
1721 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1757 stbi_uc fast[1 << FAST_BITS];
1759 stbi__uint16 code[256];
1760 stbi_uc values[256];
1762 unsigned int maxcode[18];
1769 stbi__huffman huff_dc[4];
1770 stbi__huffman huff_ac[4];
1771 stbi__uint16 dequant[4][64];
1772 stbi__int16 fast_ac[4][1 << FAST_BITS];
1775 int img_h_max, img_v_max;
1776 int img_mcu_x, img_mcu_y;
1777 int img_mcu_w, img_mcu_h;
1790 void *raw_data, *raw_coeff;
1793 int coeff_w, coeff_h;
1796 stbi__uint32 code_buffer;
1798 unsigned char marker;
1808 int app14_color_transform;
1811 int scan_n, order[4];
1812 int restart_interval, todo;
1815 void (*idct_block_kernel)(stbi_uc *out,
int out_stride,
short data[64]);
1816 void (*YCbCr_to_RGB_kernel)(stbi_uc *out,
const stbi_uc *y,
const stbi_uc *pcb,
const stbi_uc *pcr,
int count,
int step);
1817 stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs);
1820static int stbi__build_huffman(stbi__huffman *h,
int *count)
1825 for (i=0; i < 16; ++i)
1826 for (j=0; j < count[i]; ++j)
1827 h->size[k++] = (stbi_uc) (i+1);
1833 for(j=1; j <= 16; ++j) {
1835 h->delta[j] = k - code;
1836 if (h->size[k] == j) {
1837 while (h->size[k] == j)
1838 h->code[k++] = (stbi__uint16) (code++);
1839 if (code-1 >= (1u << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1842 h->maxcode[j] = code << (16-j);
1845 h->maxcode[j] = 0xffffffff;
1848 memset(h->fast, 255, 1 << FAST_BITS);
1849 for (i=0; i < k; ++i) {
1851 if (s <= FAST_BITS) {
1852 int c = h->code[i] << (FAST_BITS-s);
1853 int m = 1 << (FAST_BITS-s);
1854 for (j=0; j < m; ++j) {
1855 h->fast[c+j] = (stbi_uc) i;
1864static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1867 for (i=0; i < (1 << FAST_BITS); ++i) {
1868 stbi_uc fast = h->fast[i];
1871 int rs = h->values[fast];
1872 int run = (rs >> 4) & 15;
1873 int magbits = rs & 15;
1874 int len = h->size[fast];
1876 if (magbits && len + magbits <= FAST_BITS) {
1878 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1879 int m = 1 << (magbits - 1);
1880 if (k < m) k += (~0U << magbits) + 1;
1882 if (k >= -128 && k <= 127)
1883 fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
1889static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1892 unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
1894 int c = stbi__get8(j->s);
1895 while (c == 0xff) c = stbi__get8(j->s);
1897 j->marker = (
unsigned char) c;
1902 j->code_buffer |= b << (24 - j->code_bits);
1904 }
while (j->code_bits <= 24);
1908static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1911stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1916 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1920 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1924 if (s > j->code_bits)
1926 j->code_buffer <<= s;
1928 return h->values[k];
1937 temp = j->code_buffer >> 16;
1938 for (k=FAST_BITS+1 ; ; ++k)
1939 if (temp < h->maxcode[k])
1947 if (k > j->code_bits)
1951 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1952 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1956 j->code_buffer <<= k;
1957 return h->values[c];
1961static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1965stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1969 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1971 sgn = (stbi__int32)j->code_buffer >> 31;
1972 k = stbi_lrot(j->code_buffer, n);
1973 STBI_ASSERT(n >= 0 && n < (
int) (
sizeof(stbi__bmask)/
sizeof(*stbi__bmask)));
1974 j->code_buffer = k & ~stbi__bmask[n];
1975 k &= stbi__bmask[n];
1977 return k + (stbi__jbias[n] & ~sgn);
1981stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
1984 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1985 k = stbi_lrot(j->code_buffer, n);
1986 j->code_buffer = k & ~stbi__bmask[n];
1987 k &= stbi__bmask[n];
1992stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
1995 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1997 j->code_buffer <<= 1;
1999 return k & 0x80000000;
2004static const stbi_uc stbi__jpeg_dezigzag[64+15] =
2006 0, 1, 8, 16, 9, 2, 3, 10,
2007 17, 24, 32, 25, 18, 11, 4, 5,
2008 12, 19, 26, 33, 40, 48, 41, 34,
2009 27, 20, 13, 6, 7, 14, 21, 28,
2010 35, 42, 49, 56, 57, 50, 43, 36,
2011 29, 22, 15, 23, 30, 37, 44, 51,
2012 58, 59, 52, 45, 38, 31, 39, 46,
2013 53, 60, 61, 54, 47, 55, 62, 63,
2015 63, 63, 63, 63, 63, 63, 63, 63,
2016 63, 63, 63, 63, 63, 63, 63
2020static 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)
2025 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2026 t = stbi__jpeg_huff_decode(j, hdc);
2027 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2030 memset(data,0,64*
sizeof(data[0]));
2032 diff = t ? stbi__extend_receive(j, t) : 0;
2033 dc = j->img_comp[b].dc_pred + diff;
2034 j->img_comp[b].dc_pred = dc;
2035 data[0] = (short) (dc * dequant[0]);
2042 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2043 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2048 j->code_buffer <<= s;
2051 zig = stbi__jpeg_dezigzag[k++];
2052 data[zig] = (short) ((r >> 8) * dequant[zig]);
2054 int rs = stbi__jpeg_huff_decode(j, hac);
2055 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2059 if (rs != 0xf0)
break;
2064 zig = stbi__jpeg_dezigzag[k++];
2065 data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
2072static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
2076 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2078 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2080 if (j->succ_high == 0) {
2082 memset(data,0,64*
sizeof(data[0]));
2083 t = stbi__jpeg_huff_decode(j, hdc);
2084 diff = t ? stbi__extend_receive(j, t) : 0;
2086 dc = j->img_comp[b].dc_pred + diff;
2087 j->img_comp[b].dc_pred = dc;
2088 data[0] = (short) (dc << j->succ_low);
2091 if (stbi__jpeg_get_bit(j))
2092 data[0] += (
short) (1 << j->succ_low);
2099static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
2102 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2104 if (j->succ_high == 0) {
2105 int shift = j->succ_low;
2116 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2117 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2122 j->code_buffer <<= s;
2124 zig = stbi__jpeg_dezigzag[k++];
2125 data[zig] = (short) ((r >> 8) << shift);
2127 int rs = stbi__jpeg_huff_decode(j, hac);
2128 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2133 j->eob_run = (1 << r);
2135 j->eob_run += stbi__jpeg_get_bits(j, r);
2142 zig = stbi__jpeg_dezigzag[k++];
2143 data[zig] = (short) (stbi__extend_receive(j,s) << shift);
2146 }
while (k <= j->spec_end);
2150 short bit = (short) (1 << j->succ_low);
2154 for (k = j->spec_start; k <= j->spec_end; ++k) {
2155 short *p = &data[stbi__jpeg_dezigzag[k]];
2157 if (stbi__jpeg_get_bit(j))
2158 if ((*p & bit)==0) {
2169 int rs = stbi__jpeg_huff_decode(j, hac);
2170 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2175 j->eob_run = (1 << r) - 1;
2177 j->eob_run += stbi__jpeg_get_bits(j, r);
2185 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2187 if (stbi__jpeg_get_bit(j))
2194 while (k <= j->spec_end) {
2195 short *p = &data[stbi__jpeg_dezigzag[k++]];
2197 if (stbi__jpeg_get_bit(j))
2198 if ((*p & bit)==0) {
2212 }
while (k <= j->spec_end);
2219stbi_inline
static stbi_uc stbi__clamp(
int x)
2222 if ((
unsigned int) x > 255) {
2223 if (x < 0)
return 0;
2224 if (x > 255)
return 255;
2229#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
2230#define stbi__fsh(x) ((x) * 4096)
2233#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2234 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2237 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
2238 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
2239 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
2242 t0 = stbi__fsh(p2+p3); \
2243 t1 = stbi__fsh(p2-p3); \
2256 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
2257 t0 = t0*stbi__f2f( 0.298631336f); \
2258 t1 = t1*stbi__f2f( 2.053119869f); \
2259 t2 = t2*stbi__f2f( 3.072711026f); \
2260 t3 = t3*stbi__f2f( 1.501321110f); \
2261 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
2262 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
2263 p3 = p3*stbi__f2f(-1.961570560f); \
2264 p4 = p4*stbi__f2f(-0.390180644f); \
2270static void stbi__idct_block(stbi_uc *out,
int out_stride,
short data[64])
2272 int i,val[64],*v=val;
2277 for (i=0; i < 8; ++i,++d, ++v) {
2279 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
2280 && d[40]==0 && d[48]==0 && d[56]==0) {
2285 int dcterm = d[0]*4;
2286 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2288 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
2291 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2292 v[ 0] = (x0+t3) >> 10;
2293 v[56] = (x0-t3) >> 10;
2294 v[ 8] = (x1+t2) >> 10;
2295 v[48] = (x1-t2) >> 10;
2296 v[16] = (x2+t1) >> 10;
2297 v[40] = (x2-t1) >> 10;
2298 v[24] = (x3+t0) >> 10;
2299 v[32] = (x3-t0) >> 10;
2303 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
2305 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
2312 x0 += 65536 + (128<<17);
2313 x1 += 65536 + (128<<17);
2314 x2 += 65536 + (128<<17);
2315 x3 += 65536 + (128<<17);
2318 o[0] = stbi__clamp((x0+t3) >> 17);
2319 o[7] = stbi__clamp((x0-t3) >> 17);
2320 o[1] = stbi__clamp((x1+t2) >> 17);
2321 o[6] = stbi__clamp((x1-t2) >> 17);
2322 o[2] = stbi__clamp((x2+t1) >> 17);
2323 o[5] = stbi__clamp((x2-t1) >> 17);
2324 o[3] = stbi__clamp((x3+t0) >> 17);
2325 o[4] = stbi__clamp((x3-t0) >> 17);
2333static void stbi__idct_simd(stbi_uc *out,
int out_stride,
short data[64])
2336 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2340 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2344 #define dct_rot(out0,out1, x,y,c0,c1) \
2345 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2346 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2347 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2348 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2349 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2350 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2353 #define dct_widen(out, in) \
2354 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2355 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2358 #define dct_wadd(out, a, b) \
2359 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2360 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2363 #define dct_wsub(out, a, b) \
2364 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2365 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2368 #define dct_bfly32o(out0, out1, a,b,bias,s) \
2370 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2371 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2372 dct_wadd(sum, abiased, b); \
2373 dct_wsub(dif, abiased, b); \
2374 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2375 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2379 #define dct_interleave8(a, b) \
2381 a = _mm_unpacklo_epi8(a, b); \
2382 b = _mm_unpackhi_epi8(tmp, b)
2385 #define dct_interleave16(a, b) \
2387 a = _mm_unpacklo_epi16(a, b); \
2388 b = _mm_unpackhi_epi16(tmp, b)
2390 #define dct_pass(bias,shift) \
2393 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2394 __m128i sum04 = _mm_add_epi16(row0, row4); \
2395 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2396 dct_widen(t0e, sum04); \
2397 dct_widen(t1e, dif04); \
2398 dct_wadd(x0, t0e, t3e); \
2399 dct_wsub(x3, t0e, t3e); \
2400 dct_wadd(x1, t1e, t2e); \
2401 dct_wsub(x2, t1e, t2e); \
2403 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2404 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2405 __m128i sum17 = _mm_add_epi16(row1, row7); \
2406 __m128i sum35 = _mm_add_epi16(row3, row5); \
2407 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2408 dct_wadd(x4, y0o, y4o); \
2409 dct_wadd(x5, y1o, y5o); \
2410 dct_wadd(x6, y2o, y5o); \
2411 dct_wadd(x7, y3o, y4o); \
2412 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2413 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2414 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2415 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2418 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2419 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2420 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2421 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2422 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2423 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2424 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2425 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
2428 __m128i bias_0 = _mm_set1_epi32(512);
2429 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2432 row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
2433 row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
2434 row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
2435 row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
2436 row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
2437 row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
2438 row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
2439 row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
2442 dct_pass(bias_0, 10);
2446 dct_interleave16(row0, row4);
2447 dct_interleave16(row1, row5);
2448 dct_interleave16(row2, row6);
2449 dct_interleave16(row3, row7);
2452 dct_interleave16(row0, row2);
2453 dct_interleave16(row1, row3);
2454 dct_interleave16(row4, row6);
2455 dct_interleave16(row5, row7);
2458 dct_interleave16(row0, row1);
2459 dct_interleave16(row2, row3);
2460 dct_interleave16(row4, row5);
2461 dct_interleave16(row6, row7);
2465 dct_pass(bias_1, 17);
2469 __m128i p0 = _mm_packus_epi16(row0, row1);
2470 __m128i p1 = _mm_packus_epi16(row2, row3);
2471 __m128i p2 = _mm_packus_epi16(row4, row5);
2472 __m128i p3 = _mm_packus_epi16(row6, row7);
2475 dct_interleave8(p0, p2);
2476 dct_interleave8(p1, p3);
2479 dct_interleave8(p0, p1);
2480 dct_interleave8(p2, p3);
2483 dct_interleave8(p0, p2);
2484 dct_interleave8(p1, p3);
2487 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2488 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2489 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2490 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2491 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2492 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2493 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2494 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2503#undef dct_interleave8
2504#undef dct_interleave16
2514static void stbi__idct_simd(stbi_uc *out,
int out_stride,
short data[64])
2516 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2518 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2519 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2520 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2521 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2522 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2523 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2524 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2525 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2526 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2527 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2528 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2529 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2531#define dct_long_mul(out, inq, coeff) \
2532 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2533 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2535#define dct_long_mac(out, acc, inq, coeff) \
2536 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2537 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2539#define dct_widen(out, inq) \
2540 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2541 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2544#define dct_wadd(out, a, b) \
2545 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2546 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2549#define dct_wsub(out, a, b) \
2550 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2551 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2554#define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2556 dct_wadd(sum, a, b); \
2557 dct_wsub(dif, a, b); \
2558 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2559 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2562#define dct_pass(shiftop, shift) \
2565 int16x8_t sum26 = vaddq_s16(row2, row6); \
2566 dct_long_mul(p1e, sum26, rot0_0); \
2567 dct_long_mac(t2e, p1e, row6, rot0_1); \
2568 dct_long_mac(t3e, p1e, row2, rot0_2); \
2569 int16x8_t sum04 = vaddq_s16(row0, row4); \
2570 int16x8_t dif04 = vsubq_s16(row0, row4); \
2571 dct_widen(t0e, sum04); \
2572 dct_widen(t1e, dif04); \
2573 dct_wadd(x0, t0e, t3e); \
2574 dct_wsub(x3, t0e, t3e); \
2575 dct_wadd(x1, t1e, t2e); \
2576 dct_wsub(x2, t1e, t2e); \
2578 int16x8_t sum15 = vaddq_s16(row1, row5); \
2579 int16x8_t sum17 = vaddq_s16(row1, row7); \
2580 int16x8_t sum35 = vaddq_s16(row3, row5); \
2581 int16x8_t sum37 = vaddq_s16(row3, row7); \
2582 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2583 dct_long_mul(p5o, sumodd, rot1_0); \
2584 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2585 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2586 dct_long_mul(p3o, sum37, rot2_0); \
2587 dct_long_mul(p4o, sum15, rot2_1); \
2588 dct_wadd(sump13o, p1o, p3o); \
2589 dct_wadd(sump24o, p2o, p4o); \
2590 dct_wadd(sump23o, p2o, p3o); \
2591 dct_wadd(sump14o, p1o, p4o); \
2592 dct_long_mac(x4, sump13o, row7, rot3_0); \
2593 dct_long_mac(x5, sump24o, row5, rot3_1); \
2594 dct_long_mac(x6, sump23o, row3, rot3_2); \
2595 dct_long_mac(x7, sump14o, row1, rot3_3); \
2596 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2597 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2598 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2599 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2603 row0 = vld1q_s16(data + 0*8);
2604 row1 = vld1q_s16(data + 1*8);
2605 row2 = vld1q_s16(data + 2*8);
2606 row3 = vld1q_s16(data + 3*8);
2607 row4 = vld1q_s16(data + 4*8);
2608 row5 = vld1q_s16(data + 5*8);
2609 row6 = vld1q_s16(data + 6*8);
2610 row7 = vld1q_s16(data + 7*8);
2613 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2616 dct_pass(vrshrn_n_s32, 10);
2622#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2623#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]); }
2624#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)); }
2627 dct_trn16(row0, row1);
2628 dct_trn16(row2, row3);
2629 dct_trn16(row4, row5);
2630 dct_trn16(row6, row7);
2633 dct_trn32(row0, row2);
2634 dct_trn32(row1, row3);
2635 dct_trn32(row4, row6);
2636 dct_trn32(row5, row7);
2639 dct_trn64(row0, row4);
2640 dct_trn64(row1, row5);
2641 dct_trn64(row2, row6);
2642 dct_trn64(row3, row7);
2653 dct_pass(vshrn_n_s32, 16);
2657 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2658 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2659 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2660 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2661 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2662 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2663 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2664 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2667#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2668#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]); }
2669#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]); }
2681 dct_trn8_16(p0, p2);
2682 dct_trn8_16(p1, p3);
2683 dct_trn8_16(p4, p6);
2684 dct_trn8_16(p5, p7);
2687 dct_trn8_32(p0, p4);
2688 dct_trn8_32(p1, p5);
2689 dct_trn8_32(p2, p6);
2690 dct_trn8_32(p3, p7);
2693 vst1_u8(out, p0); out += out_stride;
2694 vst1_u8(out, p1); out += out_stride;
2695 vst1_u8(out, p2); out += out_stride;
2696 vst1_u8(out, p3); out += out_stride;
2697 vst1_u8(out, p4); out += out_stride;
2698 vst1_u8(out, p5); out += out_stride;
2699 vst1_u8(out, p6); out += out_stride;
2718#define STBI__MARKER_none 0xff
2722static stbi_uc stbi__get_marker(stbi__jpeg *j)
2725 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2726 x = stbi__get8(j->s);
2727 if (x != 0xff)
return STBI__MARKER_none;
2729 x = stbi__get8(j->s);
2735#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2739static void stbi__jpeg_reset(stbi__jpeg *j)
2744 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;
2745 j->marker = STBI__MARKER_none;
2746 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2752static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2754 stbi__jpeg_reset(z);
2755 if (!z->progressive) {
2756 if (z->scan_n == 1) {
2758 STBI_SIMD_ALIGN(
short, data[64]);
2759 int n = z->order[0];
2764 int w = (z->img_comp[n].x+7) >> 3;
2765 int h = (z->img_comp[n].y+7) >> 3;
2766 for (j=0; j < h; ++j) {
2767 for (i=0; i < w; ++i) {
2768 int ha = z->img_comp[n].ha;
2769 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;
2770 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2772 if (--z->todo <= 0) {
2773 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2776 if (!STBI__RESTART(z->marker))
return 1;
2777 stbi__jpeg_reset(z);
2784 STBI_SIMD_ALIGN(
short, data[64]);
2785 for (j=0; j < z->img_mcu_y; ++j) {
2786 for (i=0; i < z->img_mcu_x; ++i) {
2788 for (k=0; k < z->scan_n; ++k) {
2789 int n = z->order[k];
2792 for (y=0; y < z->img_comp[n].v; ++y) {
2793 for (x=0; x < z->img_comp[n].h; ++x) {
2794 int x2 = (i*z->img_comp[n].h + x)*8;
2795 int y2 = (j*z->img_comp[n].v + y)*8;
2796 int ha = z->img_comp[n].ha;
2797 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;
2798 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2804 if (--z->todo <= 0) {
2805 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2806 if (!STBI__RESTART(z->marker))
return 1;
2807 stbi__jpeg_reset(z);
2814 if (z->scan_n == 1) {
2816 int n = z->order[0];
2821 int w = (z->img_comp[n].x+7) >> 3;
2822 int h = (z->img_comp[n].y+7) >> 3;
2823 for (j=0; j < h; ++j) {
2824 for (i=0; i < w; ++i) {
2825 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2826 if (z->spec_start == 0) {
2827 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2830 int ha = z->img_comp[n].ha;
2831 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2835 if (--z->todo <= 0) {
2836 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2837 if (!STBI__RESTART(z->marker))
return 1;
2838 stbi__jpeg_reset(z);
2845 for (j=0; j < z->img_mcu_y; ++j) {
2846 for (i=0; i < z->img_mcu_x; ++i) {
2848 for (k=0; k < z->scan_n; ++k) {
2849 int n = z->order[k];
2852 for (y=0; y < z->img_comp[n].v; ++y) {
2853 for (x=0; x < z->img_comp[n].h; ++x) {
2854 int x2 = (i*z->img_comp[n].h + x);
2855 int y2 = (j*z->img_comp[n].v + y);
2856 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2857 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2864 if (--z->todo <= 0) {
2865 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2866 if (!STBI__RESTART(z->marker))
return 1;
2867 stbi__jpeg_reset(z);
2876static void stbi__jpeg_dequantize(
short *data, stbi__uint16 *dequant)
2879 for (i=0; i < 64; ++i)
2880 data[i] *= dequant[i];
2883static void stbi__jpeg_finish(stbi__jpeg *z)
2885 if (z->progressive) {
2888 for (n=0; n < z->s->img_n; ++n) {
2889 int w = (z->img_comp[n].x+7) >> 3;
2890 int h = (z->img_comp[n].y+7) >> 3;
2891 for (j=0; j < h; ++j) {
2892 for (i=0; i < w; ++i) {
2893 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2894 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2895 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2902static int stbi__process_marker(stbi__jpeg *z,
int m)
2906 case STBI__MARKER_none:
2907 return stbi__err(
"expected marker",
"Corrupt JPEG");
2910 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2911 z->restart_interval = stbi__get16be(z->s);
2915 L = stbi__get16be(z->s)-2;
2917 int q = stbi__get8(z->s);
2918 int p = q >> 4, sixteen = (p != 0);
2920 if (p != 0 && p != 1)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2921 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2923 for (i=0; i < 64; ++i)
2924 z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
2925 L -= (sixteen ? 129 : 65);
2930 L = stbi__get16be(z->s)-2;
2933 int sizes[16],i,n=0;
2934 int q = stbi__get8(z->s);
2937 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2938 for (i=0; i < 16; ++i) {
2939 sizes[i] = stbi__get8(z->s);
2944 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
2945 v = z->huff_dc[th].values;
2947 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
2948 v = z->huff_ac[th].values;
2950 for (i=0; i < n; ++i)
2951 v[i] = stbi__get8(z->s);
2953 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2960 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2961 L = stbi__get16be(z->s);
2964 return stbi__err(
"bad COM len",
"Corrupt JPEG");
2966 return stbi__err(
"bad APP len",
"Corrupt JPEG");
2970 if (m == 0xE0 && L >= 5) {
2971 static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0'};
2974 for (i=0; i < 5; ++i)
2975 if (stbi__get8(z->s) != tag[i])
2980 }
else if (m == 0xEE && L >= 12) {
2981 static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0'};
2984 for (i=0; i < 6; ++i)
2985 if (stbi__get8(z->s) != tag[i])
2990 stbi__get16be(z->s);
2991 stbi__get16be(z->s);
2992 z->app14_color_transform = stbi__get8(z->s);
2997 stbi__skip(z->s, L);
3001 return stbi__err(
"unknown marker",
"Corrupt JPEG");
3005static int stbi__process_scan_header(stbi__jpeg *z)
3008 int Ls = stbi__get16be(z->s);
3009 z->scan_n = stbi__get8(z->s);
3010 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");
3011 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
3012 for (i=0; i < z->scan_n; ++i) {
3013 int id = stbi__get8(z->s), which;
3014 int q = stbi__get8(z->s);
3015 for (which = 0; which < z->s->img_n; ++which)
3016 if (z->img_comp[which].id ==
id)
3018 if (which == z->s->img_n)
return 0;
3019 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
3020 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
3021 z->order[i] = which;
3026 z->spec_start = stbi__get8(z->s);
3027 z->spec_end = stbi__get8(z->s);
3028 aa = stbi__get8(z->s);
3029 z->succ_high = (aa >> 4);
3030 z->succ_low = (aa & 15);
3031 if (z->progressive) {
3032 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
3033 return stbi__err(
"bad SOS",
"Corrupt JPEG");
3035 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3036 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3044static int stbi__free_jpeg_components(stbi__jpeg *z,
int ncomp,
int why)
3047 for (i=0; i < ncomp; ++i) {
3048 if (z->img_comp[i].raw_data) {
3049 STBI_FREE(z->img_comp[i].raw_data);
3050 z->img_comp[i].raw_data = NULL;
3051 z->img_comp[i].data = NULL;
3053 if (z->img_comp[i].raw_coeff) {
3054 STBI_FREE(z->img_comp[i].raw_coeff);
3055 z->img_comp[i].raw_coeff = 0;
3056 z->img_comp[i].coeff = 0;
3058 if (z->img_comp[i].linebuf) {
3059 STBI_FREE(z->img_comp[i].linebuf);
3060 z->img_comp[i].linebuf = NULL;
3066static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
3068 stbi__context *s = z->s;
3069 int Lf,p,i,q, h_max=1,v_max=1,c;
3070 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3071 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
3072 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
3073 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
3075 if (c != 3 && c != 1 && c != 4)
return stbi__err(
"bad component count",
"Corrupt JPEG");
3077 for (i=0; i < c; ++i) {
3078 z->img_comp[i].data = NULL;
3079 z->img_comp[i].linebuf = NULL;
3082 if (Lf != 8+3*s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3085 for (i=0; i < s->img_n; ++i) {
3086 static const unsigned char rgb[3] = {
'R',
'G',
'B' };
3087 z->img_comp[i].id = stbi__get8(s);
3088 if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3091 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");
3092 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");
3093 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
3096 if (scan != STBI__SCAN_load)
return 1;
3098 if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0))
return stbi__err(
"too large",
"Image too large to decode");
3100 for (i=0; i < s->img_n; ++i) {
3101 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
3102 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
3106 z->img_h_max = h_max;
3107 z->img_v_max = v_max;
3108 z->img_mcu_w = h_max * 8;
3109 z->img_mcu_h = v_max * 8;
3111 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
3112 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
3114 for (i=0; i < s->img_n; ++i) {
3116 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
3117 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
3125 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3126 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3127 z->img_comp[i].coeff = 0;
3128 z->img_comp[i].raw_coeff = 0;
3129 z->img_comp[i].linebuf = NULL;
3130 z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3131 if (z->img_comp[i].raw_data == NULL)
3132 return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem",
"Out of memory"));
3134 z->img_comp[i].data = (stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
3135 if (z->progressive) {
3137 z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3138 z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3139 z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2,
sizeof(
short), 15);
3140 if (z->img_comp[i].raw_coeff == NULL)
3141 return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem",
"Out of memory"));
3142 z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
3150#define stbi__DNL(x) ((x) == 0xdc)
3151#define stbi__SOI(x) ((x) == 0xd8)
3152#define stbi__EOI(x) ((x) == 0xd9)
3153#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3154#define stbi__SOS(x) ((x) == 0xda)
3156#define stbi__SOF_progressive(x) ((x) == 0xc2)
3158static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
3162 z->app14_color_transform = -1;
3163 z->marker = STBI__MARKER_none;
3164 m = stbi__get_marker(z);
3165 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
3166 if (scan == STBI__SCAN_type)
return 1;
3167 m = stbi__get_marker(z);
3168 while (!stbi__SOF(m)) {
3169 if (!stbi__process_marker(z,m))
return 0;
3170 m = stbi__get_marker(z);
3171 while (m == STBI__MARKER_none) {
3173 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
3174 m = stbi__get_marker(z);
3177 z->progressive = stbi__SOF_progressive(m);
3178 if (!stbi__process_frame_header(z, scan))
return 0;
3183static int stbi__decode_jpeg_image(stbi__jpeg *j)
3186 for (m = 0; m < 4; m++) {
3187 j->img_comp[m].raw_data = NULL;
3188 j->img_comp[m].raw_coeff = NULL;
3190 j->restart_interval = 0;
3191 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
3192 m = stbi__get_marker(j);
3193 while (!stbi__EOI(m)) {
3195 if (!stbi__process_scan_header(j))
return 0;
3196 if (!stbi__parse_entropy_coded_data(j))
return 0;
3197 if (j->marker == STBI__MARKER_none ) {
3199 while (!stbi__at_eof(j->s)) {
3200 int x = stbi__get8(j->s);
3202 j->marker = stbi__get8(j->s);
3208 }
else if (stbi__DNL(m)) {
3209 int Ld = stbi__get16be(j->s);
3210 stbi__uint32 NL = stbi__get16be(j->s);
3211 if (Ld != 4)
return stbi__err(
"bad DNL len",
"Corrupt JPEG");
3212 if (NL != j->s->img_y)
return stbi__err(
"bad DNL height",
"Corrupt JPEG");
3214 if (!stbi__process_marker(j, m))
return 0;
3216 m = stbi__get_marker(j);
3219 stbi__jpeg_finish(j);
3225typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
3228#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3230static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3233 STBI_NOTUSED(in_far);
3239static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3244 for (i=0; i < w; ++i)
3245 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
3249static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3253 stbi_uc *input = in_near;
3257 out[0] = out[1] = input[0];
3262 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
3263 for (i=1; i < w-1; ++i) {
3264 int n = 3*input[i]+2;
3265 out[i*2+0] = stbi__div4(n+input[i-1]);
3266 out[i*2+1] = stbi__div4(n+input[i+1]);
3268 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
3269 out[i*2+1] = input[w-1];
3271 STBI_NOTUSED(in_far);
3277#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3279static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3284 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3288 t1 = 3*in_near[0] + in_far[0];
3289 out[0] = stbi__div4(t1+2);
3290 for (i=1; i < w; ++i) {
3292 t1 = 3*in_near[i]+in_far[i];
3293 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3294 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3296 out[w*2-1] = stbi__div4(t1+2);
3303#if defined(STBI_SSE2) || defined(STBI_NEON)
3304static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3310 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3314 t1 = 3*in_near[0] + in_far[0];
3318 for (; i < ((w-1) & ~7); i += 8) {
3319#if defined(STBI_SSE2)
3322 __m128i zero = _mm_setzero_si128();
3323 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
3324 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
3325 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3326 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3327 __m128i diff = _mm_sub_epi16(farw, nearw);
3328 __m128i nears = _mm_slli_epi16(nearw, 2);
3329 __m128i curr = _mm_add_epi16(nears, diff);
3336 __m128i prv0 = _mm_slli_si128(curr, 2);
3337 __m128i nxt0 = _mm_srli_si128(curr, 2);
3338 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3339 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
3345 __m128i bias = _mm_set1_epi16(8);
3346 __m128i curs = _mm_slli_epi16(curr, 2);
3347 __m128i prvd = _mm_sub_epi16(prev, curr);
3348 __m128i nxtd = _mm_sub_epi16(next, curr);
3349 __m128i curb = _mm_add_epi16(curs, bias);
3350 __m128i even = _mm_add_epi16(prvd, curb);
3351 __m128i odd = _mm_add_epi16(nxtd, curb);
3354 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3355 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3356 __m128i de0 = _mm_srli_epi16(int0, 4);
3357 __m128i de1 = _mm_srli_epi16(int1, 4);
3360 __m128i outv = _mm_packus_epi16(de0, de1);
3361 _mm_storeu_si128((__m128i *) (out + i*2), outv);
3362#elif defined(STBI_NEON)
3365 uint8x8_t farb = vld1_u8(in_far + i);
3366 uint8x8_t nearb = vld1_u8(in_near + i);
3367 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3368 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3369 int16x8_t curr = vaddq_s16(nears, diff);
3376 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3377 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3378 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3379 int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3385 int16x8_t curs = vshlq_n_s16(curr, 2);
3386 int16x8_t prvd = vsubq_s16(prev, curr);
3387 int16x8_t nxtd = vsubq_s16(next, curr);
3388 int16x8_t even = vaddq_s16(curs, prvd);
3389 int16x8_t odd = vaddq_s16(curs, nxtd);
3393 o.val[0] = vqrshrun_n_s16(even, 4);
3394 o.val[1] = vqrshrun_n_s16(odd, 4);
3395 vst2_u8(out + i*2, o);
3399 t1 = 3*in_near[i+7] + in_far[i+7];
3403 t1 = 3*in_near[i] + in_far[i];
3404 out[i*2] = stbi__div16(3*t1 + t0 + 8);
3406 for (++i; i < w; ++i) {
3408 t1 = 3*in_near[i]+in_far[i];
3409 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3410 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3412 out[w*2-1] = stbi__div4(t1+2);
3420static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3424 STBI_NOTUSED(in_far);
3425 for (i=0; i < w; ++i)
3426 for (j=0; j < hs; ++j)
3427 out[i*hs+j] = in_near[i];
3433#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3434static 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)
3437 for (i=0; i < count; ++i) {
3438 int y_fixed = (y[i] << 20) + (1<<19);
3440 int cr = pcr[i] - 128;
3441 int cb = pcb[i] - 128;
3442 r = y_fixed + cr* stbi__float2fixed(1.40200f);
3443 g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3444 b = y_fixed + cb* stbi__float2fixed(1.77200f);
3448 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3449 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3450 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3451 out[0] = (stbi_uc)r;
3452 out[1] = (stbi_uc)g;
3453 out[2] = (stbi_uc)b;
3459#if defined(STBI_SSE2) || defined(STBI_NEON)
3460static 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)
3470 __m128i signflip = _mm_set1_epi8(-0x80);
3471 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200f*4096.0f+0.5f));
3472 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
3473 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
3474 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200f*4096.0f+0.5f));
3475 __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
3476 __m128i xw = _mm_set1_epi16(255);
3478 for (; i+7 < count; i += 8) {
3480 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3481 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3482 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3483 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3484 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3487 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3488 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3489 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3492 __m128i yws = _mm_srli_epi16(yw, 4);
3493 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3494 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3495 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3496 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3497 __m128i rws = _mm_add_epi16(cr0, yws);
3498 __m128i gwt = _mm_add_epi16(cb0, yws);
3499 __m128i bws = _mm_add_epi16(yws, cb1);
3500 __m128i gws = _mm_add_epi16(gwt, cr1);
3503 __m128i rw = _mm_srai_epi16(rws, 4);
3504 __m128i bw = _mm_srai_epi16(bws, 4);
3505 __m128i gw = _mm_srai_epi16(gws, 4);
3508 __m128i brb = _mm_packus_epi16(rw, bw);
3509 __m128i gxb = _mm_packus_epi16(gw, xw);
3512 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3513 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3514 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3515 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3518 _mm_storeu_si128((__m128i *) (out + 0), o0);
3519 _mm_storeu_si128((__m128i *) (out + 16), o1);
3529 uint8x8_t signflip = vdup_n_u8(0x80);
3530 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200f*4096.0f+0.5f));
3531 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
3532 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
3533 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200f*4096.0f+0.5f));
3535 for (; i+7 < count; i += 8) {
3537 uint8x8_t y_bytes = vld1_u8(y + i);
3538 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3539 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3540 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3541 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3544 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3545 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3546 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3549 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3550 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3551 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3552 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3553 int16x8_t rws = vaddq_s16(yws, cr0);
3554 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3555 int16x8_t bws = vaddq_s16(yws, cb1);
3559 o.val[0] = vqrshrun_n_s16(rws, 4);
3560 o.val[1] = vqrshrun_n_s16(gws, 4);
3561 o.val[2] = vqrshrun_n_s16(bws, 4);
3562 o.val[3] = vdup_n_u8(255);
3571 for (; i < count; ++i) {
3572 int y_fixed = (y[i] << 20) + (1<<19);
3574 int cr = pcr[i] - 128;
3575 int cb = pcb[i] - 128;
3576 r = y_fixed + cr* stbi__float2fixed(1.40200f);
3577 g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3578 b = y_fixed + cb* stbi__float2fixed(1.77200f);
3582 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3583 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3584 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3585 out[0] = (stbi_uc)r;
3586 out[1] = (stbi_uc)g;
3587 out[2] = (stbi_uc)b;
3595static void stbi__setup_jpeg(stbi__jpeg *j)
3597 j->idct_block_kernel = stbi__idct_block;
3598 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3599 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3602 if (stbi__sse2_available()) {
3603 j->idct_block_kernel = stbi__idct_simd;
3604 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3605 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3610 j->idct_block_kernel = stbi__idct_simd;
3611 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3612 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3617static void stbi__cleanup_jpeg(stbi__jpeg *j)
3619 stbi__free_jpeg_components(j, j->s->img_n, 0);
3624 resample_row_func resample;
3625 stbi_uc *line0,*line1;
3633static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
3635 unsigned int t = x*y + 128;
3636 return (stbi_uc) ((t + (t >>8)) >> 8);
3639static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3641 int n, decode_n, is_rgb;
3645 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3648 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3651 n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3653 is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3655 if (z->s->img_n == 3 && n < 3 && !is_rgb)
3658 decode_n = z->s->img_n;
3665 stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
3667 stbi__resample res_comp[4];
3669 for (k=0; k < decode_n; ++k) {
3670 stbi__resample *r = &res_comp[k];
3674 z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
3675 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3677 r->hs = z->img_h_max / z->img_comp[k].h;
3678 r->vs = z->img_v_max / z->img_comp[k].v;
3679 r->ystep = r->vs >> 1;
3680 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3682 r->line0 = r->line1 = z->img_comp[k].data;
3684 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3685 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3686 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3687 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3688 else r->resample = stbi__resample_row_generic;
3692 output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3693 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3696 for (j=0; j < z->s->img_y; ++j) {
3697 stbi_uc *out = output + n * z->s->img_x * j;
3698 for (k=0; k < decode_n; ++k) {
3699 stbi__resample *r = &res_comp[k];
3700 int y_bot = r->ystep >= (r->vs >> 1);
3701 coutput[k] = r->resample(z->img_comp[k].linebuf,
3702 y_bot ? r->line1 : r->line0,
3703 y_bot ? r->line0 : r->line1,
3705 if (++r->ystep >= r->vs) {
3707 r->line0 = r->line1;
3708 if (++r->ypos < z->img_comp[k].y)
3709 r->line1 += z->img_comp[k].w2;
3713 stbi_uc *y = coutput[0];
3714 if (z->s->img_n == 3) {
3716 for (i=0; i < z->s->img_x; ++i) {
3718 out[1] = coutput[1][i];
3719 out[2] = coutput[2][i];
3724 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3726 }
else if (z->s->img_n == 4) {
3727 if (z->app14_color_transform == 0) {
3728 for (i=0; i < z->s->img_x; ++i) {
3729 stbi_uc m = coutput[3][i];
3730 out[0] = stbi__blinn_8x8(coutput[0][i], m);
3731 out[1] = stbi__blinn_8x8(coutput[1][i], m);
3732 out[2] = stbi__blinn_8x8(coutput[2][i], m);
3736 }
else if (z->app14_color_transform == 2) {
3737 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3738 for (i=0; i < z->s->img_x; ++i) {
3739 stbi_uc m = coutput[3][i];
3740 out[0] = stbi__blinn_8x8(255 - out[0], m);
3741 out[1] = stbi__blinn_8x8(255 - out[1], m);
3742 out[2] = stbi__blinn_8x8(255 - out[2], m);
3746 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3749 for (i=0; i < z->s->img_x; ++i) {
3750 out[0] = out[1] = out[2] = y[i];
3757 for (i=0; i < z->s->img_x; ++i)
3758 *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3760 for (i=0; i < z->s->img_x; ++i, out += 2) {
3761 out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3765 }
else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
3766 for (i=0; i < z->s->img_x; ++i) {
3767 stbi_uc m = coutput[3][i];
3768 stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
3769 stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
3770 stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
3771 out[0] = stbi__compute_y(r, g, b);
3775 }
else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
3776 for (i=0; i < z->s->img_x; ++i) {
3777 out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
3782 stbi_uc *y = coutput[0];
3784 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3786 for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
3790 stbi__cleanup_jpeg(z);
3791 *out_x = z->s->img_x;
3792 *out_y = z->s->img_y;
3793 if (comp) *comp = z->s->img_n >= 3 ? 3 : 1;
3798static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
3800 unsigned char* result;
3801 stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(
sizeof(stbi__jpeg));
3804 stbi__setup_jpeg(j);
3805 result = load_jpeg_image(j, x,y,comp,req_comp);
3810static int stbi__jpeg_test(stbi__context *s)
3813 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
3815 stbi__setup_jpeg(j);
3816 r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
3822static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
3824 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3825 stbi__rewind( j->s );
3828 if (x) *x = j->s->img_x;
3829 if (y) *y = j->s->img_y;
3830 if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
3834static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
3837 stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(
sizeof(stbi__jpeg)));
3839 result = stbi__jpeg_info_raw(j, x, y, comp);
3855#define STBI__ZFAST_BITS 9
3856#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
3862 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3863 stbi__uint16 firstcode[16];
3865 stbi__uint16 firstsymbol[16];
3867 stbi__uint16 value[288];
3870stbi_inline
static int stbi__bitreverse16(
int n)
3872 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3873 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3874 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3875 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3879stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3881 STBI_ASSERT(bits <= 16);
3884 return stbi__bitreverse16(v) >> (16-bits);
3887static int stbi__zbuild_huffman(stbi__zhuffman *z,
const stbi_uc *sizelist,
int num)
3890 int code, next_code[16], sizes[17];
3893 memset(sizes, 0,
sizeof(sizes));
3894 memset(z->fast, 0,
sizeof(z->fast));
3895 for (i=0; i < num; ++i)
3896 ++sizes[sizelist[i]];
3898 for (i=1; i < 16; ++i)
3899 if (sizes[i] > (1 << i))
3900 return stbi__err(
"bad sizes",
"Corrupt PNG");
3902 for (i=1; i < 16; ++i) {
3903 next_code[i] = code;
3904 z->firstcode[i] = (stbi__uint16) code;
3905 z->firstsymbol[i] = (stbi__uint16) k;
3906 code = (code + sizes[i]);
3908 if (code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3909 z->maxcode[i] = code << (16-i);
3913 z->maxcode[16] = 0x10000;
3914 for (i=0; i < num; ++i) {
3915 int s = sizelist[i];
3917 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3918 stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
3919 z->size [c] = (stbi_uc ) s;
3920 z->value[c] = (stbi__uint16) i;
3921 if (s <= STBI__ZFAST_BITS) {
3922 int j = stbi__bit_reverse(next_code[s],s);
3923 while (j < (1 << STBI__ZFAST_BITS)) {
3942 stbi_uc *zbuffer, *zbuffer_end;
3944 stbi__uint32 code_buffer;
3951 stbi__zhuffman z_length, z_distance;
3954stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
3956 if (z->zbuffer >= z->zbuffer_end)
return 0;
3957 return *z->zbuffer++;
3960static void stbi__fill_bits(stbi__zbuf *z)
3963 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3964 z->code_buffer |= (
unsigned int) stbi__zget8(z) << z->num_bits;
3966 }
while (z->num_bits <= 24);
3969stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
3972 if (z->num_bits < n) stbi__fill_bits(z);
3973 k = z->code_buffer & ((1 << n) - 1);
3974 z->code_buffer >>= n;
3979static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
3984 k = stbi__bit_reverse(a->code_buffer, 16);
3985 for (s=STBI__ZFAST_BITS+1; ; ++s)
3986 if (k < z->maxcode[s])
3988 if (s == 16)
return -1;
3990 b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
3991 STBI_ASSERT(z->size[b] == s);
3992 a->code_buffer >>= s;
3997stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
4000 if (a->num_bits < 16) stbi__fill_bits(a);
4001 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
4004 a->code_buffer >>= s;
4008 return stbi__zhuffman_decode_slowpath(a, z);
4011static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
4014 int cur, limit, old_limit;
4016 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
4017 cur = (int) (z->zout - z->zout_start);
4018 limit = old_limit = (int) (z->zout_end - z->zout_start);
4019 while (cur + n > limit)
4021 q = (
char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
4022 STBI_NOTUSED(old_limit);
4023 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4026 z->zout_end = q + limit;
4030static const int stbi__zlength_base[31] = {
4031 3,4,5,6,7,8,9,10,11,13,
4032 15,17,19,23,27,31,35,43,51,59,
4033 67,83,99,115,131,163,195,227,258,0,0 };
4035static const int stbi__zlength_extra[31]=
4036{ 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 };
4038static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
4039257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
4041static const int stbi__zdist_extra[32] =
4042{ 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};
4044static int stbi__parse_huffman_block(stbi__zbuf *a)
4046 char *zout = a->zout;
4048 int z = stbi__zhuffman_decode(a, &a->z_length);
4050 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4051 if (zout >= a->zout_end) {
4052 if (!stbi__zexpand(a, zout, 1))
return 0;
4064 len = stbi__zlength_base[z];
4065 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
4066 z = stbi__zhuffman_decode(a, &a->z_distance);
4067 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4068 dist = stbi__zdist_base[z];
4069 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
4070 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
4071 if (zout + len > a->zout_end) {
4072 if (!stbi__zexpand(a, zout, len))
return 0;
4075 p = (stbi_uc *) (zout - dist);
4078 if (len) {
do *zout++ = v;
while (--len); }
4080 if (len) {
do *zout++ = *p++;
while (--len); }
4086static int stbi__compute_huffman_codes(stbi__zbuf *a)
4088 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 };
4089 stbi__zhuffman z_codelength;
4090 stbi_uc lencodes[286+32+137];
4091 stbi_uc codelength_sizes[19];
4094 int hlit = stbi__zreceive(a,5) + 257;
4095 int hdist = stbi__zreceive(a,5) + 1;
4096 int hclen = stbi__zreceive(a,4) + 4;
4097 int ntot = hlit + hdist;
4099 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4100 for (i=0; i < hclen; ++i) {
4101 int s = stbi__zreceive(a,3);
4102 codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
4104 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
4108 int c = stbi__zhuffman_decode(a, &z_codelength);
4109 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4111 lencodes[n++] = (stbi_uc) c;
4115 c = stbi__zreceive(a,2)+3;
4116 if (n == 0)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4117 fill = lencodes[n-1];
4119 c = stbi__zreceive(a,3)+3;
4121 STBI_ASSERT(c == 18);
4122 c = stbi__zreceive(a,7)+11;
4124 if (ntot - n < c)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4125 memset(lencodes+n, fill, c);
4129 if (n != ntot)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4130 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
4131 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
4135static int stbi__parse_uncompressed_block(stbi__zbuf *a)
4139 if (a->num_bits & 7)
4140 stbi__zreceive(a, a->num_bits & 7);
4143 while (a->num_bits > 0) {
4144 header[k++] = (stbi_uc) (a->code_buffer & 255);
4145 a->code_buffer >>= 8;
4148 STBI_ASSERT(a->num_bits == 0);
4151 header[k++] = stbi__zget8(a);
4152 len = header[1] * 256 + header[0];
4153 nlen = header[3] * 256 + header[2];
4154 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4155 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
4156 if (a->zout + len > a->zout_end)
4157 if (!stbi__zexpand(a, a->zout, len))
return 0;
4158 memcpy(a->zout, a->zbuffer, len);
4164static int stbi__parse_zlib_header(stbi__zbuf *a)
4166 int cmf = stbi__zget8(a);
4169 int flg = stbi__zget8(a);
4170 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4171 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
4172 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
4177static const stbi_uc stbi__zdefault_length[288] =
4179 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,
4180 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,
4181 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,
4182 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,
4183 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,
4184 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,
4185 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,
4186 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,
4187 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
4189static const stbi_uc stbi__zdefault_distance[32] =
4191 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
4206static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
4210 if (!stbi__parse_zlib_header(a))
return 0;
4214 final = stbi__zreceive(a,1);
4215 type = stbi__zreceive(a,2);
4217 if (!stbi__parse_uncompressed_block(a))
return 0;
4218 }
else if (type == 3) {
4223 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288))
return 0;
4224 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
4226 if (!stbi__compute_huffman_codes(a))
return 0;
4228 if (!stbi__parse_huffman_block(a))
return 0;
4234static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
4236 a->zout_start = obuf;
4238 a->zout_end = obuf + olen;
4239 a->z_expandable = exp;
4241 return stbi__parse_zlib(a, parse_header);
4244STBIDEF
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer,
int len,
int initial_size,
int *outlen)
4247 char *p = (
char *) stbi__malloc(initial_size);
4248 if (p == NULL)
return NULL;
4249 a.zbuffer = (stbi_uc *) buffer;
4250 a.zbuffer_end = (stbi_uc *) buffer + len;
4251 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4252 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4253 return a.zout_start;
4255 STBI_FREE(a.zout_start);
4260STBIDEF
char *stbi_zlib_decode_malloc(
char const *buffer,
int len,
int *outlen)
4262 return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
4265STBIDEF
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer,
int len,
int initial_size,
int *outlen,
int parse_header)
4268 char *p = (
char *) stbi__malloc(initial_size);
4269 if (p == NULL)
return NULL;
4270 a.zbuffer = (stbi_uc *) buffer;
4271 a.zbuffer_end = (stbi_uc *) buffer + len;
4272 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4273 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4274 return a.zout_start;
4276 STBI_FREE(a.zout_start);
4281STBIDEF
int stbi_zlib_decode_buffer(
char *obuffer,
int olen,
char const *ibuffer,
int ilen)
4284 a.zbuffer = (stbi_uc *) ibuffer;
4285 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
4286 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4287 return (
int) (a.zout - a.zout_start);
4292STBIDEF
char *stbi_zlib_decode_noheader_malloc(
char const *buffer,
int len,
int *outlen)
4295 char *p = (
char *) stbi__malloc(16384);
4296 if (p == NULL)
return NULL;
4297 a.zbuffer = (stbi_uc *) buffer;
4298 a.zbuffer_end = (stbi_uc *) buffer+len;
4299 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4300 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4301 return a.zout_start;
4303 STBI_FREE(a.zout_start);
4308STBIDEF
int stbi_zlib_decode_noheader_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen)
4311 a.zbuffer = (stbi_uc *) ibuffer;
4312 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
4313 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4314 return (
int) (a.zout - a.zout_start);
4333 stbi__uint32 length;
4337static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
4340 c.length = stbi__get32be(s);
4341 c.type = stbi__get32be(s);
4345static int stbi__check_png_header(stbi__context *s)
4347 static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4349 for (i=0; i < 8; ++i)
4350 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
4357 stbi_uc *idata, *expanded, *out;
4373static stbi_uc first_row_filter[5] =
4382static int stbi__paeth(
int a,
int b,
int c)
4388 if (pa <= pb && pa <= pc)
return a;
4389 if (pb <= pc)
return b;
4393static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4396static 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)
4398 int bytes = (depth == 16? 2 : 1);
4399 stbi__context *s = a->s;
4400 stbi__uint32 i,j,stride = x*out_n*bytes;
4401 stbi__uint32 img_len, img_width_bytes;
4403 int img_n = s->img_n;
4405 int output_bytes = out_n*bytes;
4406 int filter_bytes = img_n*bytes;
4409 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
4410 a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0);
4411 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
4413 if (!stbi__mad3sizes_valid(img_n, x, depth, 7))
return stbi__err(
"too large",
"Corrupt PNG");
4414 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4415 img_len = (img_width_bytes + 1) * y;
4420 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4422 for (j=0; j < y; ++j) {
4423 stbi_uc *cur = a->out + stride*j;
4425 int filter = *raw++;
4428 return stbi__err(
"invalid filter",
"Corrupt PNG");
4431 STBI_ASSERT(img_width_bytes <= x);
4432 cur += x*out_n - img_width_bytes;
4434 width = img_width_bytes;
4436 prior = cur - stride;
4439 if (j == 0) filter = first_row_filter[filter];
4442 for (k=0; k < filter_bytes; ++k) {
4444 case STBI__F_none : cur[k] = raw[k];
break;
4445 case STBI__F_sub : cur[k] = raw[k];
break;
4446 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4447 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
4448 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
4449 case STBI__F_avg_first : cur[k] = raw[k];
break;
4450 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4460 }
else if (depth == 16) {
4461 if (img_n != out_n) {
4462 cur[filter_bytes] = 255;
4463 cur[filter_bytes+1] = 255;
4465 raw += filter_bytes;
4466 cur += output_bytes;
4467 prior += output_bytes;
4475 if (depth < 8 || img_n == out_n) {
4476 int nk = (width - 1)*filter_bytes;
4477 #define STBI__CASE(f) \
4479 for (k=0; k < nk; ++k)
4482 case STBI__F_none: memcpy(cur, raw, nk);
break;
4483 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); }
break;
4484 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4485 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); }
break;
4486 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); }
break;
4487 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); }
break;
4488 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); }
break;
4493 STBI_ASSERT(img_n+1 == out_n);
4494 #define STBI__CASE(f) \
4496 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4497 for (k=0; k < filter_bytes; ++k)
4499 STBI__CASE(STBI__F_none) { cur[k] = raw[k]; }
break;
4500 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); }
break;
4501 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4502 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); }
break;
4503 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); }
break;
4504 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); }
break;
4505 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); }
break;
4512 cur = a->out + stride*j;
4513 for (i=0; i < x; ++i,cur+=output_bytes) {
4514 cur[filter_bytes+1] = 255;
4524 for (j=0; j < y; ++j) {
4525 stbi_uc *cur = a->out + stride*j;
4526 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
4529 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4538 for (k=x*img_n; k >= 2; k-=2, ++in) {
4539 *cur++ = scale * ((*in >> 4) );
4540 *cur++ = scale * ((*in ) & 0x0f);
4542 if (k > 0) *cur++ = scale * ((*in >> 4) );
4543 }
else if (depth == 2) {
4544 for (k=x*img_n; k >= 4; k-=4, ++in) {
4545 *cur++ = scale * ((*in >> 6) );
4546 *cur++ = scale * ((*in >> 4) & 0x03);
4547 *cur++ = scale * ((*in >> 2) & 0x03);
4548 *cur++ = scale * ((*in ) & 0x03);
4550 if (k > 0) *cur++ = scale * ((*in >> 6) );
4551 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4552 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4553 }
else if (depth == 1) {
4554 for (k=x*img_n; k >= 8; k-=8, ++in) {
4555 *cur++ = scale * ((*in >> 7) );
4556 *cur++ = scale * ((*in >> 6) & 0x01);
4557 *cur++ = scale * ((*in >> 5) & 0x01);
4558 *cur++ = scale * ((*in >> 4) & 0x01);
4559 *cur++ = scale * ((*in >> 3) & 0x01);
4560 *cur++ = scale * ((*in >> 2) & 0x01);
4561 *cur++ = scale * ((*in >> 1) & 0x01);
4562 *cur++ = scale * ((*in ) & 0x01);
4564 if (k > 0) *cur++ = scale * ((*in >> 7) );
4565 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4566 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4567 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4568 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4569 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4570 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4572 if (img_n != out_n) {
4575 cur = a->out + stride*j;
4577 for (q=x-1; q >= 0; --q) {
4579 cur[q*2+0] = cur[q];
4582 STBI_ASSERT(img_n == 3);
4583 for (q=x-1; q >= 0; --q) {
4585 cur[q*4+2] = cur[q*3+2];
4586 cur[q*4+1] = cur[q*3+1];
4587 cur[q*4+0] = cur[q*3+0];
4592 }
else if (depth == 16) {
4597 stbi_uc *cur = a->out;
4598 stbi__uint16 *cur16 = (stbi__uint16*)cur;
4600 for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
4601 *cur16 = (cur[0] << 8) | cur[1];
4608static 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)
4610 int bytes = (depth == 16 ? 2 : 1);
4611 int out_bytes = out_n * bytes;
4615 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4618 final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4619 for (p=0; p < 7; ++p) {
4620 int xorig[] = { 0,4,0,2,0,1,0 };
4621 int yorig[] = { 0,0,4,0,2,0,1 };
4622 int xspc[] = { 8,8,4,4,2,2,1 };
4623 int yspc[] = { 8,8,8,4,4,2,2 };
4626 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4627 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4629 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4630 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4634 for (j=0; j < y; ++j) {
4635 for (i=0; i < x; ++i) {
4636 int out_y = j*yspc[p]+yorig[p];
4637 int out_x = i*xspc[p]+xorig[p];
4638 memcpy(
final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
4639 a->out + (j*x+i)*out_bytes, out_bytes);
4643 image_data += img_len;
4644 image_data_len -= img_len;
4652static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3],
int out_n)
4654 stbi__context *s = z->s;
4655 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4656 stbi_uc *p = z->out;
4660 STBI_ASSERT(out_n == 2 || out_n == 4);
4663 for (i=0; i < pixel_count; ++i) {
4664 p[1] = (p[0] == tc[0] ? 0 : 255);
4668 for (i=0; i < pixel_count; ++i) {
4669 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4677static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3],
int out_n)
4679 stbi__context *s = z->s;
4680 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4681 stbi__uint16 *p = (stbi__uint16*) z->out;
4685 STBI_ASSERT(out_n == 2 || out_n == 4);
4688 for (i = 0; i < pixel_count; ++i) {
4689 p[1] = (p[0] == tc[0] ? 0 : 65535);
4693 for (i = 0; i < pixel_count; ++i) {
4694 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4702static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette,
int len,
int pal_img_n)
4704 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4705 stbi_uc *p, *temp_out, *orig = a->out;
4707 p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4708 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4713 if (pal_img_n == 3) {
4714 for (i=0; i < pixel_count; ++i) {
4717 p[1] = palette[n+1];
4718 p[2] = palette[n+2];
4722 for (i=0; i < pixel_count; ++i) {
4725 p[1] = palette[n+1];
4726 p[2] = palette[n+2];
4727 p[3] = palette[n+3];
4739static int stbi__unpremultiply_on_load = 0;
4740static int stbi__de_iphone_flag = 0;
4742STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply)
4744 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4747STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert)
4749 stbi__de_iphone_flag = flag_true_if_should_convert;
4752static void stbi__de_iphone(stbi__png *z)
4754 stbi__context *s = z->s;
4755 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4756 stbi_uc *p = z->out;
4758 if (s->img_out_n == 3) {
4759 for (i=0; i < pixel_count; ++i) {
4766 STBI_ASSERT(s->img_out_n == 4);
4767 if (stbi__unpremultiply_on_load) {
4769 for (i=0; i < pixel_count; ++i) {
4773 stbi_uc half = a / 2;
4774 p[0] = (p[2] * 255 + half) / a;
4775 p[1] = (p[1] * 255 + half) / a;
4776 p[2] = ( t * 255 + half) / a;
4785 for (i=0; i < pixel_count; ++i) {
4795#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
4797static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
4799 stbi_uc palette[1024], pal_img_n=0;
4800 stbi_uc has_trans=0, tc[3]={0};
4801 stbi__uint16 tc16[3];
4802 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4803 int first=1,k,interlace=0, color=0, is_iphone=0;
4804 stbi__context *s = z->s;
4810 if (!stbi__check_png_header(s))
return 0;
4812 if (scan == STBI__SCAN_type)
return 1;
4815 stbi__pngchunk c = stbi__get_chunk_header(s);
4817 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4819 stbi__skip(s, c.length);
4821 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4823 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4825 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4826 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4827 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4828 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");
4829 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4830 if (color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4831 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4832 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4833 filter= stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4834 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4835 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4837 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4838 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4839 if (scan == STBI__SCAN_header)
return 1;
4844 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4850 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4851 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4852 if (c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4853 pal_len = c.length / 3;
4854 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4855 for (i=0; i < pal_len; ++i) {
4856 palette[i*4+0] = stbi__get8(s);
4857 palette[i*4+1] = stbi__get8(s);
4858 palette[i*4+2] = stbi__get8(s);
4859 palette[i*4+3] = 255;
4864 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4865 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4866 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4868 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4869 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4870 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4872 for (i=0; i < c.length; ++i)
4873 palette[i*4+3] = stbi__get8(s);
4875 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4876 if (c.length != (stbi__uint32) s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4878 if (z->depth == 16) {
4879 for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s);
4881 for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth];
4887 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4888 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4889 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4890 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4891 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
4892 if (ioff + c.length > idata_limit) {
4893 stbi__uint32 idata_limit_old = idata_limit;
4895 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4896 while (ioff + c.length > idata_limit)
4898 STBI_NOTUSED(idata_limit_old);
4899 p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4902 if (!stbi__getn(s, z->idata+ioff,c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4907 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4908 stbi__uint32 raw_len, bpl;
4909 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4910 if (scan != STBI__SCAN_load)
return 1;
4911 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4913 bpl = (s->img_x * z->depth + 7) / 8;
4914 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4915 z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((
char *) z->idata, ioff, raw_len, (
int *) &raw_len, !is_iphone);
4916 if (z->expanded == NULL)
return 0;
4917 STBI_FREE(z->idata); z->idata = NULL;
4918 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
4919 s->img_out_n = s->img_n+1;
4921 s->img_out_n = s->img_n;
4922 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace))
return 0;
4924 if (z->depth == 16) {
4925 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
return 0;
4927 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4930 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4934 s->img_n = pal_img_n;
4935 s->img_out_n = pal_img_n;
4936 if (req_comp >= 3) s->img_out_n = req_comp;
4937 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4939 }
else if (has_trans) {
4943 STBI_FREE(z->expanded); z->expanded = NULL;
4949 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4950 if ((c.type & (1 << 29)) == 0) {
4951 #ifndef STBI_NO_FAILURE_STRINGS
4953 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4954 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4955 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4956 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4957 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4959 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4961 stbi__skip(s, c.length);
4969static void *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp, stbi__result_info *ri)
4972 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4973 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4975 ri->bits_per_channel = 8;
4977 ri->bits_per_channel = p->depth;
4980 if (req_comp && req_comp != p->s->img_out_n) {
4981 if (ri->bits_per_channel == 8)
4982 result = stbi__convert_format((
unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4984 result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4985 p->s->img_out_n = req_comp;
4986 if (result == NULL)
return result;
4990 if (n) *n = p->s->img_n;
4992 STBI_FREE(p->out); p->out = NULL;
4993 STBI_FREE(p->expanded); p->expanded = NULL;
4994 STBI_FREE(p->idata); p->idata = NULL;
4999static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5003 return stbi__do_png(&p, x,y,comp,req_comp, ri);
5006static int stbi__png_test(stbi__context *s)
5009 r = stbi__check_png_header(s);
5014static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
5016 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
5017 stbi__rewind( p->s );
5020 if (x) *x = p->s->img_x;
5021 if (y) *y = p->s->img_y;
5022 if (comp) *comp = p->s->img_n;
5026static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
5030 return stbi__png_info_raw(&p, x, y, comp);
5033static int stbi__png_is16(stbi__context *s)
5037 if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5039 if (p.depth != 16) {
5050static int stbi__bmp_test_raw(stbi__context *s)
5054 if (stbi__get8(s) !=
'B')
return 0;
5055 if (stbi__get8(s) !=
'M')
return 0;
5060 sz = stbi__get32le(s);
5061 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5065static int stbi__bmp_test(stbi__context *s)
5067 int r = stbi__bmp_test_raw(s);
5074static int stbi__high_bit(
unsigned int z)
5077 if (z == 0)
return -1;
5078 if (z >= 0x10000) { n += 16; z >>= 16; }
5079 if (z >= 0x00100) { n += 8; z >>= 8; }
5080 if (z >= 0x00010) { n += 4; z >>= 4; }
5081 if (z >= 0x00004) { n += 2; z >>= 2; }
5082 if (z >= 0x00002) { n += 1; z >>= 1; }
5086static int stbi__bitcount(
unsigned int a)
5088 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
5089 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
5090 a = (a + (a >> 4)) & 0x0f0f0f0f;
5092 a = (a + (a >> 16));
5099static int stbi__shiftsigned(
unsigned int v,
int shift,
int bits)
5101 static unsigned int mul_table[9] = {
5103 0xff, 0x55, 0x49, 0x11,
5104 0x21, 0x41, 0x81, 0x01,
5106 static unsigned int shift_table[9] = {
5113 STBI_ASSERT(v >= 0 && v < 256);
5115 STBI_ASSERT(bits >= 0 && bits <= 8);
5116 return (
int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
5121 int bpp, offset, hsz;
5122 unsigned int mr,mg,mb,ma, all_a;
5125static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
5128 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5132 info->offset = stbi__get32le(s);
5133 info->hsz = hsz = stbi__get32le(s);
5134 info->mr = info->mg = info->mb = info->ma = 0;
5136 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5138 s->img_x = stbi__get16le(s);
5139 s->img_y = stbi__get16le(s);
5141 s->img_x = stbi__get32le(s);
5142 s->img_y = stbi__get32le(s);
5144 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5145 info->bpp = stbi__get16le(s);
5147 int compress = stbi__get32le(s);
5148 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5154 if (hsz == 40 || hsz == 56) {
5161 if (info->bpp == 16 || info->bpp == 32) {
5162 if (compress == 0) {
5163 if (info->bpp == 32) {
5164 info->mr = 0xffu << 16;
5165 info->mg = 0xffu << 8;
5166 info->mb = 0xffu << 0;
5167 info->ma = 0xffu << 24;
5170 info->mr = 31u << 10;
5171 info->mg = 31u << 5;
5172 info->mb = 31u << 0;
5174 }
else if (compress == 3) {
5175 info->mr = stbi__get32le(s);
5176 info->mg = stbi__get32le(s);
5177 info->mb = stbi__get32le(s);
5179 if (info->mr == info->mg && info->mg == info->mb) {
5181 return stbi__errpuc(
"bad BMP",
"bad BMP");
5184 return stbi__errpuc(
"bad BMP",
"bad BMP");
5188 if (hsz != 108 && hsz != 124)
5189 return stbi__errpuc(
"bad BMP",
"bad BMP");
5190 info->mr = stbi__get32le(s);
5191 info->mg = stbi__get32le(s);
5192 info->mb = stbi__get32le(s);
5193 info->ma = stbi__get32le(s);
5195 for (i=0; i < 12; ++i)
5209static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5212 unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
5213 stbi_uc pal[256][4];
5214 int psize=0,i,j,width;
5215 int flip_vertically, pad, target;
5216 stbi__bmp_data info;
5220 if (stbi__bmp_parse_header(s, &info) == NULL)
5223 flip_vertically = ((int) s->img_y) > 0;
5224 s->img_y = abs((
int) s->img_y);
5232 if (info.hsz == 12) {
5234 psize = (info.offset - 14 - 24) / 3;
5237 psize = (info.offset - 14 - info.hsz) >> 2;
5240 s->img_n = ma ? 4 : 3;
5241 if (req_comp && req_comp >= 3)
5247 if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5248 return stbi__errpuc(
"too large",
"Corrupt BMP");
5250 out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5251 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5252 if (info.bpp < 16) {
5254 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
5255 for (i=0; i < psize; ++i) {
5256 pal[i][2] = stbi__get8(s);
5257 pal[i][1] = stbi__get8(s);
5258 pal[i][0] = stbi__get8(s);
5259 if (info.hsz != 12) stbi__get8(s);
5262 stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5263 if (info.bpp == 1) width = (s->img_x + 7) >> 3;
5264 else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5265 else if (info.bpp == 8) width = s->img_x;
5266 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
5268 if (info.bpp == 1) {
5269 for (j=0; j < (int) s->img_y; ++j) {
5270 int bit_offset = 7, v = stbi__get8(s);
5271 for (i=0; i < (int) s->img_x; ++i) {
5272 int color = (v>>bit_offset)&0x1;
5273 out[z++] = pal[color][0];
5274 out[z++] = pal[color][1];
5275 out[z++] = pal[color][2];
5276 if (target == 4) out[z++] = 255;
5277 if (i+1 == (
int) s->img_x)
break;
5278 if((--bit_offset) < 0) {
5286 for (j=0; j < (int) s->img_y; ++j) {
5287 for (i=0; i < (int) s->img_x; i += 2) {
5288 int v=stbi__get8(s),v2=0;
5289 if (info.bpp == 4) {
5293 out[z++] = pal[v][0];
5294 out[z++] = pal[v][1];
5295 out[z++] = pal[v][2];
5296 if (target == 4) out[z++] = 255;
5297 if (i+1 == (
int) s->img_x)
break;
5298 v = (info.bpp == 8) ? stbi__get8(s) : v2;
5299 out[z++] = pal[v][0];
5300 out[z++] = pal[v][1];
5301 out[z++] = pal[v][2];
5302 if (target == 4) out[z++] = 255;
5308 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
5311 stbi__skip(s, info.offset - 14 - info.hsz);
5312 if (info.bpp == 24) width = 3 * s->img_x;
5313 else if (info.bpp == 16) width = 2*s->img_x;
5316 if (info.bpp == 24) {
5318 }
else if (info.bpp == 32) {
5319 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5323 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5325 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
5326 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
5327 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
5328 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
5330 for (j=0; j < (int) s->img_y; ++j) {
5332 for (i=0; i < (int) s->img_x; ++i) {
5334 out[z+2] = stbi__get8(s);
5335 out[z+1] = stbi__get8(s);
5336 out[z+0] = stbi__get8(s);
5338 a = (easy == 2 ? stbi__get8(s) : 255);
5340 if (target == 4) out[z++] = a;
5344 for (i=0; i < (int) s->img_x; ++i) {
5345 stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
5347 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5348 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5349 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5350 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5352 if (target == 4) out[z++] = STBI__BYTECAST(a);
5360 if (target == 4 && all_a == 0)
5361 for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
5364 if (flip_vertically) {
5366 for (j=0; j < (int) s->img_y>>1; ++j) {
5367 stbi_uc *p1 = out + j *s->img_x*target;
5368 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
5369 for (i=0; i < (int) s->img_x*target; ++i) {
5370 t = p1[i]; p1[i] = p2[i]; p2[i] = t;
5375 if (req_comp && req_comp != target) {
5376 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
5377 if (out == NULL)
return out;
5382 if (comp) *comp = s->img_n;
5391static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
5394 if (is_rgb16) *is_rgb16 = 0;
5395 switch(bits_per_pixel) {
5396 case 8:
return STBI_grey;
5397 case 16:
if(is_grey)
return STBI_grey_alpha;
5399 case 15:
if(is_rgb16) *is_rgb16 = 1;
5402 case 32:
return bits_per_pixel/8;
5407static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
5409 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5410 int sz, tga_colormap_type;
5412 tga_colormap_type = stbi__get8(s);
5413 if( tga_colormap_type > 1 ) {
5417 tga_image_type = stbi__get8(s);
5418 if ( tga_colormap_type == 1 ) {
5419 if (tga_image_type != 1 && tga_image_type != 9) {
5425 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5430 tga_colormap_bpp = sz;
5432 if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5437 tga_colormap_bpp = 0;
5439 tga_w = stbi__get16le(s);
5444 tga_h = stbi__get16le(s);
5449 tga_bits_per_pixel = stbi__get8(s);
5451 if (tga_colormap_bpp != 0) {
5452 if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5458 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5460 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5468 if (comp) *comp = tga_comp;
5472static int stbi__tga_test(stbi__context *s)
5475 int sz, tga_color_type;
5477 tga_color_type = stbi__get8(s);
5478 if ( tga_color_type > 1 )
goto errorEnd;
5480 if ( tga_color_type == 1 ) {
5481 if (sz != 1 && sz != 9)
goto errorEnd;
5484 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5487 if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) )
goto errorEnd;
5490 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5491 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5493 if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) )
goto errorEnd;
5494 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5504static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
5506 stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5507 stbi__uint16 fiveBitMask = 31;
5509 int r = (px >> 10) & fiveBitMask;
5510 int g = (px >> 5) & fiveBitMask;
5511 int b = px & fiveBitMask;
5513 out[0] = (stbi_uc)((r * 255)/31);
5514 out[1] = (stbi_uc)((g * 255)/31);
5515 out[2] = (stbi_uc)((b * 255)/31);
5523static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5526 int tga_offset = stbi__get8(s);
5527 int tga_indexed = stbi__get8(s);
5528 int tga_image_type = stbi__get8(s);
5530 int tga_palette_start = stbi__get16le(s);
5531 int tga_palette_len = stbi__get16le(s);
5532 int tga_palette_bits = stbi__get8(s);
5533 int tga_x_origin = stbi__get16le(s);
5534 int tga_y_origin = stbi__get16le(s);
5535 int tga_width = stbi__get16le(s);
5536 int tga_height = stbi__get16le(s);
5537 int tga_bits_per_pixel = stbi__get8(s);
5538 int tga_comp, tga_rgb16=0;
5539 int tga_inverted = stbi__get8(s);
5542 unsigned char *tga_data;
5543 unsigned char *tga_palette = NULL;
5545 unsigned char raw_data[4] = {0};
5547 int RLE_repeating = 0;
5548 int read_next_pixel = 1;
5552 if ( tga_image_type >= 8 )
5554 tga_image_type -= 8;
5557 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5560 if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5561 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5564 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5569 if (comp) *comp = tga_comp;
5571 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5572 return stbi__errpuc(
"too large",
"Corrupt TGA");
5574 tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5575 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
5578 stbi__skip(s, tga_offset );
5580 if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
5581 for (i=0; i < tga_height; ++i) {
5582 int row = tga_inverted ? tga_height -i - 1 : i;
5583 stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5584 stbi__getn(s, tga_row, tga_width * tga_comp);
5591 stbi__skip(s, tga_palette_start );
5593 tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5595 STBI_FREE(tga_data);
5596 return stbi__errpuc(
"outofmem",
"Out of memory");
5599 stbi_uc *pal_entry = tga_palette;
5600 STBI_ASSERT(tga_comp == STBI_rgb);
5601 for (i=0; i < tga_palette_len; ++i) {
5602 stbi__tga_read_rgb16(s, pal_entry);
5603 pal_entry += tga_comp;
5605 }
else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5606 STBI_FREE(tga_data);
5607 STBI_FREE(tga_palette);
5608 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5612 for (i=0; i < tga_width * tga_height; ++i)
5617 if ( RLE_count == 0 )
5620 int RLE_cmd = stbi__get8(s);
5621 RLE_count = 1 + (RLE_cmd & 127);
5622 RLE_repeating = RLE_cmd >> 7;
5623 read_next_pixel = 1;
5624 }
else if ( !RLE_repeating )
5626 read_next_pixel = 1;
5630 read_next_pixel = 1;
5633 if ( read_next_pixel )
5639 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5640 if ( pal_idx >= tga_palette_len ) {
5644 pal_idx *= tga_comp;
5645 for (j = 0; j < tga_comp; ++j) {
5646 raw_data[j] = tga_palette[pal_idx+j];
5648 }
else if(tga_rgb16) {
5649 STBI_ASSERT(tga_comp == STBI_rgb);
5650 stbi__tga_read_rgb16(s, raw_data);
5653 for (j = 0; j < tga_comp; ++j) {
5654 raw_data[j] = stbi__get8(s);
5658 read_next_pixel = 0;
5662 for (j = 0; j < tga_comp; ++j)
5663 tga_data[i*tga_comp+j] = raw_data[j];
5671 for (j = 0; j*2 < tga_height; ++j)
5673 int index1 = j * tga_width * tga_comp;
5674 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5675 for (i = tga_width * tga_comp; i > 0; --i)
5677 unsigned char temp = tga_data[index1];
5678 tga_data[index1] = tga_data[index2];
5679 tga_data[index2] = temp;
5686 if ( tga_palette != NULL )
5688 STBI_FREE( tga_palette );
5693 if (tga_comp >= 3 && !tga_rgb16)
5695 unsigned char* tga_pixel = tga_data;
5696 for (i=0; i < tga_width * tga_height; ++i)
5698 unsigned char temp = tga_pixel[0];
5699 tga_pixel[0] = tga_pixel[2];
5700 tga_pixel[2] = temp;
5701 tga_pixel += tga_comp;
5706 if (req_comp && req_comp != tga_comp)
5707 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5711 tga_palette_start = tga_palette_len = tga_palette_bits =
5712 tga_x_origin = tga_y_origin = 0;
5722static int stbi__psd_test(stbi__context *s)
5724 int r = (stbi__get32be(s) == 0x38425053);
5729static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p,
int pixelCount)
5731 int count, nleft, len;
5734 while ((nleft = pixelCount - count) > 0) {
5735 len = stbi__get8(s);
5738 }
else if (len < 128) {
5741 if (len > nleft)
return 0;
5748 }
else if (len > 128) {
5753 if (len > nleft)
return 0;
5754 val = stbi__get8(s);
5767static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
5770 int channelCount, compression;
5778 if (stbi__get32be(s) != 0x38425053)
5779 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5782 if (stbi__get16be(s) != 1)
5783 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5789 channelCount = stbi__get16be(s);
5790 if (channelCount < 0 || channelCount > 16)
5791 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5794 h = stbi__get32be(s);
5795 w = stbi__get32be(s);
5798 bitdepth = stbi__get16be(s);
5799 if (bitdepth != 8 && bitdepth != 16)
5800 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
5812 if (stbi__get16be(s) != 3)
5813 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5816 stbi__skip(s,stbi__get32be(s) );
5819 stbi__skip(s, stbi__get32be(s) );
5822 stbi__skip(s, stbi__get32be(s) );
5828 compression = stbi__get16be(s);
5829 if (compression > 1)
5830 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5833 if (!stbi__mad3sizes_valid(4, w, h, 0))
5834 return stbi__errpuc(
"too large",
"Corrupt PSD");
5838 if (!compression && bitdepth == 16 && bpc == 16) {
5839 out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
5840 ri->bits_per_channel = 16;
5842 out = (stbi_uc *) stbi__malloc(4 * w*h);
5844 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5862 stbi__skip(s, h * channelCount * 2 );
5865 for (channel = 0; channel < 4; channel++) {
5869 if (channel >= channelCount) {
5871 for (i = 0; i < pixelCount; i++, p += 4)
5872 *p = (channel == 3 ? 255 : 0);
5875 if (!stbi__psd_decode_rle(s, p, pixelCount)) {
5877 return stbi__errpuc(
"corrupt",
"bad RLE data");
5887 for (channel = 0; channel < 4; channel++) {
5888 if (channel >= channelCount) {
5890 if (bitdepth == 16 && bpc == 16) {
5891 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
5892 stbi__uint16 val = channel == 3 ? 65535 : 0;
5893 for (i = 0; i < pixelCount; i++, q += 4)
5896 stbi_uc *p = out+channel;
5897 stbi_uc val = channel == 3 ? 255 : 0;
5898 for (i = 0; i < pixelCount; i++, p += 4)
5902 if (ri->bits_per_channel == 16) {
5903 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
5904 for (i = 0; i < pixelCount; i++, q += 4)
5905 *q = (stbi__uint16) stbi__get16be(s);
5907 stbi_uc *p = out+channel;
5908 if (bitdepth == 16) {
5909 for (i = 0; i < pixelCount; i++, p += 4)
5910 *p = (stbi_uc) (stbi__get16be(s) >> 8);
5912 for (i = 0; i < pixelCount; i++, p += 4)
5921 if (channelCount >= 4) {
5922 if (ri->bits_per_channel == 16) {
5923 for (i=0; i < w*h; ++i) {
5924 stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
5925 if (pixel[3] != 0 && pixel[3] != 65535) {
5926 float a = pixel[3] / 65535.0f;
5927 float ra = 1.0f / a;
5928 float inv_a = 65535.0f * (1 - ra);
5929 pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
5930 pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
5931 pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
5935 for (i=0; i < w*h; ++i) {
5936 unsigned char *pixel = out + 4*i;
5937 if (pixel[3] != 0 && pixel[3] != 255) {
5938 float a = pixel[3] / 255.0f;
5939 float ra = 1.0f / a;
5940 float inv_a = 255.0f * (1 - ra);
5941 pixel[0] = (
unsigned char) (pixel[0]*ra + inv_a);
5942 pixel[1] = (
unsigned char) (pixel[1]*ra + inv_a);
5943 pixel[2] = (
unsigned char) (pixel[2]*ra + inv_a);
5950 if (req_comp && req_comp != 4) {
5951 if (ri->bits_per_channel == 16)
5952 out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
5954 out = stbi__convert_format(out, 4, req_comp, w, h);
5955 if (out == NULL)
return out;
5958 if (comp) *comp = 4;
5974static int stbi__pic_is4(stbi__context *s,
const char *str)
5978 if (stbi__get8(s) != (stbi_uc)str[i])
5984static int stbi__pic_test_core(stbi__context *s)
5988 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
5994 if (!stbi__pic_is4(s,
"PICT"))
6002 stbi_uc size,type,channel;
6005static stbi_uc *stbi__readval(stbi__context *s,
int channel, stbi_uc *dest)
6009 for (i=0; i<4; ++i, mask>>=1) {
6010 if (channel & mask) {
6011 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
6012 dest[i]=stbi__get8(s);
6019static void stbi__copyval(
int channel,stbi_uc *dest,
const stbi_uc *src)
6023 for (i=0;i<4; ++i, mask>>=1)
6028static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp, stbi_uc *result)
6030 int act_comp=0,num_packets=0,y,chained;
6031 stbi__pic_packet packets[10];
6036 stbi__pic_packet *packet;
6038 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
6039 return stbi__errpuc(
"bad format",
"too many packets");
6041 packet = &packets[num_packets++];
6043 chained = stbi__get8(s);
6044 packet->size = stbi__get8(s);
6045 packet->type = stbi__get8(s);
6046 packet->channel = stbi__get8(s);
6048 act_comp |= packet->channel;
6050 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
6051 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
6054 *comp = (act_comp & 0x10 ? 4 : 3);
6056 for(y=0; y<height; ++y) {
6059 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
6060 stbi__pic_packet *packet = &packets[packet_idx];
6061 stbi_uc *dest = result+y*width*4;
6063 switch (packet->type) {
6065 return stbi__errpuc(
"bad format",
"packet has bad compression type");
6070 for(x=0;x<width;++x, dest+=4)
6071 if (!stbi__readval(s,packet->channel,dest))
6081 stbi_uc count,value[4];
6083 count=stbi__get8(s);
6084 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6087 count = (stbi_uc) left;
6089 if (!stbi__readval(s,packet->channel,value))
return 0;
6091 for(i=0; i<count; ++i,dest+=4)
6092 stbi__copyval(packet->channel,dest,value);
6101 int count = stbi__get8(s), i;
6102 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6108 count = stbi__get16be(s);
6112 return stbi__errpuc(
"bad file",
"scanline overrun");
6114 if (!stbi__readval(s,packet->channel,value))
6117 for(i=0;i<count;++i, dest += 4)
6118 stbi__copyval(packet->channel,dest,value);
6121 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
6123 for(i=0;i<count;++i, dest+=4)
6124 if (!stbi__readval(s,packet->channel,dest))
6138static void *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp, stbi__result_info *ri)
6141 int i, x,y, internal_comp;
6144 if (!comp) comp = &internal_comp;
6146 for (i=0; i<92; ++i)
6149 x = stbi__get16be(s);
6150 y = stbi__get16be(s);
6151 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
6152 if (!stbi__mad3sizes_valid(x, y, 4, 0))
return stbi__errpuc(
"too large",
"PIC image too large to decode");
6159 result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
6160 memset(result, 0xff, x*y*4);
6162 if (!stbi__pic_load_core(s,x,y,comp, result)) {
6168 if (req_comp == 0) req_comp = *comp;
6169 result=stbi__convert_format(result,4,req_comp,x,y);
6174static int stbi__pic_test(stbi__context *s)
6176 int r = stbi__pic_test_core(s);
6197 stbi_uc *background;
6199 int flags, bgindex, ratio, transparent, eflags;
6200 stbi_uc pal[256][4];
6201 stbi_uc lpal[256][4];
6202 stbi__gif_lzw codes[8192];
6203 stbi_uc *color_table;
6206 int start_x, start_y;
6213static int stbi__gif_test_raw(stbi__context *s)
6216 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
6218 if (sz !=
'9' && sz !=
'7')
return 0;
6219 if (stbi__get8(s) !=
'a')
return 0;
6223static int stbi__gif_test(stbi__context *s)
6225 int r = stbi__gif_test_raw(s);
6230static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4],
int num_entries,
int transp)
6233 for (i=0; i < num_entries; ++i) {
6234 pal[i][2] = stbi__get8(s);
6235 pal[i][1] = stbi__get8(s);
6236 pal[i][0] = stbi__get8(s);
6237 pal[i][3] = transp == i ? 0 : 255;
6241static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
6244 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
6245 return stbi__err(
"not GIF",
"Corrupt GIF");
6247 version = stbi__get8(s);
6248 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
6249 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
6251 stbi__g_failure_reason =
"";
6252 g->w = stbi__get16le(s);
6253 g->h = stbi__get16le(s);
6254 g->flags = stbi__get8(s);
6255 g->bgindex = stbi__get8(s);
6256 g->ratio = stbi__get8(s);
6257 g->transparent = -1;
6259 if (comp != 0) *comp = 4;
6261 if (is_info)
return 1;
6263 if (g->flags & 0x80)
6264 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
6269static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
6271 stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
6272 if (!stbi__gif_header(s, g, comp, 1)) {
6283static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6290 if (g->codes[code].prefix >= 0)
6291 stbi__out_gif_code(g, g->codes[code].prefix);
6293 if (g->cur_y >= g->max_y)
return;
6295 idx = g->cur_x + g->cur_y;
6297 g->history[idx / 4] = 1;
6299 c = &g->color_table[g->codes[code].suffix * 4];
6308 if (g->cur_x >= g->max_x) {
6309 g->cur_x = g->start_x;
6310 g->cur_y += g->step;
6312 while (g->cur_y >= g->max_y && g->parse > 0) {
6313 g->step = (1 << g->parse) * g->line_size;
6314 g->cur_y = g->start_y + (g->step >> 1);
6320static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
6323 stbi__int32 len, init_code;
6325 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6328 lzw_cs = stbi__get8(s);
6329 if (lzw_cs > 12)
return NULL;
6330 clear = 1 << lzw_cs;
6332 codesize = lzw_cs + 1;
6333 codemask = (1 << codesize) - 1;
6336 for (init_code = 0; init_code < clear; init_code++) {
6337 g->codes[init_code].prefix = -1;
6338 g->codes[init_code].first = (stbi_uc) init_code;
6339 g->codes[init_code].suffix = (stbi_uc) init_code;
6348 if (valid_bits < codesize) {
6350 len = stbi__get8(s);
6355 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
6358 stbi__int32 code = bits & codemask;
6360 valid_bits -= codesize;
6362 if (code == clear) {
6363 codesize = lzw_cs + 1;
6364 codemask = (1 << codesize) - 1;
6368 }
else if (code == clear + 1) {
6370 while ((len = stbi__get8(s)) > 0)
6373 }
else if (code <= avail) {
6375 return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6379 p = &g->codes[avail++];
6381 return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6384 p->prefix = (stbi__int16) oldcode;
6385 p->first = g->codes[oldcode].first;
6386 p->suffix = (code == avail) ? p->first : g->codes[code].first;
6387 }
else if (code == avail)
6388 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6390 stbi__out_gif_code(g, (stbi__uint16) code);
6392 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6394 codemask = (1 << codesize) - 1;
6399 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6407static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp, stbi_uc *two_back)
6413 STBI_NOTUSED(req_comp);
6418 if (!stbi__gif_header(s, g, comp,0))
return 0;
6419 if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
6420 return stbi__errpuc(
"too large",
"GIF image is too large");
6421 pcount = g->w * g->h;
6422 g->out = (stbi_uc *) stbi__malloc(4 * pcount);
6423 g->background = (stbi_uc *) stbi__malloc(4 * pcount);
6424 g->history = (stbi_uc *) stbi__malloc(pcount);
6425 if (!g->out || !g->background || !g->history)
6426 return stbi__errpuc(
"outofmem",
"Out of memory");
6431 memset(g->out, 0x00, 4 * pcount);
6432 memset(g->background, 0x00, 4 * pcount);
6433 memset(g->history, 0x00, pcount);
6437 dispose = (g->eflags & 0x1C) >> 2;
6438 pcount = g->w * g->h;
6440 if ((dispose == 3) && (two_back == 0)) {
6445 for (pi = 0; pi < pcount; ++pi) {
6446 if (g->history[pi]) {
6447 memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
6450 }
else if (dispose == 2) {
6452 for (pi = 0; pi < pcount; ++pi) {
6453 if (g->history[pi]) {
6454 memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
6465 memcpy( g->background, g->out, 4 * g->w * g->h );
6469 memset( g->history, 0x00, g->w * g->h );
6472 int tag = stbi__get8(s);
6476 stbi__int32 x, y, w, h;
6479 x = stbi__get16le(s);
6480 y = stbi__get16le(s);
6481 w = stbi__get16le(s);
6482 h = stbi__get16le(s);
6483 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6484 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6486 g->line_size = g->w * 4;
6488 g->start_y = y * g->line_size;
6489 g->max_x = g->start_x + w * 4;
6490 g->max_y = g->start_y + h * g->line_size;
6491 g->cur_x = g->start_x;
6492 g->cur_y = g->start_y;
6499 g->cur_y = g->max_y;
6501 g->lflags = stbi__get8(s);
6503 if (g->lflags & 0x40) {
6504 g->step = 8 * g->line_size;
6507 g->step = g->line_size;
6511 if (g->lflags & 0x80) {
6512 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6513 g->color_table = (stbi_uc *) g->lpal;
6514 }
else if (g->flags & 0x80) {
6515 g->color_table = (stbi_uc *) g->pal;
6517 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6519 o = stbi__process_gif_raster(s, g);
6520 if (!o)
return NULL;
6523 pcount = g->w * g->h;
6524 if (first_frame && (g->bgindex > 0)) {
6526 for (pi = 0; pi < pcount; ++pi) {
6527 if (g->history[pi] == 0) {
6528 g->pal[g->bgindex][3] = 255;
6529 memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
6540 int ext = stbi__get8(s);
6542 len = stbi__get8(s);
6544 g->eflags = stbi__get8(s);
6545 g->delay = 10 * stbi__get16le(s);
6548 if (g->transparent >= 0) {
6549 g->pal[g->transparent][3] = 255;
6551 if (g->eflags & 0x01) {
6552 g->transparent = stbi__get8(s);
6553 if (g->transparent >= 0) {
6554 g->pal[g->transparent][3] = 0;
6559 g->transparent = -1;
6566 while ((len = stbi__get8(s)) != 0) {
6573 return (stbi_uc *) s;
6576 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6581static void *stbi__load_gif_main(stbi__context *s,
int **delays,
int *x,
int *y,
int *z,
int *comp,
int req_comp)
6583 if (stbi__gif_test(s)) {
6587 stbi_uc *two_back = 0;
6590 memset(&g, 0,
sizeof(g));
6596 u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
6597 if (u == (stbi_uc *) s) u = 0;
6603 stride = g.w * g.h * 4;
6606 out = (stbi_uc*) STBI_REALLOC( out, layers * stride );
6608 *delays = (
int*) STBI_REALLOC( *delays,
sizeof(
int) * layers );
6611 out = (stbi_uc*)stbi__malloc( layers * stride );
6613 *delays = (
int*) stbi__malloc( layers *
sizeof(
int) );
6616 memcpy( out + ((layers - 1) * stride), u, stride );
6618 two_back = out - 2 * stride;
6622 (*delays)[layers - 1U] = g.delay;
6629 STBI_FREE(g.history);
6630 STBI_FREE(g.background);
6633 if (req_comp && req_comp != 4)
6634 out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
6639 return stbi__errpuc(
"not GIF",
"Image was not as a gif type.");
6643static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6647 memset(&g, 0,
sizeof(g));
6650 u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
6651 if (u == (stbi_uc *) s) u = 0;
6658 if (req_comp && req_comp != 4)
6659 u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
6666 STBI_FREE(g.history);
6667 STBI_FREE(g.background);
6672static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
6674 return stbi__gif_info_raw(s,x,y,comp);
6682static int stbi__hdr_test_core(stbi__context *s,
const char *signature)
6685 for (i=0; signature[i]; ++i)
6686 if (stbi__get8(s) != signature[i])
6692static int stbi__hdr_test(stbi__context* s)
6694 int r = stbi__hdr_test_core(s,
"#?RADIANCE\n");
6697 r = stbi__hdr_test_core(s,
"#?RGBE\n");
6703#define STBI__HDR_BUFLEN 1024
6704static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
6709 c = (char) stbi__get8(z);
6711 while (!stbi__at_eof(z) && c !=
'\n') {
6713 if (len == STBI__HDR_BUFLEN-1) {
6715 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
6719 c = (char) stbi__get8(z);
6726static void stbi__hdr_convert(
float *output, stbi_uc *input,
int req_comp)
6728 if ( input[3] != 0 ) {
6731 f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
6733 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
6735 output[0] = input[0] * f1;
6736 output[1] = input[1] * f1;
6737 output[2] = input[2] * f1;
6739 if (req_comp == 2) output[1] = 1;
6740 if (req_comp == 4) output[3] = 1;
6743 case 4: output[3] = 1;
6744 case 3: output[0] = output[1] = output[2] = 0;
6746 case 2: output[1] = 1;
6747 case 1: output[0] = 0;
6753static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6755 char buffer[STBI__HDR_BUFLEN];
6762 unsigned char count, value;
6763 int i, j, k, c1,c2, z;
6764 const char *headerToken;
6768 headerToken = stbi__hdr_gettoken(s,buffer);
6769 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
6770 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
6774 token = stbi__hdr_gettoken(s,buffer);
6775 if (token[0] == 0)
break;
6776 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6779 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
6783 token = stbi__hdr_gettoken(s,buffer);
6784 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6786 height = (int) strtol(token, &token, 10);
6787 while (*token ==
' ') ++token;
6788 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6790 width = (int) strtol(token, NULL, 10);
6795 if (comp) *comp = 3;
6796 if (req_comp == 0) req_comp = 3;
6798 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
6799 return stbi__errpf(
"too large",
"HDR image is too large");
6802 hdr_data = (
float *) stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
6804 return stbi__errpf(
"outofmem",
"Out of memory");
6808 if ( width < 8 || width >= 32768) {
6810 for (j=0; j < height; ++j) {
6811 for (i=0; i < width; ++i) {
6814 stbi__getn(s, rgbe, 4);
6815 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
6822 for (j = 0; j < height; ++j) {
6825 len = stbi__get8(s);
6826 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
6830 rgbe[0] = (stbi_uc) c1;
6831 rgbe[1] = (stbi_uc) c2;
6832 rgbe[2] = (stbi_uc) len;
6833 rgbe[3] = (stbi_uc) stbi__get8(s);
6834 stbi__hdr_convert(hdr_data, rgbe, req_comp);
6837 STBI_FREE(scanline);
6838 goto main_decode_loop;
6841 len |= stbi__get8(s);
6842 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
6843 if (scanline == NULL) {
6844 scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
6846 STBI_FREE(hdr_data);
6847 return stbi__errpf(
"outofmem",
"Out of memory");
6851 for (k = 0; k < 4; ++k) {
6854 while ((nleft = width - i) > 0) {
6855 count = stbi__get8(s);
6858 value = stbi__get8(s);
6860 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6861 for (z = 0; z < count; ++z)
6862 scanline[i++ * 4 + k] = value;
6865 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6866 for (z = 0; z < count; ++z)
6867 scanline[i++ * 4 + k] = stbi__get8(s);
6871 for (i=0; i < width; ++i)
6872 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
6875 STBI_FREE(scanline);
6881static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
6883 char buffer[STBI__HDR_BUFLEN];
6890 if (!comp) comp = &dummy;
6892 if (stbi__hdr_test(s) == 0) {
6898 token = stbi__hdr_gettoken(s,buffer);
6899 if (token[0] == 0)
break;
6900 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6907 token = stbi__hdr_gettoken(s,buffer);
6908 if (strncmp(token,
"-Y ", 3)) {
6913 *y = (int) strtol(token, &token, 10);
6914 while (*token ==
' ') ++token;
6915 if (strncmp(token,
"+X ", 3)) {
6920 *x = (int) strtol(token, NULL, 10);
6927static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
6930 stbi__bmp_data info;
6933 p = stbi__bmp_parse_header(s, &info);
6937 if (x) *x = s->img_x;
6938 if (y) *y = s->img_y;
6939 if (comp) *comp = info.ma ? 4 : 3;
6945static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
6947 int channelCount, dummy, depth;
6950 if (!comp) comp = &dummy;
6951 if (stbi__get32be(s) != 0x38425053) {
6955 if (stbi__get16be(s) != 1) {
6960 channelCount = stbi__get16be(s);
6961 if (channelCount < 0 || channelCount > 16) {
6965 *y = stbi__get32be(s);
6966 *x = stbi__get32be(s);
6967 depth = stbi__get16be(s);
6968 if (depth != 8 && depth != 16) {
6972 if (stbi__get16be(s) != 3) {
6980static int stbi__psd_is16(stbi__context *s)
6982 int channelCount, depth;
6983 if (stbi__get32be(s) != 0x38425053) {
6987 if (stbi__get16be(s) != 1) {
6992 channelCount = stbi__get16be(s);
6993 if (channelCount < 0 || channelCount > 16) {
6997 (void) stbi__get32be(s);
6998 (void) stbi__get32be(s);
6999 depth = stbi__get16be(s);
7009static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
7011 int act_comp=0,num_packets=0,chained,dummy;
7012 stbi__pic_packet packets[10];
7016 if (!comp) comp = &dummy;
7018 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
7025 *x = stbi__get16be(s);
7026 *y = stbi__get16be(s);
7027 if (stbi__at_eof(s)) {
7031 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
7039 stbi__pic_packet *packet;
7041 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
7044 packet = &packets[num_packets++];
7045 chained = stbi__get8(s);
7046 packet->size = stbi__get8(s);
7047 packet->type = stbi__get8(s);
7048 packet->channel = stbi__get8(s);
7049 act_comp |= packet->channel;
7051 if (stbi__at_eof(s)) {
7055 if (packet->size != 8) {
7061 *comp = (act_comp & 0x10 ? 4 : 3);
7081static int stbi__pnm_test(stbi__context *s)
7084 p = (char) stbi__get8(s);
7085 t = (char) stbi__get8(s);
7086 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7093static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
7098 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
7103 if (comp) *comp = s->img_n;
7105 if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
7106 return stbi__errpuc(
"too large",
"PNM too large");
7108 out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
7109 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
7110 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
7112 if (req_comp && req_comp != s->img_n) {
7113 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7114 if (out == NULL)
return out;
7119static int stbi__pnm_isspace(
char c)
7121 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
7124static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
7127 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7128 *c = (char) stbi__get8(s);
7130 if (stbi__at_eof(s) || *c !=
'#')
7133 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r' )
7134 *c = (
char) stbi__get8(s);
7138static int stbi__pnm_isdigit(
char c)
7140 return c >=
'0' && c <=
'9';
7143static int stbi__pnm_getinteger(stbi__context *s,
char *c)
7147 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7148 value = value*10 + (*c -
'0');
7149 *c = (char) stbi__get8(s);
7155static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
7162 if (!comp) comp = &dummy;
7167 p = (char) stbi__get8(s);
7168 t = (char) stbi__get8(s);
7169 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7174 *comp = (t ==
'6') ? 3 : 1;
7176 c = (char) stbi__get8(s);
7177 stbi__pnm_skip_whitespace(s, &c);
7179 *x = stbi__pnm_getinteger(s, &c);
7180 stbi__pnm_skip_whitespace(s, &c);
7182 *y = stbi__pnm_getinteger(s, &c);
7183 stbi__pnm_skip_whitespace(s, &c);
7185 maxv = stbi__pnm_getinteger(s, &c);
7188 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
7194static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
7196 #ifndef STBI_NO_JPEG
7197 if (stbi__jpeg_info(s, x, y, comp))
return 1;
7201 if (stbi__png_info(s, x, y, comp))
return 1;
7205 if (stbi__gif_info(s, x, y, comp))
return 1;
7209 if (stbi__bmp_info(s, x, y, comp))
return 1;
7213 if (stbi__psd_info(s, x, y, comp))
return 1;
7217 if (stbi__pic_info(s, x, y, comp))
return 1;
7221 if (stbi__pnm_info(s, x, y, comp))
return 1;
7225 if (stbi__hdr_info(s, x, y, comp))
return 1;
7230 if (stbi__tga_info(s, x, y, comp))
7233 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
7236static int stbi__is_16_main(stbi__context *s)
7239 if (stbi__png_is16(s))
return 1;
7243 if (stbi__psd_is16(s))
return 1;
7249#ifndef STBI_NO_STDIO
7250STBIDEF
int stbi_info(
char const *filename,
int *x,
int *y,
int *comp)
7252 FILE *f = stbi__fopen(filename,
"rb");
7254 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7255 result = stbi_info_from_file(f, x, y, comp);
7260STBIDEF
int stbi_info_from_file(FILE *f,
int *x,
int *y,
int *comp)
7264 long pos = ftell(f);
7265 stbi__start_file(&s, f);
7266 r = stbi__info_main(&s,x,y,comp);
7267 fseek(f,pos,SEEK_SET);
7271STBIDEF
int stbi_is_16_bit(
char const *filename)
7273 FILE *f = stbi__fopen(filename,
"rb");
7275 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7276 result = stbi_is_16_bit_from_file(f);
7281STBIDEF
int stbi_is_16_bit_from_file(FILE *f)
7285 long pos = ftell(f);
7286 stbi__start_file(&s, f);
7287 r = stbi__is_16_main(&s);
7288 fseek(f,pos,SEEK_SET);
7293STBIDEF
int stbi_info_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp)
7296 stbi__start_mem(&s,buffer,len);
7297 return stbi__info_main(&s,x,y,comp);
7300STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const *c,
void *user,
int *x,
int *y,
int *comp)
7304 return stbi__info_main(&s,x,y,comp);
7307STBIDEF
int stbi_is_16_bit_from_memory(stbi_uc
const *buffer,
int len)
7310 stbi__start_mem(&s,buffer,len);
7311 return stbi__is_16_main(&s);
7314STBIDEF
int stbi_is_16_bit_from_callbacks(
stbi_io_callbacks const *c,
void *user)
7318 return stbi__is_16_main(&s);