Browse Source

stb_image: Avoid left-shifts of signed values

It's implementation-specified behavior. Writing this code and then
relying on compiler strength reduction to turn it back into shifts
feels extremely silly but it is what it is.

Fixes issue #1097.
Fabian Giesen 4 years ago
parent
commit
48632c1752
1 changed files with 3 additions and 3 deletions
  1. 3 3
      stb_image.h

+ 3 - 3
stb_image.h

@@ -2219,7 +2219,7 @@ static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__
 
 
       dc = j->img_comp[b].dc_pred + diff;
       dc = j->img_comp[b].dc_pred + diff;
       j->img_comp[b].dc_pred = dc;
       j->img_comp[b].dc_pred = dc;
-      data[0] = (short) (dc << j->succ_low);
+      data[0] = (short) (dc * (1 << j->succ_low));
    } else {
    } else {
       // refinement scan for DC coefficient
       // refinement scan for DC coefficient
       if (stbi__jpeg_get_bit(j))
       if (stbi__jpeg_get_bit(j))
@@ -2256,7 +2256,7 @@ static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__
             j->code_buffer <<= s;
             j->code_buffer <<= s;
             j->code_bits -= s;
             j->code_bits -= s;
             zig = stbi__jpeg_dezigzag[k++];
             zig = stbi__jpeg_dezigzag[k++];
-            data[zig] = (short) ((r >> 8) << shift);
+            data[zig] = (short) ((r >> 8) * (1 << shift));
          } else {
          } else {
             int rs = stbi__jpeg_huff_decode(j, hac);
             int rs = stbi__jpeg_huff_decode(j, hac);
             if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
             if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
@@ -2274,7 +2274,7 @@ static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__
             } else {
             } else {
                k += r;
                k += r;
                zig = stbi__jpeg_dezigzag[k++];
                zig = stbi__jpeg_dezigzag[k++];
-               data[zig] = (short) (stbi__extend_receive(j,s) << shift);
+               data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift));
             }
             }
          }
          }
       } while (k <= j->spec_end);
       } while (k <= j->spec_end);