╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ SubTitle.zig ─────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯
462 var rows: [2]std.ArrayList(u8) = .{ .empty, .empty }; 463 defer for (&rows) |*r| r.deinit(allocator); 464 465 var first = true; 466 for (input) |c| { 467 const glyph = glyphFor(c) orelse continue; 468 469 var on: [6][4]bool = std.mem.zeroes([6][4]bool); 470 for (0..6) |r| { 471 for (0..4) |col| { 472 on[r][col] = glyph[r][col] == '#'; 473 } 474 } 475 476 if (!first) { 477 for (&rows) |*r| try r.append(allocator, ' '); 478 } 479 first = false; 480 481 for (0..2) |text_row| { 482 for (0..2) |text_col| { 483 var pattern: u6 = 0; 484 for (0..3) |sub_row| { 485 for (0..2) |sub_col| { 486 const row_idx = text_row * 3 + sub_row; 487 const col_idx = text_col * 2 + sub_col; 488 if (on[row_idx][col_idx]) { 489 pattern |= @as(u6, 1) << @intCast(sub_row * 2 + sub_col); 490 } 491 } 492 } 493 const cp = sextantCodepoint(pattern); 494 var utf8_buf: [4]u8 = undefined; 495 const len = try std.unicode.utf8Encode(cp, &utf8_buf); 496 try rows[text_row].appendSlice(allocator, utf8_buf[0..len]); 497 } 498 } 499 } 500 501 var out: std.ArrayList(u8) = .empty; 502 errdefer out.deinit(allocator); 503 try out.appendSlice(allocator, rows[0].items); 504 try out.append(allocator, '\n'); 505 try out.appendSlice(allocator, rows[1].items); 506 return out.toOwnedSlice(allocator); 507 } 508