summaryrefslogtreecommitdiff
path: root/graphics.c
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2025-02-14 11:23:59 +0100
committerMitya Selivanov <automainint@guattari.tech>2025-02-14 11:23:59 +0100
commit236a55c6e3c6554a8ff68a9ca17053dd2c4e9cee (patch)
tree3dfe15e6fbe2e4ca1c7fabc2391efde54b67c7e8 /graphics.c
parentcf25a8b0c9cb58baf8dccfe353a733777071fe4e (diff)
downloadreduced_system_layer-236a55c6e3c6554a8ff68a9ca17053dd2c4e9cee.zip
Copy pixels perf
Diffstat (limited to 'graphics.c')
-rwxr-xr-xgraphics.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/graphics.c b/graphics.c
index a14bedd..17afe97 100755
--- a/graphics.c
+++ b/graphics.c
@@ -311,20 +311,18 @@ void draw_pixels_to_buffer(Pixel_Buffer dst, Box area, Pixel_Buffer src) {
if (j0 < 0) j0 = 0;
if (j1 > dst.height) j1 = dst.height;
- f64 w_coeff = src.width / area.width;
- f64 h_coeff = src.height / area.height;
-
- for (i64 j = j0; j < j1; ++j) {
- i64 src_j = (i64) floor((j - area.y + .5) * h_coeff);
- if (src_j < 0 || src_j >= src.height) continue;
- vec4_f32 *q = src.pixels + src_j * src.stride;
- vec4_f32 *p = dst.pixels + j * dst.stride + i0;
- for (i64 i = i0; i < i1; ++i) {
- i64 src_i = (i64) floor((i - area.x + .5) * w_coeff);
- if (src_i < 0 || src_i >= src.width) continue;
- put_pixel_(p, q[src_i]);
- ++p;
- }
+ f64 di = src.width / area.width;
+ f64 dj = src.height / area.height;
+ f64 jj = (j0 - area.y) * dj;
+ for (i64 j = j0; j < j1; ++j, jj += dj) {
+ if (jj < 0 || jj >= src.height) continue;
+ vec4_f32 *d = dst.pixels + j * dst.stride + i0;
+ vec4_f32 *d_end = d + i1 - i0;
+ vec4_f32 *s = src.pixels + (i64) jj * src.stride;
+ f64 ii = (i0 - area.x) * di;
+ if (ii < 0 || ii >= src.width) continue;
+ for (; d < d_end; ++d, ii += di)
+ put_pixel_(d, s[(i64) ii]);
}
}