|
|
|
@ -5121,6 +5121,7 @@ typedef struct |
|
|
|
|
{ |
|
|
|
|
int bpp, offset, hsz; |
|
|
|
|
unsigned int mr,mg,mb,ma, all_a; |
|
|
|
|
int extra_read; |
|
|
|
|
} stbi__bmp_data; |
|
|
|
|
|
|
|
|
|
static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) |
|
|
|
@ -5133,6 +5134,7 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) |
|
|
|
|
info->offset = stbi__get32le(s); |
|
|
|
|
info->hsz = hsz = stbi__get32le(s); |
|
|
|
|
info->mr = info->mg = info->mb = info->ma = 0; |
|
|
|
|
info->extra_read = 14; |
|
|
|
|
|
|
|
|
|
if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); |
|
|
|
|
if (hsz == 12) { |
|
|
|
@ -5176,6 +5178,7 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) |
|
|
|
|
info->mr = stbi__get32le(s); |
|
|
|
|
info->mg = stbi__get32le(s); |
|
|
|
|
info->mb = stbi__get32le(s); |
|
|
|
|
info->extra_read += 12; |
|
|
|
|
// not documented, but generated by photoshop and handled by mspaint
|
|
|
|
|
if (info->mr == info->mg && info->mg == info->mb) { |
|
|
|
|
// ?!?!?
|
|
|
|
@ -5232,10 +5235,13 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req |
|
|
|
|
|
|
|
|
|
if (info.hsz == 12) { |
|
|
|
|
if (info.bpp < 24) |
|
|
|
|
psize = (info.offset - 14 - 24) / 3; |
|
|
|
|
psize = (info.offset - info.extra_read - 24) / 3; |
|
|
|
|
} else { |
|
|
|
|
if (info.bpp < 16) |
|
|
|
|
psize = (info.offset - 14 - info.hsz) >> 2; |
|
|
|
|
psize = (info.offset - info.extra_read - info.hsz) >> 2; |
|
|
|
|
} |
|
|
|
|
if (psize == 0) { |
|
|
|
|
STBI_ASSERT(info.offset == (s->img_buffer - s->buffer_start)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (info.bpp == 24 && ma == 0xff000000) |
|
|
|
@ -5263,7 +5269,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req |
|
|
|
|
if (info.hsz != 12) stbi__get8(s); |
|
|
|
|
pal[i][3] = 255; |
|
|
|
|
} |
|
|
|
|
stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); |
|
|
|
|
stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); |
|
|
|
|
if (info.bpp == 1) width = (s->img_x + 7) >> 3; |
|
|
|
|
else if (info.bpp == 4) width = (s->img_x + 1) >> 1; |
|
|
|
|
else if (info.bpp == 8) width = s->img_x; |
|
|
|
@ -5312,7 +5318,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req |
|
|
|
|
int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; |
|
|
|
|
int z = 0; |
|
|
|
|
int easy=0; |
|
|
|
|
stbi__skip(s, info.offset - 14 - info.hsz); |
|
|
|
|
stbi__skip(s, info.offset - info.extra_read - info.hsz); |
|
|
|
|
if (info.bpp == 24) width = 3 * s->img_x; |
|
|
|
|
else if (info.bpp == 16) width = 2*s->img_x; |
|
|
|
|
else /* bpp = 32 and pad = 0 */ width=0; |
|
|
|
|