╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ Title.zig ────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
515 }, 516 }; 517 } 518 519 fn renderTitle(allocator: std.mem.Allocator, input: []const u8) ![]const u8 { 520 var rows: [3]std.ArrayList(u8) = .{ .empty, .empty, .empty }; 521 defer for (&rows) |*r| r.deinit(allocator); 522 523 var first = true; 524 for (input) |c| { 525 const glyph = glyphFor(c) orelse continue; 526 527 // row-aligned dither: keep on-pixels only at even bitmap rows. 528 var kept: [9][6]bool = std.mem.zeroes([9][6]bool); 529 for (0..9) |r| { 530 if (r % 2 != 0) continue; 531 for (0..6) |col| { 532 kept[r][col] = glyph[r][col] == '#'; 533 } 534 } 535 536 if (!first) { 537 for (&rows) |*r| try r.append(allocator, ' '); 538 } 539 first = false; 540 541 for (0..3) |text_row| { 542 for (0..3) |text_col| { 543 var pattern: u6 = 0; 544 for (0..3) |sub_row| { 545 for (0..2) |sub_col| { 546 const row_idx = text_row * 3 + sub_row; 547 const col_idx = text_col * 2 + sub_col; 548 if (kept[row_idx][col_idx]) { 549 pattern |= @as(u6, 1) << @intCast(sub_row * 2 + sub_col); 550 } 551 } 552 } 553 const cp = sextantCodepoint(pattern); 554 var utf8_buf: [4]u8 = undefined; 555 const len = try std.unicode.utf8Encode(cp, &utf8_buf); 556 try rows[text_row].appendSlice(allocator, utf8_buf[0..len]); 557 } 558 } 559 } 560 561 var out: std.ArrayList(u8) = .empty; 562 errdefer out.deinit(allocator); 563 try out.appendSlice(allocator, rows[0].items); 564 try out.append(allocator, '\n'); 565 try out.appendSlice(allocator, rows[1].items); 566 try out.append(allocator, '\n'); 567 try out.appendSlice(allocator, rows[2].items); 568 return out.toOwnedSlice(allocator); 569 } 570