Skip to content

Commit

Permalink
[CFF2Index] Make even faster
Browse files Browse the repository at this point in the history
Load offsets on-demand as well.
  • Loading branch information
behdad committed Dec 16, 2023
1 parent 829e06c commit 34d74fa
Showing 1 changed file with 20 additions and 11 deletions.
31 changes: 20 additions & 11 deletions Lib/fontTools/ttLib/tables/otConverters.py
Expand Up @@ -1846,16 +1846,19 @@ def read(self, reader, font, tableDict):
if count == 0:
return []
offSize = reader.readUInt8()
readArray = {
1: reader.readUInt8Array,
2: reader.readUShortArray,
3: reader.readUInt24Array,
4: reader.readULongArray,
}[offSize]
offsets = readArray(count + 1)

def getReadArray(reader, offSize):
return {
1: reader.readUInt8Array,
2: reader.readUShortArray,
3: reader.readUInt24Array,
4: reader.readULongArray,
}[offSize]
readArray = getReadArray(reader, offSize)

lazy = font.lazy is not False and count > 8
if not lazy:
offsets = readArray(count + 1)
items = []
lastOffset = offsets.pop(0)
reader.readData(lastOffset) # In case first offset is not 0
Expand All @@ -1874,8 +1877,10 @@ def read(self, reader, font, tableDict):
return items
else:
def read_item(self, i):
self.reader.seek(self.pos + self.offsets[i])
item = self.reader.readData(self.offsets[i + 1] - self.offsets[i])
self.reader.seek(self.offset_pos + i * self.offSize)
offsets = self.readArray(2)
self.reader.seek(self.data_pos + offsets[0])
item = self.reader.readData(offsets[1] - offsets[0])

if self.itemClass is not None:
obj = self.itemClass()
Expand All @@ -1886,10 +1891,14 @@ def read_item(self, i):

l = _LazyList(read_item for i in range(count))
l.reader = reader.copy()
l.pos = l.reader.pos
l.offset_pos = l.reader.pos
l.data_pos = l.offset_pos + (count + 1) * offSize
l.font = font
l.itemClass = self.itemClass
l.offsets = offsets
l.offSize = offSize
l.readArray = getReadArray(l.reader, offSize)

# TODO: Advance reader

return l

Expand Down

0 comments on commit 34d74fa

Please sign in to comment.