@ -585,7 +585,7 @@ stbir__inline static int stbir__use_height_upsampling(stbir__info* stbir_info)
// This is the maximum number of input samples that can affect an output sample
// with the given filter
stbir__inline static int stbir__get_filter_pixel_width ( stbir_filter filter , int input_w , int output_w , float scale )
stbir__inline static int stbir__get_filter_pixel_width ( stbir_filter filter , float scale )
{
STBIR_ASSERT ( filter ! = 0 ) ;
STBIR_ASSERT ( filter < STBIR__ARRAY_SIZE ( stbir__filter_info_table ) ) ;
@ -598,29 +598,29 @@ stbir__inline static int stbir__get_filter_pixel_width(stbir_filter filter, int
stbir__inline static int stbir__get_filter_pixel_width_horizontal ( stbir__info * stbir_info )
{
return stbir__get_filter_pixel_width ( stbir_info - > horizontal_filter , stbir_info - > input_w , stbir_info - > output_w , stbir_info - > horizontal_scale ) ;
return stbir__get_filter_pixel_width ( stbir_info - > horizontal_filter , stbir_info - > horizontal_scale ) ;
}
stbir__inline static int stbir__get_filter_pixel_width_vertical ( stbir__info * stbir_info )
{
return stbir__get_filter_pixel_width ( stbir_info - > vertical_filter , stbir_info - > input_h , stbir_info - > output_h , stbir_info - > vertical_scale ) ;
return stbir__get_filter_pixel_width ( stbir_info - > vertical_filter , stbir_info - > vertical_scale ) ;
}
// This is how much to expand buffers to account for filters seeking outside
// the image boundaries.
stbir__inline static int stbir__get_filter_pixel_margin ( stbir_filter filter , int input_w , int output_w , float scale )
stbir__inline static int stbir__get_filter_pixel_margin ( stbir_filter filter , float scale )
{
return stbir__get_filter_pixel_width ( filter , input_w , output_w , scale ) / 2 ;
return stbir__get_filter_pixel_width ( filter , scale ) / 2 ;
}
stbir__inline static int stbir__get_filter_pixel_margin_horizontal ( stbir__info * stbir_info )
{
return stbir__get_filter_pixel_width ( stbir_info - > horizontal_filter , stbir_info - > input_w , stbir_info - > output_w , stbir_info - > horizontal_scale ) / 2 ;
return stbir__get_filter_pixel_width ( stbir_info - > horizontal_filter , stbir_info - > horizontal_scale ) / 2 ;
}
stbir__inline static int stbir__get_filter_pixel_margin_vertical ( stbir__info * stbir_info )
{
return stbir__get_filter_pixel_width ( stbir_info - > vertical_filter , stbir_info - > input_h , stbir_info - > output_h , stbir_info - > vertical_scale ) / 2 ;
return stbir__get_filter_pixel_width ( stbir_info - > vertical_filter , stbir_info - > vertical_scale ) / 2 ;
}
stbir__inline static int stbir__get_horizontal_contributors ( stbir__info * info )
@ -628,13 +628,13 @@ stbir__inline static int stbir__get_horizontal_contributors(stbir__info* info)
if ( stbir__use_upsampling ( info - > horizontal_scale ) )
return info - > output_w ;
else
return ( info - > input_w + stbir__get_filter_pixel_margin ( info - > horizontal_filter , info - > input_w , info - > output_w , info - > horizontal_scale ) * 2 ) ;
return ( info - > input_w + stbir__get_filter_pixel_margin ( info - > horizontal_filter , info - > horizontal_scale ) * 2 ) ;
}
stbir__inline static int stbir__get_total_coefficients ( stbir__info * info )
{
return stbir__get_horizontal_contributors ( info )
* stbir__get_filter_pixel_width ( info - > horizontal_filter , info - > input_w , info - > output_w , info - > horizontal_scale ) ;
* stbir__get_filter_pixel_width ( info - > horizontal_filter , info - > horizontal_scale ) ;
}
stbir__inline static stbir__contributors * stbir__get_contributor ( stbir__info * stbir_info , int n )
@ -645,7 +645,7 @@ stbir__inline static stbir__contributors* stbir__get_contributor(stbir__info* st
stbir__inline static float * stbir__get_coefficient ( stbir__info * stbir_info , int n , int c )
{
int width = stbir__get_filter_pixel_width ( stbir_info - > horizontal_filter , stbir_info - > input_w , stbir_info - > output_w , stbir_info - > horizontal_scale ) ;
int width = stbir__get_filter_pixel_width ( stbir_info - > horizontal_filter , stbir_info - > horizontal_scale ) ;
return & stbir_info - > horizontal_coefficients [ width * n + c ] ;
}
@ -751,7 +751,7 @@ static void stbir__calculate_coefficients_upsample(stbir__info* stbir_info, stbi
float total_filter = 0 ;
float filter_scale ;
STBIR__DEBUG_ASSERT ( in_last_pixel - in_first_pixel < = stbir__get_filter_pixel_width_horizontal ( stbir_info ) ) ;
STBIR__DEBUG_ASSERT ( in_last_pixel - in_first_pixel < = ( int ) ceil ( stbir__filter_info_table [ filter ] . support * 2 ) ) ; // Taken directly from stbir__get_filter_pixel_width() which we can't call because we don't know if we're horizontal or vertical.
contributor - > n0 = in_first_pixel ;
contributor - > n1 = in_last_pixel ;
@ -778,7 +778,7 @@ static void stbir__calculate_coefficients_downsample(stbir__info* stbir_info, st
{
int i ;
STBIR__DEBUG_ASSERT ( out_last_pixel - out_first_pixel < = stbir__get_filter_pixel_width_horizontal ( stbir_inf o) ) ;
STBIR__DEBUG_ASSERT ( out_last_pixel - out_first_pixel < = ( int ) ceil ( stbir__filter_info_table [ filter ] . support * 2 / scale_rati o) ) ; // Taken directly from stbir__get_filter_pixel_width() which we can't call because we don't know if we're horizontal or vertical.
contributor - > n0 = out_first_pixel ;
contributor - > n1 = out_last_pixel ;
@ -1619,8 +1619,8 @@ static void stbir__choose_filter(stbir__info *info, stbir_filter h_filter, stbir
static stbir_uint32 stbir__calculate_memory ( stbir__info * info )
{
int pixel_margin = stbir__get_filter_pixel_margin ( info - > horizontal_filter , info - > input_w , info - > output_w , info - > horizontal_scale ) ;
int filter_height = stbir__get_filter_pixel_width ( info - > vertical_filter , info - > input_h , info - > output_h , info - > vertical_scale ) ;
int pixel_margin = stbir__get_filter_pixel_margin ( info - > horizontal_filter , info - > horizontal_scale ) ;
int filter_height = stbir__get_filter_pixel_width ( info - > vertical_filter , info - > vertical_scale ) ;
int contributors_size = stbir__get_horizontal_contributors ( info ) * sizeof ( stbir__contributors ) ;
int horizontal_coefficients_size = stbir__get_total_coefficients ( info ) * sizeof ( float ) ;
@ -1635,7 +1635,7 @@ static stbir_uint32 stbir__calculate_memory(stbir__info *info)
STBIR_ASSERT ( info - > vertical_filter ! = 0 ) ;
STBIR_ASSERT ( info - > vertical_filter < STBIR__ARRAY_SIZE ( stbir__filter_info_table ) ) ; // this now happens too late
if ( stbir__use_upsampling ( info - > horizontal_scale ) )
if ( stbir__use_height_ upsampling ( info ) )
// The horizontal buffer is for when we're downsampling the height and we
// can't output the result of sampling the decode buffer directly into the
// ring buffers.
@ -1736,7 +1736,7 @@ static int stbir__resize_allocated(stbir__info *info,
{
info - > horizontal_buffer = NULL ;
info - > ring_buffer = STBIR__NEXT_MEMPTR ( info - > decode_buffer , info - > decode_buffer_pixels * info - > channels * sizeof ( float ) , float ) ;
info - > encode_buffer = STBIR__NEXT_MEMPTR ( info - > ring_buffer , info - > ring_buffer_length_bytes * stbir__get_filter_pixel_width_horizont al ( info ) , float ) ;
info - > encode_buffer = STBIR__NEXT_MEMPTR ( info - > ring_buffer , info - > ring_buffer_length_bytes * stbir__get_filter_pixel_width_vertic al ( info ) , float ) ;
STBIR__DEBUG_ASSERT ( ( size_t ) STBIR__NEXT_MEMPTR ( info - > encode_buffer , info - > output_w * info - > channels * sizeof ( float ) , unsigned char ) = = ( size_t ) tempmem + tempmem_size_in_bytes ) ;
}