Skip to content

Commit

Permalink
Converted to use the pure python decoder interface, instead of doing …
Browse files Browse the repository at this point in the history
…all the work in open
  • Loading branch information
wiredfool committed May 31, 2016
1 parent e7e4b98 commit 544267b
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 12 deletions.
40 changes: 29 additions & 11 deletions PIL/DdsImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
3 changes: 2 additions & 1 deletion Tests/test_file_dds.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down

0 comments on commit 544267b

Please sign in to comment.