Переменные, которые управляют размером глифа в шрифтах TrueType - PullRequest
0 голосов
/ 22 января 2019

У меня есть следующие данные из 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>

Что это показываетдля меня в средстве просмотра шрифтов это:

enter image description here

Только несколько диагональных линий в нижнем углу.

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

enter image description here

Интересно, что мне не хватает.В частности, ниже приведены переменные, участвующие в фактическом отображении / определении размера / расположении глифов.

  • glyf таблица:
    • numberOfContours
    • xMin
    • yMin
    • xMax
    • yMax
    • endPtsOfContours
    • инструкцияLength
    • флаги
    • xCoordinates
    • yКоординаты
  • head Таблица:
    • Единицы измеренияPerEm
    • xMin
    • yMin
    • xMax
    • yMax
    • низшийRecPPEM
  • 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
    • инструкцияLength: 0
    • flags: flags
    • x Координаты: относительные координаты
    • yКоординаты: относительныеКоординаты
  • head Таблица:
    • Единицы измерения: 2000
    • xMin: 0
    • yMin: 0
    • xMax: 100
    • yMax: 300
    • lowRecPPEM: 3
  • hhea таблица:
    • по возрастанию:200
    • по убыванию: -100 (но всегда становится 100, поэтому возможно - не обязательно)
    • advanceWidthMax: glyphs [i] .advanceWidth max
    • minLeftSideBearing: 0
    • minRightSideBearing: 100
    • xMaxExtent: maxLeftSideBearТаблица ing + (xMax - xMin),
  • os2: я думаю, что в этом нет необходимости, хотя я не уверен, но здесь есть несколько переменных, связанных с размером / позиционированием, которыедубликаты других в других таблицах.
  • post таблица:
    • isFixedPitch true (поскольку сейчас это проще)

Мои вопросыявляются:

  1. Какими должны быть эти значения (в приведенном выше списке).
  2. Что такое «якорное» значение, где все относительно этого масштаба / размера (если оно существует)).
  3. Как мне разместить глиф в ограничительной рамке так, чтобы он отображался на одном уровне с любым другим шрифтом на экране (или, по крайней мере, он относительно близок к тому же размеру). В моем шрифте есть только символы b и d, поэтому, если я напишу abcd, я должен увидеть a□c□, если мой персонаж просто рисует простой квадрат для каждого (и размер должен быть примерно одинаковым). Прямо сейчас я вижу маленькую диагональную линию.
...