╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ ui.zig ───────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
3215 errdefer out.deinit(); 3216 3217 const anchor_x = foreground.size.width -| art_grid.size.width; 3218 for (0..art_grid.size.height) |y| { 3219 for (0..art_grid.size.width) |x| { 3220 const src = art_grid.cells.items[try art_grid.cells.at(.{ y, x })]; 3221 if (src.rune == null) continue; 3222 const idx = try out.cells.at(.{ y, anchor_x + x }); 3223 const dst = &out.cells.items[idx]; 3224 // blank cells take the art; occupied cells take its background 3225 if (cellIsBlank(dst.*)) { 3226 dst.* = src; 3227 dst.style.fg = sgrSafe(dst.style.fg); 3228 dst.style.bg = sgrSafe(dst.style.bg); 3229 } else { 3230 const background_maybe = sgrSafe(src.style.bg orelse src.style.fg); 3231 dst.style.bg = background_maybe; 3232 // change unstyled text to contrast with the art behind it 3233 if (dst.style.fg == null) { 3234 if (background_maybe) |background| { 3235 // use near-black and near-white, which is easier on the eyes 3236 // while retaining high contrast 3237 const luminance = (@as(u32, background.r) * 299 + 3238 @as(u32, background.g) * 587 + 3239 @as(u32, background.b) * 114) / 1000; 3240 dst.style.fg = if (luminance >= 128) 3241 .{ .r = 16, .g = 16, .b = 16 } 3242 else 3243 .{ .r = 240, .g = 240, .b = 240 }; 3244 } 3245 } 3246 } 3247 } 3248 } 3249 return out; 3250 } 3251 }; 3252