From ba6f45058d4e85b8ac08a74bb9b69befb3920be7 Mon Sep 17 00:00:00 2001 From: Mitya Selivanov Date: Sun, 27 Apr 2025 23:10:03 +0200 Subject: Cleanup --- examples/ui.c | 7 ++++--- graphics.c | 59 +++++++++++++++++++++++++++++++---------------------------- runtime.c | 16 ++++++++-------- 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/examples/ui.c b/examples/ui.c index ebc00c8..e8b5611 100644 --- a/examples/ui.c +++ b/examples/ui.c @@ -78,8 +78,8 @@ void update_and_render_frame(void) { text_len -= i1 - i0; } - for (i64 n = 0; n < g_platform.clipboard_text_len;) { - UTF8_Char c = utf8_read(g_platform.clipboard_text_len - n, g_platform.clipboard_text + n); + for (i64 n = 0; n < g_platform.clipboard.text_len;) { + UTF8_Char c = utf8_read(g_platform.clipboard.text_len - n, g_platform.clipboard.text + n); if (text_len < (i64) (sizeof text / sizeof *text)) { for (i64 j = text_len; j > cursor; --j) @@ -232,7 +232,8 @@ i32 main(i32 argc, c8 **argv) { (void) argv; g_platform = (Platform) { - .title = "UI", + .title = "UI", + .clipboard.enable_text = 1, }; run_main_window_event_loop(); diff --git a/graphics.c b/graphics.c index ffe620a..d0cbdec 100644 --- a/graphics.c +++ b/graphics.c @@ -183,6 +183,9 @@ b8 hit_line (vec2 vertices[2], f64 width, vec2 point); Stencil_Buffer default_stencil(i64 width, i64 height); +vec2 lcd_text_area (vec2 scale, i64 num_chars, c32 *text); +void lcd_text_render_to_stencil(Stencil_Buffer dst, vec2 position, vec2 scale, i64 num_chars, c32 *text); + void fill_stencil_to_stencil (Stencil_Buffer dst, u8 value, Box area, Stencil_Buffer src); void fill_rectangle_to_stencil (Stencil_Buffer dst, u8 value, Box area); void fill_triangle_to_stencil (Stencil_Buffer dst, u8 value, vec2 vertices[3]); @@ -190,8 +193,6 @@ void fill_triangles_to_stencil (Stencil_Buffer dst, u8 value, vec2 position, ve void fill_quad_to_stencil (Stencil_Buffer dst, u8 value, vec2 vertices[4]); void fill_ellipse_to_stencil (Stencil_Buffer dst, u8 value, Box area); void fill_line_to_stencil (Stencil_Buffer dst, u8 value, vec2 vertices[2], f64 width); -vec2 lcd_text_area (vec2 scale, i64 num_chars, c32 *text); -void lcd_text_render_to_stencil (Stencil_Buffer dst, vec2 position, vec2 scale, i64 num_chars, c32 *text); void draw_text_area_to_stencil (Stencil_Buffer dst, u8 value, i32 font, Box area, vec2 max_size, i64 num_chars, c32 *text); void draw_text_cursor_to_stencil(Stencil_Buffer dst, u8 value, i32 font, Box area, vec2 max_size, i64 num_chars, c32 *text, i64 cursor, i64 selection); @@ -1315,14 +1316,9 @@ static i64 lcd_char_width_(c32 c) { return _lcd_widths[index]; } -static i64 lcd_spacing_(i64 num_chars, c32 *text, i64 index) { - if (text == NULL) - return 0; - if (index < 0 || index + 1 >= num_chars) - return 0; - - i64 a = text[index] - LCD_First; - i64 b = text[index + 1] - LCD_First; +static i64 lcd_spacing_(c32 c0, c32 c1) { + i64 a = c0 - LCD_First; + i64 b = c1 - LCD_First; if (a < 0 || a >= LCD_Len || b < 0 || b >= LCD_Len) return 0; @@ -1339,17 +1335,19 @@ static i64 lcd_enum_text_columns_(i64 num_chars, c32 *text) { i64 cols = 0; i64 n = 0; - for (i64 i = 0; i < num_chars; ++i) { - if (text[i] <= ' ') { - if (text[i] == '\n') { + for (c32 *s = text, *s_end = text + num_chars; s < s_end; ++s) { + if (*s <= ' ') { + if (*s == '\n') { if (cols < n) cols = n; n = 0; } else - n += lcd_char_width_(' ') + lcd_spacing_(num_chars, text, i); + n += lcd_char_width_(' '); continue; } - n += lcd_char_width_(text[i]) + lcd_spacing_(num_chars, text, i); + n += lcd_char_width_(*s); + if (s + 1 < s_end) + n += lcd_spacing_(s[0], s[1]); } if (cols < n) @@ -1388,24 +1386,29 @@ void lcd_text_render_to_stencil(Stencil_Buffer dst, vec2 position, vec2 scale, i if (h < EPSILON) return; + u32 h_inv = (u32) floor(0x10000 / h + 0.5); + u32 h_half = h_inv / 2; + f64 x = position.x; f64 y = position.y; - for (i64 n = 0; n < num_chars; ++n) { - if (text[n] <= ' ') { - if (text[n] == '\n') { + for (c32 *s = text, *s_end = text + num_chars; s < s_end; ++s) { + if (*s <= ' ') { + if (*s == '\n') { x = position.x; y += scale.y * (LCD_Height + 1); } else - x += kx * (lcd_char_width_(' ') + lcd_spacing_(num_chars, text, n)); + x += kx * lcd_char_width_(' '); continue; } - i64 num_cols = lcd_char_width_(text[n]); + i64 num_cols = lcd_char_width_(*s); f64 w = num_cols * kx; - i64 index = text[n] - LCD_First; + i64 index = *s - LCD_First; if (w >= EPSILON && index >= 0 && index < LCD_Len) { + u64 bits = _lcd_bits[index]; + i64 i0 = (i64) floor(x + 0.5); i64 i1 = (i64) floor(x + w + 0.5); i64 j0 = (i64) floor(y + 0.5); @@ -1419,24 +1422,24 @@ void lcd_text_render_to_stencil(Stencil_Buffer dst, vec2 position, vec2 scale, i if (j0 < 0) j0 = 0; if (j1 > dst.height) j1 = dst.height; - u32 w_inv = (u32) floor(0x10000 / w + 0.5); - u32 h_inv = (u32) floor(0x10000 / h + 0.5); - + u32 w_inv = (u32) floor(0x10000 / w + 0.5); u32 w_half = w_inv / 2; - u32 h_half = h_inv / 2; for (i64 j = j0; j < j1; ++j) { - u32 row = (((j - j00) * LCD_Height) * h_inv + h_half) >> 16; + u32 row_8 = ((((j - j00) * LCD_Height) * h_inv + h_half) >> 16) * 8; for (i64 i = i0; i < i1; ++i) { u32 column = (((i - i00) * num_cols) * w_inv + w_half) >> 16; - if ((_lcd_bits[index] & (1ull << (row * 8 + column))) != 0) + if ((bits & (1ull << (row_8 + column))) != 0) dst.pixels[j * dst.stride + i] = max2_u8_(dst.pixels[j * dst.stride + i], 255); } } } - x += kx * (num_cols + lcd_spacing_(num_chars, text, n)); + if (s + 1 < s_end) + num_cols += lcd_spacing_(s[0], s[1]); + + x += kx * num_cols; } } diff --git a/runtime.c b/runtime.c index fbb04fc..ec38374 100644 --- a/runtime.c +++ b/runtime.c @@ -6101,14 +6101,14 @@ __attribute__((export_name("js_wheel"))) void js_wheel(f64 delta_x, f64 delta_y) } __attribute__((export_name("js_clipboard_text_len"))) i32 js_clipboard_text_len(void) { - return g_platform.clipboard_text_len; + return g_platform.clipboard.text_len; } __attribute__((export_name("js_clipboard_text"))) void *js_clipboard_text(i32 len) { - if (!g_platform.enable_clipboard_text && len < 0) + if (!g_platform.clipboard.enable_text && len < 0) len = 0; - resize_dynamic_array_exact(&g_platform.clipboard_text_len, (void **) &g_platform.clipboard_text, 1, len); - return g_platform.clipboard_text; + resize_dynamic_array_exact(&g_platform.clipboard.text_len, (void **) &g_platform.clipboard.text, 1, len); + return g_platform.clipboard.text; } __attribute__((export_name("js_dragenter"))) void js_dragenter(void) { @@ -6485,8 +6485,8 @@ TEST("average frame duration") { } TEST("BMP image") { - i64 width = 800; - i64 height = 600; + i64 width = 200; + i64 height = 150; i64 stride = width; i64 pixels_len = 0; @@ -6553,8 +6553,8 @@ TEST("BMP image") { } TEST("PPM image") { - i64 width = 800; - i64 height = 600; + i64 width = 80; + i64 height = 60; i64 stride = width; i64 pixels_len = 0; -- cgit v1.2.3