╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ Title.zig ────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
536 537 var first = true; 538 for (input) |c| { 539 const glyph = glyphFor(c) orelse continue; 540 541 // scanlines: keep on-pixels only at even bitmap rows. 542 var kept: [9][6]bool = std.mem.zeroes([9][6]bool); 543 for (0..9) |r| { 544 if (style == .scanlines and r % 2 != 0) continue; 545 for (0..6) |col| { 546 kept[r][col] = glyph[r][col] == '#'; 547 } 548 } 549 550 if (!first) { 551 for (&rows) |*r| try r.append(allocator, ' '); 552 } 553 first = false; 554 555 for (0..3) |text_row| { 556 for (0..3) |text_col| { 557 var pattern: u6 = 0; 558 for (0..3) |sub_row| { 559 for (0..2) |sub_col| { 560 const row_idx = text_row * 3 + sub_row; 561 const col_idx = text_col * 2 + sub_col; 562 if (kept[row_idx][col_idx]) { 563 pattern |= @as(u6, 1) << @intCast(sub_row * 2 + sub_col); 564 } 565 } 566 } 567 const cp = sextantCodepoint(pattern); 568 var utf8_buf: [4]u8 = undefined; 569 const len = try std.unicode.utf8Encode(cp, &utf8_buf); 570 try rows[text_row].appendSlice(allocator, utf8_buf[0..len]); 571 } 572 } 573 } 574 575 var out: std.ArrayList(u8) = .empty; 576 errdefer out.deinit(allocator); 577 try out.appendSlice(allocator, rows[0].items); 578 try out.append(allocator, '\n'); 579 try out.appendSlice(allocator, rows[1].items); 580 try out.append(allocator, '\n'); 581 try out.appendSlice(allocator, rows[2].items); 582 return out.toOwnedSlice(allocator); 583 } 584