From 61b1eeb39f7ecddfe03a6063ae860d2f8950c8a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20S=2E=20O=2E=20Bueno?= Date: Tue, 4 Oct 2022 01:13:50 -0300 Subject: [PATCH 01/14] Fix indices of colors read from GIMP Palette file --- Tests/images/custom_gimp_palette.gpl | 16 +++++++-------- Tests/test_file_gimppalette.py | 30 ++++++++++++++++++++++++++++ src/PIL/GimpPaletteFile.py | 21 +++++++++---------- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/Tests/images/custom_gimp_palette.gpl b/Tests/images/custom_gimp_palette.gpl index 08ea7002849..229c45d3e56 100644 --- a/Tests/images/custom_gimp_palette.gpl +++ b/Tests/images/custom_gimp_palette.gpl @@ -2,11 +2,11 @@ GIMP Palette Name: custompalette Columns: 4 # - 0 0 0 Index 3 - 65 38 30 Index 4 -103 62 49 Index 6 - 79 73 72 Index 7 -114 101 97 Index 8 -208 127 100 Index 9 -151 144 142 Index 10 -221 207 199 Index 11 + 0 0 0 Index 0 + 65 38 30 Index 1 +103 62 49 Index 2 + 79 73 72 Index 3 +114 101 97 Index 4 +208 127 100 Index 5 +151 144 142 Index 6 +221 207 199 Index 7 diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index caec9cf2115..9ecce801eb8 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -30,3 +30,33 @@ def test_get_palette(): # Assert assert mode == "RGB" + + +def test_palette__has_correct_color_indexes(): + # Arrange + with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: + palette_file = GimpPaletteFile(fp) + + palette, mode = palette_file.getpalette() + + colors_in_test_palette = [ + (0, 0, 0), + (65, 38, 30), + (103, 62, 49), + (79, 73, 72), + (114, 101, 97), + (208, 127, 100), + (151, 144, 142), + (221, 207, 199), + ] + + for i, color in enumerate(colors_in_test_palette): + assert tuple(palette[i * 3: i * 3 + 3]) == color + + +def test_palette_counts_number_of_colors_in_file(): + # Arrange + with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: + palette_file = GimpPaletteFile(fp) + + assert palette_file.n_colors == 8 diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index 4d7cfbabab5..d26a229a8ee 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -18,6 +18,8 @@ from ._binary import o8 +_str_to_o8 = lambda v: o8(int(v)) + class GimpPaletteFile: """File handler for GIMP's palette format.""" @@ -26,17 +28,13 @@ class GimpPaletteFile: def __init__(self, fp): - self.palette = [o8(i) * 3 for i in range(256)] + palette = bytearray(b"".join([o8(i) * 3 for i in range(256)])) if fp.readline()[:12] != b"GIMP Palette": raise SyntaxError("not a GIMP palette file") - for i in range(256): - - s = fp.readline() - if not s: - break - + index = 0 + for s in fp: # skip fields and comment lines if re.match(rb"\w+:|#", s): continue @@ -44,12 +42,15 @@ def __init__(self, fp): raise SyntaxError("bad palette file") v = tuple(map(int, s.split()[:3])) - if len(v) != 3: + if len(v) < 3: raise ValueError("bad palette entry") - self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) + palette[index * 3: index * 3 + 3] = v + index += 1 + + self.palette = bytes(palette) + self.n_colors = index - self.palette = b"".join(self.palette) def getpalette(self): From d0837bd36ad5f2a61476be44eb57137ed34970ec Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 4 Oct 2022 04:41:17 +0000 Subject: [PATCH 02/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Tests/test_file_gimppalette.py | 2 +- src/PIL/GimpPaletteFile.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index 9ecce801eb8..4d82ab89375 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -51,7 +51,7 @@ def test_palette__has_correct_color_indexes(): ] for i, color in enumerate(colors_in_test_palette): - assert tuple(palette[i * 3: i * 3 + 3]) == color + assert tuple(palette[i * 3 : i * 3 + 3]) == color def test_palette_counts_number_of_colors_in_file(): diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index d26a229a8ee..87b12a2ab6b 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -45,13 +45,12 @@ def __init__(self, fp): if len(v) < 3: raise ValueError("bad palette entry") - palette[index * 3: index * 3 + 3] = v + palette[index * 3 : index * 3 + 3] = v index += 1 self.palette = bytes(palette) self.n_colors = index - def getpalette(self): return self.palette, self.rawmode From 681f77a2939a7b2e2bd5775e7929d68a29773576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20S=2E=20O=2E=20Bueno?= Date: Tue, 4 Oct 2022 01:53:38 -0300 Subject: [PATCH 03/14] Linter fixes, remove hanging unused lambda --- src/PIL/GimpPaletteFile.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index 87b12a2ab6b..7d08bab077f 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -18,8 +18,6 @@ from ._binary import o8 -_str_to_o8 = lambda v: o8(int(v)) - class GimpPaletteFile: """File handler for GIMP's palette format.""" From 4642e0257136d7239bcab4ad72595ba529de5b82 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 6 Oct 2022 11:43:20 +1100 Subject: [PATCH 04/14] Only use colors from the palette file --- Tests/test_file_gimppalette.py | 29 ++++++----------------------- src/PIL/GimpPaletteFile.py | 21 ++++++++++----------- 2 files changed, 16 insertions(+), 34 deletions(-) diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index 4d82ab89375..241273f8c5f 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -29,17 +29,8 @@ def test_get_palette(): palette, mode = palette_file.getpalette() # Assert - assert mode == "RGB" - - -def test_palette__has_correct_color_indexes(): - # Arrange - with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: - palette_file = GimpPaletteFile(fp) - - palette, mode = palette_file.getpalette() - - colors_in_test_palette = [ + expected_palette = b"" + for color in ( (0, 0, 0), (65, 38, 30), (103, 62, 49), @@ -48,15 +39,7 @@ def test_palette__has_correct_color_indexes(): (208, 127, 100), (151, 144, 142), (221, 207, 199), - ] - - for i, color in enumerate(colors_in_test_palette): - assert tuple(palette[i * 3 : i * 3 + 3]) == color - - -def test_palette_counts_number_of_colors_in_file(): - # Arrange - with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: - palette_file = GimpPaletteFile(fp) - - assert palette_file.n_colors == 8 + ): + expected_palette += bytes(color) + assert palette == expected_palette + assert mode == "RGB" diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index 7d08bab077f..cdc28f4e466 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -26,28 +26,27 @@ class GimpPaletteFile: def __init__(self, fp): - palette = bytearray(b"".join([o8(i) * 3 for i in range(256)])) - if fp.readline()[:12] != b"GIMP Palette": raise SyntaxError("not a GIMP palette file") - index = 0 - for s in fp: + self.palette = b"" + while len(self.palette) < 768: + + s = fp.readline() + if not s: + break + # skip fields and comment lines if re.match(rb"\w+:|#", s): continue if len(s) > 100: raise SyntaxError("bad palette file") - v = tuple(map(int, s.split()[:3])) + v = s.split() if len(v) < 3: raise ValueError("bad palette entry") - - palette[index * 3 : index * 3 + 3] = v - index += 1 - - self.palette = bytes(palette) - self.n_colors = index + for i in range(3): + self.palette += o8(int(v[i])) def getpalette(self): From a12389bf35c13446bdf06f70630c33b43f328833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20S=2E=20O=2E=20Bueno?= Date: Thu, 6 Oct 2022 11:35:41 -0300 Subject: [PATCH 05/14] Provide way to load big palettes; --- Tests/images/custom_gimp_palette.gpl | 2 +- Tests/test_file_gimppalette.py | 25 +++++++++++++++++++++++++ src/PIL/GimpPaletteFile.py | 27 +++++++++++++++++++++++---- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/Tests/images/custom_gimp_palette.gpl b/Tests/images/custom_gimp_palette.gpl index 229c45d3e56..ced2f243176 100644 --- a/Tests/images/custom_gimp_palette.gpl +++ b/Tests/images/custom_gimp_palette.gpl @@ -1,7 +1,7 @@ GIMP Palette Name: custompalette Columns: 4 -# +# Original written by David Wetz in https://stackoverflow.com/questions/815836/im-creating-a-program-that-generates-a-palette-from-a-true-color-image-need-hel/815855#815855 0 0 0 Index 0 65 38 30 Index 1 103 62 49 Index 2 diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index 241273f8c5f..23bb8aaabfc 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -20,6 +20,21 @@ def test_sanity(): GimpPaletteFile(fp) +def test_large_file_is_truncated(): + import warnings + from unittest.mock import patch + try: + original_value = GimpPaletteFile._max_file_size + GimpPaletteFile._max_file_size = 100 + with warnings.catch_warnings(): + warnings.simplefilter("error") + with pytest.raises(UserWarning): + with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: + palette_file = GimpPaletteFile(fp) + + finally: + GimpPaletteFile._max_file_size = original_value + def test_get_palette(): # Arrange with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: @@ -43,3 +58,13 @@ def test_get_palette(): expected_palette += bytes(color) assert palette == expected_palette assert mode == "RGB" + + +def test_n_colors(): + # Arrange + with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: + palette_file = GimpPaletteFile(fp) + + palette, _ = palette_file.getpalette() + assert len(palette) == 24 + assert palette_file.n_colors == 8 diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index cdc28f4e466..ff5d6e10f19 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -15,6 +15,7 @@ # import re +import warnings from ._binary import o8 @@ -24,25 +25,39 @@ class GimpPaletteFile: rawmode = "RGB" + #: override if reading larger palettes is needed + max_colors = 256 + _max_line_size = 100 + _max_file_size = 2 ** 20 + def __init__(self, fp): if fp.readline()[:12] != b"GIMP Palette": raise SyntaxError("not a GIMP palette file") + read = 0 + self.palette = b"" - while len(self.palette) < 768: + while len(self.palette) < 3 * self.max_colors: - s = fp.readline() + s = fp.readline(self._max_file_size) if not s: break + read += len(s) + if read >= self._max_file_size: + warnings.warn( + f"Palette file truncated at {self._max_file_size - len(s)} bytes") + break + # skip fields and comment lines if re.match(rb"\w+:|#", s): continue - if len(s) > 100: + if len(s) > self._max_line_size: raise SyntaxError("bad palette file") - v = s.split() + # 4th column is color name and may contain spaces. + v = s.split(None, 4) if len(v) < 3: raise ValueError("bad palette entry") for i in range(3): @@ -51,3 +66,7 @@ def __init__(self, fp): def getpalette(self): return self.palette, self.rawmode + + @property + def n_colors(self): + return len(self.palette) / 3 From 2f6467c94e60a28445b5e7f691da28e43dc730a5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 6 Oct 2022 16:51:28 +0000 Subject: [PATCH 06/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Tests/test_file_gimppalette.py | 2 ++ src/PIL/GimpPaletteFile.py | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index 23bb8aaabfc..ab45664af6a 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -23,6 +23,7 @@ def test_sanity(): def test_large_file_is_truncated(): import warnings from unittest.mock import patch + try: original_value = GimpPaletteFile._max_file_size GimpPaletteFile._max_file_size = 100 @@ -35,6 +36,7 @@ def test_large_file_is_truncated(): finally: GimpPaletteFile._max_file_size = original_value + def test_get_palette(): # Arrange with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index ff5d6e10f19..2d7104b202a 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -28,7 +28,7 @@ class GimpPaletteFile: #: override if reading larger palettes is needed max_colors = 256 _max_line_size = 100 - _max_file_size = 2 ** 20 + _max_file_size = 2**20 def __init__(self, fp): @@ -47,7 +47,8 @@ def __init__(self, fp): read += len(s) if read >= self._max_file_size: warnings.warn( - f"Palette file truncated at {self._max_file_size - len(s)} bytes") + f"Palette file truncated at {self._max_file_size - len(s)} bytes" + ) break # skip fields and comment lines From b4711584986551ef4d247e4eb7ef01388ac57e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20S=2E=20O=2E=20Bueno?= Date: Thu, 6 Oct 2022 18:02:19 -0300 Subject: [PATCH 07/14] :lipstick: --- Tests/test_file_gimppalette.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index ab45664af6a..c59a6b9f486 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -22,7 +22,6 @@ def test_sanity(): def test_large_file_is_truncated(): import warnings - from unittest.mock import patch try: original_value = GimpPaletteFile._max_file_size @@ -31,7 +30,7 @@ def test_large_file_is_truncated(): warnings.simplefilter("error") with pytest.raises(UserWarning): with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: - palette_file = GimpPaletteFile(fp) + GimpPaletteFile(fp) finally: GimpPaletteFile._max_file_size = original_value From 0d00d08b15a144b08541761856cb92c1b20e1323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20S=2E=20O=2E=20Bueno?= Date: Fri, 7 Oct 2022 00:10:45 -0300 Subject: [PATCH 08/14] Remove n_colors property --- Tests/test_file_gimppalette.py | 1 - src/PIL/GimpPaletteFile.py | 4 ---- 2 files changed, 5 deletions(-) diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index c59a6b9f486..2d6353f2572 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -68,4 +68,3 @@ def test_n_colors(): palette, _ = palette_file.getpalette() assert len(palette) == 24 - assert palette_file.n_colors == 8 diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index 2d7104b202a..ab051cde3e8 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -67,7 +67,3 @@ def __init__(self, fp): def getpalette(self): return self.palette, self.rawmode - - @property - def n_colors(self): - return len(self.palette) / 3 From 2eb6976590119946e2dbad279a07b741fe3ca3f1 Mon Sep 17 00:00:00 2001 From: "Joao S. O. Bueno" Date: Fri, 7 Oct 2022 01:22:32 -0300 Subject: [PATCH 09/14] Update src/PIL/GimpPaletteFile.py Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- src/PIL/GimpPaletteFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index ab051cde3e8..3e3e22c7beb 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -58,7 +58,7 @@ def __init__(self, fp): raise SyntaxError("bad palette file") # 4th column is color name and may contain spaces. - v = s.split(None, 4) + v = s.split(maxsplit=3) if len(v) < 3: raise ValueError("bad palette entry") for i in range(3): From c345080996a2071b4990a4face2f8012f038d77d Mon Sep 17 00:00:00 2001 From: "Joao S. O. Bueno" Date: Fri, 7 Oct 2022 01:57:35 -0300 Subject: [PATCH 10/14] Update Tests/test_file_gimppalette.py Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Tests/test_file_gimppalette.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index 2d6353f2572..f7913ff81da 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -59,12 +59,3 @@ def test_get_palette(): expected_palette += bytes(color) assert palette == expected_palette assert mode == "RGB" - - -def test_n_colors(): - # Arrange - with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: - palette_file = GimpPaletteFile(fp) - - palette, _ = palette_file.getpalette() - assert len(palette) == 24 From 378471e729997ad8a27a780f61a8edacb610620c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20S=2E=20O=2E=20Bueno?= Date: Sat, 8 Oct 2022 22:25:09 -0300 Subject: [PATCH 11/14] Mark 'break' after 'warning' as not "no cover": testing promotes the warning to an exception --- src/PIL/GimpPaletteFile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index 3e3e22c7beb..21188f5f5aa 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -28,7 +28,7 @@ class GimpPaletteFile: #: override if reading larger palettes is needed max_colors = 256 _max_line_size = 100 - _max_file_size = 2**20 + _max_file_size = 2 ** 20 # 1MB def __init__(self, fp): @@ -49,7 +49,7 @@ def __init__(self, fp): warnings.warn( f"Palette file truncated at {self._max_file_size - len(s)} bytes" ) - break + break # pragma: no cover # skip fields and comment lines if re.match(rb"\w+:|#", s): From 8979f0ccabfa80f8a3a3abeb2e5e2ce5c2a32bdd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 9 Oct 2022 01:30:42 +0000 Subject: [PATCH 12/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/PIL/GimpPaletteFile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index 21188f5f5aa..b5fab25259c 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -28,7 +28,7 @@ class GimpPaletteFile: #: override if reading larger palettes is needed max_colors = 256 _max_line_size = 100 - _max_file_size = 2 ** 20 # 1MB + _max_file_size = 2**20 # 1MB def __init__(self, fp): From e007a0b45d505fe14038a952858d06882551b5fa Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 11 Oct 2022 23:28:27 +1100 Subject: [PATCH 13/14] Improved test --- Tests/test_file_gimppalette.py | 15 +++++---------- src/PIL/GimpPaletteFile.py | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index f7913ff81da..b58bb865e21 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -21,19 +21,14 @@ def test_sanity(): def test_large_file_is_truncated(): - import warnings - + original_max_file_size = GimpPaletteFile._max_file_size try: - original_value = GimpPaletteFile._max_file_size GimpPaletteFile._max_file_size = 100 - with warnings.catch_warnings(): - warnings.simplefilter("error") - with pytest.raises(UserWarning): - with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: - GimpPaletteFile(fp) - + with open("Tests/images/custom_gimp_palette.gpl", "rb") as fp: + with pytest.warns(UserWarning): + GimpPaletteFile(fp) finally: - GimpPaletteFile._max_file_size = original_value + GimpPaletteFile._max_file_size = original_max_file_size def test_get_palette(): diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index b5fab25259c..82121be3c97 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -49,7 +49,7 @@ def __init__(self, fp): warnings.warn( f"Palette file truncated at {self._max_file_size - len(s)} bytes" ) - break # pragma: no cover + break # skip fields and comment lines if re.match(rb"\w+:|#", s): From cefeab85da64fd69e32088752aa8d212886274f3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 5 Nov 2022 19:58:03 +1100 Subject: [PATCH 14/14] Use array for better performance --- Tests/test_file_gimppalette.py | 6 +++--- src/PIL/GimpPaletteFile.py | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index b58bb865e21..e6587ff7c0b 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -40,7 +40,7 @@ def test_get_palette(): palette, mode = palette_file.getpalette() # Assert - expected_palette = b"" + expected_palette = [] for color in ( (0, 0, 0), (65, 38, 30), @@ -51,6 +51,6 @@ def test_get_palette(): (151, 144, 142), (221, 207, 199), ): - expected_palette += bytes(color) - assert palette == expected_palette + expected_palette += color + assert palette == bytes(expected_palette) assert mode == "RGB" diff --git a/src/PIL/GimpPaletteFile.py b/src/PIL/GimpPaletteFile.py index 82121be3c97..736900f0670 100644 --- a/src/PIL/GimpPaletteFile.py +++ b/src/PIL/GimpPaletteFile.py @@ -17,8 +17,6 @@ import re import warnings -from ._binary import o8 - class GimpPaletteFile: """File handler for GIMP's palette format.""" @@ -37,7 +35,7 @@ def __init__(self, fp): read = 0 - self.palette = b"" + self.palette = [] while len(self.palette) < 3 * self.max_colors: s = fp.readline(self._max_file_size) @@ -61,8 +59,10 @@ def __init__(self, fp): v = s.split(maxsplit=3) if len(v) < 3: raise ValueError("bad palette entry") - for i in range(3): - self.palette += o8(int(v[i])) + + self.palette += (int(v[0]), int(v[1]), int(v[2])) + + self.palette = bytes(self.palette) def getpalette(self):