const std = @import("std"); const builtin = @import("builtin"); const interop = @import("interop.zig"); const utils = @import("tui/utils.zig"); const termbox = interop.termbox; const X: u32 = if (builtin.os.tag == .linux or builtin.os.tag.isBSD()) 0x2593 else '#'; const O: u32 = 0; pub const WIDTH: u64 = 5; pub const HEIGHT: u64 = 5; pub const SIZE = WIDTH * HEIGHT; // zig fmt: off const ZERO = [_]u32{ X,X,X,X,X, X,X,O,X,X, X,X,O,X,X, X,X,O,X,X, X,X,X,X,X, }; const ONE = [_]u32{ O,O,O,X,X, O,O,O,X,X, O,O,O,X,X, O,O,O,X,X, O,O,O,X,X, }; const TWO = [_]u32{ X,X,X,X,X, O,O,O,X,X, X,X,X,X,X, X,X,O,O,O, X,X,X,X,X, }; const THREE = [_]u32{ X,X,X,X,X, O,O,O,X,X, X,X,X,X,X, O,O,O,X,X, X,X,X,X,X, }; const FOUR = [_]u32{ X,X,O,X,X, X,X,O,X,X, X,X,X,X,X, O,O,O,X,X, O,O,O,X,X, }; const FIVE = [_]u32{ X,X,X,X,X, X,X,O,O,O, X,X,X,X,X, O,O,O,X,X, X,X,X,X,X, }; const SIX = [_]u32{ X,X,X,X,X, X,X,O,O,O, X,X,X,X,X, X,X,O,X,X, X,X,X,X,X, }; const SEVEN = [_]u32{ X,X,X,X,X, O,O,O,X,X, O,O,O,X,X, O,O,O,X,X, O,O,O,X,X, }; const EIGHT = [_]u32{ X,X,X,X,X, X,X,O,X,X, X,X,X,X,X, X,X,O,X,X, X,X,X,X,X, }; const NINE = [_]u32{ X,X,X,X,X, X,X,O,X,X, X,X,X,X,X, O,O,O,X,X, X,X,X,X,X, }; const S = [_]u32{ O,O,O,O,O, O,O,X,O,O, O,O,O,O,O, O,O,X,O,O, O,O,O,O,O, }; const E = [_]u32{ O,O,O,O,O, O,O,O,O,O, O,O,O,O,O, O,O,O,O,O, O,O,O,O,O, }; // zig fmt: on pub fn clockCell(animate: bool, char: u8, fg: u8, bg: u8) [SIZE]termbox.tb_cell { var cells: [SIZE]termbox.tb_cell = undefined; var tv: std.c.timeval = undefined; _ = std.c.gettimeofday(&tv, null); const clock_chars = toBigNumber(if (animate and char == ':' and @divTrunc(tv.tv_usec, 500000) != 0) ' ' else char); for (0..cells.len) |i| cells[i] = utils.initCell(clock_chars[i], fg, bg); return cells; } pub fn alphaBlit(buffer: [*]termbox.tb_cell, x: u64, y: u64, tb_width: u64, tb_height: u64, cells: [SIZE]termbox.tb_cell) void { if (x + WIDTH >= tb_width or y + HEIGHT >= tb_height) return; for (0..HEIGHT) |yy| { for (0..WIDTH) |xx| { const cell = cells[yy * WIDTH + xx]; if (cell.ch != 0) buffer[(y + yy) * tb_width + (x + xx)] = cell; } } } fn toBigNumber(char: u8) []const u32 { return switch (char) { '0' => &ZERO, '1' => &ONE, '2' => &TWO, '3' => &THREE, '4' => &FOUR, '5' => &FIVE, '6' => &SIX, '7' => &SEVEN, '8' => &EIGHT, '9' => &NINE, ':' => &S, else => &E, }; }