@@ -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