mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-26 01:46:18 +03:00
Merge pull request #7603 from sambvfx/bc4-dds
Added support for reading DX10 BC4 DDS images
This commit is contained in:
commit
b3f374333b
BIN
Tests/images/bc4_typeless.dds
Normal file
BIN
Tests/images/bc4_typeless.dds
Normal file
Binary file not shown.
BIN
Tests/images/bc4_unorm.dds
Normal file
BIN
Tests/images/bc4_unorm.dds
Normal file
Binary file not shown.
BIN
Tests/images/bc4_unorm.png
Normal file
BIN
Tests/images/bc4_unorm.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 982 B |
|
@ -12,6 +12,8 @@ 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_DXT5 = "Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds"
|
||||||
TEST_FILE_ATI1 = "Tests/images/ati1.dds"
|
TEST_FILE_ATI1 = "Tests/images/ati1.dds"
|
||||||
TEST_FILE_ATI2 = "Tests/images/ati2.dds"
|
TEST_FILE_ATI2 = "Tests/images/ati2.dds"
|
||||||
|
TEST_FILE_DX10_BC4_TYPELESS = "Tests/images/bc4_typeless.dds"
|
||||||
|
TEST_FILE_DX10_BC4_UNORM = "Tests/images/bc4_unorm.dds"
|
||||||
TEST_FILE_DX10_BC5_TYPELESS = "Tests/images/bc5_typeless.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_UNORM = "Tests/images/bc5_unorm.dds"
|
||||||
TEST_FILE_DX10_BC5_SNORM = "Tests/images/bc5_snorm.dds"
|
TEST_FILE_DX10_BC5_SNORM = "Tests/images/bc5_snorm.dds"
|
||||||
|
@ -82,6 +84,27 @@ def test_sanity_ati1():
|
||||||
assert_image_equal_tofile(im, TEST_FILE_ATI1.replace(".dds", ".png"))
|
assert_image_equal_tofile(im, TEST_FILE_ATI1.replace(".dds", ".png"))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"image_path",
|
||||||
|
(
|
||||||
|
TEST_FILE_DX10_BC4_UNORM,
|
||||||
|
# hexeditted to be typeless
|
||||||
|
TEST_FILE_DX10_BC4_TYPELESS,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
def test_dx10_bc4(image_path):
|
||||||
|
"""Check DX10 BC4 images can be opened"""
|
||||||
|
|
||||||
|
with Image.open(image_path) as im:
|
||||||
|
im.load()
|
||||||
|
|
||||||
|
assert im.format == "DDS"
|
||||||
|
assert im.mode == "L"
|
||||||
|
assert im.size == (64, 64)
|
||||||
|
|
||||||
|
assert_image_equal_tofile(im, TEST_FILE_DX10_BC4_UNORM.replace(".dds", ".png"))
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"image_path",
|
"image_path",
|
||||||
(
|
(
|
||||||
|
|
|
@ -98,6 +98,8 @@ DXT5_FOURCC = 0x35545844
|
||||||
DXGI_FORMAT_R8G8B8A8_TYPELESS = 27
|
DXGI_FORMAT_R8G8B8A8_TYPELESS = 27
|
||||||
DXGI_FORMAT_R8G8B8A8_UNORM = 28
|
DXGI_FORMAT_R8G8B8A8_UNORM = 28
|
||||||
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29
|
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29
|
||||||
|
DXGI_FORMAT_BC4_TYPELESS = 79
|
||||||
|
DXGI_FORMAT_BC4_UNORM = 80
|
||||||
DXGI_FORMAT_BC5_TYPELESS = 82
|
DXGI_FORMAT_BC5_TYPELESS = 82
|
||||||
DXGI_FORMAT_BC5_UNORM = 83
|
DXGI_FORMAT_BC5_UNORM = 83
|
||||||
DXGI_FORMAT_BC5_SNORM = 84
|
DXGI_FORMAT_BC5_SNORM = 84
|
||||||
|
@ -190,7 +192,11 @@ class DdsImageFile(ImageFile.ImageFile):
|
||||||
# ignoring flags which pertain to volume textures and cubemaps
|
# ignoring flags which pertain to volume textures and cubemaps
|
||||||
(dxgi_format,) = struct.unpack("<I", self.fp.read(4))
|
(dxgi_format,) = struct.unpack("<I", self.fp.read(4))
|
||||||
self.fp.read(16)
|
self.fp.read(16)
|
||||||
if dxgi_format in (DXGI_FORMAT_BC5_TYPELESS, DXGI_FORMAT_BC5_UNORM):
|
if dxgi_format in (DXGI_FORMAT_BC4_TYPELESS, DXGI_FORMAT_BC4_UNORM):
|
||||||
|
self.pixel_format = "BC4"
|
||||||
|
n = 4
|
||||||
|
self._mode = "L"
|
||||||
|
elif dxgi_format in (DXGI_FORMAT_BC5_TYPELESS, DXGI_FORMAT_BC5_UNORM):
|
||||||
self.pixel_format = "BC5"
|
self.pixel_format = "BC5"
|
||||||
n = 5
|
n = 5
|
||||||
self._mode = "RGB"
|
self._mode = "RGB"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user