diff options
author | Mitya Selivanov <automainint@guattari.tech> | 2025-04-26 03:34:30 +0200 |
---|---|---|
committer | Mitya Selivanov <automainint@guattari.tech> | 2025-04-26 03:34:30 +0200 |
commit | 9be9c3c5f9cfd0a25aab70e9637d39a97d3a6fe2 (patch) | |
tree | cd5064fbd3b317e0d088cfbff366998d25abdab7 | |
parent | 57db102b3d034ece373d8e953dfd0c0524a6a08c (diff) | |
download | reduced_system_layer-9be9c3c5f9cfd0a25aab70e9637d39a97d3a6fe2.zip |
Downscaling
-rw-r--r-- | runtime.c | 95 |
1 files changed, 54 insertions, 41 deletions
@@ -152,6 +152,7 @@ // - Self-contained impl // - Anti-aliasing // - System +// - Dynamic libraries // - Window - X11, Web // - Screenshot - X11, Wayland // - Clipboard @@ -1846,11 +1847,7 @@ static void convert_pixels_for_window_(void) { return; } - // TODO, PERF: Improve performance. - // Downscale pixels from vec4_f32 pixel buffer to internal u32 pixel buffer. - // - // FIXME: Check if the scale is 1:1. { u32 dst_width = g_platform.frame_width / aa_scale; u32 dst_height = g_platform.frame_height / aa_scale; @@ -1873,49 +1870,62 @@ static void convert_pixels_for_window_(void) { PROFILER_begin(PROFILE_DOWNSCALE); - f32 k = 1.f / (aa_scale * aa_scale); - vec4_f32 *s = g_platform.pixels; - u32 *d = _internal_pixels; + if (aa_scale == 1) { + vec4_f32 *s = g_platform.pixels; + u32 *d = _internal_pixels; + u32 *d_end = d + dst_width * dst_height; - for (u32 j = 0; j < dst_height; ++j) { - mem_set_(_internal_row, 0, dst_width * sizeof *_internal_row); + if (g_platform.enable_gamma) + for (; d < d_end; ++d, ++s) + *d = rgb_u32_from_f32_((vec3_f32) { gamma_(s->x), gamma_(s->y), gamma_(s->z) }) | 0xff000000; + else + for (; d < d_end; ++d, ++s) + *d = rgb_u32_from_f32_((vec3_f32) { s->x, s->y, s->z }) | 0xff000000; + } else { + f32 k = 1.f / (aa_scale * aa_scale); + vec4_f32 *s = g_platform.pixels; + u32 *d = _internal_pixels; - for (u32 jj = 0; jj < aa_scale; ++jj) { - vec3_f32 *im = _internal_row; - vec3_f32 *im_end = im + dst_width; + for (u32 j = 0; j < dst_height; ++j) { + mem_set_(_internal_row, 0, dst_width * sizeof *_internal_row); + + for (u32 jj = 0; jj < aa_scale; ++jj) { + vec3_f32 *im = _internal_row; + vec3_f32 *im_end = im + dst_width; - for (; im < im_end; ++im) { - vec4_f32 *s_end = s + aa_scale; + for (; im < im_end; ++im) { + vec4_f32 *s_end = s + aa_scale; - for (; s < s_end; ++s) { - im->x += s->x; - im->y += s->y; - im->z += s->z; + for (; s < s_end; ++s) { + im->x += s->x; + im->y += s->y; + im->z += s->z; + } } } - } - u32 *d_end = d + dst_width; - vec3_f32 *im = _internal_row; - vec3_f32 *im_end = _internal_row + dst_width; + u32 *d_end = d + dst_width; + vec3_f32 *im = _internal_row; + vec3_f32 *im_end = _internal_row + dst_width; - if (g_platform.enable_gamma) - for (; im < im_end; ++im) { - im->x = gamma_(im->x * k); - im->y = gamma_(im->y * k); - im->z = gamma_(im->z * k); - } - else - for (; im < im_end; ++im) { - im->x *= k; - im->y *= k; - im->z *= k; - } + if (g_platform.enable_gamma) + for (; im < im_end; ++im) { + im->x = gamma_(im->x * k); + im->y = gamma_(im->y * k); + im->z = gamma_(im->z * k); + } + else + for (; im < im_end; ++im) { + im->x *= k; + im->y *= k; + im->z *= k; + } - im = _internal_row; + im = _internal_row; - for (; d < d_end; ++d, ++im) - *d = rgb_u32_from_f32_(*im) | 0xff000000; + for (; d < d_end; ++d, ++im) + *d = rgb_u32_from_f32_(*im) | 0xff000000; + } } PROFILER_end(PROFILE_DOWNSCALE); @@ -1945,12 +1955,15 @@ static void convert_pixels_for_window_(void) { u32 x_ratio = (src_width << 16) / dst_width; u32 y_ratio = (src_height << 16) / dst_height; + u32 x_half = x_ratio / 2; + u32 y_half = y_ratio / 2; + if (src_len < dst_len) for (u32 j = dst_height - 1;; --j) { - u32 jj_w = ((j * y_ratio) >> 16) * src_width; + u32 jj_w = ((j * y_ratio + y_half) >> 16) * src_width; u32 j_w = j * dst_width; for (u32 i = dst_width - 1;; --i) { - u32 ii = (i * x_ratio) >> 16; + u32 ii = (i * x_ratio + x_half) >> 16; _internal_pixels[j_w + i] = _internal_pixels[jj_w + ii]; if (i == 0) break; } @@ -1958,10 +1971,10 @@ static void convert_pixels_for_window_(void) { } else for (u32 j = 0; j < dst_height; ++j) { - u32 jj_w = ((j * y_ratio) >> 16) * src_width; + u32 jj_w = ((j * y_ratio + y_half) >> 16) * src_width; u32 j_w = j * dst_width; for (u32 i = 0; i < dst_width; ++i) { - u32 ii = (i * x_ratio) >> 16; + u32 ii = (i * x_ratio + x_half) >> 16; _internal_pixels[j_w + i] = _internal_pixels[jj_w + ii]; } } |