| 7501 | } |
| 7502 | |
| 7503 | static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) |
| 7504 | { |
| 7505 | stbi_uc *out; |
| 7506 | STBI_NOTUSED(ri); |
| 7507 | |
| 7508 | ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); |
| 7509 | if (ri->bits_per_channel == 0) |
| 7510 | return 0; |
| 7511 | |
| 7512 | if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); |
| 7513 | if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); |
| 7514 | |
| 7515 | *x = s->img_x; |
| 7516 | *y = s->img_y; |
| 7517 | if (comp) *comp = s->img_n; |
| 7518 | |
| 7519 | if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) |
| 7520 | return stbi__errpuc("too large", "PNM too large"); |
| 7521 | |
| 7522 | out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); |
| 7523 | if (!out) return stbi__errpuc("outofmem", "Out of memory"); |
| 7524 | if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { |
| 7525 | STBI_FREE(out); |
| 7526 | return stbi__errpuc("bad PNM", "PNM file truncated"); |
| 7527 | } |
| 7528 | |
| 7529 | if (req_comp && req_comp != s->img_n) { |
| 7530 | if (ri->bits_per_channel == 16) { |
| 7531 | out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); |
| 7532 | } else { |
| 7533 | out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); |
| 7534 | } |
| 7535 | if (out == NULL) return out; // stbi__convert_format frees input on failure |
| 7536 | } |
| 7537 | return out; |
| 7538 | } |
| 7539 | |
| 7540 | static int stbi__pnm_isspace(char c) |
| 7541 | { |
no test coverage detected