diff --git a/PIL/DdsImagePlugin.py b/PIL/DdsImagePlugin.py index 2ebfdf03752..dd048a32ffa 100644 --- a/PIL/DdsImagePlugin.py +++ b/PIL/DdsImagePlugin.py @@ -233,31 +233,49 @@ def _open(self): bitcount, rmask, gmask, bmask, amask = struct.unpack("<5I", header.read(20)) - self.tile = [ - ("raw", (0, 0) + self.size, 0, (self.mode, 0, 1)) - ] if fourcc == b"DXT1": - self.pixel_format = "DXT1" + self.decoder = "DXT1" codec = _dxt1 elif fourcc == b"DXT5": - self.pixel_format = "DXT5" + self.decoder = "DXT5" codec = _dxt5 else: raise NotImplementedError("Unimplemented pixel format %r" % (fourcc)) + self.tile = [ + (self.decoder, (0, 0) + self.size, 0, (self.mode, 0, 1)) + ] + + + def load_seek(self, pos): + pass + + +class DXT1Decoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer): try: - decoded_data = codec(self.fp, self.width, self.height) + self.set_as_raw(_dxt1(self.fd, self.state.xsize, self.state.ysize)) except struct.error: raise IOError("Truncated DDS file") - finally: - self.fp.close() + + return 0,0 - self.fp = BytesIO(decoded_data) +class DXT5Decoder(ImageFile.PyDecoder): + _pulls_fd = True - def load_seek(self, pos): - pass + def decode(self, buffer): + try: + self.set_as_raw(_dxt5(self.fd, self.state.xsize, self.state.ysize)) + except struct.error: + raise IOError("Truncated DDS file") + return 0,0 + +Image.register_decoder('DXT1', DXT1Decoder) +Image.register_decoder('DXT5', DXT5Decoder) def _validate(prefix): diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index a4442a2e8e5..8e31f1b947e 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -89,7 +89,8 @@ def test_short_file(self): img_file = f.read() def short_file(): - Image.open(BytesIO(img_file[:-100])) + im = Image.open(BytesIO(img_file[:-100])) + im.load() self.assertRaises(IOError, short_file)