Skip to content

Commit e15c7d1

Browse files
committed
pcf: Optimize memory allocations
1 parent 84bf520 commit e15c7d1

File tree

1 file changed

+28
-18
lines changed

1 file changed

+28
-18
lines changed

adafruit_bitmap_font/pcf.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def __init__(self, f, bitmap_class):
7171
self.file = f
7272
self.name = f
7373
f.seek(0)
74+
self.buffer = bytearray(1)
7475
self.bitmap_class = bitmap_class
7576
header, table_count = self.read("<4sI")
7677
self.tables = {}
@@ -106,7 +107,10 @@ def get_bounding_box(self):
106107

107108
def read(self, format):
108109
s = struct.calcsize(format)
109-
return struct.unpack_from(format, self.file.read(s))
110+
if s != len(self.buffer):
111+
self.buffer = bytearray(s)
112+
self.file.readinto(self.buffer)
113+
return struct.unpack_from(format, self.buffer)
110114

111115
def seek_table(self, table):
112116
self.file.seek(table.offset)
@@ -117,10 +121,6 @@ def seek_table(self, table):
117121

118122
return format
119123

120-
def seek_glyph(self, idx):
121-
encoding = self.tables[_PCF_BDF_ENCODINGS]
122-
self.seek_table(encoding)
123-
124124
def read_encoding_table(self):
125125
encoding = self.tables[_PCF_BDF_ENCODINGS]
126126
self.seek_table(encoding)
@@ -261,7 +261,6 @@ def load_glyphs(self, code_points):
261261
code_points = sorted(
262262
c for c in code_points if self._glyphs.get(c, None) is None
263263
)
264-
265264
if not code_points:
266265
return
267266

@@ -316,6 +315,28 @@ def load_glyphs(self, code_points):
316315
(bitmap_offset,) = self.read(">I")
317316
bitmap_offsets[i] = bitmap_offset
318317

318+
# Batch creation of glyphs and bitmaps so that we need only gc.collect
319+
# once
320+
gc.collect()
321+
bitmaps = [None] * len(code_points)
322+
for i in range(len(all_metrics)):
323+
metrics = all_metrics[i]
324+
if metrics is not None:
325+
shift = metrics.character_width
326+
width = metrics.right_side_bearing - metrics.left_side_bearing
327+
height = metrics.character_ascent + metrics.character_descent
328+
bitmap = bitmaps[i] = self.bitmap_class(width, height, 2)
329+
self._glyphs[code_points[i]] = Glyph(
330+
bitmap,
331+
0,
332+
width,
333+
height,
334+
metrics.left_side_bearing,
335+
-metrics.character_descent,
336+
metrics.character_width,
337+
0,
338+
)
339+
319340
for i, code_point in enumerate(code_points):
320341
metrics = all_metrics[i]
321342
if metrics is None:
@@ -325,18 +346,7 @@ def load_glyphs(self, code_points):
325346
width = metrics.right_side_bearing - metrics.left_side_bearing
326347
height = metrics.character_ascent + metrics.character_descent
327348

328-
gc.collect()
329-
bitmap = self.bitmap_class(width, height, 2)
330-
self._glyphs[code_point] = Glyph(
331-
bitmap,
332-
0,
333-
width,
334-
height,
335-
metrics.left_side_bearing,
336-
-metrics.character_descent,
337-
metrics.character_width,
338-
0,
339-
)
349+
bitmap = bitmaps[i]
340350
words_per_row = (width + 31) // 32
341351
buf = bytearray(4 * words_per_row)
342352
start = 0

0 commit comments

Comments
 (0)