Micro-optimize cmap subtable format 4 loading

This commit is contained in:
Behdad Esfahbod 2014-05-14 00:08:15 -04:00
parent 0d182bfb80
commit 2db5eca0df

View File

@ -665,18 +665,22 @@ class cmap_format_4(CmapSubtable):
charCodes = []
gids = []
for i in range(len(startCode) - 1): # don't do 0xffff!
start = startCode[i]
delta = idDelta[i]
rangeOffset = idRangeOffset[i]
# *someone* needs to get killed.
partial = rangeOffset // 2 - start + i - len(idRangeOffset)
rangeCharCodes = list(range(startCode[i], endCode[i] + 1))
charCodes.extend(rangeCharCodes)
for charCode in rangeCharCodes:
rangeOffset = idRangeOffset[i]
if rangeOffset == 0:
glyphID = charCode + idDelta[i]
glyphID = charCode + delta
else:
# *someone* needs to get killed.
index = rangeOffset // 2 + (charCode - startCode[i]) + i - len(idRangeOffset)
index = charCode + partial
assert (index < lenGIArray), "In format 4 cmap, range (%d), the calculated index (%d) into the glyph index array is not less than the length of the array (%d) !" % (i, index, lenGIArray)
if glyphIndexArray[index] != 0: # if not missing glyph
glyphID = glyphIndexArray[index] + idDelta[i]
glyphID = glyphIndexArray[index] + delta
else:
glyphID = 0 # missing glyph
gids.append(glyphID % 0x10000)