public static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) { if (compress == 3) { return(1); } if (compress == 0) { if (info->bpp == 16) { info->mr = 31u << 10; info->mg = 31u << 5; info->mb = 31u << 0; } else if (info->bpp == 32) { info->mr = 0xffu << 16; info->mg = 0xffu << 8; info->mb = 0xffu << 0; info->ma = 0xffu << 24; info->all_a = 0; } else { info->mr = info->mg = info->mb = info->ma = 0; } return(1); } return(0); }
public static void *stbi__bmp_parse_header(stbi__context s, stbi__bmp_data *info) { var hsz = 0; if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') { return((byte *)(ulong)(stbi__err("not BMP") != 0 ? (byte *)null : null)); } stbi__get32le(s); stbi__get16le(s); stbi__get16le(s); info->offset = (int)stbi__get32le(s); info->hsz = hsz = (int)stbi__get32le(s); info->mr = info->mg = info->mb = info->ma = 0; if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) { return((byte *)(ulong)(stbi__err("unknown BMP") != 0 ? (byte *)null : null)); } if (hsz == 12) { s.img_x = (uint)stbi__get16le(s); s.img_y = (uint)stbi__get16le(s); } else { s.img_x = stbi__get32le(s); s.img_y = stbi__get32le(s); } if (stbi__get16le(s) != 1) { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? (byte *)null : null)); } info->bpp = stbi__get16le(s); if (hsz != 12) { var compress = (int)stbi__get32le(s); if (compress == 1 || compress == 2) { return((byte *)(ulong)(stbi__err("BMP RLE") != 0 ? (byte *)null : null)); } stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); if (hsz == 40 || hsz == 56) { if (hsz == 56) { stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); } if (info->bpp == 16 || info->bpp == 32) { if (compress == 0) { if (info->bpp == 32) { info->mr = 0xffu << 16; info->mg = 0xffu << 8; info->mb = 0xffu << 0; info->ma = 0xffu << 24; info->all_a = 0; } else { info->mr = 31u << 10; info->mg = 31u << 5; info->mb = 31u << 0; } } else if (compress == 3) { info->mr = stbi__get32le(s); info->mg = stbi__get32le(s); info->mb = stbi__get32le(s); if (info->mr == info->mg && info->mg == info->mb) { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? (byte *)null : null)); } } else { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? (byte *)null : null)); } } } else { var i = 0; if (hsz != 108 && hsz != 124) { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? (byte *)null : null)); } info->mr = stbi__get32le(s); info->mg = stbi__get32le(s); info->mb = stbi__get32le(s); info->ma = stbi__get32le(s); stbi__get32le(s); for (i = 0; i < 12; ++i) { stbi__get32le(s); } if (hsz == 124) { stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); } } } return((void *)1); }
public static void *stbi__bmp_parse_header(stbi__context s, stbi__bmp_data *info) { var hsz = 0; if (stbi__get8(s) != 66 || stbi__get8(s) != 77) { return((byte *)(ulong)(stbi__err("not BMP") != 0 ? 0 : 0)); } stbi__get32le(s); stbi__get16le(s); stbi__get16le(s); info->offset = (int)stbi__get32le(s); info->hsz = hsz = (int)stbi__get32le(s); info->mr = info->mg = info->mb = info->ma = 0; info->extra_read = 14; if (info->offset < 0) { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? 0 : 0)); } if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) { return((byte *)(ulong)(stbi__err("unknown BMP") != 0 ? 0 : 0)); } if (hsz == 12) { s.img_x = (uint)stbi__get16le(s); s.img_y = (uint)stbi__get16le(s); } else { s.img_x = stbi__get32le(s); s.img_y = stbi__get32le(s); } if (stbi__get16le(s) != 1) { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? 0 : 0)); } info->bpp = stbi__get16le(s); if (hsz != 12) { var compress = (int)stbi__get32le(s); if (compress == 1 || compress == 2) { return((byte *)(ulong)(stbi__err("BMP RLE") != 0 ? 0 : 0)); } if (compress >= 4) { return((byte *)(ulong)(stbi__err("BMP JPEG/PNG") != 0 ? 0 : 0)); } if (compress == 3 && info->bpp != 16 && info->bpp != 32) { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? 0 : 0)); } stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); if (hsz == 40 || hsz == 56) { if (hsz == 56) { stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); } if (info->bpp == 16 || info->bpp == 32) { if (compress == 0) { stbi__bmp_set_mask_defaults(info, compress); } else if (compress == 3) { info->mr = stbi__get32le(s); info->mg = stbi__get32le(s); info->mb = stbi__get32le(s); info->extra_read += 12; if (info->mr == info->mg && info->mg == info->mb) { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? 0 : 0)); } } else { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? 0 : 0)); } } } else { var i = 0; if (hsz != 108 && hsz != 124) { return((byte *)(ulong)(stbi__err("bad BMP") != 0 ? 0 : 0)); } info->mr = stbi__get32le(s); info->mg = stbi__get32le(s); info->mb = stbi__get32le(s); info->ma = stbi__get32le(s); if (compress != 3) { stbi__bmp_set_mask_defaults(info, compress); } stbi__get32le(s); for (i = 0; i < 12; ++i) { stbi__get32le(s); } if (hsz == 124) { stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); stbi__get32le(s); } } } return((void *)1); }