Мне для http://teilnehmer.somee.com/WpfTextImage нужен шрифт-заглушка, который бы имел во всех код-пойнтах один и тот же глиф — квадратик.
Сейчас я использую для этих целей пару шрифтов UnicodeBMPFallback для главной плоскости и LastResort для остальных плоскостей. Но проблема в том, что в этих шрифтах задействованы только заняьые в уникоде код-поинты.
Вот например, вышла новая версия Универсалии (http://rutracker.org/forum/viewtopic.php?t=4133056) с поддержкой уникода 7.0. Я набираю в WpfTextImage в списке шрифтов символ рубля, и он мне показывает, как будто этот символ есть во всех шрифтах. Дело в том, что в UnicodeBMPFallback и в LastResort его нету, и WPF выполняет автоподстановку из имеющегося шрифта.
Хорошо бы иметь шрифт, в котором решительно все код-поинты ссылаются на глиф-квадратик.
Я пытался сделать такой шрифт сам, но у меня ничего не вышло, т. к. не разбираюсть в шрифтовых программах.
Может, кто-нибудь мне поможет?
Есть системный шрифт System, в котором почти все код-поинты ссылаются на глиф Ђ.
Цитата: Bhudh от августа 26, 2014, 20:54
Есть системный шрифт System, в котором почти все код-поинты ссылаются на глиф Ђ.
Думаю, это не работает. Ђ в System функционально является тем же, чем квадратик в других шрифтах — символом, отображаемым при отсутствии символа в шрифте. Однако, умные программы сами находят то, чего нет в текущем шрифте, проверяя другие установленные шрифты.
Цитата: Тайльнемер от августа 26, 2014, 20:43
Я пытался сделать такой шрифт сам, но у меня ничего не вышло, т. к. не разбираюсть в шрифтовых программах.
А какая возникла проблема?
Цитата: Wolliger Mensch от августа 27, 2014, 00:00
А какая возникла проблема?
Я пробовал FontForge и FontLab Studio 5.
В FontForge я создал новый шрифт, нарисовал глиф-прямоугольник. Как я понял, этому глифу можно назначить ещё несколько код-пойнтов (Same glyph as), или можно в других глифах сослаться на этот (Copy reference, Paste). Но последний способ плох тем, что не позволяет покрыть больше 2
16 символов (одну плоскость уникода). Первый способ — позволяет, что видно из шрифта LastResort.
Опции «назначить глифу код-пойнты с X по Y» я не нашёл. Тыкать миддион раз мышкой — тоже не очень хорошо. К счастью, формат исходных файлов у FontForg'а текстовый. Дополнительные код-пойнты в нём вводятся с помощью строки «AltUni2: ‹код›.ffffffff.0 ‹код›.ffffffff.0 ‹код›.ffffffff.0...».
Я стал эксперементировать с генерацией исходных файлов. Оказалось, что при количевтве кодов в AltUni2 больше ≈30000 (это меньше половины базовой плоскости) FontForge при генерации ttf или otf выдаёт ошибку:
"Attempt to output ‹столько-то› into a 16-bit field. It will be truncated and the file may not be useful."
Причём это ограничение не на altUni для одного глифа, а на общее количество altUni на весь шрифт, как ни странно. И кстати, шрифт LastResort FontForge открывает, но при попытке собрать вылетает с той же ошибкой.
В FontLab Studio я тоже нарисовал глиф-прямоугольник. Функции «назначить глифу код-пойнты с X по Y» я здесь тоже не нашёл. В окне Glyph Properties в поле Unicode можно вписать через пробел несколько код-пойнтов для одного глифа. Но при попытке вписать туда несколько десятков кодов программа вылетает с ошибкой.
Формат исходных файлов у FontLab'а бинарный, и копаться в нём нехочется.
Как быть?
Ура!
А вот в FontCreator'е есть возможность задавать глифу диапазон код-пойнтов.
Шрифт работает!
Цитата: FontCreatorYou are on day 984 of your 30 day evaluation period.
:E:
Прошу помощи.
Вот сделал я шрифт в FontCreator'е. Там один глиф — прямоугольник. Но он получился неотхинченный — стороны прямоугольника выглядят разной толщины, а при некоторых размерах некоторые стороны вообще исчезают. Чтобы не сильно исчезали, мне пришлось горизонтальные линии сделать намного толще, но всё равно мало помогло: (http://teilnehmer.somee.com/WpfTextImage/Make.ashx?src=W2Y9Tm9uZV1bc3o9MTVd0YfRkSDQt9CwINGE0LjQs9C90Y8h) (http://teilnehmer.somee.com/WpfTextImage?src=W2Y9Tm9uZV1bc3o9MTVd0YfRkSDQt9CwINGE0LjQs9C90Y8h)
Конечно, можно сделать ещё толще, не проблема. Но хотелось бы знать, как это делается по-хорошему, как отхинтить глиф так, чтобы стороны прямоугольника были одинаковой толщины и не терялись.
Как я понял, FontCreator не позволяет делать хинтинг. (Там есть в опциях экспорта «автохинтинг», но он не помог.)
Я открыл шрифт в FontLabStudio и сталкнулся с двумя проблемами:
1) Я не знаю, как хинтить.
2) Я не могу экспортировать шрифт в otf/ttf без потери привязки глифа к код-пойнтам.
Ах да, вот сам шрифт:
в otf (http://teilnehmer.somee.com/Fonts/None.otf)
и в формате FontCreator'а:
Ну нарисуйте два квадратика. Один диапазон будет ссылаться на один квадратик, следующий диапазон на другой.
Цитата: amdf от сентября 8, 2014, 17:21
Ну нарисуйте два квадратика. Один диапазон будет ссылаться на один квадратик, следующий диапазон на другой.
Это уже не актуально. Всё получилось с одним квадратиком и 17 ссылками на него (на каждый глиф-ссылку повешено по плоскости уникода).
Теперь вопрос с хинтингом (уже не жизненно важный, а так, по мелочи).
Цитата: Тайльнемер от сентября 8, 2014, 17:32и 17 ссылками на него (на каждый глиф-ссылку повешено по плоскости уникода)
То есть квадратиком помечены даже все неиспользуемые и зарезервированные код-пойнты?
Цитата: Bhudh от сентября 8, 2014, 18:22
То есть квадратиком помечены даже все неиспользуемые и зарезервированные код-пойнты?
Именно так.
Такой шрифт не придётся обновлять под каждую версию уникода, как этого требует LastResort.
Можно, конечно, сделать облегчённую версию только для плоскостей 0—2, 14—16. Он бы весил меньше. Не знаю, имеет ли это значение.
Можно попробовать и посмотреть, несколько меньше.
Назвать, скажем, MiniNone или CurrentNone.
Линейно: 5 МБ против 13.
Мне кажется, скорость доступа к шрифту не зависит от размера файла, и смысла в маленьком файле нет. Но может я ошибаюсь...
:o Ого сжал!!!
Открыл файл в Notepad++ и немного прифигел от числа повторений ANSI блока в нём.
12 297 раз.
При этом символы \u000F и \u000E повторяются по 137 226 раз...