From 01ea5ec5aeb50ed9801a457a7ced1c541d63f7c8 Mon Sep 17 00:00:00 2001 From: Mitya Selivanov Date: Tue, 15 Apr 2025 08:11:38 +0200 Subject: Update docs; Add key repeat flag; Fix fill rectangle --- graphics.c | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) (limited to 'graphics.c') diff --git a/graphics.c b/graphics.c index 79e3a6c..287b248 100755 --- a/graphics.c +++ b/graphics.c @@ -7,6 +7,8 @@ #/ #/ (C) 2025 Mitya Selivanov #/ +#/ 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; + } } // ================================================================ -- cgit v1.2.3