summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2025-04-26 03:34:30 +0200
committerMitya Selivanov <automainint@guattari.tech>2025-04-26 03:34:30 +0200
commit9be9c3c5f9cfd0a25aab70e9637d39a97d3a6fe2 (patch)
treecd5064fbd3b317e0d088cfbff366998d25abdab7
parent57db102b3d034ece373d8e953dfd0c0524a6a08c (diff)
downloadreduced_system_layer-9be9c3c5f9cfd0a25aab70e9637d39a97d3a6fe2.zip
Downscaling
-rw-r--r--runtime.c95
1 files changed, 54 insertions, 41 deletions
diff --git a/runtime.c b/runtime.c
index 144fbc2..5444139 100644
--- a/runtime.c
+++ b/runtime.c
@@ -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];
}
}