Запилить хороший рендер эмулятора терминала - продуктово весьма сложная задача. Не технически, потому что технически там каждый раз все понятно, а вот именно понять, что и когда надо делать - сложно.
Вот возьмем italic.
Если ты хочешь хорошо отрисовать текст в italic, то ты неизбежно придешь к тому, что левые ячейки налезают на правые, и ничего с этим не поделать - ну не помещается один italic символ в одну ячейку.
Ты начинаешь рендерить italic тем же способом, что и прочие лигатуры - отрисовываешь целые последовательности символов одним вызовом шрифтового движка, а потом пилишь результат на ячейки. В процессе некоторые ячейки начинают содержать кусочки нескольких символов, но это ровно то, что тебе надо для отрисовки italic.
Потом ты видишь, что по краям слов italic у тебя обрезан, и ты понимаешь, что это потому, что ты сделал границей последовательности пробельные символы. Это очень важно, потому что кешировать отрисовку слов - эффективно, а кешировать отрисовку линий - дорого.
Ты берешь, и добавляешь в последовательность самый правый пробельный символ после слова, и все становится хорошо и классно, потому что последней букве слова есть куда нависнуть, пока...
Пока ты не видишь, что если italic слово выделено болдом, то оно снова рисуется обрезанным. И все потому, что болд - это часть отрисовки шрифта, и тебе нужно обрывать последовательность, когда отрисовка шрифта меняется, потому что иначе получается дичь.
Кроме одного случая - если отрисовка шрифта меняется на пробельном символе, то и пофиг - неважно, болдом пробел рисуется, или нет, его можно включить в последовательность.
Такие дела.
Самое интересное в процессе, конечно, изучать, как это делают твои конкуренты, и на какие компромиссы идут.
#shitty
Вот возьмем italic.
Если ты хочешь хорошо отрисовать текст в italic, то ты неизбежно придешь к тому, что левые ячейки налезают на правые, и ничего с этим не поделать - ну не помещается один italic символ в одну ячейку.
Ты начинаешь рендерить italic тем же способом, что и прочие лигатуры - отрисовываешь целые последовательности символов одним вызовом шрифтового движка, а потом пилишь результат на ячейки. В процессе некоторые ячейки начинают содержать кусочки нескольких символов, но это ровно то, что тебе надо для отрисовки italic.
Потом ты видишь, что по краям слов italic у тебя обрезан, и ты понимаешь, что это потому, что ты сделал границей последовательности пробельные символы. Это очень важно, потому что кешировать отрисовку слов - эффективно, а кешировать отрисовку линий - дорого.
Ты берешь, и добавляешь в последовательность самый правый пробельный символ после слова, и все становится хорошо и классно, потому что последней букве слова есть куда нависнуть, пока...
Пока ты не видишь, что если italic слово выделено болдом, то оно снова рисуется обрезанным. И все потому, что болд - это часть отрисовки шрифта, и тебе нужно обрывать последовательность, когда отрисовка шрифта меняется, потому что иначе получается дичь.
Кроме одного случая - если отрисовка шрифта меняется на пробельном символе, то и пофиг - неважно, болдом пробел рисуется, или нет, его можно включить в последовательность.
Такие дела.
Самое интересное в процессе, конечно, изучать, как это делают твои конкуренты, и на какие компромиссы идут.
#shitty