From 119b8a923248e482064e6a1f20181470c73191b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Wed, 16 Jun 2021 13:12:40 +0200 Subject: [PATCH] feat: use NN for downscaling and optimize without using floats --- image-viewer/src/image.c | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/image-viewer/src/image.c b/image-viewer/src/image.c index d089f6d682b2c8e539f60eb3b8a0c12a6424f155..2aa7ba935e18f3f742b42c0e856ebe8266f5db85 100644 --- a/image-viewer/src/image.c +++ b/image-viewer/src/image.c @@ -94,7 +94,8 @@ double get_scale_factor(uint16_t w, uint16_t h, image_region_t display_region) { static void image_write_downscale(image_t *image, display_t *display, image_region_t region, image_region_t display_region, double scale_factor) { float downscale_factor = 1 / scale_factor; - uint16_t avg_pixels = downscale_factor; + const downscale_precision = 10000; + uint32_t downscale_factor_i = downscale_factor * downscale_precision; uint16_t w = region.width, h = region.height; uint16_t sw = (uint16_t)(scale_factor * w), sh = (uint16_t)(scale_factor * h); @@ -103,33 +104,14 @@ static void image_write_downscale(image_t *image, display_t *display, avg_range++; } - uint32_t avg_count = avg_pixels * avg_pixels; - uint32_t downhalf = downscale_factor / 2; - uint16_t beg_x = (display_region.width - sw) / 2 + display_region.x; uint16_t beg_y = (display_region.height - sh) / 2 + display_region.y; for (int y = 0; y < sh; y++) { for (int x = 0; x < sw; x++) { - uint16_t px = (uint16_t)(downscale_factor * (x + 0.5f)) + region.x; - uint16_t py = (uint16_t)(downscale_factor * (y + 0.5f)) + region.y; - raw_pixel_t result = {.red = 0, .green = 0, .blue = 0}; - - for (int avg_x = 0; avg_x < avg_pixels; avg_x++) { - for (int avg_y = 0; avg_y < avg_pixels; avg_y++) { - display_pixel_t pixel = image_get_pixel(image, px + avg_x - downhalf, py + avg_y - downhalf); - - result.red += pixel.fields.r; - result.green += pixel.fields.g; - result.blue += pixel.fields.b; - } - } - - result.red /= avg_count; - result.green /= avg_count; - result.blue /= avg_count; - - display_pixel_t result_display = {.fields = {.r = result.red, .g = result.green, .b = result.blue}}; + uint16_t px = ((uint64_t)(downscale_factor_i * (2*x + 1)))/(downscale_precision * 2) + region.x; + uint16_t py = ((uint64_t)(downscale_factor_i * (2*y + 1)))/(downscale_precision * 2) + region.y; + display_pixel_t result_display = image_get_pixel(image, px, py); display_set_pixel(display, x + beg_x, y + beg_y, result_display); } }