@ -1176,8 +1176,10 @@ static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x,
if ( result = = NULL )
return NULL ;
// it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
STBI_ASSERT ( ri . bits_per_channel = = 8 | | ri . bits_per_channel = = 16 ) ;
if ( ri . bits_per_channel ! = 8 ) {
STBI_ASSERT ( ri . bits_per_channel = = 16 ) ;
result = stbi__convert_16_to_8 ( ( stbi__uint16 * ) result , * x , * y , req_comp = = 0 ? * comp : req_comp ) ;
ri . bits_per_channel = 8 ;
}
@ -1200,8 +1202,10 @@ static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x,
if ( result = = NULL )
return NULL ;
// it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
STBI_ASSERT ( ri . bits_per_channel = = 8 | | ri . bits_per_channel = = 16 ) ;
if ( ri . bits_per_channel ! = 16 ) {
STBI_ASSERT ( ri . bits_per_channel = = 8 ) ;
result = stbi__convert_8_to_16 ( ( stbi_uc * ) result , * x , * y , req_comp = = 0 ? * comp : req_comp ) ;
ri . bits_per_channel = 16 ;
}
@ -1691,7 +1695,7 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r
STBI__CASE ( 4 , 1 ) { dest [ 0 ] = stbi__compute_y ( src [ 0 ] , src [ 1 ] , src [ 2 ] ) ; } break ;
STBI__CASE ( 4 , 2 ) { dest [ 0 ] = stbi__compute_y ( src [ 0 ] , src [ 1 ] , src [ 2 ] ) ; dest [ 1 ] = src [ 3 ] ; } break ;
STBI__CASE ( 4 , 3 ) { dest [ 0 ] = src [ 0 ] ; dest [ 1 ] = src [ 1 ] ; dest [ 2 ] = src [ 2 ] ; } break ;
default : STBI_ASSERT ( 0 ) ;
default : STBI_ASSERT ( 0 ) ; STBI_FREE ( data ) ; STBI_FREE ( good ) ; return stbi__errpuc ( " unsupported " , " Unsupported format conversion " ) ;
}
# undef STBI__CASE
}
@ -1748,7 +1752,7 @@ static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int r
STBI__CASE ( 4 , 1 ) { dest [ 0 ] = stbi__compute_y_16 ( src [ 0 ] , src [ 1 ] , src [ 2 ] ) ; } break ;
STBI__CASE ( 4 , 2 ) { dest [ 0 ] = stbi__compute_y_16 ( src [ 0 ] , src [ 1 ] , src [ 2 ] ) ; dest [ 1 ] = src [ 3 ] ; } break ;
STBI__CASE ( 4 , 3 ) { dest [ 0 ] = src [ 0 ] ; dest [ 1 ] = src [ 1 ] ; dest [ 2 ] = src [ 2 ] ; } break ;
default : STBI_ASSERT ( 0 ) ;
default : STBI_ASSERT ( 0 ) ; STBI_FREE ( data ) ; STBI_FREE ( good ) ; return ( stbi__uint16 * ) stbi__errpuc ( " unsupported " , " Unsupported format conversion " ) ;
}
# undef STBI__CASE
}
@ -2057,7 +2061,7 @@ stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
sgn = ( stbi__int32 ) j - > code_buffer > > 31 ; // sign bit is always in MSB
k = stbi_lrot ( j - > code_buffer , n ) ;
STBI_ASSERT ( n > = 0 & & n < ( int ) ( sizeof ( stbi__bmask ) / sizeof ( * stbi__bmask ) ) ) ;
if ( n < 0 | | n > = ( int ) ( sizeof ( stbi__bmask ) / sizeof ( * stbi__bmask ) ) ) return 0 ;
j - > code_buffer = k & ~ stbi__bmask [ n ] ;
k & = stbi__bmask [ n ] ;
j - > code_bits - = n ;
@ -4083,7 +4087,8 @@ static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
if ( s > = 16 ) return - 1 ; // invalid code!
// code size is s, so:
b = ( k > > ( 16 - s ) ) - z - > firstcode [ s ] + z - > firstsymbol [ s ] ;
STBI_ASSERT ( z - > size [ b ] = = s ) ;
if ( b > = sizeof ( z - > size ) ) return - 1 ; // some data was corrupt somewhere!
if ( z - > size [ b ] ! = s ) return - 1 ; // was originally an assert, but report failure instead.
a - > code_buffer > > = s ;
a - > num_bits - = s ;
return z - > value [ b ] ;
@ -4215,11 +4220,12 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a)
c = stbi__zreceive ( a , 2 ) + 3 ;
if ( n = = 0 ) return stbi__err ( " bad codelengths " , " Corrupt PNG " ) ;
fill = lencodes [ n - 1 ] ;
} else if ( c = = 17 )
} else if ( c = = 17 ) {
c = stbi__zreceive ( a , 3 ) + 3 ;
else {
STBI_ASSERT ( c = = 18 ) ;
} else if ( c = = 18 ) {
c = stbi__zreceive ( a , 7 ) + 11 ;
} else {
return stbi__err ( " bad codelengths " , " Corrupt PNG " ) ;
}
if ( ntot - n < c ) return stbi__err ( " bad codelengths " , " Corrupt PNG " ) ;
memset ( lencodes + n , fill , c ) ;
@ -4245,7 +4251,7 @@ static int stbi__parse_uncompressed_block(stbi__zbuf *a)
a - > code_buffer > > = 8 ;
a - > num_bits - = 8 ;
}
STBI_ASSERT ( a - > num_bits = = 0 ) ;
if ( a - > num_bits < 0 ) return stbi__err ( " zlib corrupt " , " Corrupt PNG " ) ;
// now fill header the normal way
while ( k < 4 )
header [ k + + ] = stbi__zget8 ( a ) ;
@ -4529,7 +4535,7 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r
return stbi__err ( " invalid filter " , " Corrupt PNG " ) ;
if ( depth < 8 ) {
STBI_ASSERT ( img_width_bytes < = x ) ;
if ( img_width_bytes > x ) return stbi__err ( " invalid width " , " Corrupt PNG " ) ;
cur + = x * out_n - img_width_bytes ; // store output to the rightmost img_len bytes, so we can decode in place
filter_bytes = 1 ;
width = img_width_bytes ;
@ -5347,7 +5353,9 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
psize = ( info . offset - info . extra_read - info . hsz ) > > 2 ;
}
if ( psize = = 0 ) {
STBI_ASSERT ( info . offset = = ( s - > img_buffer - s - > buffer_start ) ) ;
if ( info . offset ! = ( s - > img_buffer - s - > buffer_start ) ) {
return stbi__errpuc ( " bad offset " , " Corrupt BMP " ) ;
}
}
if ( info . bpp = = 24 & & ma = = 0xff000000 )