Создание облегченного резервного шрифта с помощью fontforge и fonttools

Для веб-приложения мне нужен способ предотвратить возврат браузера к другому шрифту, если мой веб-шрифт не содержит символ. Кажется, единственный способ сделать это — добавить в стек шрифтов еще один шрифт, который включает «все» возможные символы 1.

Уже существуют откат шрифты, но это больше вспомогательные средства отладки, поскольку они показывают кодовую точку как число, поэтому они слишком тяжелые ( >2 МБ).

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

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

Мой скрипт для fontforge:

import fontforge
import fontTools.feaLib.builder as feaLibBuilder
from fontTools.ttLib import TTFont

font_name = 'maeh.ttf'
font = fontforge.font()
glyph = font.createChar(33, "theone")
pen = glyph.glyphPen()
pen.moveTo((100,100))
pen.lineTo((100,500))
pen.lineTo((500,500))
pen.lineTo((500,100))
pen.closePath()

for i in range(34, 99):
    glyph = font.createChar(i)
    glyph.width=10

font.cidConvertTo('Adobe', 'Identity', 0)  # doesn't make a difference

font.generate(font_name)

font = TTFont(font_name)
feaLibBuilder.addOpenTypeFeatures(font, 'fallback.fea')
font.save("fea_"+font_name)

Мой файл функций:

languagesystem DFLT dflt;

@all=[\00035-\00039];
#@all=[A-Z]   this works 

feature liga {
    sub @all by theone;
} liga;

Но приведенное выше приводит к

KeyError: ('cid00037', 'SingleSubst[0]', 'Lookup[0]', 'LookupList')

с изменением номеров для cid00037.

Если я использую закомментированные A-Z из файла Feature, он работает, поэтому этот подход не кажется полностью неправильным.

Почему шрифтовые инструменты не могут найти глифы, если я указываю диапазон в нотации CID? Есть ли другой способ создать класс для файла функций OpenType, который включает все глифы?


person tobltobs    schedule 09.12.2016    source источник
comment
прежде чем мы продолжим: почему вам нужно предотвратить откат шрифта? Потому что это то, что веб-сайты должны делать, так почему же вы пытаетесь бороться с тем, как должен работать CSS, вместо того, чтобы писать автономный валидатор для вашего кода, который сообщает вам, есть ли пробелы в выбранном вами шрифте? ?   -  person Mike 'Pomax' Kamermans    schedule 13.12.2016
comment
@Mike'Pomax'Kamermans Мне это нужно для веб-сайта, который используется для тестирования шрифтов. Если глиф не является частью шрифта, должно быть очевидно, что он отсутствует.   -  person tobltobs    schedule 13.12.2016
comment
так что... почему бы не использовать резервный вариант шрифта и не вернуться к Adobe пустой шрифт или шрифт Adobe notdef? Это буквально то, для чего они были сделаны (проверка набора). Тем не менее, проверка наличия глифа — это то, что вы могли бы разумно сделать без какого-либо внешнего интерфейса: вы просто запускаете код своей страницы через формирователь и смотрите, пройдет ли он в тот момент, когда вы скормите мне строку X и этот шрифт, который я должен использовать, не имеет индекса/индекса глифа для него, нет необходимости делать это в клиенте. Но если нужно: используйте пробел.   -  person Mike 'Pomax' Kamermans    schedule 13.12.2016


Ответы (1)


При работе над вышеуказанной проблемой кто-то намекнул мне на шрифт Adobe NotDef, который почти то, что я искал. По какой-то причине мне не удалось преобразовать .otf Adobe NotDef в woff или woff2 с помощью fontforge. Также все онлайн-инструменты для создания файлов веб-шрифтов, такие как fontsquirrel, потерпели неудачу. Для создания файла woff я использовал sfnt2woff из пакета woff-tools. Для файла woff2 я использовал https://github.com/google/woff2.

person tobltobs    schedule 13.12.2016
comment
Какая версия Font Forge? И Adobe Blank, и Adobe notdef полагаются на новую таблицу CMAP, поэтому, если вы все еще используете старую версию, вполне вероятно, что она просто не понимает, что делать с этими данными CMAP. - person Mike 'Pomax' Kamermans; 13.12.2016
comment
FontForge поддерживает WOFF с 2010 года, так что это не должно было быть проблемой, но поддержка WOFF2 была добавлена ​​только 15 июня 2018 года. - person Yay295; 13.08.2018