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

Разработка Far.
Post Reply
awson
Posts: 26
Joined: Fri 11 Sep, 2009 13:22

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

Post by awson » Sat 10 Jun, 2017 13:57

В редакторе Фара не отображаются некоторые экзотические символы, вместо них 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.

Или, может, я вообще ломлюсь в открытые двери и существуют какие-то простые варианты, мимо которых я прошел (внешние редакторы, как я уже упомянул, не предлагать)?
Last edited by awson on Sat 10 Jun, 2017 14:00, edited 1 time in total.

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

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

Post by DrKnS » Sat 10 Jun, 2017 18:14

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

awson
Posts: 26
Joined: Fri 11 Sep, 2009 13:22

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

Post by awson » Sat 10 Jun, 2017 20:22

О! Отлично, спасибо! Как я понял, в ConEmu это `ConEmuDW` (или `Far.ExtendedConsole`)?

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

Т.е., я сделал дллку, которая экспортирует нужные функции. Что нужно, чтоб Фар их подхватил?
Last edited by awson on Sat 10 Jun, 2017 20:25, edited 1 time in total.

User avatar
DrKnS
Posts: 4609
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

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

Post by DrKnS » Sun 11 Jun, 2017 07:05

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

Post Reply

Return to “Development”