Ver Fonte

stb_image: fix reading BMP with explicit masks

Sean Barrett há 5 anos atrás
pai
commit
c440a53d06
1 ficheiros alterados com 10 adições e 4 exclusões
  1. 10 4
      stb_image.h

+ 10 - 4
stb_image.h

@@ -5121,6 +5121,7 @@ typedef struct
 {
 {
    int bpp, offset, hsz;
    int bpp, offset, hsz;
    unsigned int mr,mg,mb,ma, all_a;
    unsigned int mr,mg,mb,ma, all_a;
+   int extra_read;
 } stbi__bmp_data;
 } stbi__bmp_data;
 
 
 static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
 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->offset = stbi__get32le(s);
    info->hsz = hsz = stbi__get32le(s);
    info->hsz = hsz = stbi__get32le(s);
    info->mr = info->mg = info->mb = info->ma = 0;
    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 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
    if (hsz == 12) {
    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->mr = stbi__get32le(s);
                info->mg = stbi__get32le(s);
                info->mg = stbi__get32le(s);
                info->mb = stbi__get32le(s);
                info->mb = stbi__get32le(s);
+               info->extra_read += 12;
                // not documented, but generated by photoshop and handled by mspaint
                // not documented, but generated by photoshop and handled by mspaint
                if (info->mr == info->mg && info->mg == info->mb) {
                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.hsz == 12) {
       if (info.bpp < 24)
       if (info.bpp < 24)
-         psize = (info.offset - 14 - 24) / 3;
+         psize = (info.offset - info.extra_read - 24) / 3;
    } else {
    } else {
       if (info.bpp < 16)
       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)
    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);
          if (info.hsz != 12) stbi__get8(s);
          pal[i][3] = 255;
          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;
       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 == 4) width = (s->img_x + 1) >> 1;
       else if (info.bpp == 8) width = s->img_x;
       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 rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
       int z = 0;
       int z = 0;
       int easy=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;
       if (info.bpp == 24) width = 3 * s->img_x;
       else if (info.bpp == 16) width = 2*s->img_x;
       else if (info.bpp == 16) width = 2*s->img_x;
       else /* bpp = 32 and pad = 0 */ width=0;
       else /* bpp = 32 and pad = 0 */ width=0;