--- stb/stb_image.h 2021-09-16 11:52:38.284782000 -0700k +++ stb_image.h 2021-09-16 13:45:48.159770000 -0700 @@ -488,14 +488,14 @@ STBIDEF void stbi_image_free (void *retval_from_stbi_load); // get image dimensions & components without fully decoding -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, float *gamma); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, float *gamma); STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); #ifndef STBI_NO_STDIO -STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp, float *gamma); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp, float *gamma); STBIDEF int stbi_is_16_bit (char const *filename); STBIDEF int stbi_is_16_bit_from_file(FILE *f); #endif @@ -911,7 +911,7 @@ #ifndef STBI_NO_PNG static int stbi__png_test(stbi__context *s); static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp, float *gamma); static int stbi__png_is16(stbi__context *s); #endif @@ -4554,6 +4554,7 @@ stbi__context *s; stbi_uc *idata, *expanded, *out; int depth; + float gamma = 0; } stbi__png; @@ -5112,6 +5113,13 @@ break; } + case STBI__PNG_TYPE('g','A','M','A'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (4 != c.length) return stbi__err("invalid gAMA","Corrupt PNG"); + z->gamma = stbi__get32be(s) / 100000.0f; + break; + } + case STBI__PNG_TYPE('I','D','A','T'): { if (first) return stbi__err("first not IHDR", "Corrupt PNG"); if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); @@ -5243,7 +5251,7 @@ return r; } -static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp, float *gamma) { if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { stbi__rewind( p->s ); @@ -5252,21 +5260,22 @@ if (x) *x = p->s->img_x; if (y) *y = p->s->img_y; if (comp) *comp = p->s->img_n; + if (gamma) *gamma = p->gamma; return 1; } -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp, float *gamma) { stbi__png p; p.s = s; - return stbi__png_info_raw(&p, x, y, comp); + return stbi__png_info_raw(&p, x, y, comp, gamma); } static int stbi__png_is16(stbi__context *s) { stbi__png p; p.s = s; - if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + if (!stbi__png_info_raw(&p, NULL, NULL, NULL, NULL)) return 0; if (p.depth != 16) { stbi__rewind(p.s); @@ -7538,14 +7547,14 @@ } #endif -static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp, float *gamma) { #ifndef STBI_NO_JPEG if (stbi__jpeg_info(s, x, y, comp)) return 1; #endif #ifndef STBI_NO_PNG - if (stbi__png_info(s, x, y, comp)) return 1; + if (stbi__png_info(s, x, y, comp, gamma)) return 1; #endif #ifndef STBI_NO_GIF @@ -7597,23 +7606,23 @@ } #ifndef STBI_NO_STDIO -STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp, float *gamma) { FILE *f = stbi__fopen(filename, "rb"); int result; if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_info_from_file(f, x, y, comp); + result = stbi_info_from_file(f, x, y, comp, gamma); fclose(f); return result; } -STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp, float *gamma) { int r; stbi__context s; long pos = ftell(f); stbi__start_file(&s, f); - r = stbi__info_main(&s,x,y,comp); + r = stbi__info_main(&s,x,y,comp, gamma); fseek(f,pos,SEEK_SET); return r; } @@ -7640,18 +7649,18 @@ } #endif // !STBI_NO_STDIO -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, float *gamma) { stbi__context s; stbi__start_mem(&s,buffer,len); - return stbi__info_main(&s,x,y,comp); + return stbi__info_main(&s,x,y,comp, gamma); } -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp, float *gamma) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__info_main(&s,x,y,comp); + return stbi__info_main(&s,x,y,comp, gamma); } STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)