[opentype-gx/varLib] More work towards VariationStore
And HVAR/VVAR tables.
This commit is contained in:
parent
4506796b32
commit
e2da17e032
7
Lib/fontTools/ttLib/tables/H_V_A_R_.py
Normal file
7
Lib/fontTools/ttLib/tables/H_V_A_R_.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from __future__ import print_function, division, absolute_import
|
||||||
|
from fontTools.misc.py23 import *
|
||||||
|
from .otBase import BaseTTXConverter
|
||||||
|
|
||||||
|
|
||||||
|
class table_H_V_A_R_(BaseTTXConverter):
|
||||||
|
pass
|
7
Lib/fontTools/ttLib/tables/V_V_A_R_.py
Normal file
7
Lib/fontTools/ttLib/tables/V_V_A_R_.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from __future__ import print_function, division, absolute_import
|
||||||
|
from fontTools.misc.py23 import *
|
||||||
|
from .otBase import BaseTTXConverter
|
||||||
|
|
||||||
|
|
||||||
|
class table_V_V_A_R_(BaseTTXConverter):
|
||||||
|
pass
|
@ -24,6 +24,7 @@ def _moduleFinderHint():
|
|||||||
from . import G_P_K_G_
|
from . import G_P_K_G_
|
||||||
from . import G_P_O_S_
|
from . import G_P_O_S_
|
||||||
from . import G_S_U_B_
|
from . import G_S_U_B_
|
||||||
|
from . import H_V_A_R_
|
||||||
from . import J_S_T_F_
|
from . import J_S_T_F_
|
||||||
from . import L_T_S_H_
|
from . import L_T_S_H_
|
||||||
from . import M_A_T_H_
|
from . import M_A_T_H_
|
||||||
@ -44,6 +45,7 @@ def _moduleFinderHint():
|
|||||||
from . import T_S_I__5
|
from . import T_S_I__5
|
||||||
from . import V_D_M_X_
|
from . import V_D_M_X_
|
||||||
from . import V_O_R_G_
|
from . import V_O_R_G_
|
||||||
|
from . import V_V_A_R_
|
||||||
from . import _a_v_a_r
|
from . import _a_v_a_r
|
||||||
from . import _c_m_a_p
|
from . import _c_m_a_p
|
||||||
from . import _c_v_t
|
from . import _c_v_t
|
||||||
|
@ -227,6 +227,13 @@ class GlyphID(SimpleValue):
|
|||||||
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
||||||
writer.writeUShort(font.getGlyphID(value))
|
writer.writeUShort(font.getGlyphID(value))
|
||||||
|
|
||||||
|
class VarAxisID(SimpleValue):
|
||||||
|
staticSize = 2
|
||||||
|
def read(self, reader, font, tableDict):
|
||||||
|
return font['fvar'].axes[reader.readUShort()]
|
||||||
|
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
||||||
|
writer.writeUShort(font['fvar'].axes.index(value))
|
||||||
|
|
||||||
class FloatValue(SimpleValue):
|
class FloatValue(SimpleValue):
|
||||||
def xmlRead(self, attrs, content, font):
|
def xmlRead(self, attrs, content, font):
|
||||||
return float(attrs["value"])
|
return float(attrs["value"])
|
||||||
|
@ -837,11 +837,15 @@ otData = [
|
|||||||
('Offset', 'Lookup', 'LookupCount', 0, 'Array of offsets to GPOS-type lookup tables-from beginning of JstfMax table-in design order'),
|
('Offset', 'Lookup', 'LookupCount', 0, 'Array of offsets to GPOS-type lookup tables-from beginning of JstfMax table-in design order'),
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# variations
|
# Variation fonts
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# VariationStore
|
||||||
|
|
||||||
('VarAxis', [
|
('VarAxis', [
|
||||||
('uint16', 'AxisIndex', None, None, ''),
|
('uint16', 'VarAxisID', None, None, ''),
|
||||||
('F2Dot14', 'StartCoord', None, None, ''),
|
('F2Dot14', 'StartCoord', None, None, ''),
|
||||||
('F2Dot14', 'PeakCoord', None, None, ''),
|
('F2Dot14', 'PeakCoord', None, None, ''),
|
||||||
('F2Dot14', 'EndCoord', None, None, ''),
|
('F2Dot14', 'EndCoord', None, None, ''),
|
||||||
@ -869,7 +873,7 @@ otData = [
|
|||||||
('uint16', 'ItemCount', None, None, ''),
|
('uint16', 'ItemCount', None, None, ''),
|
||||||
('uint16', 'VarTupleCount', None, None, ''),
|
('uint16', 'VarTupleCount', None, None, ''),
|
||||||
('uint16', 'VarTupleIndex', 'VarTupleCount', 0, ''),
|
('uint16', 'VarTupleIndex', 'VarTupleCount', 0, ''),
|
||||||
('struct', 'VarItemByteRecord', 'ItemCount', 0, ''),
|
('VarItemByteRecord', 'Item', 'ItemCount', 0, ''),
|
||||||
]),
|
]),
|
||||||
|
|
||||||
('VarDeltasFormat2', [
|
('VarDeltasFormat2', [
|
||||||
@ -877,16 +881,43 @@ otData = [
|
|||||||
('uint16', 'ItemCount', None, None, ''),
|
('uint16', 'ItemCount', None, None, ''),
|
||||||
('uint16', 'VarTupleCount', None, None, ''),
|
('uint16', 'VarTupleCount', None, None, ''),
|
||||||
('uint16', 'VarTupleIndex', 'VarTupleCount', 0, ''),
|
('uint16', 'VarTupleIndex', 'VarTupleCount', 0, ''),
|
||||||
('struct', 'VarItemShortRecord', 'ItemCount', 0, ''),
|
('VarItemShortRecord', 'Item', 'ItemCount', 0, ''),
|
||||||
]),
|
]),
|
||||||
|
|
||||||
('VarStore', [
|
('VarStore', [
|
||||||
('LOffset', 'VarTupleList', None, None, ''),
|
|
||||||
('uint16', 'Format', None, None, 'Set to 1.'),
|
('uint16', 'Format', None, None, 'Set to 1.'),
|
||||||
|
('LOffset', 'VarTupleList', None, None, ''),
|
||||||
('uint16', 'VarDeltasCount', None, None, ''),
|
('uint16', 'VarDeltasCount', None, None, ''),
|
||||||
('LOffset', 'VarDeltas', 'VarDeltasCount', 0, ''),
|
('LOffset', 'VarDeltas', 'VarDeltasCount', 0, ''),
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
# Variation helpers
|
||||||
|
|
||||||
|
('VarIdxMapFormat1', [
|
||||||
|
('uint16', 'Format', None, None, 'Set to 1.'),
|
||||||
|
('uint16', 'VarIdxCount', None, None, ''),
|
||||||
|
('uint16', 'VarIdx', 'VarIdxCount', 0, ''),
|
||||||
|
]),
|
||||||
|
('VarIdxMapFormat2', [
|
||||||
|
('uint16', 'Format', None, None, 'Set to 2.'),
|
||||||
|
('uint16', 'VarIdxCount', None, None, ''),
|
||||||
|
('uint32', 'VarIdx', 'VarIdxCount', 0, ''),
|
||||||
|
]),
|
||||||
|
|
||||||
|
# Glyph advance variations
|
||||||
|
|
||||||
|
('HVAR', [
|
||||||
|
('Version', 'Version', None, None, 'Version of the HVAR table-initially = 0x00010000'),
|
||||||
|
('LOffset', 'VarIdxMap', None, None, ''),
|
||||||
|
('LOffset', 'VarStore', None, None, ''),
|
||||||
|
]),
|
||||||
|
('VVAR', [
|
||||||
|
('Version', 'Version', None, None, 'Version of the VVAR table-initially = 0x00010000'),
|
||||||
|
('LOffset', 'VarIdxMap', None, None, ''),
|
||||||
|
('LOffset', 'VarStore', None, None, ''),
|
||||||
|
]),
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# math
|
# math
|
||||||
#
|
#
|
||||||
|
@ -25,6 +25,7 @@ from fontTools.ttLib.tables._n_a_m_e import NameRecord
|
|||||||
from fontTools.ttLib.tables._f_v_a_r import table__f_v_a_r, Axis, NamedInstance
|
from fontTools.ttLib.tables._f_v_a_r import table__f_v_a_r, Axis, NamedInstance
|
||||||
from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates
|
from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates
|
||||||
from fontTools.ttLib.tables._g_v_a_r import table__g_v_a_r, GlyphVariation
|
from fontTools.ttLib.tables._g_v_a_r import table__g_v_a_r, GlyphVariation
|
||||||
|
from fontTools.varLib import builder
|
||||||
import warnings
|
import warnings
|
||||||
try:
|
try:
|
||||||
import xml.etree.cElementTree as ET
|
import xml.etree.cElementTree as ET
|
||||||
|
57
Lib/fontTools/varLib/builder.py
Normal file
57
Lib/fontTools/varLib/builder.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
from __future__ import print_function, division, absolute_import
|
||||||
|
from fontTools import ttLib
|
||||||
|
from fontTools.ttLib.tables import otTables as ot
|
||||||
|
|
||||||
|
# VariationStore
|
||||||
|
|
||||||
|
def buildVarAxis(axisTag, axisSupport):
|
||||||
|
self = ot.VarAxis()
|
||||||
|
self.VarAxisID = axisTag
|
||||||
|
self.StartCoord, self.PeakCoord, self.EndCoord = axisSupport
|
||||||
|
return self
|
||||||
|
|
||||||
|
def buildVarTuple(support):
|
||||||
|
self = ot.VarTuple()
|
||||||
|
self.VarAxis = []
|
||||||
|
for axisTag in sorted(support.keys()): # TODO order by axisIdx instead of tag?!
|
||||||
|
self.VarAxis.append(buildVarAxis(axisTag, support[axisTag]))
|
||||||
|
self.VarAxisCount = len(self.VarAxis)
|
||||||
|
return self
|
||||||
|
|
||||||
|
def buildVarTupleList(supports):
|
||||||
|
self = ot.VarTupleList()
|
||||||
|
self.VarTuple = []
|
||||||
|
for support in supports:
|
||||||
|
self.VarTuple.append(buildVarTuple(support))
|
||||||
|
self.VarTupleCount = len(self.VarTuple)
|
||||||
|
return self
|
||||||
|
|
||||||
|
def buildVarDeltas(varTupleIndexes, items):
|
||||||
|
self = ot.VarDeltas()
|
||||||
|
self.format = 1 if all(all(128 <= delta <= 127 for delta in item) for item in items) else 2
|
||||||
|
self.VarTupleIndex = list(varTupleIndexes)
|
||||||
|
tupleCount = self.VarTupleCount = len(self.VarTupleIndex)
|
||||||
|
records = self.Item = []
|
||||||
|
for item in items:
|
||||||
|
assert len(item) == tupleCount
|
||||||
|
record = ot.VarItemByteRecord() if self.format == 1 else ot.VarItemShortRecord()
|
||||||
|
record.deltas = list(item)
|
||||||
|
records.append(record)
|
||||||
|
self.ItemCount = len(self.Item)
|
||||||
|
return self
|
||||||
|
|
||||||
|
def buildVarStore(varTupleList, varDeltas):
|
||||||
|
self = ot.VarStore()
|
||||||
|
self.VarTupleList = varTupleList
|
||||||
|
self.VarDeltas = varDeltas
|
||||||
|
self.VarDeltasCount = len(self.VarDeltas)
|
||||||
|
return self
|
||||||
|
|
||||||
|
# Variation helpers
|
||||||
|
|
||||||
|
def buildVarIdxMap(varIdxes):
|
||||||
|
self = ot.VarIdxMap()
|
||||||
|
self.VarIdx = varIdxes = list(varIdxes)
|
||||||
|
self.VarIdxCount = len(self.VarIdx)
|
||||||
|
self.Format = 1 if all(x <= 0xFFFF for x in varIdxes) else 2
|
||||||
|
return self
|
10
README.md
10
README.md
@ -76,11 +76,11 @@ These additional options include:
|
|||||||
The following tables are currently supported:
|
The following tables are currently supported:
|
||||||
<!-- begin table list -->
|
<!-- begin table list -->
|
||||||
BASE, CBDT, CBLC, CFF, COLR, CPAL, DSIG, EBDT, EBLC, FFTM, GDEF,
|
BASE, CBDT, CBLC, CFF, COLR, CPAL, DSIG, EBDT, EBLC, FFTM, GDEF,
|
||||||
GMAP, GPKG, GPOS, GSUB, JSTF, LTSH, MATH, META, OS/2, SING, SVG,
|
GMAP, GPKG, GPOS, GSUB, HVAR, JSTF, LTSH, MATH, META, OS/2, SING,
|
||||||
TSI0, TSI1, TSI2, TSI3, TSI5, TSIB, TSID, TSIJ, TSIP, TSIS, TSIV,
|
SVG, TSI0, TSI1, TSI2, TSI3, TSI5, TSIB, TSID, TSIJ, TSIP, TSIS,
|
||||||
VDMX, VORG, avar, cmap, cvt, feat, fpgm, fvar, gasp, glyf, gvar,
|
TSIV, VDMX, VORG, VVAR, avar, cmap, cvt, feat, fpgm, fvar, gasp,
|
||||||
hdmx, head, hhea, hmtx, kern, loca, ltag, maxp, meta, name, post,
|
glyf, gvar, hdmx, head, hhea, hmtx, kern, loca, ltag, maxp, meta,
|
||||||
prep, sbix, trak, vhea and vmtx
|
name, post, prep, sbix, trak, vhea and vmtx
|
||||||
<!-- end table list -->
|
<!-- end table list -->
|
||||||
Other tables are dumped as hexadecimal data.
|
Other tables are dumped as hexadecimal data.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user