From c3457f10eb6b56fcd3f9b795a79cd8df672dd5c6 Mon Sep 17 00:00:00 2001 From: REDxEYE Date: Sun, 14 Aug 2022 21:11:18 +0300 Subject: [PATCH] Add switch to DXT1 encoder to select block mode (With alpha/Without alpha) --- Tests/images/vtf_a8.png | Bin 3223 -> 4221 bytes Tests/images/vtf_a8.vtf | Bin 87605 -> 87605 bytes Tests/images/vtf_bgr888.vtf | Bin 262367 -> 262367 bytes Tests/images/vtf_dxt1.vtf | Bin 43928 -> 43928 bytes Tests/images/vtf_dxt1A.vtf | Bin 43928 -> 43928 bytes Tests/images/vtf_i8.vtf | Bin 87605 -> 87605 bytes Tests/images/vtf_ia88.vtf | Bin 174986 -> 174986 bytes Tests/images/vtf_rgb888.vtf | Bin 262367 -> 262367 bytes Tests/images/vtf_rgba8888.vtf | Bin 349748 -> 349748 bytes Tests/images/vtf_uv88.vtf | Bin 174986 -> 174986 bytes Tests/test_file_vtf.py | 38 ++++++++++-- src/PIL/VtfImagePlugin.py | 113 ++++++++++++---------------------- src/libImaging/BcnEncode.c | 36 ++++++----- 13 files changed, 94 insertions(+), 93 deletions(-) diff --git a/Tests/images/vtf_a8.png b/Tests/images/vtf_a8.png index 2411de7e2230a795d73301b89c2aa8d458b5ab60..1e95446f151993e688cd7f2605e3e70f018e5387 100644 GIT binary patch literal 4221 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 uwX8i!4IwA2dT+EB=g^XK8N%G diff --git a/Tests/images/vtf_a8.vtf b/Tests/images/vtf_a8.vtf index e2bf3501fe1c9538a25ec75a6ae66ae3d5247da4..4705e9e0915feed5579abf026f04048da5f1bdc8 100644 GIT binary patch delta 100 zcmdnGhIQ*2)(I^kwziDS0y7vG`1njk6Brm692}VAffNL2FfbfG%q+}ck-%VY?+}mx p6b%oD$^j{JE(V76>seVRurn}(hAJ?CU_Ty}=k83IN3h63hSq delta 100 zcmdnGhIQ*2)(I^kqN0q90y7vG*w{ox6Brm692^)!ffNL2FfceeG72(SBrs@cIXEN$ lMMDv?4CY)6469bLvQA(Ji7POG delta 108 zcmccLC~&_~U_wiXs3;?&zzhZkHa1bw1O^5M2M5MbAO!&$3=EErjDidn2@G0V4h{)G t(NKgegEU!RtP|Kl;tC8Pc}7MCm&O~dHyB%QFty%bo_d3Y9RTeB6i)yE diff --git a/Tests/images/vtf_dxt1.vtf b/Tests/images/vtf_dxt1.vtf index 6efc2d6596f88e43444dde4bee2ee460b95e3332..f74c3756b0a4ad4e562c0d9f77c3e2f916bd664e 100644 GIT binary patch delta 805 zcmZ8fO-K|`9RI&JGdsJ^eu$gjy0e7&b=W$%xHu%$iqUEbxGk-$6VSD9U}JN=B+jm>QoZDS)fh-(Sq<@e)E6t@%x&W-K5z~nz>^S z4H2O>3lI#(>rDXAG$D;}u(|;X1tAOx6NZO1-NfBg>hBrCKn=j^sw8D(0K#VQl^B-alHW5eVRiuE*P-OO?t_nAMV#f^BcJbELiFf29N}Ei8~g@sJXm zQpVU9(nsTQ7NHSwZx2+a(LTlJlOz>oEX!gx9TL*%G+U<^X&}HN!l@3^)D1_T_f)HJ z!I4dmpGuOnkdUje(E^vnG{3dA0!X)J5DlLMk4^eN9-Os!J@KA z6@_)mF)9drRDMsD5zPH5RF-#lH~2t}m-tGKyyKd8*lDFhv@BvE|A3dRgs-^7!6OMm zQyS(m*^~M-NpWw3N=S)!H;RN-t1Q-(qZ?Z&H^_X=1#w~`nLHR;3SugiG;m0;sN!M4 z)+JghvB#~q#e9Bt78!4_T$_i)`AXX@>Sl?l&3ss$_s~j(zdQDe5RJX*>LkC}x2|@I zJq5eJ)?tz0$m=o|gZNRlZ656DCt^CC)RA(Mt@ZY!yU)GlQX5}f zw1~f01jyl^#b@TWdznuyJs`ALPA-Q+R7D$x0iZ$)s4Bm^To?KSk$m_Q delta 800 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 literal 43928 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 Tj=ULH*nGG2xIyQ3j{f{V>{|rI diff --git a/Tests/images/vtf_i8.vtf b/Tests/images/vtf_i8.vtf index f5e949285f05042d69134843428f4c6711040f95..d3e5e94f5bae44f6e3cf0eaa17efc063062a6c96 100644 GIT binary patch delta 100 zcmdnGhIQ*2)(I^kwziDS0y7vG`1njk6Brm692}VAffNL2FfbfG%q+}ck-%VY?+}mx p6b%oD$^j{JE(V76>seVRurn}(hAJ?CU_Ty}=k83IN3h63hSq delta 100 zcmdnGhIQ*2)(I^kqN0q90y7vG*w{ox6Brm692^)!ffNL2FfceeG72(SBrs@cIXEN$ lMMDv?4CY)6469bLvQA(Ji7POGU!RtP|Kl;tC8Pc}7MCm&O~dHyF3xVA`|_0ETlC`2YX_ diff --git a/Tests/images/vtf_rgb888.vtf b/Tests/images/vtf_rgb888.vtf index 55f70d4f72f37655e058e5caa3a8e288578f9404..b8eb744dbf5a95b35d741d98fc75d5a4f5b54550 100644 GIT binary patch delta 108 zcmccLC~&_~U_wiXtt}(7zzhZkK0Z^?1O^5M2M6YOAO!&$3=D@4GYd0VBrw?9I|L*E xMZ?3PazM(Qi-BSNdREp6> delta 108 zcmccLC~&_~U_wiXs3;?&zzhZkHa1bw1O^5M2M5MbAO!&$3=EErjDidn2@G0V4h{)G t(NKgegEU!RtP|Kl;tC8Pc}7MCm&O~dHyB%QFty%bo_d3Y9RTeB6i)yE diff --git a/Tests/images/vtf_rgba8888.vtf b/Tests/images/vtf_rgba8888.vtf index 9553f80a53702eea3c8de5b4888564888adb795e..6d8248bc6323c1a96b7a8fd5445418725a7314db 100644 GIT binary patch delta 112 zcmdn8Ms&*>(FrXfwziDS0y7vG`1njk6Brm692}VAffNL2FfbfG%q+}ck-%VY?+}mx z6b%oD$^j{JE(V76>seVRurn}(hAJ?CU`G-e7FK!PI(#x%CFi)*Gxbp#a&2 B7;69k delta 112 zcmdn8Ms&*>(FrXfqN0q90y7vG*w{ox6Brm692^)!ffNL2FfceeG72(SBrs@cIXEN$ xMMDv?4CY)6469bLvQA(Ji7POGU!RtP|Kl;tC8Pc}7MCm&O~dHyF3xVA`|_0ETlC`2YX_ diff --git a/Tests/test_file_vtf.py b/Tests/test_file_vtf.py index 021765d1626..b0e7321fe48 100644 --- a/Tests/test_file_vtf.py +++ b/Tests/test_file_vtf.py @@ -63,7 +63,7 @@ def test_get_mipmap_count(size: Tuple[int, int], expected_count: int): ], ) def test_get_texture_size( - pixel_format: VtfPF, size: Tuple[int, int], expected_size: int + pixel_format: VtfPF, size: Tuple[int, int], expected_size: int ): assert _get_texture_size(pixel_format, *size) == expected_size @@ -72,17 +72,18 @@ def test_get_texture_size( ("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", "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_loading( - etalon_path: str, file_path: str, expected_mode: str, epsilon: float +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) @@ -92,3 +93,32 @@ def test_vtf_loading( 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) diff --git a/src/PIL/VtfImagePlugin.py b/src/PIL/VtfImagePlugin.py index ba7e572605e..79f82d92e87 100644 --- a/src/PIL/VtfImagePlugin.py +++ b/src/PIL/VtfImagePlugin.py @@ -76,29 +76,29 @@ class VtfPF(IntEnum): ABGR8888 = 1 RGB888 = 2 BGR888 = 3 - RGB565 = 4 + # RGB565 = 4 I8 = 5 IA88 = 6 - P8 = 7 + # P8 = 7 A8 = 8 - RGB888_BLUESCREEN = 9 - BGR888_BLUESCREEN = 10 + # RGB888_BLUESCREEN = 9 + # BGR888_BLUESCREEN = 10 ARGB8888 = 11 BGRA8888 = 12 DXT1 = 13 DXT3 = 14 DXT5 = 15 BGRX8888 = 16 - BGR565 = 17 - BGRX5551 = 18 - BGRA4444 = 19 + # BGR565 = 17 + # BGRX5551 = 18 + # BGRA4444 = 19 DXT1_ONEBITALPHA = 20 - BGRA5551 = 21 + # BGRA5551 = 21 UV88 = 22 - UVWQ8888 = 23 - RGBA16161616F = 24 - RGBA16161616 = 25 - UVLX8888 = 26 + # UVWQ8888 = 23 + # RGBA16161616F = 24 + # RGBA16161616 = 25 + # UVLX8888 = 26 VTFHeader = NamedTuple( @@ -125,26 +125,8 @@ class VtfPF(IntEnum): ("resource_count", int), ], ) -RGB_FORMATS = ( - VtfPF.DXT1, - VtfPF.RGB888, - VtfPF.BGR888, - VtfPF.UV88, -) -RGBA_FORMATS = ( - VtfPF.DXT1_ONEBITALPHA, - VtfPF.DXT3, - VtfPF.DXT5, - VtfPF.RGBA8888, -) -L_FORMATS = ( - VtfPF.A8, - VtfPF.I8, -) -LA_FORMATS = (VtfPF.IA88,) BLOCK_COMPRESSED = (VtfPF.DXT1, VtfPF.DXT1_ONEBITALPHA, VtfPF.DXT3, VtfPF.DXT5) -SUPPORTED_FORMATS = RGBA_FORMATS + RGB_FORMATS + LA_FORMATS + L_FORMATS HEADER_V70 = "context)->pixel_format, "DXT1A") != 0) { - no_alpha = 1; + if (strcmp(((BCNSTATE *)state->context)->pixel_format, "DXT1A") == 0) { + alpha = 1; } INT32 block_count = (im->xsize * im->ysize) / 16; if (block_count * sizeof(bc1_color) > bytes) { @@ -143,6 +143,7 @@ encode_bc1(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { UINT16 unique_colors[16]; UINT8 color_frequency[16]; UINT8 opaque[16]; + UINT8 local_alpha = 0; memset(all_colors, 0, sizeof(all_colors)); memset(unique_colors, 0, sizeof(unique_colors)); memset(color_frequency, 0, sizeof(color_frequency)); @@ -157,7 +158,8 @@ encode_bc1(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { UINT8 b = im->image[y][x * im->pixelsize + 0]; UINT8 a = im->image[y][x * im->pixelsize + 3]; UINT16 color = PACK_SHORT_565(r, g, b); - opaque[bx + by * 4] = a >= 127; + opaque[bx + by * 4] = a >= 128; + local_alpha |= a <= 128; all_colors[bx + by * 4] = color; UINT8 new_color = 1; @@ -179,17 +181,23 @@ encode_bc1(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { UINT16 c0 = 0, c1 = 0; pick_2_major_colors(unique_colors, color_frequency, unique_count, &c0, &c1); - if (c0 < c1 && no_alpha) { - SWAP(UINT16, c0, c1); + if (alpha && local_alpha) { + if (c0 > c1) { + SWAP(UINT16, c0, c1); + } + } else { + if (c0 < c1) { + SWAP(UINT16, c0, c1); + } } UINT16 palette[4] = {c0, c1, 0, 0}; - if (no_alpha) { - palette[2] = rgb565_lerp(c0, c1, 2, 1); - palette[3] = rgb565_lerp(c0, c1, 1, 2); - } else { + if (alpha && local_alpha) { palette[2] = rgb565_lerp(c0, c1, 1, 1); palette[3] = 0; + } else { + palette[2] = rgb565_lerp(c0, c1, 2, 1); + palette[3] = rgb565_lerp(c0, c1, 1, 2); } bc1_color block = {0}; block.c0 = c0; @@ -197,10 +205,10 @@ encode_bc1(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { UINT32 color_id; for (color_id = 0; color_id < 16; ++color_id) { UINT8 bc_color_id; - if (opaque[color_id] || no_alpha) { - bc_color_id = get_closest_color_index(palette, all_colors[color_id]); - } else { + if ((alpha && local_alpha) && !opaque[color_id]) { bc_color_id = 3; + } else { + bc_color_id = get_closest_color_index(palette, all_colors[color_id]); } SET_BITS(block.lut, color_id * 2, 2, bc_color_id); }