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);
        }
Esempio n. 2
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);
        }