a73x

1146e2f0

Add text comparison layout helpers

a73x   2026-04-09 08:17


diff --git a/src/main.zig b/src/main.zig
index 4820276..f1e0c36 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -457,6 +457,45 @@ fn shouldRenderFrame(terminal_dirty: bool, window_dirty: bool, forced: bool) boo
    return terminal_dirty or window_dirty or forced;
}

const ComparisonVariant = struct {
    label: []const u8,
    coverage: [2]f32,
};

fn comparisonVariants() [4]ComparisonVariant {
    return .{
        .{ .label = "baseline", .coverage = renderer.coverageVariantParams(.baseline) },
        .{ .label = "mild", .coverage = renderer.coverageVariantParams(.mild) },
        .{ .label = "medium", .coverage = renderer.coverageVariantParams(.medium) },
        .{ .label = "crisp", .coverage = renderer.coverageVariantParams(.crisp) },
    };
}

fn comparisonSpecimenLines() []const []const u8 {
    return &.{
        "abcdefghijklmnopqrstuvwxyz",
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
        "0123456789",
        "{}[]()/\\|,.;:_-=+",
        "~/code/rad/waystty $ zig build test",
    };
}

fn comparisonPanelOrigins(panel_count: usize, panel_cols: u32, top_margin_rows: u32) [4][2]f32 {
    var origins = [_][2]f32{.{ 0.0, @floatFromInt(top_margin_rows) }} ** 4;
    const count = @min(panel_count, origins.len);

    var idx: usize = 0;
    while (idx < count) : (idx += 1) {
        origins[idx] = .{
            @floatFromInt(idx * @as(usize, panel_cols)),
            @floatFromInt(top_margin_rows),
        };
    }

    return origins;
}

const RowRefreshState = enum {
    full,
    partial,
@@ -1711,6 +1750,27 @@ test "glyphTopOffset uses baseline rather than cell height" {
    try std.testing.expectEqual(@as(f32, -3.0), glyphTopOffset(9, 12));
}

test "comparisonPanelOrigins splits four panels left to right" {
    const origins = comparisonPanelOrigins(4, 80, 24);
    try std.testing.expectEqual(@as(f32, 0), origins[0][0]);
    try std.testing.expect(origins[1][0] > origins[0][0]);
    try std.testing.expect(origins[2][0] > origins[1][0]);
    try std.testing.expect(origins[3][0] > origins[2][0]);
}

test "comparisonSpecimenLines remains fixed and non-empty" {
    const lines = comparisonSpecimenLines();
    try std.testing.expectEqual(@as(usize, 5), lines.len);
    try std.testing.expectEqualStrings("abcdefghijklmnopqrstuvwxyz", lines[0]);
    try std.testing.expectEqualStrings("ABCDEFGHIJKLMNOPQRSTUVWXYZ", lines[1]);
    try std.testing.expectEqualStrings("0123456789", lines[2]);
    try std.testing.expectEqualStrings("{}[]()/\\|,.;:_-=+", lines[3]);
    try std.testing.expectEqualStrings("~/code/rad/waystty $ zig build test", lines[4]);
    for (lines) |line| {
        try std.testing.expect(line.len > 0);
    }
}

fn runRenderSmokeTest(alloc: std.mem.Allocator) !void {
    var conn = try wayland_client.Connection.init();
    defer conn.deinit();