Pillow/Tests/test_file_vtf.py
2023-12-24 08:45:26 +00:00

124 lines
3.9 KiB
Python

from __future__ import annotations
import pytest
from PIL import Image
from PIL.VtfImagePlugin import (
VtfPF,
_closest_power,
_get_mipmap_count,
_get_texture_size,
)
from .helper import assert_image_equal, assert_image_similar
@pytest.mark.parametrize(
("size", "expected_size"),
[
(8, 8),
(7, 8),
(9, 8),
(192, 256),
(1, 1),
(2000, 2048),
],
)
def test_closest_power(size: int, expected_size: int):
assert _closest_power(size) == expected_size
@pytest.mark.parametrize(
("size", "expected_count"),
[
((1, 1), 1),
((2, 2), 2),
((4, 4), 3),
((8, 8), 4),
((128, 128), 8),
((256, 256), 9),
((512, 512), 10),
((1024, 1024), 11),
((1024, 1), 11),
],
)
def test_get_mipmap_count(size: tuple[int, int], expected_count: int):
assert _get_mipmap_count(*size) == expected_count
@pytest.mark.parametrize(
("pixel_format", "size", "expected_size"),
[
(VtfPF.DXT1, (16, 16), (16 * 16) // 2),
(VtfPF.DXT1_ONEBITALPHA, (16, 16), (16 * 16) // 2),
(VtfPF.DXT3, (16, 16), 16 * 16),
(VtfPF.DXT5, (16, 16), 16 * 16),
(VtfPF.BGR888, (16, 16), 16 * 16 * 3),
(VtfPF.RGB888, (16, 16), 16 * 16 * 3),
(VtfPF.RGBA8888, (16, 16), 16 * 16 * 4),
(VtfPF.UV88, (16, 16), 16 * 16 * 2),
(VtfPF.A8, (16, 16), 16 * 16),
(VtfPF.I8, (16, 16), 16 * 16),
(VtfPF.IA88, (16, 16), 16 * 16 * 2),
],
)
def test_get_texture_size(
pixel_format: VtfPF, size: tuple[int, int], expected_size: int
):
assert _get_texture_size(pixel_format, *size) == expected_size
@pytest.mark.parametrize(
("etalon_path", "file_path", "expected_mode", "epsilon"),
[
("Tests/images/vtf_i8.png", "Tests/images/vtf_i8.vtf", "L", 0.0),
("Tests/images/vtf_a8.png", "Tests/images/vtf_a8.vtf", "RGBA", 0.0),
("Tests/images/vtf_ia88.png", "Tests/images/vtf_ia88.vtf", "LA", 0.0),
("Tests/images/vtf_uv88.png", "Tests/images/vtf_uv88.vtf", "RGB", 0.0),
("Tests/images/vtf_rgb888.png", "Tests/images/vtf_rgb888.vtf", "RGB", 0.0),
("Tests/images/vtf_bgr888.png", "Tests/images/vtf_bgr888.vtf", "RGB", 0.0),
("Tests/images/vtf_dxt1.png", "Tests/images/vtf_dxt1.vtf", "RGBA", 3.0),
("Tests/images/vtf_dxt1A.png", "Tests/images/vtf_dxt1A.vtf", "RGBA", 8.0),
("Tests/images/vtf_rgba8888.png", "Tests/images/vtf_rgba8888.vtf", "RGBA", 0),
],
)
def test_vtf_read(etalon_path: str, file_path: str, expected_mode: str, epsilon: float):
e = Image.open(etalon_path)
f = Image.open(file_path)
assert f.mode == expected_mode
e = e.convert(expected_mode)
if epsilon == 0:
assert_image_equal(e, f)
else:
assert_image_similar(e, f, epsilon)
@pytest.mark.parametrize(
("pixel_format", "file_path", "expected_mode", "epsilon"),
[
(VtfPF.I8, "Tests/images/vtf_i8.png", "L", 0.0),
(VtfPF.A8, "Tests/images/vtf_a8.png", "RGBA", 0.0),
(VtfPF.IA88, "Tests/images/vtf_ia88.png", "LA", 0.0),
(VtfPF.UV88, "Tests/images/vtf_uv88.png", "RGB", 0.0),
(VtfPF.RGB888, "Tests/images/vtf_rgb888.png", "RGB", 0.0),
(VtfPF.BGR888, "Tests/images/vtf_bgr888.png", "RGB", 0.0),
(VtfPF.DXT1, "Tests/images/vtf_dxt1.png", "RGBA", 3.0),
(VtfPF.DXT1_ONEBITALPHA, "Tests/images/vtf_dxt1A.png", "RGBA", 8.0),
(VtfPF.RGBA8888, "Tests/images/vtf_rgba8888.png", "RGBA", 0),
],
)
def test_vtf_save(
pixel_format: VtfPF, file_path: str, expected_mode: str, epsilon: float, tmp_path
):
f: Image.Image = Image.open(file_path)
out = (tmp_path / "tmp.vtf").as_posix()
f.save(out, pixel_format=pixel_format)
if pixel_format == VtfPF.DXT1:
f = f.convert("RGBA")
e = Image.open(out)
assert e.mode == expected_mode
if epsilon == 0:
assert_image_equal(e, f)
else:
assert_image_similar(e, f, epsilon)