|
3 | 3 | import struct
|
4 | 4 | from io import BytesIO
|
5 | 5 | 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 |
7 | 7 |
|
8 | 8 | import astc_encoder
|
9 | 9 | import texture2ddecoder
|
@@ -327,12 +327,12 @@ def parse_image_data(
|
327 | 327 | else:
|
328 | 328 | image_data = texture2ddecoder.unpack_crunch(image_data)
|
329 | 329 |
|
330 |
| - conv_func = CONV_TABLE.get(texture_format) |
331 |
| - if not conv_func: |
| 330 | + if texture_format not in CONV_TABLE: |
332 | 331 | raise NotImplementedError(
|
333 | 332 | f"Not implemented texture format: {texture_format.name}"
|
334 | 333 | )
|
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) |
336 | 336 |
|
337 | 337 | if ori_width != width or ori_height != height:
|
338 | 338 | img = img.crop((0, 0, ori_width, ori_height))
|
@@ -516,90 +516,85 @@ def rgb9e5float(image_data: bytes, width: int, height: int) -> Image.Image:
|
516 | 516 | return Image.frombytes("RGB", (width, height), rgb, "raw", "RGB")
|
517 | 517 |
|
518 | 518 |
|
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")), |
603 | 598 | }
|
604 | 599 |
|
605 | 600 | # XBOX Swap Formats
|
|
0 commit comments