mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-23 07:10:33 +03:00
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
This commit is contained in:
parent
df3c025cbc
commit
9223c06482
|
@ -11,7 +11,7 @@ Full text of the CC0 license:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import struct
|
import struct
|
||||||
from enum import IntFlag, IntEnum
|
from enum import IntEnum, IntFlag
|
||||||
from typing import NamedTuple
|
from typing import NamedTuple
|
||||||
|
|
||||||
from . import Image, ImageFile
|
from . import Image, ImageFile
|
||||||
|
@ -99,39 +99,51 @@ class VtfPF(IntEnum):
|
||||||
UVLX8888 = 26
|
UVLX8888 = 26
|
||||||
|
|
||||||
|
|
||||||
VTFHeader = NamedTuple("VTFHeader", [
|
VTFHeader = NamedTuple(
|
||||||
("header_size", int),
|
"VTFHeader",
|
||||||
("width", int),
|
[
|
||||||
("height", int),
|
("header_size", int),
|
||||||
("flags", int),
|
("width", int),
|
||||||
("frames", int),
|
("height", int),
|
||||||
("first_frames", int),
|
("flags", int),
|
||||||
("padding0", int),
|
("frames", int),
|
||||||
("reflectivity_r", float),
|
("first_frames", int),
|
||||||
("reflectivity_g", float),
|
("padding0", int),
|
||||||
("reflectivity_b", float),
|
("reflectivity_r", float),
|
||||||
("padding1", int),
|
("reflectivity_g", float),
|
||||||
("bumpmap_scale", float),
|
("reflectivity_b", float),
|
||||||
("pixel_format", int),
|
("padding1", int),
|
||||||
("mipmap_count", int),
|
("bumpmap_scale", float),
|
||||||
("lowres_format", int),
|
("pixel_format", int),
|
||||||
("lowres_width", int),
|
("mipmap_count", int),
|
||||||
("lowres_height", int),
|
("lowres_format", int),
|
||||||
|
("lowres_width", int),
|
||||||
# V 7.2+
|
("lowres_height", int),
|
||||||
('depth', int),
|
# V 7.2+
|
||||||
|
("depth", int),
|
||||||
# V 7.3+
|
# V 7.3+
|
||||||
('padding2', int),
|
("padding2", int),
|
||||||
('padding2_', int),
|
("padding2_", int),
|
||||||
('resource_count', int),
|
("resource_count", int),
|
||||||
('padding3', int),
|
("padding3", int),
|
||||||
|
],
|
||||||
])
|
)
|
||||||
RGB_FORMATS = (VtfPF.RGB888,)
|
RGB_FORMATS = (VtfPF.RGB888,)
|
||||||
RGBA_FORMATS = (VtfPF.DXT1, VtfPF.DXT1_ONEBITALPHA, VtfPF.DXT3, VtfPF.DXT5, VtfPF.RGBA8888)
|
RGBA_FORMATS = (
|
||||||
L_FORMATS = (VtfPF.A8, VtfPF.I8,)
|
VtfPF.DXT1,
|
||||||
LA_FORMATS = (VtfPF.IA88, VtfPF.UV88,)
|
VtfPF.DXT1_ONEBITALPHA,
|
||||||
|
VtfPF.DXT3,
|
||||||
|
VtfPF.DXT5,
|
||||||
|
VtfPF.RGBA8888,
|
||||||
|
)
|
||||||
|
L_FORMATS = (
|
||||||
|
VtfPF.A8,
|
||||||
|
VtfPF.I8,
|
||||||
|
)
|
||||||
|
LA_FORMATS = (
|
||||||
|
VtfPF.IA88,
|
||||||
|
VtfPF.UV88,
|
||||||
|
)
|
||||||
|
|
||||||
SUPPORTED_FORMATS = RGBA_FORMATS + RGB_FORMATS + LA_FORMATS + L_FORMATS
|
SUPPORTED_FORMATS = RGBA_FORMATS + RGB_FORMATS + LA_FORMATS + L_FORMATS
|
||||||
|
|
||||||
|
@ -139,7 +151,14 @@ SUPPORTED_FORMATS = RGBA_FORMATS + RGB_FORMATS + LA_FORMATS + L_FORMATS
|
||||||
def _get_texture_size(pixel_format: VtfPF, width, height):
|
def _get_texture_size(pixel_format: VtfPF, width, height):
|
||||||
if pixel_format in (VtfPF.DXT1, VtfPF.DXT1_ONEBITALPHA):
|
if pixel_format in (VtfPF.DXT1, VtfPF.DXT1_ONEBITALPHA):
|
||||||
return width * height // 2
|
return width * height // 2
|
||||||
elif pixel_format in (VtfPF.DXT3, VtfPF.DXT5,) + L_FORMATS:
|
elif (
|
||||||
|
pixel_format
|
||||||
|
in (
|
||||||
|
VtfPF.DXT3,
|
||||||
|
VtfPF.DXT5,
|
||||||
|
)
|
||||||
|
+ L_FORMATS
|
||||||
|
):
|
||||||
return width * height
|
return width * height
|
||||||
elif pixel_format in LA_FORMATS:
|
elif pixel_format in LA_FORMATS:
|
||||||
return width * height * 2
|
return width * height * 2
|
||||||
|
@ -147,7 +166,7 @@ def _get_texture_size(pixel_format: VtfPF, width, height):
|
||||||
return width * height * 3
|
return width * height * 3
|
||||||
elif pixel_format in (VtfPF.RGBA8888,):
|
elif pixel_format in (VtfPF.RGBA8888,):
|
||||||
return width * height * 4
|
return width * height * 4
|
||||||
raise VTFException(f'Unsupported VTF pixel format: {pixel_format}')
|
raise VTFException(f"Unsupported VTF pixel format: {pixel_format}")
|
||||||
|
|
||||||
|
|
||||||
class VtfImageFile(ImageFile.ImageFile):
|
class VtfImageFile(ImageFile.ImageFile):
|
||||||
|
@ -158,28 +177,34 @@ class VtfImageFile(ImageFile.ImageFile):
|
||||||
if not _accept(self.fp.read(12)):
|
if not _accept(self.fp.read(12)):
|
||||||
raise SyntaxError("not a VTF file")
|
raise SyntaxError("not a VTF file")
|
||||||
self.fp.seek(4)
|
self.fp.seek(4)
|
||||||
version = struct.unpack('<2I', self.fp.read(8))
|
version = struct.unpack("<2I", self.fp.read(8))
|
||||||
if version <= (7, 2):
|
if version <= (7, 2):
|
||||||
header = VTFHeader(*struct.unpack('<I2HI2HI3fIfIbI2b', self.fp.read(51)), 0, 0, 0, 0, 0)
|
header = VTFHeader(
|
||||||
|
*struct.unpack("<I2HI2HI3fIfIbI2b", self.fp.read(51)), 0, 0, 0, 0, 0
|
||||||
|
)
|
||||||
elif (7, 2) <= version < (7, 3):
|
elif (7, 2) <= version < (7, 3):
|
||||||
header = VTFHeader(*struct.unpack('<I2HI2HI3fIfIbI2bH', self.fp.read(53)), 0, 0, 0, 0)
|
header = VTFHeader(
|
||||||
|
*struct.unpack("<I2HI2HI3fIfIbI2bH", self.fp.read(53)), 0, 0, 0, 0
|
||||||
|
)
|
||||||
elif (7, 3) <= version < (7, 5):
|
elif (7, 3) <= version < (7, 5):
|
||||||
header = VTFHeader(*struct.unpack('<I2HI2HI3fIfIbI2bHHBIQ', self.fp.read(68)))
|
header = VTFHeader(
|
||||||
|
*struct.unpack("<I2HI2HI3fIfIbI2bHHBIQ", self.fp.read(68))
|
||||||
|
)
|
||||||
self.fp.seek(header.resource_count * 8, 1)
|
self.fp.seek(header.resource_count * 8, 1)
|
||||||
else:
|
else:
|
||||||
raise VTFException(f"Unsupported VTF version: {version}")
|
raise VTFException(f"Unsupported VTF version: {version}")
|
||||||
flags = CompiledVtfFlags(header.flags)
|
flags = CompiledVtfFlags(header.flags)
|
||||||
pixel_format = VtfPF(header.pixel_format)
|
pixel_format = VtfPF(header.pixel_format)
|
||||||
if pixel_format in RGB_FORMATS:
|
if pixel_format in RGB_FORMATS:
|
||||||
self.mode = 'RGB'
|
self.mode = "RGB"
|
||||||
elif pixel_format in RGBA_FORMATS:
|
elif pixel_format in RGBA_FORMATS:
|
||||||
self.mode = 'RGBA'
|
self.mode = "RGBA"
|
||||||
elif pixel_format in L_FORMATS:
|
elif pixel_format in L_FORMATS:
|
||||||
self.mode = 'L'
|
self.mode = "L"
|
||||||
elif pixel_format in LA_FORMATS:
|
elif pixel_format in LA_FORMATS:
|
||||||
self.mode = 'LA'
|
self.mode = "LA"
|
||||||
else:
|
else:
|
||||||
raise VTFException(f'Unsupported VTF pixel format: {pixel_format}')
|
raise VTFException(f"Unsupported VTF pixel format: {pixel_format}")
|
||||||
|
|
||||||
# if flags & CompiledVtfFlags.EIGHTBITALPHA or flags & CompiledVtfFlags.ONEBITALPHA:
|
# if flags & CompiledVtfFlags.EIGHTBITALPHA or flags & CompiledVtfFlags.ONEBITALPHA:
|
||||||
# if 'A' not in self.mode:
|
# if 'A' not in self.mode:
|
||||||
|
@ -191,19 +216,26 @@ class VtfImageFile(ImageFile.ImageFile):
|
||||||
self._size = (header.width, header.height)
|
self._size = (header.width, header.height)
|
||||||
|
|
||||||
data_start = self.fp.tell()
|
data_start = self.fp.tell()
|
||||||
data_start += _get_texture_size(header.lowres_format, header.lowres_width, header.lowres_height)
|
data_start += _get_texture_size(
|
||||||
min_res = 4 if pixel_format in (VtfPF.DXT1, VtfPF.DXT1_ONEBITALPHA, VtfPF.DXT3, VtfPF.DXT5) else 1
|
header.lowres_format, header.lowres_width, header.lowres_height
|
||||||
for mip_id in range(header.mipmap_count - 1, 0, - 1):
|
)
|
||||||
|
min_res = (
|
||||||
|
4
|
||||||
|
if pixel_format
|
||||||
|
in (VtfPF.DXT1, VtfPF.DXT1_ONEBITALPHA, VtfPF.DXT3, VtfPF.DXT5)
|
||||||
|
else 1
|
||||||
|
)
|
||||||
|
for mip_id in range(header.mipmap_count - 1, 0, -1):
|
||||||
mip_width = max(header.width >> mip_id, min_res)
|
mip_width = max(header.width >> mip_id, min_res)
|
||||||
mip_height = max(header.height >> mip_id, min_res)
|
mip_height = max(header.height >> mip_id, min_res)
|
||||||
|
|
||||||
data_start += _get_texture_size(pixel_format, mip_width, mip_height)
|
data_start += _get_texture_size(pixel_format, mip_width, mip_height)
|
||||||
if pixel_format in (VtfPF.DXT1, VtfPF.DXT1_ONEBITALPHA):
|
if pixel_format in (VtfPF.DXT1, VtfPF.DXT1_ONEBITALPHA):
|
||||||
tile = ("bcn", (0, 0) + self.size, data_start, (1, 'DXT1'))
|
tile = ("bcn", (0, 0) + self.size, data_start, (1, "DXT1"))
|
||||||
elif pixel_format == VtfPF.DXT3:
|
elif pixel_format == VtfPF.DXT3:
|
||||||
tile = ("bcn", (0, 0) + self.size, data_start, (2, 'DXT3'))
|
tile = ("bcn", (0, 0) + self.size, data_start, (2, "DXT3"))
|
||||||
elif pixel_format == VtfPF.DXT5:
|
elif pixel_format == VtfPF.DXT5:
|
||||||
tile = ("bcn", (0, 0) + self.size, data_start, (3, 'DXT5'))
|
tile = ("bcn", (0, 0) + self.size, data_start, (3, "DXT5"))
|
||||||
elif pixel_format in (VtfPF.RGBA8888,):
|
elif pixel_format in (VtfPF.RGBA8888,):
|
||||||
tile = ("raw", (0, 0) + self.size, data_start, ("RGBA", 0, 1))
|
tile = ("raw", (0, 0) + self.size, data_start, ("RGBA", 0, 1))
|
||||||
elif pixel_format in (VtfPF.RGB888,):
|
elif pixel_format in (VtfPF.RGB888,):
|
||||||
|
@ -213,7 +245,7 @@ class VtfImageFile(ImageFile.ImageFile):
|
||||||
elif pixel_format in LA_FORMATS:
|
elif pixel_format in LA_FORMATS:
|
||||||
tile = ("raw", (0, 0) + self.size, data_start, ("LA", 0, 1))
|
tile = ("raw", (0, 0) + self.size, data_start, ("LA", 0, 1))
|
||||||
else:
|
else:
|
||||||
raise VTFException(f'Unsupported VTF pixel format: {pixel_format}')
|
raise VTFException(f"Unsupported VTF pixel format: {pixel_format}")
|
||||||
self.tile = [tile]
|
self.tile = [tile]
|
||||||
|
|
||||||
|
|
||||||
|
@ -224,7 +256,7 @@ def _save(im, fp, filename):
|
||||||
|
|
||||||
def _accept(prefix):
|
def _accept(prefix):
|
||||||
valid_header = prefix[:4] == b"VTF\x00"
|
valid_header = prefix[:4] == b"VTF\x00"
|
||||||
valid_version = struct.unpack_from('<2I', prefix, 4) >= (7, 0)
|
valid_version = struct.unpack_from("<2I", prefix, 4) >= (7, 0)
|
||||||
return valid_header and valid_version
|
return valid_header and valid_version
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user