diff options
author | Mitya Selivanov <automainint@guattari.tech> | 2025-04-15 08:11:38 +0200 |
---|---|---|
committer | Mitya Selivanov <automainint@guattari.tech> | 2025-04-15 08:11:38 +0200 |
commit | 01ea5ec5aeb50ed9801a457a7ced1c541d63f7c8 (patch) | |
tree | acbdc0ace86b40328fa15d199c625a1bc60366c9 /graphics.c | |
parent | af8c9212a029ddaf8e7eef66cecaa762263ca0c5 (diff) | |
download | reduced_system_layer-01ea5ec5aeb50ed9801a457a7ced1c541d63f7c8.zip |
Update docs; Add key repeat flag; Fix fill rectangle
Diffstat (limited to 'graphics.c')
-rwxr-xr-x | graphics.c | 51 |
1 files changed, 30 insertions, 21 deletions
@@ -7,6 +7,8 @@ #/ #/ (C) 2025 Mitya Selivanov <guattari.tech> #/ +#/ Any use of this code is prohibited. +#/ #/ ================================================================ #/ #/ Self-testing shell script @@ -20,6 +22,9 @@ gcc \ -Wno-missing-braces \ -Wno-old-style-declaration \ -Wno-overlength-strings \ + -Wno-unused-parameter \ + -Wno-unused-variable \ + -Wno-unused-but-set-variable \ -O3 -D NDEBUG \ -D ENABLE_WAYLAND=0 \ -D GRAPHICS_TEST_SUITE \ @@ -93,7 +98,6 @@ typedef struct { } Box; enum { - GRAPHICS_NOOP = 0, GRAPHICS_DRAW_PIXELS, GRAPHICS_FILL_RECTANGLE, GRAPHICS_FILL_TRIANGLE, @@ -173,9 +177,9 @@ typedef struct { // // ================================================================ -Box external_font_text_area(i32 font, vec2 scale, i64 num_chars, c32 *text); +Box font_text_area_dispatch(i32 font, vec2 scale, i64 num_chars, c32 *text); -void external_font_render_to_buffer(Pixel_Buffer dst, i32 font, vec4_f32 color, vec2 position, vec2 scale, i64 num_chars, c32 *text); +void font_render_to_buffer_dispatch(Pixel_Buffer dst, i32 font, vec4_f32 color, vec2 position, vec2 scale, i64 num_chars, c32 *text); // ================================================================ @@ -244,6 +248,7 @@ void draw_text_area (i32 font, vec4_f32 color, Box area, vec2 max_size, i64 num void draw_text_cursor(i32 font, vec4_f32 color, Box area, vec2 max_size, i64 num_chars, c32 *text, i64 cursor, i64 selection); void perform_graphics_request(Graphics_Context context, Graphics_Request req); +void clean_graphics_requests_cache(i64 amount); #endif // GRAPHICS_HEADER_GUARD_ @@ -335,16 +340,18 @@ void draw_pixels_to_buffer(Pixel_Buffer dst, Box area, Pixel_Buffer src) { PROFILER_begin(PROFILE_DRAW_PIXELS); - i64 i0 = (i64) floor(area.x); - i64 i1 = (i64) floor(area.x + area.width); - i64 j0 = (i64) floor(area.y); - i64 j1 = (i64) floor(area.y + area.height); + i64 i0 = (i64) floor(area.x + 0.5); + i64 i1 = (i64) floor(area.x + area.width + 0.5); + i64 j0 = (i64) floor(area.y + 0.5); + i64 j1 = (i64) floor(area.y + area.height + 0.5); if (i0 < 0) i0 = 0; if (i1 > dst.width) i1 = dst.width; if (j0 < 0) j0 = 0; if (j1 > dst.height) j1 = dst.height; + // FIXME, PERF: Use integer arithmetic. + f64 di = src.width / area.width; f64 dj = src.height / area.height; f64 jj = (j0 - area.y) * dj + dj * .5; @@ -365,10 +372,10 @@ void draw_pixels_to_buffer(Pixel_Buffer dst, Box area, Pixel_Buffer src) { void fill_rectangle_to_buffer(Pixel_Buffer dst, vec4_f32 color, Box area) { PROFILER_begin(PROFILE_FILL_RECTANGLE); - i64 i0 = (i64) floor(area.x); - i64 i1 = (i64) floor(area.x + area.width); - i64 j0 = (i64) floor(area.y); - i64 j1 = (i64) floor(area.y + area.height); + i64 i0 = (i64) floor(area.x + 0.5); + i64 i1 = (i64) floor(area.x + area.width + 0.5); + i64 j0 = (i64) floor(area.y + 0.5); + i64 j1 = (i64) floor(area.y + area.height + 0.5); if (i0 < 0) i0 = 0; if (i1 > dst.width) i1 = dst.width; @@ -815,8 +822,8 @@ static void draw_text_(Pixel_Buffer dst, vec4_f32 color, f64 x0, f64 y0, f64 sca } } -#if !defined(GRAPHICS_ENABLE_EXTERNAL_FONT) -Box external_font_text_area(i32 font, vec2 scale, i64 num_chars, c32 *text) { +#if !defined(GRAPHICS_ENABLE_FONT_CUSTOM_DISPATCH) +Box font_text_area_dispatch(i32 font, vec2 scale, i64 num_chars, c32 *text) { // TODO (void) font; @@ -827,7 +834,7 @@ Box external_font_text_area(i32 font, vec2 scale, i64 num_chars, c32 *text) { return (Box) {0}; } -void external_font_render_to_buffer(Pixel_Buffer dst, i32 font, vec4_f32 color, vec2 position, vec2 scale, i64 num_chars, c32 *text) { +void font_render_to_buffer_dispatch(Pixel_Buffer dst, i32 font, vec4_f32 color, vec2 position, vec2 scale, i64 num_chars, c32 *text) { // TODO (void) dst; @@ -838,7 +845,7 @@ void external_font_render_to_buffer(Pixel_Buffer dst, i32 font, vec4_f32 color, (void) num_chars; (void) text; } -#endif // !defined(GRAPHICS_ENABLE_EXTERNAL_FONT) +#endif // !defined(GRAPHICS_ENABLE_FONT_CUSTOM_DISPATCH) void draw_text_area_to_buffer(Pixel_Buffer dst, i32 font, vec4_f32 color, Box area, vec2 max_size, i64 num_chars, c32 *text) { if (text == NULL || num_chars <= 0 || max_size.x < EPSILON || max_size.y < EPSILON) @@ -2141,15 +2148,17 @@ void perform_graphics_request(Graphics_Context context, Graphics_Request req) { scale_and_perform_graphics_request_(graphics_context_defaults_(context), req); } -void graphics_refresh_frame(void) { - Graphics_Cache_Slot_ *s = _graphics_cache + _graphics_cache_gc_index; +void clean_graphics_requests_cache(i64 amount) { + for (; amount > 0; --amount) { + Graphics_Cache_Slot_ *s = _graphics_cache + _graphics_cache_gc_index; - i64 required_len = !s->occupied ? 0 : s->width * s->height; + i64 required_len = !s->occupied ? 0 : s->width * s->height; - if (s->buffer_len > required_len) - resize_dynamic_array_exact(&s->buffer_len, (void **) &s->buffer, sizeof *s->buffer, required_len); + if (s->buffer_len > required_len) + resize_dynamic_array_exact(&s->buffer_len, (void **) &s->buffer, sizeof *s->buffer, required_len); - _graphics_cache_gc_index = (_graphics_cache_gc_index + 1) % GRAPHICS_CACHE_SIZE; + _graphics_cache_gc_index = (_graphics_cache_gc_index + 1) % GRAPHICS_CACHE_SIZE; + } } // ================================================================ |