8000 Use generator expressions to define pdf names · matplotlib/matplotlib@209b1d8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 209b1d8

Browse files
committed
Use generator expressions to define pdf names
Instead of the `self.nextFoo` counters. This way the various name sequences are defined closer together and it's impossible to forget to increment the counters.
1 parent 6c57ffd commit 209b1d8

File tree

1 file changed

+15
-20
lines changed

1 file changed

+15
-20
lines changed

lib/matplotlib/backends/backend_pdf.py

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from datetime import datetime
99
from functools import total_ordering
1010
from io import BytesIO
11+
import itertools
1112
import logging
1213
import math
1314
import os
@@ -424,7 +425,7 @@ class PdfFile:
424425
"""PDF file object."""
425426

426427
def __init__(self, filename, metadata=None):
427-
self.nextObject = 1 # next free object id
428+
self.objectId = itertools.count(1) # consumed by reserveObject
428429
self.xrefTable = [[0, 65535, 'the zero object']]
429430
self.passed_in_file_object = False
430431
self.original_file_like = None
@@ -482,21 +483,21 @@ def __init__(self, filename, metadata=None):
482483
if v is not None}
483484

484485
self.fontNames = {} # maps filenames to internal font names
485-
self.nextFont = 1 # next free internal font name
486+
self.internalFontName = (Name(f'F{i}') for i in itertools.count(1))
486487
self.dviFontInfo = {} # maps dvi font names to embedding information
487488
# differently encoded Type-1 fonts may share the same descriptor
488489
self.type1Descriptors = {}
489490
self.used_characters = {}
490491

491492
self.alphaStates = {} # maps alpha values to graphics state objects
492-
self.nextAlphaState = 1
493+
self.alphaStateName = (Name(f'A{i}') for i in itertools.count(1))
493494
# reproducible writeHatches needs an ordered dict:
494495
self.hatchPatterns = collections.OrderedDict()
495-
self.nextHatch = 1
496+
self.hatchPatternName = (Name(f'H{i}') for i in itertools.count(1))
496497
self.gouraudTriangles = []
497498

498499
self._images = collections.OrderedDict() # reproducible writeImages
499-
self.nextImage = 1
500+
self.imageName = (Name(f'I{i}') for i in itertools.count(1))
500501

501502
self.markers = collections.OrderedDict() # reproducible writeMarkers
502503
self.multi_byte_charprocs = {}
@@ -643,9 +644,8 @@ def fontName(self, fontprop):
643644

644645
Fx = self.fontNames.get(filename)
645646
if Fx is None:
646-
Fx = Name('F%d' % self.nextFont)
647+
Fx = next(self.internalFontName)
647648
self.fontNames[filename] = Fx
648-
self.nextFont += 1
649649
_log.debug('Assigning font %s = %r', Fx, filename)
650650

651651
return Fx
@@ -669,8 +669,7 @@ def dviFontName(self, dvifont):
669669
"the font may lack a Type-1 version"
670670
.format(psfont.psname, dvifont.texname))
671671

672-
pdfname = Name('F%d' % self.nextFont)
673-
self.nextFont += 1
672+
pdfname = next(self.internalFontName)
674673
_log.debug('Assigning font %s = %s (dvi)', pdfname, dvifont.texname)
675674
self.dviFontInfo[dvifont.texname] = types.SimpleNamespace(
676675
dvifont=dvifont,
@@ -1186,8 +1185,7 @@ def alphaState(self, alpha):
11861185
if state is not None:
11871186
return state[0]
11881187

1189-
name = Name('A%d' % self.nextAlphaState)
1190-
self.nextAlphaState += 1
1188+
name = next(self.alphaStateName)
11911189
self.alphaStates[alpha] = \
11921190
(name, {'Type': Name('ExtGState'),
11931191
'CA': alpha[0], 'ca': alpha[1]})
@@ -1207,8 +1205,7 @@ def hatchPattern(self, hatch_style):
12071205
if pattern is not None:
12081206
return pattern
12091207

1210-
name = Name('H%d' % self.nextHatch)
1211-
self.nextHatch += 1
1208+
name = next(self.hatchPatternName)
12121209
self.hatchPatterns[hatch_style] = name
12131210
return name
12141211

@@ -1300,9 +1297,8 @@ def imageObject(self, image):
13001297
if entry is not None:
13011298
return entry[1]
13021299

1303-
name = Name('I%d' % self.nextImage)
1304-
ob = self.reserveObject('image %d' % self.nextImage)
1305-
self.nextImage += 1
1300+
name = next(self.imageName)
1301+
ob = self.reserveObject(f'image {name}')
13061302
self._images[id(image)] = (image, name, ob)
13071303
return name
13081304

@@ -1495,8 +1491,7 @@ def reserveObject(self, name=''):
14951491
the object with writeObject.
14961492
"""
14971493

1498-
id = self.nextObject
1499-
self.nextObject += 1
1494+
id = next(self.objectId)
15001495
self.xrefTable.append([None, 0, name])
15011496
return Reference(id)
15021497

@@ -1510,7 +1505,7 @@ def writeObject(self, object, contents):
15101505
def writeXref(self):
15111506
"""Write out the xref table."""
15121507
self.startxref = self.fh.tell() - self.tell_base
1513-
self.write(b"xref\n0 %d\n" % self.nextObject)
1508+
self.write(b"xref\n0 %d\n" % len(self.xrefTable))
15141509
for i, (offset, generation, name) in enumerate(self.xrefTable):
15151510
if offset is None:
15161511
raise AssertionError(
@@ -1557,7 +1552,7 @@ def writeTrailer(self):
15571552

15581553
self.write(b"trailer\n")
15591554
self.write(pdfRepr(
1560-
{'Size': self.nextObject,
1555+
{'Size': len(self.xrefTable),
15611556
'Root': self.rootObject,
15621557
'Info': self.infoObject}))
15631558
# Could add 'ID'

0 commit comments

Comments
 (0)
0