Skip to content

Commit edc6c3d

Browse files
committed
Use maxval instead of unreliable 32-bit specific behaviour
1 parent e3b53dc commit edc6c3d

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

src/PIL/PpmImagePlugin.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ def _open(self):
100100
elif magic_number in (b"P3", b"P6"):
101101
self.custom_mimetype = "image/x-portable-pixmap"
102102

103+
maxval = None
103104
for ix in range(3):
104105
token = int(self._read_token())
105106
if ix == 0: # token is the x size
@@ -127,10 +128,9 @@ def _open(self):
127128
decoder_name = "raw"
128129
if magic_number in (b"P1", b"P2", b"P3"):
129130
decoder_name = "ppm_plain"
131+
args = (rawmode, 0, 1) if decoder_name == "raw" else (rawmode, maxval)
130132
self._size = xsize, ysize
131-
self.tile = [
132-
(decoder_name, (0, 0, xsize, ysize), self.fp.tell(), (rawmode, 0, 1))
133-
]
133+
self.tile = [(decoder_name, (0, 0, xsize, ysize), self.fp.tell(), args)]
134134

135135

136136
#
@@ -201,10 +201,8 @@ def _decode_bitonal(self):
201201
invert = bytes.maketrans(b"01", b"\xFF\x00")
202202
return decoded_data.translate(invert)
203203

204-
def _decode_blocks(self, channels=1, depth=8):
204+
def _decode_blocks(self, channels, depth, maxval):
205205
decoded_data = bytearray()
206-
# HACK: 32-bit grayscale uses signed int
207-
maxval = 2 ** (31 if depth == 32 else depth) - 1
208206
max_len = 10
209207
bytes_per_sample = depth // 8
210208
total_bytes = self.state.xsize * self.state.ysize * channels * bytes_per_sample
@@ -256,20 +254,20 @@ def _decode_blocks(self, channels=1, depth=8):
256254
return decoded_data
257255

258256
def decode(self, buffer):
259-
rawmode = self.args[0]
257+
rawmode, maxval = self.args
260258

261259
if self.mode == "1":
262260
decoded_data = self._decode_bitonal()
263261
rawmode = "1;8"
264262
elif self.mode == "L":
265-
decoded_data = self._decode_blocks(channels=1, depth=8)
263+
decoded_data = self._decode_blocks(1, 8, maxval)
266264
elif self.mode == "I":
267265
if rawmode == "I;16B":
268-
decoded_data = self._decode_blocks(channels=1, depth=16)
266+
decoded_data = self._decode_blocks(1, 16, maxval)
269267
elif rawmode == "I;32B":
270-
decoded_data = self._decode_blocks(channels=1, depth=32)
268+
decoded_data = self._decode_blocks(1, 32, maxval)
271269
elif self.mode == "RGB":
272-
decoded_data = self._decode_blocks(channels=3, depth=8)
270+
decoded_data = self._decode_blocks(3, 8, maxval)
273271

274272
self.set_as_raw(bytes(decoded_data), rawmode)
275273
return -1, 0

0 commit comments

Comments
 (0)