|
|
|
@ -1429,16 +1429,64 @@ static void stbir__resample_horizontal_downsample(stbir__info* stbir_info, int n |
|
|
|
|
int max_n = n1; |
|
|
|
|
int coefficient_group = coefficient_width * x; |
|
|
|
|
|
|
|
|
|
for (k = n0; k <= max_n; k++) |
|
|
|
|
{ |
|
|
|
|
int out_pixel_index = k * channels; |
|
|
|
|
float coefficient = horizontal_coefficients[coefficient_group + k - n0]; |
|
|
|
|
int c; |
|
|
|
|
switch (channels) { |
|
|
|
|
case 1: |
|
|
|
|
for (k = n0; k <= max_n; k++) |
|
|
|
|
{ |
|
|
|
|
int out_pixel_index = k * 1; |
|
|
|
|
float coefficient = horizontal_coefficients[coefficient_group + k - n0]; |
|
|
|
|
STBIR__DEBUG_ASSERT(coefficient != 0); |
|
|
|
|
output_buffer[out_pixel_index + 0] += decode_buffer[in_pixel_index + 0] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
STBIR__DEBUG_ASSERT(coefficient != 0); |
|
|
|
|
case 2: |
|
|
|
|
for (k = n0; k <= max_n; k++) |
|
|
|
|
{ |
|
|
|
|
int out_pixel_index = k * 2; |
|
|
|
|
float coefficient = horizontal_coefficients[coefficient_group + k - n0]; |
|
|
|
|
STBIR__DEBUG_ASSERT(coefficient != 0); |
|
|
|
|
output_buffer[out_pixel_index + 0] += decode_buffer[in_pixel_index + 0] * coefficient; |
|
|
|
|
output_buffer[out_pixel_index + 1] += decode_buffer[in_pixel_index + 1] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
for (c = 0; c < channels; c++) |
|
|
|
|
output_buffer[out_pixel_index + c] += decode_buffer[in_pixel_index + c] * coefficient; |
|
|
|
|
case 3: |
|
|
|
|
for (k = n0; k <= max_n; k++) |
|
|
|
|
{ |
|
|
|
|
int out_pixel_index = k * 3; |
|
|
|
|
float coefficient = horizontal_coefficients[coefficient_group + k - n0]; |
|
|
|
|
STBIR__DEBUG_ASSERT(coefficient != 0); |
|
|
|
|
output_buffer[out_pixel_index + 0] += decode_buffer[in_pixel_index + 0] * coefficient; |
|
|
|
|
output_buffer[out_pixel_index + 1] += decode_buffer[in_pixel_index + 1] * coefficient; |
|
|
|
|
output_buffer[out_pixel_index + 2] += decode_buffer[in_pixel_index + 2] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case 4: |
|
|
|
|
for (k = n0; k <= max_n; k++) |
|
|
|
|
{ |
|
|
|
|
int out_pixel_index = k * 4; |
|
|
|
|
float coefficient = horizontal_coefficients[coefficient_group + k - n0]; |
|
|
|
|
STBIR__DEBUG_ASSERT(coefficient != 0); |
|
|
|
|
output_buffer[out_pixel_index + 0] += decode_buffer[in_pixel_index + 0] * coefficient; |
|
|
|
|
output_buffer[out_pixel_index + 1] += decode_buffer[in_pixel_index + 1] * coefficient; |
|
|
|
|
output_buffer[out_pixel_index + 2] += decode_buffer[in_pixel_index + 2] * coefficient; |
|
|
|
|
output_buffer[out_pixel_index + 3] += decode_buffer[in_pixel_index + 3] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
for (k = n0; k <= max_n; k++) |
|
|
|
|
{ |
|
|
|
|
int c; |
|
|
|
|
int out_pixel_index = k * channels; |
|
|
|
|
float coefficient = horizontal_coefficients[coefficient_group + k - n0]; |
|
|
|
|
STBIR__DEBUG_ASSERT(coefficient != 0); |
|
|
|
|
for (c = 0; c < channels; c++) |
|
|
|
|
output_buffer[out_pixel_index + c] += decode_buffer[in_pixel_index + c] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1717,13 +1765,51 @@ static void stbir__resample_vertical_downsample(stbir__info* stbir_info, int n, |
|
|
|
|
|
|
|
|
|
float* ring_buffer_entry = stbir__get_ring_buffer_scanline(k, ring_buffer, ring_buffer_begin_index, ring_buffer_first_scanline, kernel_pixel_width, ring_buffer_length); |
|
|
|
|
|
|
|
|
|
for (x = 0; x < output_w; x++) |
|
|
|
|
{ |
|
|
|
|
int in_pixel_index = x * channels; |
|
|
|
|
switch (channels) { |
|
|
|
|
case 1: |
|
|
|
|
for (x = 0; x < output_w; x++) |
|
|
|
|
{ |
|
|
|
|
int in_pixel_index = x * 1; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 0] += horizontal_buffer[in_pixel_index + 0] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 2: |
|
|
|
|
for (x = 0; x < output_w; x++) |
|
|
|
|
{ |
|
|
|
|
int in_pixel_index = x * 2; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 0] += horizontal_buffer[in_pixel_index + 0] * coefficient; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 1] += horizontal_buffer[in_pixel_index + 1] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 3: |
|
|
|
|
for (x = 0; x < output_w; x++) |
|
|
|
|
{ |
|
|
|
|
int in_pixel_index = x * 3; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 0] += horizontal_buffer[in_pixel_index + 0] * coefficient; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 1] += horizontal_buffer[in_pixel_index + 1] * coefficient; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 2] += horizontal_buffer[in_pixel_index + 2] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 4: |
|
|
|
|
for (x = 0; x < output_w; x++) |
|
|
|
|
{ |
|
|
|
|
int in_pixel_index = x * 4; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 0] += horizontal_buffer[in_pixel_index + 0] * coefficient; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 1] += horizontal_buffer[in_pixel_index + 1] * coefficient; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 2] += horizontal_buffer[in_pixel_index + 2] * coefficient; |
|
|
|
|
ring_buffer_entry[in_pixel_index + 3] += horizontal_buffer[in_pixel_index + 3] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
for (x = 0; x < output_w; x++) |
|
|
|
|
{ |
|
|
|
|
int in_pixel_index = x * channels; |
|
|
|
|
|
|
|
|
|
int c; |
|
|
|
|
for (c = 0; c < channels; c++) |
|
|
|
|
ring_buffer_entry[in_pixel_index + c] += horizontal_buffer[in_pixel_index + c] * coefficient; |
|
|
|
|
int c; |
|
|
|
|
for (c = 0; c < channels; c++) |
|
|
|
|
ring_buffer_entry[in_pixel_index + c] += horizontal_buffer[in_pixel_index + c] * coefficient; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|