[CFF2Index] Make even faster

Load offsets on-demand as well.
This commit is contained in:
Behdad Esfahbod 2023-12-16 12:50:57 -07:00
parent feb6820d03
commit 7de1306d92

View File

@ -1847,16 +1847,19 @@ class CFF2Index(BaseConverter):
if count == 0: if count == 0:
return [] return []
offSize = reader.readUInt8() offSize = reader.readUInt8()
readArray = {
1: reader.readUInt8Array, def getReadArray(reader, offSize):
2: reader.readUShortArray, return {
3: reader.readUInt24Array, 1: reader.readUInt8Array,
4: reader.readULongArray, 2: reader.readUShortArray,
}[offSize] 3: reader.readUInt24Array,
offsets = readArray(count + 1) 4: reader.readULongArray,
}[offSize]
readArray = getReadArray(reader, offSize)
lazy = font.lazy is not False and count > 8 lazy = font.lazy is not False and count > 8
if not lazy: if not lazy:
offsets = readArray(count + 1)
items = [] items = []
lastOffset = offsets.pop(0) lastOffset = offsets.pop(0)
reader.readData(lastOffset) # In case first offset is not 0 reader.readData(lastOffset) # In case first offset is not 0
@ -1875,8 +1878,10 @@ class CFF2Index(BaseConverter):
return items return items
else: else:
def read_item(self, i): def read_item(self, i):
self.reader.seek(self.pos + self.offsets[i]) self.reader.seek(self.offset_pos + i * self.offSize)
item = self.reader.readData(self.offsets[i + 1] - self.offsets[i]) 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: if self.itemClass is not None:
obj = self.itemClass() obj = self.itemClass()
@ -1885,12 +1890,16 @@ class CFF2Index(BaseConverter):
return item return item
l = _LazyList(read_item for i in range(count)) l = _LazyList([read_item] * count)
l.reader = reader.copy() 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.font = font
l.itemClass = self.itemClass l.itemClass = self.itemClass
l.offsets = offsets l.offSize = offSize
l.readArray = getReadArray(l.reader, offSize)
# TODO: Advance reader
return l return l