add placeInline for term_graphics, to be used for kitty charts
This commit is contained in:
parent
78076b5319
commit
692a28aed7
2 changed files with 31 additions and 3 deletions
|
|
@ -617,9 +617,7 @@ fn emitTimelineKitty(
|
||||||
const rgb = try rendered.extractRgb(allocator);
|
const rgb = try rendered.extractRgb(allocator);
|
||||||
defer allocator.free(rgb);
|
defer allocator.free(rgb);
|
||||||
|
|
||||||
try term_graphics.emitKittyRGB(out, allocator, rgb, dims.width, dims.height, cols, rows);
|
try term_graphics.placeInline(out, allocator, rgb, dims.width, dims.height, cols, rows);
|
||||||
// Kitty leaves the cursor in place; advance below the placed image.
|
|
||||||
for (0..rows) |_| try out.writeByte('\n');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn renderBraille(
|
fn renderBraille(
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,25 @@ pub fn emitKittyRGB(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Emit `rgb` as a kitty image (see `emitKittyRGB`), then advance the
|
||||||
|
/// cursor `rows` lines so following output lands directly below it.
|
||||||
|
/// Centralizes the pairing of the `C=1` (no cursor move) emission with
|
||||||
|
/// its matching vertical advance - callers should use this rather than
|
||||||
|
/// emitting + advancing by hand.
|
||||||
|
pub fn placeInline(
|
||||||
|
writer: *std.Io.Writer,
|
||||||
|
alloc: std.mem.Allocator,
|
||||||
|
rgb: []const u8,
|
||||||
|
width_px: u32,
|
||||||
|
height_px: u32,
|
||||||
|
cols: u16,
|
||||||
|
rows: u16,
|
||||||
|
) !void {
|
||||||
|
try emitKittyRGB(writer, alloc, rgb, width_px, height_px, cols, rows);
|
||||||
|
var i: u16 = 0;
|
||||||
|
while (i < rows) : (i += 1) try writer.writeByte('\n');
|
||||||
|
}
|
||||||
|
|
||||||
// ── Tests ─────────────────────────────────────────────────────────────
|
// ── Tests ─────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
|
|
@ -158,3 +177,14 @@ test "emitKittyRGB: large payload is chunked with m=1 then a final m=0" {
|
||||||
try testing.expect(std.mem.indexOf(u8, out, "\x1b_Gm=1;") != null);
|
try testing.expect(std.mem.indexOf(u8, out, "\x1b_Gm=1;") != null);
|
||||||
try testing.expect(std.mem.indexOf(u8, out, "\x1b_Gm=0;") != null);
|
try testing.expect(std.mem.indexOf(u8, out, "\x1b_Gm=0;") != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "placeInline appends exactly `rows` newlines after the image" {
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
var aw: std.Io.Writer.Allocating = .init(alloc);
|
||||||
|
defer aw.deinit();
|
||||||
|
const rgb = [_]u8{ 0, 0, 0, 0, 0, 0 }; // 2x1, base64 has no newlines
|
||||||
|
try placeInline(&aw.writer, alloc, &rgb, 2, 1, 4, 3);
|
||||||
|
const out = aw.written();
|
||||||
|
try testing.expect(std.mem.endsWith(u8, out, "\x1b\\\n\n\n"));
|
||||||
|
try testing.expectEqual(@as(usize, 3), std.mem.count(u8, out, "\n"));
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue