Page 1 of 1

Экзотические символы в редакторе

Posted: Sat 10 Jun, 2017 13:57
by awson
В редакторе Фара не отображаются некоторые экзотические символы, вместо них 1 или 2 прямоугольника.

В общем, причина этого понятна, используемые шрифты не содержат всех нужных начертаний и требуется подстановка из других шрифтов.

Я использую DejaVu Sans Mono. К нему руками в реестре подлинковал дополнительные шрифты, это известная техника, использует ветку реестра

Code: Select all

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink
Ситуация сильно улучшилась, однако, некоторые символы, которые точно должны отображаться, все еще не отображаются. Как минимум, не отображаются символы, которые не лезут в UCS-2, то есть, для которых не хватает виндового 16-битного wchar_t, и которые представляются суррогатной парой wchar_t –- это как раз те символы, что отображаются двумя прямоугольниками.

Стал гуглить, нашел какие-то упоминания, что виндовый консольный API в принципе не может отображать символы, не лезущие в UCS-2. Но это упоминания все какие-то неофициальные и официальных формулировок от MS я так и не нашел.

Еще я пробовал использовать ConEmu, там, что интересно, все UCS-4 символы отобразились, но не отображается очень много других символов. Линковку шрифтов оно вообще игнорирует, а та подстановка символов из других шрифтов, что все-таки происходит, оказывается (очень) плохого качества -- размеры глифов не корректируются, рендерятся они отвратно и т .д. Т.е. ConEmu в нынешнем виде для этого совсем плох.

Использование внешних редакторов, которые все умеют, пока вынесем за скобки (оно меня в данный момент не удовлетворяет по другим причинам).

Итак, теперь вопросы, на которые, возможно, у кого-нибудь есть ответы:
1. Действительно ли консольный API винды на сегодня в принципе неспособен рисовать UCS-4 символы?
2. Если да, то каковы перспективы замены механизма рендеринга текста только для редактора Фара (а не для всего Фара)? Это совсем нереально?
3. Если нереально, то каковы перспективы замены механизма рендеринга текста для всего Фара (т.е., частичной эмуляции консоли)? ConEmu очень большой, жирный и мне оттуда вообще ничего не нужно, кроме его потенциальной способности отрендерить любой текст в случае, если обычная консоль на это не способна, но как раз с этим у него проблемы.
4. Если все предыдущее не вариант, то правильно ли то, что единственной остающейся возможностью остается доработка ConEmu?
5. Если ответ на предыдущий вопрос положителен, то в какую сторону дорабатывать ConEmu? Я его довольно пристально повертел в руках и примерно понимаю, что там в этой части происходит, но только примерно. Из того, что я видел, наиболее удобный API для работы с проблемами типа моей -- это использование DirectWrite, там оба высокоуровневых API для рендеринга текста делают font fallback автоматически, без геморроя, и с высоким качеством (примеры -- редакторы на scintilla c включенным DirectWrite, например scite, или, например, Vim последних версий). Но нащет ConEmu у меня сложилось ощущение, что он весь насквозь пророс GDI и использовать DirectWrite там реалистично только без D2D рендеринга, и только используя GDI interoperatbility. Хотя мою проблему это таки решит.

В общем, правилен ли мой вывод, что единственный реалистичный вариант решить мою проблему это допилить ConEmu, воткнув туда DirectWrite в режиме GDI interoperatbility, или нет? Еще вариант -- допилить ConEmu, используя Uniscribe APIs, но по результатом беглого исследования мне этот вариант показался даже более геморройным, чем использование DirectWrite.

Или, может, я вообще ломлюсь в открытые двери и существуют какие-то простые варианты, мимо которых я прошел (внешние редакторы, как я уже упомянул, не предлагать)?

Экзотические символы в редакторе

Posted: Sat 10 Jun, 2017 18:14
by DrKnS
awson wrote:
Sat 10 Jun, 2017 13:57
Действительно ли консольный API винды на сегодня в принципе неспособен рисовать UCS-4 символы?
Не скажу за консольный API, но конкретно Far в данный момент никак не обрабатывает суррогатные пары, т. е. даже если оно отобразится корректно - для редактора это два символа со всеми вытекающими.
каковы перспективы замены механизма рендеринга текста для всего Фара
Уже. В conemu, насколько я знаю, присутствует реализация.

Экзотические символы в редакторе

Posted: Sat 10 Jun, 2017 20:22
by awson
О! Отлично, спасибо! Как я понял, в ConEmu это `ConEmuDW` (или `Far.ExtendedConsole`)?

Не совсем понял как оно должно деплоиться. Просто дллка в одном каталоге с far.exe? В ConEmu оно, вроде не так (в каталоге `ConEmu`).

Т.е., я сделал дллку, которая экспортирует нужные функции. Что нужно, чтоб Фар их подхватил?

Экзотические символы в редакторе

Posted: Sun 11 Jun, 2017 07:05
by DrKnS
Скорее второе.
Conemu там что-то шаманит, чтобы подсунуть dll со своим именем.
Far ищет extendedconsole.dll в стандартных местах, см. https://sourceforge.net/p/farmanager/co ... e.cpp#l818. Достаточно положить в папку с Far.exe.

Экзотические символы в редакторе

Posted: Sun 26 May, 2019 10:28
by awson
Решил шевельнуть старую тему, которая снова стала актуальна, но с другой стороны.

В новой консоли (которая опенсорснута https://github.com/microsoft/terminal) MS сделал directwrite рендеринг, и оно теперь умеет рисовать экзотические глифы (я запустил FAR в новой консоли и посмотрел) и поддерживает UTF-8/UTF-16.

Я не вдавался в детали, в том смысле, нужно ли для этого использовать новые API или старые теперь их автоматически поддерживают (типа ANSI версии — UTF-8, а UNICODE — UTF16), но в любом случае поддержка 4-байтных codepoints становится насущной.

Эта тема как-то обсуждается? Есть какие-то идеи (design space тут обширный, да)?

Экзотические символы в редакторе

Posted: Sun 26 May, 2019 12:00
by DrKnS
awson wrote:
Sun 26 May, 2019 10:28
Эта тема как-то обсуждается? Есть какие-то идеи (design space тут обширный, да)?
Нет, нет. Предлагайте, делайте pull requestы :)