aboutsummaryrefslogtreecommitdiff
path: root/Lib/fontTools/cffLib/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/fontTools/cffLib/__init__.py')
-rw-r--r--Lib/fontTools/cffLib/__init__.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/Lib/fontTools/cffLib/__init__.py b/Lib/fontTools/cffLib/__init__.py
index 3c5f36df..e9065407 100644
--- a/Lib/fontTools/cffLib/__init__.py
+++ b/Lib/fontTools/cffLib/__init__.py
@@ -831,6 +831,23 @@ class FDSelect(object):
for glyphID in range(prev, first):
gidArray[glyphID] = fd
self.gidArray = gidArray
+ elif self.format == 4:
+ gidArray = [None] * numGlyphs
+ nRanges = readCard32(file)
+ fd = None
+ prev = None
+ for i in range(nRanges):
+ first = readCard32(file)
+ if prev is not None:
+ for glyphID in range(prev, first):
+ gidArray[glyphID] = fd
+ prev = first
+ fd = readCard16(file)
+ if prev is not None:
+ first = readCard32(file)
+ for glyphID in range(prev, first):
+ gidArray[glyphID] = fd
+ self.gidArray = gidArray
else:
assert False, "unsupported FDSelect format: %s" % format
else:
@@ -1001,6 +1018,10 @@ def packCard16(value):
return struct.pack(">H", value)
+def packCard32(value):
+ return struct.pack(">L", value)
+
+
def buildOperatorDict(table):
d = {}
for op, name, arg, default, conv in table:
@@ -1732,6 +1753,27 @@ def packFDSelect3(fdSelectArray):
return bytesjoin(data)
+def packFDSelect4(fdSelectArray):
+ fmt = 4
+ fdRanges = []
+ lenArray = len(fdSelectArray)
+ lastFDIndex = -1
+ for i in range(lenArray):
+ fdIndex = fdSelectArray[i]
+ if lastFDIndex != fdIndex:
+ fdRanges.append([i, fdIndex])
+ lastFDIndex = fdIndex
+ sentinelGID = i + 1
+
+ data = [packCard8(fmt)]
+ data.append(packCard32(len(fdRanges)))
+ for fdRange in fdRanges:
+ data.append(packCard32(fdRange[0]))
+ data.append(packCard16(fdRange[1]))
+ data.append(packCard32(sentinelGID))
+ return bytesjoin(data)
+
+
class FDSelectCompiler(object):
def __init__(self, fdSelect, parent):
@@ -1741,6 +1783,8 @@ class FDSelectCompiler(object):
self.data = packFDSelect0(fdSelectArray)
elif fmt == 3:
self.data = packFDSelect3(fdSelectArray)
+ elif fmt == 4:
+ self.data = packFDSelect4(fdSelectArray)
else:
# choose smaller of the two formats
data0 = packFDSelect0(fdSelectArray)