summaryrefslogtreecommitdiff
path: root/graphics.c
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2025-04-15 08:11:38 +0200
committerMitya Selivanov <automainint@guattari.tech>2025-04-15 08:11:38 +0200
commit01ea5ec5aeb50ed9801a457a7ced1c541d63f7c8 (patch)
treeacbdc0ace86b40328fa15d199c625a1bc60366c9 /graphics.c
parentaf8c9212a029ddaf8e7eef66cecaa762263ca0c5 (diff)
downloadreduced_system_layer-01ea5ec5aeb50ed9801a457a7ced1c541d63f7c8.zip
Update docs; Add key repeat flag; Fix fill rectangle
Diffstat (limited to 'graphics.c')
-rwxr-xr-xgraphics.c51
1 files changed, 30 insertions, 21 deletions
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 <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;
+ }
}
// ================================================================