Skip to content

Commit

Permalink
Merge pull request #4760 from qiankanglai/dds-rgba8888
Browse files Browse the repository at this point in the history
Support raw rgba8888 for dds
  • Loading branch information
hugovk committed Oct 15, 2020
2 parents 7a20ef7 + b5c5987 commit b074d87
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 0 deletions.
Binary file added Tests/images/DXGI_FORMAT_R8G8B8A8_UNORM_SRGB.dds
Binary file not shown.
Binary file added Tests/images/DXGI_FORMAT_R8G8B8A8_UNORM_SRGB.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Tests/images/argb-32bpp_MipMaps-1.dds
Binary file not shown.
Binary file added Tests/images/argb-32bpp_MipMaps-1.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 33 additions & 0 deletions Tests/test_file_dds.py
Expand Up @@ -12,6 +12,8 @@
TEST_FILE_DXT5 = "Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds"
TEST_FILE_DX10_BC7 = "Tests/images/bc7-argb-8bpp_MipMaps-1.dds"
TEST_FILE_DX10_BC7_UNORM_SRGB = "Tests/images/DXGI_FORMAT_BC7_UNORM_SRGB.dds"
TEST_FILE_DX10_R8G8B8A8 = "Tests/images/argb-32bpp_MipMaps-1.dds"
TEST_FILE_DX10_R8G8B8A8_UNORM_SRGB = "Tests/images/DXGI_FORMAT_R8G8B8A8_UNORM_SRGB.dds"
TEST_FILE_UNCOMPRESSED_RGB = "Tests/images/uncompressed_rgb.dds"


Expand Down Expand Up @@ -88,6 +90,37 @@ def test_dx10_bc7_unorm_srgb():
assert_image_equal(target, im)


def test_dx10_r8g8b8a8():
"""Check DX10 images can be opened"""

with Image.open(TEST_FILE_DX10_R8G8B8A8) as im:
im.load()

assert im.format == "DDS"
assert im.mode == "RGBA"
assert im.size == (256, 256)

with Image.open(TEST_FILE_DX10_R8G8B8A8.replace(".dds", ".png")) as target:
assert_image_equal(target, im)


def test_dx10_r8g8b8a8_unorm_srgb():
"""Check DX10 unsigned normalized integer images can be opened"""

with Image.open(TEST_FILE_DX10_R8G8B8A8_UNORM_SRGB) as im:
im.load()

assert im.format == "DDS"
assert im.mode == "RGBA"
assert im.size == (16, 16)
assert im.info["gamma"] == 1 / 2.2

with Image.open(
TEST_FILE_DX10_R8G8B8A8_UNORM_SRGB.replace(".dds", ".png")
) as target:
assert_image_equal(target, im)


def test_unimplemented_dxgi_format():
with pytest.raises(NotImplementedError):
Image.open("Tests/images/unimplemented_dxgi_format.dds")
Expand Down
12 changes: 12 additions & 0 deletions src/PIL/DdsImagePlugin.py
Expand Up @@ -94,6 +94,9 @@

# dxgiformat.h

DXGI_FORMAT_R8G8B8A8_TYPELESS = 27
DXGI_FORMAT_R8G8B8A8_UNORM = 28
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29
DXGI_FORMAT_BC7_TYPELESS = 97
DXGI_FORMAT_BC7_UNORM = 98
DXGI_FORMAT_BC7_UNORM_SRGB = 99
Expand Down Expand Up @@ -157,6 +160,15 @@ def _open(self):
self.pixel_format = "BC7"
self.info["gamma"] = 1 / 2.2
n = 7
elif dxgi_format in (
DXGI_FORMAT_R8G8B8A8_TYPELESS,
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
):
self.tile = [("raw", (0, 0) + self.size, 0, ("RGBA", 0, 1))]
if dxgi_format == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
self.info["gamma"] = 1 / 2.2
return
else:
raise NotImplementedError(
f"Unimplemented DXGI format {dxgi_format}"
Expand Down

0 comments on commit b074d87

Please sign in to comment.