@@ -288,15 +288,12 @@ def _open(self):
288288 self .fp .seek (2 , os .SEEK_CUR )
289289 self ._size = struct .unpack ("<II" , self .fp .read (8 ))
290290
291- if self .magic == b"BLP1" :
292- decoder = "BLP1"
293- self .mode = "RGB"
294- elif self .magic == b"BLP2" :
295- decoder = "BLP2"
296- self .mode = "RGBA" if self ._blp_alpha_depth else "RGB"
291+ if self .magic in (b"BLP1" , b"BLP2" ):
292+ decoder = self .magic .decode ()
297293 else :
298294 raise BLPFormatError (f"Bad BLP magic { repr (self .magic )} " )
299295
296+ self .mode = "RGBA" if self ._blp_alpha_depth else "RGB"
300297 self .tile = [(decoder , (0 , 0 ) + self .size , 0 , (self .mode , 0 , 1 ))]
301298
302299
@@ -311,19 +308,6 @@ def decode(self, buffer):
311308 raise OSError ("Truncated BLP file" ) from e
312309 return 0 , 0
313310
314- def _safe_read (self , length ):
315- return ImageFile ._safe_read (self .fd , length )
316-
317- def _read_palette (self ):
318- ret = []
319- for i in range (256 ):
320- try :
321- b , g , r , a = struct .unpack ("<4B" , self ._safe_read (4 ))
322- except struct .error :
323- break
324- ret .append ((b , g , r , a ))
325- return ret
326-
327311 def _read_blp_header (self ):
328312 self .fd .seek (4 )
329313 (self ._blp_compression ,) = struct .unpack ("<i" , self ._safe_read (4 ))
@@ -343,6 +327,34 @@ def _read_blp_header(self):
343327 self ._blp_offsets = struct .unpack ("<16I" , self ._safe_read (16 * 4 ))
344328 self ._blp_lengths = struct .unpack ("<16I" , self ._safe_read (16 * 4 ))
345329
330+ def _safe_read (self , length ):
331+ return ImageFile ._safe_read (self .fd , length )
332+
333+ def _read_palette (self ):
334+ ret = []
335+ for i in range (256 ):
336+ try :
337+ b , g , r , a = struct .unpack ("<4B" , self ._safe_read (4 ))
338+ except struct .error :
339+ break
340+ ret .append ((b , g , r , a ))
341+ return ret
342+
343+ def _read_bgra (self , palette ):
344+ data = bytearray ()
345+ _data = BytesIO (self ._safe_read (self ._blp_lengths [0 ]))
346+ while True :
347+ try :
348+ (offset ,) = struct .unpack ("<B" , _data .read (1 ))
349+ except struct .error :
350+ break
351+ b , g , r , a = palette [offset ]
352+ d = (r , g , b )
353+ if self ._blp_alpha_depth :
354+ d += (a ,)
355+ data .extend (d )
356+ return data
357+
346358
347359class BLP1Decoder (_BLPBaseDecoder ):
348360 def _load (self ):
@@ -351,17 +363,8 @@ def _load(self):
351363
352364 elif self ._blp_compression == 1 :
353365 if self ._blp_encoding in (4 , 5 ):
354- data = bytearray ()
355366 palette = self ._read_palette ()
356- _data = BytesIO (self ._safe_read (self ._blp_lengths [0 ]))
357- while True :
358- try :
359- (offset ,) = struct .unpack ("<B" , _data .read (1 ))
360- except struct .error :
361- break
362- b , g , r , a = palette [offset ]
363- data .extend ([r , g , b ])
364-
367+ data = self ._read_bgra (palette )
365368 self .set_as_raw (bytes (data ))
366369 else :
367370 raise BLPFormatError (
@@ -392,26 +395,16 @@ class BLP2Decoder(_BLPBaseDecoder):
392395 def _load (self ):
393396 palette = self ._read_palette ()
394397
395- data = bytearray ()
396398 self .fd .seek (self ._blp_offsets [0 ])
397399
398400 if self ._blp_compression == 1 :
399401 # Uncompressed or DirectX compression
400402
401403 if self ._blp_encoding == Encoding .UNCOMPRESSED :
402- _data = BytesIO (self ._safe_read (self ._blp_lengths [0 ]))
403- while True :
404- try :
405- (offset ,) = struct .unpack ("<B" , _data .read (1 ))
406- except struct .error :
407- break
408- b , g , r , a = palette [offset ]
409- d = (r , g , b )
410- if self ._blp_alpha_depth :
411- d += (a ,)
412- data .extend (d )
404+ data = self ._read_bgra (palette )
413405
414406 elif self ._blp_encoding == Encoding .DXT :
407+ data = bytearray ()
415408 if self ._blp_alpha_encoding == AlphaEncoding .DXT1 :
416409 linesize = (self .size [0 ] + 3 ) // 4 * 8
417410 for yb in range ((self .size [1 ] + 3 ) // 4 ):
0 commit comments