diff --git a/Tests/images/bc5_typeless.dds b/Tests/images/bc5_typeless.dds new file mode 100644 index 000000000..b5bae52bb Binary files /dev/null and b/Tests/images/bc5_typeless.dds differ diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 08f200f9a..dffdf4c45 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -10,6 +10,7 @@ from .helper import assert_image_equal, assert_image_equal_tofile 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" +TEST_FILE_DX10_BC5_TYPELESS = "Tests/images/bc5_typeless.dds" TEST_FILE_DX10_BC5_UNORM = "Tests/images/bc5_unorm.dds" TEST_FILE_DX10_BC5_SNORM = "Tests/images/bc5_snorm.dds" TEST_FILE_DX10_BC7 = "Tests/images/bc7-argb-8bpp_MipMaps-1.dds" @@ -60,30 +61,23 @@ def test_sanity_dxt5(): assert_image_equal_tofile(im, TEST_FILE_DXT5.replace(".dds", ".png")) -def test_dx10_bc5_unorm(): - """Check DX10 images can be opened""" +@pytest.mark.parametrize( + "image_path", + (TEST_FILE_DX10_BC5_TYPELESS, TEST_FILE_DX10_BC5_UNORM, TEST_FILE_DX10_BC5_SNORM), +) +def test_dx10_bc5(image_path): + """Check DX10 BC5 images can be opened""" - with Image.open(TEST_FILE_DX10_BC5_UNORM) as im: + with Image.open(image_path) as im: im.load() assert im.format == "DDS" assert im.mode == "RGB" assert im.size == (256, 256) - assert_image_equal_tofile(im, TEST_FILE_DX10_BC5_UNORM.replace(".dds", ".png")) - - -def test_dx10_bc5_snorm(): - """Check DX10 images can be opened""" - - with Image.open(TEST_FILE_DX10_BC5_SNORM) as im: - im.load() - - assert im.format == "DDS" - assert im.mode == "RGB" - assert im.size == (256, 256) - - assert_image_equal_tofile(im, TEST_FILE_DX10_BC5_SNORM.replace(".dds", ".png")) + assert_image_equal_tofile( + im, image_path.replace("typeless", "unorm").replace(".dds", ".png") + ) def test_dx10_bc7(): diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index dba4a5d72..21e6e0bd7 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -97,6 +97,7 @@ DXT5_FOURCC = 0x35545844 DXGI_FORMAT_R8G8B8A8_TYPELESS = 27 DXGI_FORMAT_R8G8B8A8_UNORM = 28 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29 +DXGI_FORMAT_BC5_TYPELESS = 82 DXGI_FORMAT_BC5_UNORM = 83 DXGI_FORMAT_BC7_TYPELESS = 97 DXGI_FORMAT_BC7_UNORM = 98 @@ -160,7 +161,7 @@ class DdsImageFile(ImageFile.ImageFile): # ignoring flags which pertain to volume textures and cubemaps dxt10 = BytesIO(self.fp.read(20)) dxgi_format, dimension = struct.unpack("