@@ -489,9 +489,14 @@ class DdsRgbDecoder(ImageFile.PyDecoder):
489489 _pulls_fd = True
490490
491491 def decode (self , buffer : Image .DecoderInput ) -> tuple [int , int ]:
492- assert self .fd is not None
493492 bitcount , masks = self .args
494493
494+ data = bytearray ()
495+ bytecount = bitcount // 8
496+ if not bytecount :
497+ self .set_as_raw (data )
498+ return - 1 , 0
499+
495500 # Some masks will be padded with zeros, e.g. R 0b11 G 0b1100
496501 # Calculate how many zeros each mask is padded with
497502 mask_offsets = []
@@ -505,11 +510,13 @@ def decode(self, buffer: Image.DecoderInput) -> tuple[int, int]:
505510 mask_offsets .append (offset )
506511 mask_totals .append (mask >> offset )
507512
508- data = bytearray ()
509- bytecount = bitcount // 8
513+ assert self .fd is not None
510514 dest_length = self .state .xsize * self .state .ysize * len (masks )
511515 while len (data ) < dest_length :
512- value = int .from_bytes (self .fd .read (bytecount ), "little" )
516+ bytes_read = self .fd .read (bytecount )
517+ if len (bytes_read ) < bytecount :
518+ break
519+ value = int .from_bytes (bytes_read , "little" )
513520 for i , mask in enumerate (masks ):
514521 masked_value = value & mask
515522 # Remove the zero padding, and scale it to 8 bits
0 commit comments