mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 07:57:27 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			125 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) -> None:
 | |
|     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) -> None:
 | |
|     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
 | |
| ) -> None:
 | |
|     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
 | |
| ) -> None:
 | |
|     with Image.open(file_path) as f:
 | |
|         assert f.mode == expected_mode
 | |
|         with Image.open(etalon_path) as e:
 | |
|             converted_e = e.convert(expected_mode)
 | |
|         if epsilon == 0:
 | |
|             assert_image_equal(converted_e, f)
 | |
|         else:
 | |
|             assert_image_similar(converted_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.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
 | |
| ) -> None:
 | |
|     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)
 |