Hacker News Digest

05 сентября 2025 г. в 00:54 • fathy.fr • ⭐ 140 • 💬 17

OriginalHN

#rust#cpp#skia#chromium#mojo#terminal#unicode#pdf#podman#youtube

Forking Chrome to render in a terminal (2023)

  • Рисование
    Терминал умеет только моноширинные символы и escape-последовательности. Используем нижний полублок , задавая цвет фона (верхний пиксель) и символа (нижний).

    fn print_pixels_pair(top, bottom, (x, y)) {
        println!("\x1b[{};{}H\x1b[48;2;{t}m\x1b[38;2;{b}m▄", y+1, x+1, t=top, b=bottom);
    }
    
  • Текст
    Создаём TextCaptureDevice в Skia: перехватываем onDrawGlyphRunList, преобразуем glyph → Unicode, вызываем Rust-функцию draw_text.
    Добавляем очистку текста при заливке прямоугольников:

    if (paint.getStyle() == kFill_Style && paint.getAlphaf() == 1.0)
        clear_text(rect);
    
  • Ввод
    Читаем stdin, парсим escape-коды клавиш/мыши, передаём их в Chromium через DOM-события.

  • Pipe-режим
    carbonyl --pipe рисует в stdout, позволяя встраивать браузер в скрипты.

  • Mojo
    Заменяем GPU-процесс на заглушку, отключая лишние сервисы.

  • Layout
    Подгоняем device_scale_factor и viewport под размер терминала, чтобы 1 px = ½ клетки.

  • LoDPI
    На 1×-экранах включаем сглаживание, чтобы символы не «дребезжали».

  • Цвет
    Палитра 6×6×6 или 24-бит truecolor; приводим цвета к ближайшему доступному.

  • Заголовок
    ESC-операторы меняют заголовок окна и вкладки tmux.

  • Итог
    Carbonyl запускает весь веб в терминале без X11/Wayland: cargo install carbonyl.