Переменные, которые управляют размером глифа в шрифтах TrueType
У меня есть следующие данные из ttx fonttools, которые описывают двоичный файл шрифта, который я создал вручную:
<?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="true" ttLibVersion="3.36">
<GlyphOrder>
<!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
<GlyphID id="0" name=".notdef"/>
<GlyphID id="1" name="b"/>
<GlyphID id="2" name="d"/>
</GlyphOrder>
<head>
<!-- Most of this table will be recalculated by the compiler -->
<tableVersion value="1.0"/>
<fontRevision value="1.0681"/>
<checkSumAdjustment value="0x0"/>
<magicNumber value="0x5f0f3cf5"/>
<flags value="00000000 00000011"/>
<unitsPerEm value="1000"/>
<created value="Tue Jan 22 12:25:10 2019"/>
<modified value="Tue Jan 22 12:25:10 2019"/>
<xMin value="10"/>
<yMin value="10"/>
<xMax value="90"/>
<yMax value="90"/>
<macStyle value="00000000 00000000"/>
<lowestRecPPEM value="3"/>
<fontDirectionHint value="2"/>
<indexToLocFormat value="1"/>
<glyphDataFormat value="0"/>
</head>
<hhea>
<tableVersion value="0x00010000"/>
<ascent value="200"/>
<descent value="100"/>
<lineGap value="0"/>
<advanceWidthMax value="90"/>
<minLeftSideBearing value="0"/>
<minRightSideBearing value="0"/>
<xMaxExtent value="0"/>
<caretSlopeRise value="1"/>
<caretSlopeRun value="0"/>
<caretOffset value="0"/>
<reserved0 value="0"/>
<reserved1 value="0"/>
<reserved2 value="0"/>
<reserved3 value="0"/>
<metricDataFormat value="0"/>
<numberOfHMetrics value="3"/>
</hhea>
<maxp>
<!-- Most of this table will be recalculated by the compiler -->
<tableVersion value="0x10000"/>
<numGlyphs value="3"/>
<maxPoints value="5"/>
<maxContours value="1"/>
<maxCompositePoints value="0"/>
<maxCompositeContours value="0"/>
<maxZones value="1"/>
<maxTwilightPoints value="0"/>
<maxStorage value="0"/>
<maxFunctionDefs value="0"/>
<maxInstructionDefs value="0"/>
<maxStackElements value="0"/>
<maxSizeOfInstructions value="0"/>
<maxComponentElements value="0"/>
<maxComponentDepth value="0"/>
</maxp>
<OS_2>
<!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
will be recalculated by the compiler -->
<version value="5"/>
<xAvgCharWidth value="90"/>
<usWeightClass value="500"/>
<usWidthClass value="5"/>
<fsType value="00000000 00000000"/>
<ySubscriptXSize value="650"/>
<ySubscriptYSize value="699"/>
<ySubscriptXOffset value="0"/>
<ySubscriptYOffset value="140"/>
<ySuperscriptXSize value="650"/>
<ySuperscriptYSize value="699"/>
<ySuperscriptXOffset value="0"/>
<ySuperscriptYOffset value="479"/>
<yStrikeoutSize value="49"/>
<yStrikeoutPosition value="258"/>
<sFamilyClass value="0"/>
<panose>
<bFamilyType value="0"/>
<bSerifStyle value="0"/>
<bWeight value="0"/>
<bProportion value="0"/>
<bContrast value="0"/>
<bStrokeVariation value="0"/>
<bArmStyle value="0"/>
<bLetterForm value="0"/>
<bMidline value="0"/>
<bXHeight value="0"/>
</panose>
<ulUnicodeRange1 value="00000000 00000000 00000000 00000000"/>
<ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
<ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
<ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
<achVendID value="XXXX"/>
<fsSelection value="00000000 01000000"/>
<usFirstCharIndex value="97"/>
<usLastCharIndex value="100"/>
<sTypoAscender value="200"/>
<sTypoDescender value="100"/>
<sTypoLineGap value="0"/>
<usWinAscent value="90"/>
<usWinDescent value="10"/>
<ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
<ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
<sxHeight value="100"/>
<sCapHeight value="40"/>
<usDefaultChar value="0"/>
<usBreakChar value="0"/>
<usMaxContext value="0"/>
<usLowerOpticalPointSize value="0.0"/>
<usUpperOpticalPointSize value="0.15"/>
</OS_2>
<hmtx>
<mtx name=".notdef" width="90" lsb="0"/>
<mtx name="b" width="90" lsb="0"/>
<mtx name="d" width="90" lsb="0"/>
</hmtx>
<cmap>
<tableVersion version="0"/>
<cmap_format_4 platformID="3" platEncID="1" language="0">
<map code="0x62" name="b"/><!-- LATIN SMALL LETTER B -->
<map code="0x64" name="d"/><!-- LATIN SMALL LETTER D -->
</cmap_format_4>
</cmap>
<loca>
<!-- The 'loca' table will be calculated by the compiler -->
</loca>
<glyf>
<!-- The xMin, yMin, xMax and yMax values
will be recalculated by the compiler. -->
<TTGlyph name=".notdef" xMin="0" yMin="0" xMax="100" yMax="300">
<contour>
<pt x="10" y="10" on="1"/>
<pt x="90" y="10" on="1"/>
<pt x="90" y="90" on="1"/>
<pt x="10" y="90" on="1"/>
<pt x="10" y="10" on="1"/>
</contour>
<instructions/>
</TTGlyph>
<TTGlyph name="b" xMin="0" yMin="0" xMax="100" yMax="300">
<contour>
<pt x="10" y="10" on="1"/>
<pt x="90" y="10" on="1"/>
<pt x="90" y="90" on="1"/>
<pt x="10" y="90" on="1"/>
<pt x="10" y="10" on="1"/>
</contour>
<instructions/>
</TTGlyph>
<TTGlyph name="d" xMin="0" yMin="0" xMax="100" yMax="300">
<contour>
<pt x="10" y="10" on="1"/>
<pt x="90" y="10" on="1"/>
<pt x="90" y="90" on="1"/>
<pt x="10" y="90" on="1"/>
<pt x="10" y="10" on="1"/>
</contour>
<instructions/>
</TTGlyph>
</glyf>
<name>
<namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
Foo
</namerecord>
<namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
Foo
</namerecord>
<namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
Regular
</namerecord>
<namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
foo
</namerecord>
<namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
Foo Regular
</namerecord>
<namerecord nameID="13" platformID="1" platEncID="0" langID="0x0" unicode="True">
Licensed under the Apache License, Version 2.0
</namerecord>
<namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
Version 1.000
</namerecord>
</name>
<post>
<formatType value="3.0"/>
<italicAngle value="0.0"/>
<underlinePosition value="0"/>
<underlineThickness value="0"/>
<isFixedPitch value="0"/>
<minMemType42 value="0"/>
<maxMemType42 value="0"/>
<minMemType1 value="0"/>
<maxMemType1 value="0"/>
</post>
</ttFont>
Все 3 символа - просто квадрат:
<TTGlyph name="d" xMin="0" yMin="0" xMax="100" yMax="300">
<contour>
<pt x="10" y="10" on="1"/>
<pt x="90" y="10" on="1"/>
<pt x="90" y="90" on="1"/>
<pt x="10" y="90" on="1"/>
<pt x="10" y="10" on="1"/>
</contour>
<instructions/>
</TTGlyph>
То, что он показывает для меня в средстве просмотра шрифтов, это:
Просто несколько диагональных линий в нижнем углу.
В браузере когда буквы b
а также d
стилизованы шрифтом, он обнаруживается практически без ширины или, возможно, высоты. Похоже, это крошечный квадрат.
Интересно, что мне не хватает. В частности, ниже приведены переменные, участвующие в реальном отображении / определении размера / позиционировании глифов.
glyf
Таблица:- numberOfContours
- XMIN
- Ymin
- Xmax
- YMAX
- endPtsOfContours
- instructionLength
- флаги
- xCoordinates
- yCoordinates
head
Таблица:- unitsPerEm
- XMIN
- Ymin
- Xmax
- YMAX
- lowestRecPPEM
hhea
Таблица:- восходящему
- нижний выносной элемент
- advanceWidthMax
- minLeftSideBearing
- minRightSideBearing
- xMaxExtent: maxLeftSideBearing + (xMax - xMin),
os2
таблица: я думаю, что в этом нет необходимости, хотя и не уверен, но здесь есть несколько переменных, связанных с размером / расположением, которые являются дубликатами других в других таблицах.post
Таблица:- isFixedPitch (моноширинные шрифты)
Я думаю, что это в значительной степени так. Пожалуйста, дайте мне знать, если требуется что-то большее, чем это.
Эти свойства так или иначе управляют размером / положением глифа. Я думаю, что проблема отображения глифа выше может иметь отношение к размеру / масштабу этих переменных. Я не уверен, должны ли они быть порядка 100, 1000 или 10000 и т. Д. Я не уверен, каков размер "якоря", на котором все основано. Может это unitsPerEm
или, может быть, это основано на xMin
а также xMax
а также yMin
а также yMax
(так 100, 300).
Что у меня есть для этих значений:
glyf
Таблица:- numberOfContours: 1
- xMin: 0
- yMin: 0
- xMax: 100
- yMax: 300
- endPtsOfContours: lastIndex
- длина инструкции: 0
- флаги: флаги
- xCoordinates:lativeCoordinates
- Координаты: относительные координаты
head
Таблица:- Единицы измерения: 2000
- xMin: 0
- yMin: 0
- xMax: 100
- yMax: 300
- самый низкий RecPPEM: 3
hhea
Таблица:- по возрастанию: 200
- Descender: -100 (но всегда становится 100, так что, возможно, - не обязательно)
- advanceWidthMax: глифы [i].advanceWidth max
- minLeftSideBearing: 0
- minRightSideBearing: 100
- xMaxExtent: maxLeftSideBearing + (xMax - xMin),
os2
таблица: я думаю, что в этом нет необходимости, хотя и не уверен, но здесь есть несколько переменных, связанных с размером / расположением, которые являются дубликатами других в других таблицах.post
Таблица:- isFixedPitch true (поскольку сейчас это проще)
Мои вопросы:
- Какими должны быть эти значения (в списке выше).
- Что такое "якорное" значение, где все относительно этого масштаба / размера (если таковой существует).
- Как я помещаю глиф в ограничивающий прямоугольник так, чтобы он отображался на одном уровне с любым другим шрифтом на экране (или, по крайней мере, он относительно близок к тому же размеру). В моем шрифте у меня есть только символы
b
а такжеd
так что если я напишуabcd
Я должен увидетьa□c□
если мой персонаж просто рисует простой квадрат для каждого (и размер должен быть примерно одинаковым). Прямо сейчас я вижу маленькую диагональную линию.