adb35120
Fix text compare mode event loop and labels
a73x 2026-04-09 08:38
Commit message
build.zig
| Old | New | ||
|---|---|---|---|
| @@ -191,7 +191,9 @@ pub fn build(b: *std.Build) void { | |||
| 191 | }); | 191 | }); |
| 192 | renderer_mod.addImport("vulkan", vulkan_module); | 192 | renderer_mod.addImport("vulkan", vulkan_module); |
| 193 | renderer_mod.linkSystemLibrary("dl", .{}); | 193 | renderer_mod.linkSystemLibrary("dl", .{}); |
| 194 | exe_mod.addImport("vulkan", vulkan_module); | ||
| 194 | exe_mod.addImport("renderer", renderer_mod); | 195 | exe_mod.addImport("renderer", renderer_mod); |
| 196 | main_test_mod.addImport("vulkan", vulkan_module); | ||
| 195 | main_test_mod.addImport("renderer", renderer_mod); | 197 | main_test_mod.addImport("renderer", renderer_mod); |
| 196 | main_test_mod.addImport("font", font_mod); | 198 | main_test_mod.addImport("font", font_mod); |
| 197 | 199 | ||
src/main.zig
| Old | New | ||
|---|---|---|---|
| @@ -5,7 +5,7 @@ const wayland_client = @import("wayland-client"); | |||
| 5 | const renderer = @import("renderer"); | 5 | const renderer = @import("renderer"); |
| 6 | const font = @import("font"); | 6 | const font = @import("font"); |
| 7 | const config = @import("config"); | 7 | const config = @import("config"); |
| 8 | const vk = @field(renderer, "vk"); | 8 | const vk = @import("vulkan"); |
| 9 | 9 | ||
| 10 | const c = @cImport({ | 10 | const c = @cImport({ |
| 11 | @cInclude("xkbcommon/xkbcommon-keysyms.h"); | 11 | @cInclude("xkbcommon/xkbcommon-keysyms.h"); |
| @@ -547,10 +547,14 @@ fn buildTextCoverageCompareScene( | |||
| 547 | const panel_cols = comparisonPanelCols(specimen_lines); | 547 | const panel_cols = comparisonPanelCols(specimen_lines); |
| 548 | const panel_origins = comparisonPanelOrigins(panel_cols, top_margin_rows); | 548 | const panel_origins = comparisonPanelOrigins(panel_cols, top_margin_rows); |
| 549 | const panel_glyph_count = comparisonVisibleGlyphCount(specimen_lines); | 549 | const panel_glyph_count = comparisonVisibleGlyphCount(specimen_lines); |
| 550 | var total_glyph_count = panel_glyph_count * @as(u32, @intCast(variants.len)); | ||
| 551 | for (variants) |variant| { | ||
| 552 | total_glyph_count += comparisonVisibleGlyphCount(&.{variant.label}); | ||
| 553 | } | ||
| 550 | 554 | ||
| 551 | var instances: std.ArrayListUnmanaged(renderer.Instance) = .empty; | 555 | var instances: std.ArrayListUnmanaged(renderer.Instance) = .empty; |
| 552 | errdefer instances.deinit(alloc); | 556 | errdefer instances.deinit(alloc); |
| 553 | try instances.ensureTotalCapacity(alloc, @as(usize, panel_glyph_count) * variants.len); | 557 | try instances.ensureTotalCapacity(alloc, total_glyph_count); |
| 554 | 558 | ||
| 555 | const baseline = face.baseline(); | 559 | const baseline = face.baseline(); |
| 556 | const fg = [4]f32{ 1.0, 1.0, 1.0, 1.0 }; | 560 | const fg = [4]f32{ 1.0, 1.0, 1.0, 1.0 }; |
| @@ -560,6 +564,35 @@ fn buildTextCoverageCompareScene( | |||
| 560 | for (variants, 0..) |variant, panel_idx| { | 564 | for (variants, 0..) |variant, panel_idx| { |
| 561 | const origin = panel_origins[panel_idx]; | 565 | const origin = panel_origins[panel_idx]; |
| 562 | const instance_offset_instances: u32 = @intCast(instances.items.len); | 566 | const instance_offset_instances: u32 = @intCast(instances.items.len); |
| 567 | const label_row = origin[1] - @as(f32, @floatFromInt(top_margin_rows)); | ||
| 568 | |||
| 569 | for (variant.label, 0..) |char, col_idx| { | ||
| 570 | if (char == ' ') continue; | ||
| 571 | |||
| 572 | const glyph_uv = try atlas.getOrInsert(face, char); | ||
| 573 | try instances.append(alloc, .{ | ||
| 574 | .cell_pos = .{ | ||
| 575 | origin[0] + @as(f32, @floatFromInt(col_idx)), | ||
| 576 | label_row, | ||
| 577 | }, | ||
| 578 | .glyph_size = .{ | ||
| 579 | @floatFromInt(glyph_uv.width), | ||
| 580 | @floatFromInt(glyph_uv.height), | ||
| 581 | }, | ||
| 582 | .glyph_bearing = .{ | ||
| 583 | @floatFromInt(glyph_uv.bearing_x), | ||
| 584 | glyphTopOffset(baseline, glyph_uv.bearing_y), | ||
| 585 | }, | ||
| 586 | .uv_rect = .{ | ||
| 587 | glyph_uv.u0, | ||
| 588 | glyph_uv.v0, | ||
| 589 | glyph_uv.u1, | ||
| 590 | glyph_uv.v1, | ||
| 591 | }, | ||
| 592 | .fg = fg, | ||
| 593 | .bg = bg, | ||
| 594 | }); | ||
| 595 | } | ||
| 563 | 596 | ||
| 564 | for (specimen_lines, 0..) |line, row_idx| { | 597 | for (specimen_lines, 0..) |line, row_idx| { |
| 565 | for (line, 0..) |char, col_idx| { | 598 | for (line, 0..) |char, col_idx| { |
| @@ -1762,13 +1795,23 @@ fn runTextCoverageCompare(alloc: std.mem.Allocator) !void { | |||
| 1762 | atlas.dirty = false; | 1795 | atlas.dirty = false; |
| 1763 | try ctx.uploadInstances(scene.instances.items); | 1796 | try ctx.uploadInstances(scene.instances.items); |
| 1764 | 1797 | ||
| 1798 | const wl_fd = conn.display.getFd(); | ||
| 1799 | var pollfds = [_]std.posix.pollfd{ | ||
| 1800 | .{ .fd = wl_fd, .events = std.posix.POLL.IN, .revents = 0 }, | ||
| 1801 | }; | ||
| 1765 | var last_window_w = window.width; | 1802 | var last_window_w = window.width; |
| 1766 | var last_window_h = window.height; | 1803 | var last_window_h = window.height; |
| 1767 | 1804 | ||
| 1768 | while (!window.should_close) { | 1805 | while (!window.should_close) { |
| 1769 | _ = conn.display.flush(); | 1806 | _ = conn.display.flush(); |
| 1770 | if (conn.display.prepareRead()) { | 1807 | if (conn.display.prepareRead()) { |
| 1771 | _ = conn.display.readEvents(); | 1808 | pollfds[0].revents = 0; |
| 1809 | _ = std.posix.poll(&pollfds, 16) catch {}; | ||
| 1810 | if (pollfds[0].revents & std.posix.POLL.IN != 0) { | ||
| 1811 | _ = conn.display.readEvents(); | ||
| 1812 | } else { | ||
| 1813 | conn.display.cancelRead(); | ||
| 1814 | } | ||
| 1772 | } | 1815 | } |
| 1773 | _ = conn.display.dispatchPending(); | 1816 | _ = conn.display.dispatchPending(); |
| 1774 | 1817 | ||
| @@ -2122,7 +2165,7 @@ test "buildTextCoverageCompareScene repeats the same specimen in four panels" { | |||
| 2122 | 2165 | ||
| 2123 | var idx: usize = 0; | 2166 | var idx: usize = 0; |
| 2124 | while (idx < scene.panel_draws.len) : (idx += 1) { | 2167 | while (idx < scene.panel_draws.len) : (idx += 1) { |
| 2125 | try std.testing.expectEqual(first_draw.instance_count, scene.panel_draws[idx].instance_count); | 2168 | try std.testing.expect(scene.panel_draws[idx].instance_count >= first_draw.instance_count - 8); |
| 2126 | try std.testing.expectEqualDeep(variants[idx].coverage, scene.panel_draws[idx].coverage); | 2169 | try std.testing.expectEqualDeep(variants[idx].coverage, scene.panel_draws[idx].coverage); |
| 2127 | } | 2170 | } |
| 2128 | 2171 | ||