Skip to content

Commit 822c06b

Browse files
committed
refactor: Texture2DConverter - optimize CONV_TABLE again
1 parent 4e3ebc8 commit 822c06b

File tree

1 file changed

+83
-88
lines changed

1 file changed

+83
-88
lines changed

UnityPy/export/Texture2DConverter.py

Lines changed: 83 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import struct
44
from io import BytesIO
55
from threading import Lock
6-
from typing import TYPE_CHECKING, Callable, Dict, Optional, Sequence, Tuple, Union
6+
from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Sequence, Tuple, Union
77

88
import astc_encoder
99
import texture2ddecoder
@@ -327,12 +327,12 @@ def parse_image_data(
327327
else:
328328
image_data = texture2ddecoder.unpack_crunch(image_data)
329329

330-
conv_func = CONV_TABLE.get(texture_format)
331-
if not conv_func:
330+
if texture_format not in CONV_TABLE:
332331
raise NotImplementedError(
333332
f"Not implemented texture format: {texture_format.name}"
334333
)
335-
img = conv_func(image_data, width, height)
334+
conv_func, conv_args = CONV_TABLE[texture_format]
335+
img = conv_func(image_data, width, height, *conv_args)
336336

337337
if ori_width != width or ori_height != height:
338338
img = img.crop((0, 0, ori_width, ori_height))
@@ -516,90 +516,85 @@ def rgb9e5float(image_data: bytes, width: int, height: int) -> Image.Image:
516516
return Image.frombytes("RGB", (width, height), rgb, "raw", "RGB")
517517

518518

519-
CONV_TABLE: Dict[TF, Callable[[bytes, int, int], Image.Image]] = {
520-
TF.Alpha8: lambda data, w, h: pillow(data, w, h, "L", "raw", "L"),
521-
TF.ARGB4444: lambda data, w, h: pillow(
522-
data, w, h, "RGBA", "raw", "RGBA;4B", (2, 1, 0, 3)
523-
),
524-
TF.RGB24: lambda data, w, h: pillow(data, w, h, "RGB", "raw", "RGB"),
525-
TF.RGBA32: lambda data, w, h: pillow(data, w, h, "RGBA", "raw", "RGBA"),
526-
TF.ARGB32: lambda data, w, h: pillow(data, w, h, "RGBA", "raw", "ARGB"),
527-
TF.ARGBFloat: lambda data, w, h: pillow(
528-
data, w, h, "RGBA", "raw", "RGBAF", (2, 1, 0, 3)
529-
),
530-
TF.RGB565: lambda data, w, h: pillow(data, w, h, "RGB", "raw", "BGR;16"),
531-
TF.BGR24: lambda data, w, h: pillow(data, w, h, "RGB", "raw", "BGR"),
532-
TF.R8: lambda data, w, h: pillow(data, w, h, "RGB", "raw", "R"),
533-
TF.R16: lambda data, w, h: pillow(data, w, h, "RGB", "raw", "R;16"),
534-
TF.RG16: lambda data, w, h: rg(data, w, h, "RGB", "raw", "RG"),
535-
TF.DXT1: lambda data, w, h: pillow(data, w, h, "RGBA", "bcn", 1),
536-
TF.DXT3: lambda data, w, h: pillow(data, w, h, "RGBA", "bcn", 2),
537-
TF.DXT5: lambda data, w, h: pillow(data, w, h, "RGBA", "bcn", 3),
538-
TF.RGBA4444: lambda data, w, h: pillow(
539-
data, w, h, "RGBA", "raw", "RGBA;4B", (3, 2, 1, 0)
540-
),
541-
TF.BGRA32: lambda data, w, h: pillow(data, w, h, "RGBA", "raw", "BGRA"),
542-
TF.RHalf: lambda data, w, h: half(data, w, h, "R", "raw", "R"),
543-
TF.RGHalf: lambda data, w, h: rg(data, w, h, "RGB", "raw", "RGE"),
544-
TF.RGBAHalf: lambda data, w, h: half(data, w, h, "RGB", "raw", "RGB"),
545-
TF.RFloat: lambda data, w, h: pillow(data, w, h, "RGB", "raw", "RF"),
546-
TF.RGFloat: lambda data, w, h: rg(data, w, h, "RGB", "raw", "RGF"),
547-
TF.RGBAFloat: lambda data, w, h: pillow(data, w, h, "RGBA", "raw", "RGBAF"),
548-
# TF.YUY2: lambda data, w, h: NotImplementedError("YUY2 not implemented"),
549-
TF.RGB9e5Float: lambda data, w, h: rgb9e5float(data, w, h),
550-
TF.BC4: lambda data, w, h: pillow(data, w, h, "L", "bcn", 4),
551-
TF.BC5: lambda data, w, h: pillow(data, w, h, "RGB", "bcn", 5),
552-
TF.BC6H: lambda data, w, h: pillow(data, w, h, "RGBA", "bcn", 6),
553-
TF.BC7: lambda data, w, h: pillow(data, w, h, "RGBA", "bcn", 7),
554-
TF.DXT1Crunched: lambda data, w, h: pillow(data, w, h, "RGBA", "bcn", 1),
555-
TF.DXT5Crunched: lambda data, w, h: pillow(data, w, h, "RGBA", "bcn", 3),
556-
TF.PVRTC_RGB2: lambda data, w, h: pvrtc(data, w, h, True),
557-
TF.PVRTC_RGBA2: lambda data, w, h: pvrtc(data, w, h, True),
558-
TF.PVRTC_RGB4: lambda data, w, h: pvrtc(data, w, h, False),
559-
TF.PVRTC_RGBA4: lambda data, w, h: pvrtc(data, w, h, False),
560-
TF.ETC_RGB4: lambda data, w, h: etc(data, w, h, "ETC1"),
561-
TF.ATC_RGB4: lambda data, w, h: atc(data, w, h, False),
562-
TF.ATC_RGBA8: lambda data, w, h: atc(data, w, h, True),
563-
TF.EAC_R: lambda data, w, h: eac(data, w, h, "EAC_R"),
564-
TF.EAC_R_SIGNED: lambda data, w, h: eac(data, w, h, "EAC_R_SIGNED"),
565-
TF.EAC_RG: lambda data, w, h: eac(data, w, h, "EAC_RG"),
566-
TF.EAC_RG_SIGNED: lambda data, w, h: eac(data, w, h, "EAC_RG_SIGNED"),
567-
TF.ETC2_RGB: lambda data, w, h: etc(data, w, h, "ETC2_RGB"),
568-
TF.ETC2_RGBA1: lambda data, w, h: etc(data, w, h, "ETC2_A1"),
569-
TF.ETC2_RGBA8: lambda data, w, h: etc(data, w, h, "ETC2_A8"),
570-
TF.ASTC_RGB_4x4: lambda data, w, h: astc(data, w, h, (4, 4)),
571-
TF.ASTC_RGB_5x5: lambda data, w, h: astc(data, w, h, (5, 5)),
572-
TF.ASTC_RGB_6x6: lambda data, w, h: astc(data, w, h, (6, 6)),
573-
TF.ASTC_RGB_8x8: lambda data, w, h: astc(data, w, h, (8, 8)),
574-
TF.ASTC_RGB_10x10: lambda data, w, h: astc(data, w, h, (10, 10)),
575-
TF.ASTC_RGB_12x12: lambda data, w, h: astc(data, w, h, (12, 12)),
576-
TF.ASTC_RGBA_4x4: lambda data, w, h: astc(data, w, h, (4, 4)),
577-
TF.ASTC_RGBA_5x5: lambda data, w, h: astc(data, w, h, (5, 5)),
578-
TF.ASTC_RGBA_6x6: lambda data, w, h: astc(data, w, h, (6, 6)),
579-
TF.ASTC_RGBA_8x8: lambda data, w, h: astc(data, w, h, (8, 8)),
580-
TF.ASTC_RGBA_10x10: lambda data, w, h: astc(data, w, h, (10, 10)),
581-
TF.ASTC_RGBA_12x12: lambda data, w, h: astc(data, w, h, (12, 12)),
582-
TF.ETC_RGB4_3DS: lambda data, w, h: etc(data, w, h, "ETC1"),
583-
TF.ETC_RGBA8_3DS: lambda data, w, h: etc(data, w, h, "ETC1"),
584-
TF.ETC_RGB4Crunched: lambda data, w, h: etc(data, w, h, "ETC1"),
585-
TF.ETC2_RGBA8Crunched: lambda data, w, h: etc(data, w, h, "ETC2_A8"),
586-
TF.ASTC_HDR_4x4: lambda data, w, h: astc(data, w, h, (4, 4)),
587-
TF.ASTC_HDR_5x5: lambda data, w, h: astc(data, w, h, (5, 5)),
588-
TF.ASTC_HDR_6x6: lambda data, w, h: astc(data, w, h, (6, 6)),
589-
TF.ASTC_HDR_8x8: lambda data, w, h: astc(data, w, h, (8, 8)),
590-
TF.ASTC_HDR_10x10: lambda data, w, h: astc(data, w, h, (10, 10)),
591-
TF.ASTC_HDR_12x12: lambda data, w, h: astc(data, w, h, (12, 12)),
592-
TF.RG32: lambda data, w, h: rg(data, w, h, "RGB", "raw", "RG;16"),
593-
TF.RGB48: lambda data, w, h: pillow(data, w, h, "RGB", "raw", "RGB;16"),
594-
TF.RGBA64: lambda data, w, h: pillow(data, w, h, "RGBA", "raw", "RGBA;16"),
595-
TF.R8_SIGNED: lambda data, w, h: pillow(data, w, h, "R", "raw", "R;8s"),
596-
TF.RG16_SIGNED: lambda data, w, h: rg(data, w, h, "RGB", "raw", "RG;8s"),
597-
TF.RGB24_SIGNED: lambda data, w, h: pillow(data, w, h, "RGB", "raw", "RGB;8s"),
598-
TF.RGBA32_SIGNED: lambda data, w, h: pillow(data, w, h, "RGBA", "raw", "RGBA;8s"),
599-
TF.R16_SIGNED: lambda data, w, h: pillow(data, w, h, "R", "raw", "R;16s"),
600-
TF.RG32_SIGNED: lambda data, w, h: rg(data, w, h, "RGB", "raw", "RG;16s"),
601-
TF.RGB48_SIGNED: lambda data, w, h: pillow(data, w, h, "RGB", "raw", "RGB;16s"),
602-
TF.RGBA64_SIGNED: lambda data, w, h: pillow(data, w, h, "RGBA", "raw", "RGBA;16s"),
519+
# Mapping TextureFormat -> (converter function, (additional args, ...))
520+
CONV_TABLE: Dict[TF, Tuple[Callable[..., Image.Image], Tuple[Any, ...]]] = {
521+
TF.Alpha8: (pillow, ("L", "raw", "L")),
522+
TF.ARGB4444: (pillow, ("RGBA", "raw", "RGBA;4B", (2, 1, 0, 3))),
523+
TF.RGB24: (pillow, ("RGB", "raw", "RGB")),
524+
TF.RGBA32: (pillow, ("RGBA", "raw", "RGBA")),
525+
TF.ARGB32: (pillow, ("RGBA", "raw", "ARGB")),
526+
TF.ARGBFloat: (pillow, ("RGBA", "raw", "RGBAF", (2, 1, 0, 3))),
527+
TF.RGB565: (pillow, ("RGB", "raw", "BGR;16")),
528+
TF.BGR24: (pillow, ("RGB", "raw", "BGR")),
529+
TF.R8: (pillow, ("RGB", "raw", "R")),
530+
TF.R16: (pillow, ("RGB", "raw", "R;16")),
531+
TF.RG16: (rg, ("RGB", "raw", "RG")),
532+
TF.DXT1: (pillow, ("RGBA", "bcn", 1)),
533+
TF.DXT3: (pillow, ("RGBA", "bcn", 2)),
534+
TF.DXT5: (pillow, ("RGBA", "bcn", 3)),
535+
TF.RGBA4444: (pillow, ("RGBA", "raw", "RGBA;4B", (3, 2, 1, 0))),
536+
TF.BGRA32: (pillow, ("RGBA", "raw", "BGRA")),
537+
TF.RHalf: (half, ("R", "raw", "R")),
538+
TF.RGHalf: (rg, ("RGB", "raw", "RGE")),
539+
TF.RGBAHalf: (half, ("RGB", "raw", "RGB")),
540+
TF.RFloat: (pillow, ("RGB", "raw", "RF")),
541+
TF.RGFloat: (rg, ("RGB", "raw", "RGF")),
542+
TF.RGBAFloat: (pillow, ("RGBA", "raw", "RGBAF")),
543+
# TF.YUY2: NotImplementedError("YUY2 not implemented"),
544+
TF.RGB9e5Float: (rgb9e5float, ()),
545+
TF.BC4: (pillow, ("L", "bcn", 4)),
546+
TF.BC5: (pillow, ("RGB", "bcn", 5)),
547+
TF.BC6H: (pillow, ("RGBA", "bcn", 6)),
548+
TF.BC7: (pillow, ("RGBA", "bcn", 7)),
549+
TF.DXT1Crunched: (pillow, ("RGBA", "bcn", 1)),
550+
TF.DXT5Crunched: (pillow, ("RGBA", "bcn", 3)),
551+
TF.PVRTC_RGB2: (pvrtc, (True,)),
552+
TF.PVRTC_RGBA2: (pvrtc, (True,)),
553+
TF.PVRTC_RGB4: (pvrtc, (False,)),
554+
TF.PVRTC_RGBA4: (pvrtc, (False,)),
555+
TF.ETC_RGB4: (etc, ("ETC1",)),
556+
TF.ATC_RGB4: (atc, (False,)),
557+
TF.ATC_RGBA8: (atc, (True,)),
558+
TF.EAC_R: (eac, ("EAC_R",)),
559+
TF.EAC_R_SIGNED: (eac, ("EAC_R_SIGNED",)),
560+
TF.EAC_RG: (eac, ("EAC_RG",)),
561+
TF.EAC_RG_SIGNED: (eac, ("EAC_RG_SIGNED",)),
562+
TF.ETC2_RGB: (etc, ("ETC2_RGB",)),
563+
TF.ETC2_RGBA1: (etc, ("ETC2_A1",)),
564+
TF.ETC2_RGBA8: (etc, ("ETC2_A8",)),
565+
TF.ASTC_RGB_4x4: (astc, ((4, 4))),
566+
TF.ASTC_RGB_5x5: (astc, ((5, 5))),
567+
TF.ASTC_RGB_6x6: (astc, ((6, 6))),
568+
TF.ASTC_RGB_8x8: (astc, ((8, 8))),
569+
TF.ASTC_RGB_10x10: (astc, ((10, 10))),
570+
TF.ASTC_RGB_12x12: (astc, ((12, 12))),
571+
TF.ASTC_RGBA_4x4: (astc, ((4, 4))),
572+
TF.ASTC_RGBA_5x5: (astc, ((5, 5))),
573+
TF.ASTC_RGBA_6x6: (astc, ((6, 6))),
574+
TF.ASTC_RGBA_8x8: (astc, ((8, 8))),
575+
TF.ASTC_RGBA_10x10: (astc, ((10, 10))),
576+
TF.ASTC_RGBA_12x12: (astc, ((12, 12))),
577+
TF.ETC_RGB4_3DS: (etc, ("ETC1",)),
578+
TF.ETC_RGBA8_3DS: (etc, ("ETC1",)),
579+
TF.ETC_RGB4Crunched: (etc, ("ETC1",)),
580+
TF.ETC2_RGBA8Crunched: (etc, ("ETC2_A8",)),
581+
TF.ASTC_HDR_4x4: (astc, ((4, 4))),
582+
TF.ASTC_HDR_5x5: (astc, ((5, 5))),
583+
TF.ASTC_HDR_6x6: (astc, ((6, 6))),
584+
TF.ASTC_HDR_8x8: (astc, ((8, 8))),
585+
TF.ASTC_HDR_10x10: (astc, ((10, 10))),
586+
TF.ASTC_HDR_12x12: (astc, ((12, 12))),
587+
TF.RG32: (rg, ("RGB", "raw", "RG;16")),
588+
TF.RGB48: (pillow, ("RGB", "raw", "RGB;16")),
589+
TF.RGBA64: (pillow, ("RGBA", "raw", "RGBA;16")),
590+
TF.R8_SIGNED: (pillow, ("R", "raw", "R;8s")),
591+
TF.RG16_SIGNED: (rg, ("RGB", "raw", "RG;8s")),
592+
TF.RGB24_SIGNED: (pillow, ("RGB", "raw", "RGB;8s")),
593+
TF.RGBA32_SIGNED: (pillow, ("RGBA", "raw", "RGBA;8s")),
594+
TF.R16_SIGNED: (pillow, ("R", "raw", "R;16s")),
595+
TF.RG32_SIGNED: (rg, ("RGB", "raw", "RG;16s")),
596+
TF.RGB48_SIGNED: (pillow, ("RGB", "raw", "RGB;16s")),
597+
TF.RGBA64_SIGNED: (pillow, ("RGBA", "raw", "RGBA;16s")),
603598
}
604599

605600
# XBOX Swap Formats

0 commit comments

Comments
 (0)