From b9a71cafbc35692999c96910c299cfb272d7c75a Mon Sep 17 00:00:00 2001 From: Jerome Leclanche Date: Tue, 5 Jan 2016 13:39:15 +0200 Subject: [PATCH 01/13] Add a basic DDS image plugin Only supports DXT1 and DXT5 for now. The pixel formats ideally should be supported in decode.c instead, but for now this is good enough. Fixes #252 --- CHANGES.rst | 2 + PIL/DdsImagePlugin.py | 253 +++++++++++++++++++++++++++ PIL/__init__.py | 1 + docs/handbook/image-file-formats.rst | 16 +- 4 files changed, 269 insertions(+), 3 deletions(-) create mode 100644 PIL/DdsImagePlugin.py diff --git a/CHANGES.rst b/CHANGES.rst index 23fb56983..96ed4f16c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,6 +6,8 @@ Changelog (Pillow) - Fix incorrect conditional in encode.c #1638 [manisandro] +- Add a basic read-only DDS plugin #252 + [jleclanche] 3.1.0 (2016-01-04) ------------------ diff --git a/PIL/DdsImagePlugin.py b/PIL/DdsImagePlugin.py new file mode 100644 index 000000000..3ca6c7409 --- /dev/null +++ b/PIL/DdsImagePlugin.py @@ -0,0 +1,253 @@ +""" +A Pillow loader for .dds files (S3TC-compressed aka DXTC) +Jerome Leclanche + +Documentation: + http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ +""" + +import struct +from io import BytesIO +from PIL import Image, ImageFile + + +# Magic ("DDS ") +DDS_MAGIC = 0x20534444 + +# DDS flags +DDSD_CAPS = 0x1 +DDSD_HEIGHT = 0x2 +DDSD_WIDTH = 0x4 +DDSD_PITCH = 0x8 +DDSD_PIXELFORMAT = 0x1000 +DDSD_MIPMAPCOUNT = 0x20000 +DDSD_LINEARSIZE = 0x80000 +DDSD_DEPTH = 0x800000 + +# DDS caps +DDSCAPS_COMPLEX = 0x8 +DDSCAPS_TEXTURE = 0x1000 +DDSCAPS_MIPMAP = 0x400000 + +DDSCAPS2_CUBEMAP = 0x200 +DDSCAPS2_CUBEMAP_POSITIVEX = 0x400 +DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800 +DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000 +DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000 +DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000 +DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000 +DDSCAPS2_VOLUME = 0x200000 + +# Pixel Format +DDPF_ALPHAPIXELS = 0x1 +DDPF_ALPHA = 0x2 +DDPF_FOURCC = 0x4 +DDPF_PALETTEINDEXED8 = 0x20 +DDPF_RGB = 0x40 +DDPF_LUMINANCE = 0x20000 + + +# dds.h + +DDS_FOURCC = DDPF_FOURCC +DDS_RGB = DDPF_RGB +DDS_RGBA = DDPF_RGB | DDPF_ALPHAPIXELS +DDS_LUMINANCE = DDPF_LUMINANCE +DDS_LUMINANCEA = DDPF_LUMINANCE | DDPF_ALPHAPIXELS +DDS_ALPHA = DDPF_ALPHA +DDS_PAL8 = DDPF_PALETTEINDEXED8 + +DDS_HEADER_FLAGS_TEXTURE = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT +DDS_HEADER_FLAGS_MIPMAP = DDSD_MIPMAPCOUNT +DDS_HEADER_FLAGS_VOLUME = DDSD_DEPTH +DDS_HEADER_FLAGS_PITCH = DDSD_PITCH +DDS_HEADER_FLAGS_LINEARSIZE = DDSD_LINEARSIZE + +DDS_HEIGHT = DDSD_HEIGHT +DDS_WIDTH = DDSD_WIDTH + +DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS_TEXTURE +DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS_COMPLEX | DDSCAPS_MIPMAP +DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS_COMPLEX + +DDS_CUBEMAP_POSITIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX +DDS_CUBEMAP_NEGATIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX +DDS_CUBEMAP_POSITIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY +DDS_CUBEMAP_NEGATIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY +DDS_CUBEMAP_POSITIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ +DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ + + +# DXT1 +DXT1_FOURCC = 0x31545844 + +# DXT3 +DXT3_FOURCC = 0x33545844 + +# DXT5 +DXT5_FOURCC = 0x35545844 + + +def decode565(bits): + a = ((bits >> 11) & 0x1f) << 3 + b = ((bits >> 5) & 0x3f) << 2 + c = (bits & 0x1f) << 3 + return a, b, c + + +def _c2a(a, b): + return (2 * a + b) // 3 + +def _c2b(a, b): + return (a + b) // 2 + +def _c3(a, b): + return (2 * b + a) // 3 + + +def dxt1(data, width, height): + ret = bytearray(4 * width * height) + + for y in range(0, height, 4): + for x in range(0, width, 4): + color0, color1, bits = struct.unpack("> 2 + if control == 0: + r, g, b = r0, g0, b0 + elif control == 1: + r, g, b = r1, g1, b1 + elif control == 2: + if color0 > color1: + r, g, b = _c2a(r0, r1), _c2a(g0, g1), _c2a(b0, b1) + else: + r, g, b = _c2b(r0, r1), _c2b(g0, g1), _c2b(b0, b1) + elif control == 3: + if color0 > color1: + r, g, b = _c3(r0, r1), _c3(g0, g1), _c3(b0, b1) + else: + r, g, b = 0, 0, 0 + + idx = 4 * ((y + j) * width + (x + i)) + ret[idx:idx+4] = bytes([r, g, b, 0xff]) + + return bytes(ret) + + +def _dxtc_alpha(a0, a1, ac0, ac1, ai): + if ai <= 12: + ac = (ac0 >> ai) & 7 + elif ai == 15: + ac = (ac0 >> 15) | ((ac1 << 1) & 6) + else: + ac = (ac1 >> (ai - 16)) & 7 + + if ac == 0: + alpha = a0 + elif ac == 1: + alpha = a1 + elif a0 > a1: + alpha = ((8 - ac) * a0 + (ac - 1) * a1) // 7 + elif ac == 6: + alpha = 0 + elif ac == 7: + alpha = 0xff + else: + alpha = ((6 - ac) * a0 + (ac - 1) * a1) // 5 + + return alpha + + +def dxt5(data, width, height): + ret = bytearray(4 * width * height) + + for y in range(0, height, 4): + for x in range(0, width, 4): + a0, a1, ac0, ac1, c0, c1, code = struct.unpack("<2BHI2HI", data.read(16)) + + r0, g0, b0 = decode565(c0) + r1, g1, b1 = decode565(c1) + + for j in range(4): + for i in range(4): + ai = 3 * (4 * j + i) + alpha = _dxtc_alpha(a0, a1, ac0, ac1, ai) + + cc = (code >> 2 * (4 * j + i)) & 3 + if cc == 0: + r, g, b = r0, g0, b0 + elif cc == 1: + r, g, b = r1, g1, b1 + elif cc == 2: + r, g, b = _c2a(r0, r1), _c2a(g0, g1), _c2a(b0, b1) + elif cc == 3: + r, g, b = _c3(r0, r1), _c3(g0, g1), _c3(b0, b1) + + idx = 4 * ((y + j) * width + (x + i)) + ret[idx:idx+4] = bytes([r, g, b, alpha]) + + return bytes(ret) + + +class DdsImageFile(ImageFile.ImageFile): + format = "DDS" + format_description = "DirectDraw Surface" + + def _open(self): + magic, header_size = struct.unpack(" Date: Wed, 6 Jan 2016 10:59:37 +0200 Subject: [PATCH 02/13] Test DdsImagePlugin --- Tests/test_file_dds.py | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Tests/test_file_dds.py diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py new file mode 100644 index 000000000..a68e2884a --- /dev/null +++ b/Tests/test_file_dds.py @@ -0,0 +1,55 @@ +from helper import unittest, PillowTestCase + +from PIL import Image, DdsImagePlugin + +TEST_FILE_DXT1 = "Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.dds" +TEST_FILE_DXT5 = "Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds" + + +class TestFileCur(PillowTestCase): + + def test_sanity_dxt1(self): + im = Image.open(TEST_FILE_DXT1) + + self.assertEqual(im.size, (256, 256)) + self.assertIsInstance(im, DdsImagePlugin.DdsImageFile) + # Check some pixel colors to ensure image is loaded properly + self.assertEqual(im.getpixel((10, 1)), (49, 50, 53, 44)) + self.assertEqual(im.getpixel((11, 1)), (32, 50, 53, 53)) + self.assertEqual(im.getpixel((16, 16)), (91, 48, 44, 32)) + + def test_sanity_dxt5(self): + im = Image.open(TEST_FILE_DXT5) + + self.assertEqual(im.size, (256, 256)) + self.assertIsInstance(im, DdsImagePlugin.DdsImageFile) + # Check some pixel colors to ensure image is loaded properly + self.assertEqual(im.getpixel((10, 1)), (49, 50, 53, 44)) + self.assertEqual(im.getpixel((11, 1)), (32, 49, 50, 56)) + self.assertEqual(im.getpixel((16, 16)), (91, 48, 44, 32)) + + def test__validate_true(self): + # Arrange + prefix = b"DDS etc" + + # Act + output = DdsImagePlugin._validate(prefix) + + # Assert + self.assertTrue(output) + + def test__validate_false(self): + # Arrange + prefix = b"something invalid" + + # Act + output = DdsImagePlugin._validate(prefix) + + # Assert + self.assertFalse(output) + + +if __name__ == '__main__': + unittest.main() + +# End of file From 3515cf82b7c059df773a7c53a928e94a72885d9e Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 6 Jan 2016 11:00:08 +0200 Subject: [PATCH 03/13] Test images from https://github.com/python-pillow/Pillow/pull/1644#issuecomment-169101551 --- .../images/dxt1-rgb-4bbp-noalpha_MipMaps-1.dds | Bin 0 -> 32896 bytes ...t5-argb-8bbp-interpolatedalpha_MipMaps-1.dds | Bin 0 -> 65664 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.dds create mode 100755 Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds diff --git a/Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.dds b/Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.dds new file mode 100755 index 0000000000000000000000000000000000000000..7e12460c48c22ca10418ebad49ba2e4cd22d7f1c GIT binary patch literal 32896 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 literal 0 HcmV?d00001 diff --git a/Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds b/Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds new file mode 100755 index 0000000000000000000000000000000000000000..b2e56d6060429fc743f709dd5cfc42a72c2eab29 GIT binary patch literal 65664 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 KjsHU|G5-SL^XiZQ literal 0 HcmV?d00001 From f826bff3c7f174584f85f620dccd55b26f71d5fa Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 6 Jan 2016 11:24:09 +0200 Subject: [PATCH 04/13] Simplify sanity tests --- Tests/test_file_dds.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index a68e2884a..dfc21993a 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -11,22 +11,18 @@ class TestFileCur(PillowTestCase): def test_sanity_dxt1(self): im = Image.open(TEST_FILE_DXT1) + self.assertEqual(im.format, "DDS") + self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (256, 256)) self.assertIsInstance(im, DdsImagePlugin.DdsImageFile) - # Check some pixel colors to ensure image is loaded properly - self.assertEqual(im.getpixel((10, 1)), (49, 50, 53, 44)) - self.assertEqual(im.getpixel((11, 1)), (32, 50, 53, 53)) - self.assertEqual(im.getpixel((16, 16)), (91, 48, 44, 32)) def test_sanity_dxt5(self): im = Image.open(TEST_FILE_DXT5) + self.assertEqual(im.format, "DDS") + self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (256, 256)) self.assertIsInstance(im, DdsImagePlugin.DdsImageFile) - # Check some pixel colors to ensure image is loaded properly - self.assertEqual(im.getpixel((10, 1)), (49, 50, 53, 44)) - self.assertEqual(im.getpixel((11, 1)), (32, 49, 50, 56)) - self.assertEqual(im.getpixel((16, 16)), (91, 48, 44, 32)) def test__validate_true(self): # Arrange From cc0d2a7b94003f0758e462af41b4d491acfda125 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 6 Jan 2016 11:33:24 +0200 Subject: [PATCH 05/13] Include *.dds --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 4fd9c602e..ac7360c93 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -24,6 +24,7 @@ recursive-include Tests *.bmp recursive-include Tests *.bw recursive-include Tests *.cur recursive-include Tests *.dcx +recursive-include Tests *.dds recursive-include Tests *.doc recursive-include Tests *.eps recursive-include Tests *.fli From 02ec83ee64232e98a7cb6fc3e1b475c0325cc337 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 6 Jan 2016 11:57:51 +0200 Subject: [PATCH 06/13] Test image from https://github.com/python-pillow/Pillow/pull/1644#issuecomment-169101551 --- .../dxt3-argb-8bbp-explicitalpha_MipMaps-1.dds | Bin 0 -> 65664 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.dds diff --git a/Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.dds b/Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.dds new file mode 100755 index 0000000000000000000000000000000000000000..8ec3484fa5d8571c45f4bd072eedc8517c00ea1c GIT binary patch literal 65664 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 literal 0 HcmV?d00001 From 517cbbff08042ef8957e7a6a92bbcc1113bcb104 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 6 Jan 2016 11:59:47 +0200 Subject: [PATCH 07/13] Test NotImplementedError --- Tests/test_file_dds.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index dfc21993a..200bebaba 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -3,6 +3,7 @@ from helper import unittest, PillowTestCase from PIL import Image, DdsImagePlugin TEST_FILE_DXT1 = "Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.dds" +TEST_FILE_DXT3 = "Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.dds" TEST_FILE_DXT5 = "Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds" @@ -24,6 +25,10 @@ class TestFileCur(PillowTestCase): self.assertEqual(im.size, (256, 256)) self.assertIsInstance(im, DdsImagePlugin.DdsImageFile) + def test_sanity_dxt3(self): + self.assertRaises(NotImplementedError, + lambda: Image.open(TEST_FILE_DXT3)) + def test__validate_true(self): # Arrange prefix = b"DDS etc" From 9dd68bb0bea1fd383e84be1e713462be3311d010 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 6 Jan 2016 12:07:40 +0200 Subject: [PATCH 08/13] flake8 --- PIL/DdsImagePlugin.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/PIL/DdsImagePlugin.py b/PIL/DdsImagePlugin.py index 3ca6c7409..141c85b3e 100644 --- a/PIL/DdsImagePlugin.py +++ b/PIL/DdsImagePlugin.py @@ -61,7 +61,8 @@ DDS_LUMINANCEA = DDPF_LUMINANCE | DDPF_ALPHAPIXELS DDS_ALPHA = DDPF_ALPHA DDS_PAL8 = DDPF_PALETTEINDEXED8 -DDS_HEADER_FLAGS_TEXTURE = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT +DDS_HEADER_FLAGS_TEXTURE = (DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | + DDSD_PIXELFORMAT) DDS_HEADER_FLAGS_MIPMAP = DDSD_MIPMAPCOUNT DDS_HEADER_FLAGS_VOLUME = DDSD_DEPTH DDS_HEADER_FLAGS_PITCH = DDSD_PITCH @@ -102,9 +103,11 @@ def decode565(bits): def _c2a(a, b): return (2 * a + b) // 3 + def _c2b(a, b): return (a + b) // 2 + def _c3(a, b): return (2 * b + a) // 3 @@ -175,7 +178,8 @@ def dxt5(data, width, height): for y in range(0, height, 4): for x in range(0, width, 4): - a0, a1, ac0, ac1, c0, c1, code = struct.unpack("<2BHI2HI", data.read(16)) + a0, a1, ac0, ac1, c0, c1, code = struct.unpack("<2BHI2HI", + data.read(16)) r0, g0, b0 = decode565(c0) r1, g1, b1 = decode565(c1) @@ -221,7 +225,8 @@ class DdsImageFile(ImageFile.ImageFile): # pixel format pfsize, pfflags = struct.unpack("<2I", header.read(8)) fourcc = header.read(4) - bitcount, rmask, gmask, bmask, amask = struct.unpack("<5I", header.read(20)) + bitcount, rmask, gmask, bmask, amask = struct.unpack("<5I", + header.read(20)) self.tile = [ ("raw", (0, 0) + self.size, 0, (self.mode, 0, 1)) @@ -234,7 +239,8 @@ class DdsImageFile(ImageFile.ImageFile): self.pixel_format = "DXT5" codec = dxt5 else: - raise NotImplementedError("Unimplemented pixel format %r" % (fourcc)) + raise NotImplementedError("Unimplemented pixel format %r" % + (fourcc)) decoded_data = codec(self.fp, self.width, self.height) From 05b22cedd5108e90740ae4660d6c9690d202baf7 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 6 Jan 2016 12:26:58 +0200 Subject: [PATCH 09/13] Add docstrings --- Tests/test_file_dds.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 200bebaba..6914c5f6e 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -7,9 +7,11 @@ TEST_FILE_DXT3 = "Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.dds" TEST_FILE_DXT5 = "Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds" -class TestFileCur(PillowTestCase): +class TestFileDds(PillowTestCase): + """Test DdsImagePlugin""" def test_sanity_dxt1(self): + """Check DXT1 images can be opened""" im = Image.open(TEST_FILE_DXT1) self.assertEqual(im.format, "DDS") @@ -18,6 +20,7 @@ class TestFileCur(PillowTestCase): self.assertIsInstance(im, DdsImagePlugin.DdsImageFile) def test_sanity_dxt5(self): + """Check DXT5 images can be opened""" im = Image.open(TEST_FILE_DXT5) self.assertEqual(im.format, "DDS") @@ -26,10 +29,12 @@ class TestFileCur(PillowTestCase): self.assertIsInstance(im, DdsImagePlugin.DdsImageFile) def test_sanity_dxt3(self): + """Check DXT3 images are not supported""" self.assertRaises(NotImplementedError, lambda: Image.open(TEST_FILE_DXT3)) def test__validate_true(self): + """Check valid prefix""" # Arrange prefix = b"DDS etc" @@ -40,6 +45,7 @@ class TestFileCur(PillowTestCase): self.assertTrue(output) def test__validate_false(self): + """Check invalid prefix""" # Arrange prefix = b"something invalid" From 37b5a39c58bcb916fe691d2eb7dfcc4384b2d9f7 Mon Sep 17 00:00:00 2001 From: hugovk Date: Wed, 6 Jan 2016 20:00:03 +0200 Subject: [PATCH 10/13] Note internal functions and TODOs --- PIL/DdsImagePlugin.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/PIL/DdsImagePlugin.py b/PIL/DdsImagePlugin.py index 141c85b3e..45b514d4c 100644 --- a/PIL/DdsImagePlugin.py +++ b/PIL/DdsImagePlugin.py @@ -93,7 +93,7 @@ DXT3_FOURCC = 0x33545844 DXT5_FOURCC = 0x35545844 -def decode565(bits): +def _decode565(bits): a = ((bits >> 11) & 0x1f) << 3 b = ((bits >> 5) & 0x3f) << 2 c = (bits & 0x1f) << 3 @@ -112,15 +112,16 @@ def _c3(a, b): return (2 * b + a) // 3 -def dxt1(data, width, height): +def _dxt1(data, width, height): + # TODO implement this function as pixel format in decode.c ret = bytearray(4 * width * height) for y in range(0, height, 4): for x in range(0, width, 4): color0, color1, bits = struct.unpack(" Date: Fri, 8 Jan 2016 07:59:18 -0800 Subject: [PATCH 11/13] Correctness tests for DDS --- .../images/dxt1-rgb-4bbp-noalpha_MipMaps-1.png | Bin 0 -> 27769 bytes ...t5-argb-8bbp-interpolatedalpha_MipMaps-1.png | Bin 0 -> 49443 bytes Tests/test_file_dds.py | 10 ++++++++-- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.png create mode 100644 Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.png diff --git a/Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.png b/Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a308f0deffcc38809f680e2afe31ab436e8451fd GIT binary patch literal 27769 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 aQ4#nSI6%TfdIC5AWT Date: Fri, 8 Jan 2016 13:58:19 -0800 Subject: [PATCH 12/13] fixing dds plugin on Py 2.x, relaxing dxt5 test --- PIL/DdsImagePlugin.py | 4 ++-- Tests/test_file_dds.py | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/PIL/DdsImagePlugin.py b/PIL/DdsImagePlugin.py index 45b514d4c..68dfc0690 100644 --- a/PIL/DdsImagePlugin.py +++ b/PIL/DdsImagePlugin.py @@ -145,7 +145,7 @@ def _dxt1(data, width, height): r, g, b = 0, 0, 0 idx = 4 * ((y + j) * width + (x + i)) - ret[idx:idx+4] = bytes([r, g, b, 0xff]) + ret[idx:idx+4] = struct.pack('4B', r, g, b, 255) return bytes(ret) @@ -202,7 +202,7 @@ def _dxt5(data, width, height): r, g, b = _c3(r0, r1), _c3(g0, g1), _c3(b0, b1) idx = 4 * ((y + j) * width + (x + i)) - ret[idx:idx+4] = bytes([r, g, b, alpha]) + ret[idx:idx+4] = struct.pack('4B', r, g, b, alpha) return bytes(ret) diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 57721e976..6a213db8b 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -12,26 +12,37 @@ class TestFileDds(PillowTestCase): def test_sanity_dxt1(self): """Check DXT1 images can be opened""" - im = Image.open(TEST_FILE_DXT1) + target = Image.open(TEST_FILE_DXT1.replace('.dds', '.png')) + im = Image.open(TEST_FILE_DXT1) + im.load() + self.assertEqual(im.format, "DDS") self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (256, 256)) - - target = Image.open(TEST_FILE_DXT1.replace('.dds', '.png')) - target.show() + + # This target image is from the test set of images, and is exact. self.assert_image_equal(target.convert('RGBA'), im) def test_sanity_dxt5(self): """Check DXT5 images can be opened""" + + target = Image.open(TEST_FILE_DXT5.replace('.dds', '.png')) + im = Image.open(TEST_FILE_DXT5) + im.load() self.assertEqual(im.format, "DDS") self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (256, 256)) - - target = Image.open(TEST_FILE_DXT5.replace('.dds', '.png')) - self.assert_image_equal(target, im) + + # Imagemagick, which generated this target image from the .dds + # has a slightly different decoder than is standard. It looks + # a little brighter. The 0,0 pixel is (00,6c,f8,ff) by our code, + # and by the target image for the DXT1, and the imagemagick .png + # is giving (00, 6d, ff, ff). So, assert similar, pretty tight + # I'm currently seeing about a 3 for the epsilon. + self.assert_image_similar(target, im, 5) def test_sanity_dxt3(self): From b0d15c9b8dd9b59266281debcbd3a0c8a642c6e6 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 15 Jan 2016 21:34:36 +0000 Subject: [PATCH 13/13] Catch truncated DDS files --- PIL/DdsImagePlugin.py | 18 +++++++++++++----- Tests/test_file_dds.py | 24 ++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/PIL/DdsImagePlugin.py b/PIL/DdsImagePlugin.py index 68dfc0690..86145ca8f 100644 --- a/PIL/DdsImagePlugin.py +++ b/PIL/DdsImagePlugin.py @@ -215,8 +215,11 @@ class DdsImageFile(ImageFile.ImageFile): magic, header_size = struct.unpack("