|
@@ -108,7 +108,7 @@ RECENT REVISION HISTORY:
|
|
Cass Everitt Ryamond Barbiero github:grim210
|
|
Cass Everitt Ryamond Barbiero github:grim210
|
|
Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw
|
|
Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw
|
|
Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus
|
|
Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus
|
|
- Josh Tobin Matthew Gregan github:poppolopoppo
|
|
|
|
|
|
+ Josh Tobin Simon Breuss Matthew Gregan github:poppolopoppo
|
|
Julian Raschke Gregory Mullen Christian Floisand github:darealshinji
|
|
Julian Raschke Gregory Mullen Christian Floisand github:darealshinji
|
|
Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007
|
|
Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007
|
|
Brad Weinberger Matvey Cherevko [reserved]
|
|
Brad Weinberger Matvey Cherevko [reserved]
|
|
@@ -935,6 +935,7 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
|
|
static int stbi__pnm_test(stbi__context *s);
|
|
static int stbi__pnm_test(stbi__context *s);
|
|
static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
|
|
static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
|
|
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
|
|
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
|
|
|
|
+static int stbi__pnm_is16(stbi__context *s);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
static
|
|
static
|
|
@@ -7322,7 +7323,8 @@ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
stbi_uc *out;
|
|
stbi_uc *out;
|
|
STBI_NOTUSED(ri);
|
|
STBI_NOTUSED(ri);
|
|
|
|
|
|
- if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n))
|
|
|
|
|
|
+ ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n);
|
|
|
|
+ if (ri->bits_per_channel == 0)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
|
|
if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
|
|
@@ -7332,12 +7334,12 @@ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
*y = s->img_y;
|
|
*y = s->img_y;
|
|
if (comp) *comp = s->img_n;
|
|
if (comp) *comp = s->img_n;
|
|
|
|
|
|
- if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
|
|
|
|
|
|
+ if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))
|
|
return stbi__errpuc("too large", "PNM too large");
|
|
return stbi__errpuc("too large", "PNM too large");
|
|
|
|
|
|
- out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
|
|
|
|
|
|
+ out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);
|
|
if (!out) return stbi__errpuc("outofmem", "Out of memory");
|
|
if (!out) return stbi__errpuc("outofmem", "Out of memory");
|
|
- stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
|
|
|
|
|
|
+ stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8));
|
|
|
|
|
|
if (req_comp && req_comp != s->img_n) {
|
|
if (req_comp && req_comp != s->img_n) {
|
|
out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
|
|
out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
|
|
@@ -7413,12 +7415,21 @@ static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
|
|
stbi__pnm_skip_whitespace(s, &c);
|
|
stbi__pnm_skip_whitespace(s, &c);
|
|
|
|
|
|
maxv = stbi__pnm_getinteger(s, &c); // read max value
|
|
maxv = stbi__pnm_getinteger(s, &c); // read max value
|
|
-
|
|
|
|
- if (maxv > 255)
|
|
|
|
- return stbi__err("max value > 255", "PPM image not 8-bit");
|
|
|
|
|
|
+ if (maxv > 65535)
|
|
|
|
+ return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images");
|
|
|
|
+ else if (maxv > 255)
|
|
|
|
+ return 16;
|
|
else
|
|
else
|
|
- return 1;
|
|
|
|
|
|
+ return 8;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+static int stbi__pnm_is16(stbi__context *s)
|
|
|
|
+{
|
|
|
|
+ if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)
|
|
|
|
+ return 1;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
#endif
|
|
#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)
|
|
@@ -7473,6 +7484,9 @@ static int stbi__is_16_main(stbi__context *s)
|
|
if (stbi__psd_is16(s)) return 1;
|
|
if (stbi__psd_is16(s)) return 1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+ #ifndef STBI_NO_PNM
|
|
|
|
+ if (stbi__pnm_is16(s)) return 1;
|
|
|
|
+ #endif
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|