From 607acbf95e8ee0a5900d3406324bffc77e02b49a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 5 Nov 2024 07:05:39 +1100 Subject: [PATCH 001/268] Allow window to be supplied for ImageGrab.grab() on Windows --- Tests/test_imagegrab.py | 5 +++++ docs/reference/ImageGrab.rst | 5 +++++ src/PIL/ImageGrab.py | 11 ++++++++- src/display.c | 43 ++++++++++++++++++++++++++++++------ 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index 5cd510751..032dac8cc 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -57,6 +57,11 @@ class TestImageGrab: ImageGrab.grab(xdisplay="error.test:0.0") assert str(e.value).startswith("X connection failed") + @pytest.mark.skipif(sys.platform != "win32", reason="Windows only") + def test_grab_invalid_handle(self) -> None: + with pytest.raises(OSError): + ImageGrab.grab(window=-1) + def test_grabclipboard(self) -> None: if sys.platform == "darwin": subprocess.call(["screencapture", "-cx"]) diff --git a/docs/reference/ImageGrab.rst b/docs/reference/ImageGrab.rst index db2987eb0..6435e1a0c 100644 --- a/docs/reference/ImageGrab.rst +++ b/docs/reference/ImageGrab.rst @@ -39,6 +39,11 @@ or the clipboard to a PIL image memory. You can check X11 support using :py:func:`PIL.features.check_feature` with ``feature="xcb"``. .. versionadded:: 7.1.0 + + :param handle: + HWND, to capture a single window. Windows only. + + .. versionadded:: 11.1.0 :return: An image .. py:function:: grabclipboard() diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index e27ca7e50..4dcaaa6c3 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -22,15 +22,20 @@ import shutil import subprocess import sys import tempfile +from typing import TYPE_CHECKING from . import Image +if TYPE_CHECKING: + from . import ImageWin + def grab( bbox: tuple[int, int, int, int] | None = None, include_layered_windows: bool = False, all_screens: bool = False, xdisplay: str | None = None, + window: int | ImageWin.HWND | None = None, ) -> Image.Image: im: Image.Image if xdisplay is None: @@ -51,8 +56,12 @@ def grab( return im_resized return im elif sys.platform == "win32": + if window is not None: + all_screens = -1 offset, size, data = Image.core.grabscreen_win32( - include_layered_windows, all_screens + include_layered_windows, + all_screens, + int(window) if window is not None else 0, ) im = Image.frombytes( "RGB", diff --git a/src/display.c b/src/display.c index b4e2e3899..30b7ada11 100644 --- a/src/display.c +++ b/src/display.c @@ -320,25 +320,36 @@ typedef HANDLE(__stdcall *Func_SetThreadDpiAwarenessContext)(HANDLE); PyObject * PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { - int x = 0, y = 0, width, height; - int includeLayeredWindows = 0, all_screens = 0; + int x = 0, y = 0, width = -1, height; + int includeLayeredWindows = 0, screens = 0; HBITMAP bitmap; BITMAPCOREHEADER core; HDC screen, screen_copy; + HWND wnd; DWORD rop; PyObject *buffer; HANDLE dpiAwareness; HMODULE user32; Func_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContext_function; - if (!PyArg_ParseTuple(args, "|ii", &includeLayeredWindows, &all_screens)) { + if (!PyArg_ParseTuple( + args, "|ii" F_HANDLE, &includeLayeredWindows, &screens, &wnd + )) { return NULL; } /* step 1: create a memory DC large enough to hold the entire screen */ - screen = CreateDC("DISPLAY", NULL, NULL, NULL); + if (screens == -1) { + screen = GetDC(wnd); + if (screen == NULL) { + PyErr_SetString(PyExc_OSError, "unable to get device context for handle"); + return NULL; + } + } else { + screen = CreateDC("DISPLAY", NULL, NULL, NULL); + } screen_copy = CreateCompatibleDC(screen); // added in Windows 10 (1607) @@ -351,11 +362,17 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE)-3); } - if (all_screens) { + if (screens == 1) { x = GetSystemMetrics(SM_XVIRTUALSCREEN); y = GetSystemMetrics(SM_YVIRTUALSCREEN); width = GetSystemMetrics(SM_CXVIRTUALSCREEN); height = GetSystemMetrics(SM_CYVIRTUALSCREEN); + } else if (screens == -1) { + RECT rect; + if (GetClientRect(wnd, &rect)) { + width = rect.right; + height = rect.bottom; + } } else { width = GetDeviceCaps(screen, HORZRES); height = GetDeviceCaps(screen, VERTRES); @@ -367,6 +384,10 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { FreeLibrary(user32); + if (width == -1) { + goto error; + } + bitmap = CreateCompatibleBitmap(screen, width, height); if (!bitmap) { goto error; @@ -412,7 +433,11 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { DeleteObject(bitmap); DeleteDC(screen_copy); - DeleteDC(screen); + if (screens == -1) { + ReleaseDC(wnd, screen); + } else { + DeleteDC(screen); + } return Py_BuildValue("(ii)(ii)N", x, y, width, height, buffer); @@ -420,7 +445,11 @@ error: PyErr_SetString(PyExc_OSError, "screen grab failed"); DeleteDC(screen_copy); - DeleteDC(screen); + if (screens == -1) { + ReleaseDC(wnd, screen); + } else { + DeleteDC(screen); + } return NULL; } From 28e5b929f8dcae3312f45e8aeb8d3b03b290036d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 5 Nov 2024 08:40:09 +1100 Subject: [PATCH 002/268] Test 0 --- Tests/test_imagegrab.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index 032dac8cc..35aaa7ff0 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -59,8 +59,10 @@ class TestImageGrab: @pytest.mark.skipif(sys.platform != "win32", reason="Windows only") def test_grab_invalid_handle(self) -> None: - with pytest.raises(OSError): + with pytest.raises(OSError, match="unable to get device context for handle"): ImageGrab.grab(window=-1) + with pytest.raises(OSError, match="screen grab failed"): + ImageGrab.grab(window=0) def test_grabclipboard(self) -> None: if sys.platform == "darwin": From 9622266c2a9b81b7b9a9e2e670571f9889bbe4d5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 5 Nov 2024 18:33:25 +1100 Subject: [PATCH 003/268] Use DPI awareness from window --- src/display.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/display.c b/src/display.c index 30b7ada11..b78d0dca1 100644 --- a/src/display.c +++ b/src/display.c @@ -316,6 +316,7 @@ PyImaging_DisplayModeWin32(PyObject *self, PyObject *args) { /* -------------------------------------------------------------------- */ /* Windows screen grabber */ +typedef HANDLE(__stdcall *Func_GetWindowDpiAwarenessContext)(HANDLE); typedef HANDLE(__stdcall *Func_SetThreadDpiAwarenessContext)(HANDLE); PyObject * @@ -330,6 +331,7 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { PyObject *buffer; HANDLE dpiAwareness; HMODULE user32; + Func_GetWindowDpiAwarenessContext GetWindowDpiAwarenessContext_function; Func_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContext_function; if (!PyArg_ParseTuple( @@ -358,8 +360,19 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { SetThreadDpiAwarenessContext_function = (Func_SetThreadDpiAwarenessContext )GetProcAddress(user32, "SetThreadDpiAwarenessContext"); if (SetThreadDpiAwarenessContext_function != NULL) { - // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) - dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE)-3); + if (screens == -1) { + GetWindowDpiAwarenessContext_function = (Func_GetWindowDpiAwarenessContext + )GetProcAddress(user32, "GetWindowDpiAwarenessContext"); + DPI_AWARENESS_CONTEXT dpiAwarenessContext = + GetWindowDpiAwarenessContext_function(wnd); + if (dpiAwarenessContext != NULL) { + dpiAwareness = + SetThreadDpiAwarenessContext_function(dpiAwarenessContext); + } + } else { + // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) + dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE)-3); + } } if (screens == 1) { From 7763350f072ca4ebe714352871df3ef8429b40bb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 Nov 2024 07:30:09 +1100 Subject: [PATCH 004/268] Fallback to PER_MONITOR_AWARE --- src/display.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/display.c b/src/display.c index b78d0dca1..da248443c 100644 --- a/src/display.c +++ b/src/display.c @@ -368,6 +368,8 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { if (dpiAwarenessContext != NULL) { dpiAwareness = SetThreadDpiAwarenessContext_function(dpiAwarenessContext); + } else { + dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE)-3); } } else { // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) From a44b3067b0e31d6c3a89ba270db20b1a1a71d226 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Fri, 8 Nov 2024 07:45:29 +1100 Subject: [PATCH 005/268] Fallback to PER_MONITOR_AWARE if GetWindowDpiAwarenessContext is not available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ondrej Baranovič --- src/display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/display.c b/src/display.c index da248443c..f28926427 100644 --- a/src/display.c +++ b/src/display.c @@ -365,7 +365,7 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { )GetProcAddress(user32, "GetWindowDpiAwarenessContext"); DPI_AWARENESS_CONTEXT dpiAwarenessContext = GetWindowDpiAwarenessContext_function(wnd); - if (dpiAwarenessContext != NULL) { + if (GetWindowDpiAwarenessContext_function != NULL && dpiAwarenessContext != NULL) { dpiAwareness = SetThreadDpiAwarenessContext_function(dpiAwarenessContext); } else { From 288d77efd6f198d1c01c3eb62c333c6021b521bc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:45:58 +0000 Subject: [PATCH 006/268] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/display.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/display.c b/src/display.c index f28926427..89fec2c28 100644 --- a/src/display.c +++ b/src/display.c @@ -365,7 +365,8 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { )GetProcAddress(user32, "GetWindowDpiAwarenessContext"); DPI_AWARENESS_CONTEXT dpiAwarenessContext = GetWindowDpiAwarenessContext_function(wnd); - if (GetWindowDpiAwarenessContext_function != NULL && dpiAwarenessContext != NULL) { + if (GetWindowDpiAwarenessContext_function != NULL && + dpiAwarenessContext != NULL) { dpiAwareness = SetThreadDpiAwarenessContext_function(dpiAwarenessContext); } else { From 4b8867069b3b49cfabe2a7ef6275a7c0d85406af Mon Sep 17 00:00:00 2001 From: Nulano Date: Thu, 7 Nov 2024 22:06:28 +0100 Subject: [PATCH 007/268] Fix GetWindowDpiAwarenessContext NULL check --- src/display.c | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/display.c b/src/display.c index 89fec2c28..5babd4f2a 100644 --- a/src/display.c +++ b/src/display.c @@ -329,7 +329,7 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { HWND wnd; DWORD rop; PyObject *buffer; - HANDLE dpiAwareness; + HANDLE dpiAwareness = NULL; HMODULE user32; Func_GetWindowDpiAwarenessContext GetWindowDpiAwarenessContext_function; Func_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContext_function; @@ -359,23 +359,15 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { user32 = LoadLibraryA("User32.dll"); SetThreadDpiAwarenessContext_function = (Func_SetThreadDpiAwarenessContext )GetProcAddress(user32, "SetThreadDpiAwarenessContext"); + GetWindowDpiAwarenessContext_function = (Func_GetWindowDpiAwarenessContext + )GetProcAddress(user32, "GetWindowDpiAwarenessContext"); if (SetThreadDpiAwarenessContext_function != NULL) { - if (screens == -1) { - GetWindowDpiAwarenessContext_function = (Func_GetWindowDpiAwarenessContext - )GetProcAddress(user32, "GetWindowDpiAwarenessContext"); - DPI_AWARENESS_CONTEXT dpiAwarenessContext = + if (screens == -1 && GetWindowDpiAwarenessContext_function != NULL) { + dpiAwareness = GetWindowDpiAwarenessContext_function(wnd); - if (GetWindowDpiAwarenessContext_function != NULL && - dpiAwarenessContext != NULL) { - dpiAwareness = - SetThreadDpiAwarenessContext_function(dpiAwarenessContext); - } else { - dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE)-3); - } - } else { - // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) - dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE)-3); } + // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) + dpiAwareness = SetThreadDpiAwarenessContext_function(dpiAwareness == NULL ? (HANDLE)-3 : dpiAwareness); } if (screens == 1) { From a6c941ac2c5e0b88d827c6d5c753cce3021e9e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ondrej=20Baranovi=C4=8D?= Date: Thu, 7 Nov 2024 22:22:02 +0100 Subject: [PATCH 008/268] Do not load GetWindowDpiAwarenessContext until its needed Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- src/display.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/display.c b/src/display.c index 5babd4f2a..353d52396 100644 --- a/src/display.c +++ b/src/display.c @@ -359,9 +359,9 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { user32 = LoadLibraryA("User32.dll"); SetThreadDpiAwarenessContext_function = (Func_SetThreadDpiAwarenessContext )GetProcAddress(user32, "SetThreadDpiAwarenessContext"); - GetWindowDpiAwarenessContext_function = (Func_GetWindowDpiAwarenessContext - )GetProcAddress(user32, "GetWindowDpiAwarenessContext"); if (SetThreadDpiAwarenessContext_function != NULL) { + GetWindowDpiAwarenessContext_function = (Func_GetWindowDpiAwarenessContext + )GetProcAddress(user32, "GetWindowDpiAwarenessContext"); if (screens == -1 && GetWindowDpiAwarenessContext_function != NULL) { dpiAwareness = GetWindowDpiAwarenessContext_function(wnd); From acba5c47f8be16869da92efb877f07451612fa04 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 Nov 2024 08:24:13 +1100 Subject: [PATCH 009/268] Lint fix --- src/display.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/display.c b/src/display.c index 353d52396..b0693bf71 100644 --- a/src/display.c +++ b/src/display.c @@ -363,11 +363,12 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { GetWindowDpiAwarenessContext_function = (Func_GetWindowDpiAwarenessContext )GetProcAddress(user32, "GetWindowDpiAwarenessContext"); if (screens == -1 && GetWindowDpiAwarenessContext_function != NULL) { - dpiAwareness = - GetWindowDpiAwarenessContext_function(wnd); + dpiAwareness = GetWindowDpiAwarenessContext_function(wnd); } // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) - dpiAwareness = SetThreadDpiAwarenessContext_function(dpiAwareness == NULL ? (HANDLE)-3 : dpiAwareness); + dpiAwareness = SetThreadDpiAwarenessContext_function( + dpiAwareness == NULL ? (HANDLE)-3 : dpiAwareness + ); } if (screens == 1) { From f056c259a7080a337b2ee09fee343dad1d3e48ab Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 4 Feb 2025 21:07:05 +1100 Subject: [PATCH 010/268] Support ttb multiline text --- Tests/images/test_combine_multiline_ttb.png | Bin 0 -> 4042 bytes Tests/test_imagefontctl.py | 29 +++-- src/PIL/ImageDraw.py | 130 ++++++++++---------- 3 files changed, 88 insertions(+), 71 deletions(-) create mode 100644 Tests/images/test_combine_multiline_ttb.png diff --git a/Tests/images/test_combine_multiline_ttb.png b/Tests/images/test_combine_multiline_ttb.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c4aa2a1ae7e9c150c6ba0a53a78ccaacf6a865 GIT binary patch literal 4042 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 L&L>I7y_5e5ZOkoU literal 0 HcmV?d00001 diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index c85eb499c..5954de874 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -4,7 +4,11 @@ import pytest from PIL import Image, ImageDraw, ImageFont -from .helper import assert_image_similar_tofile, skip_unless_feature +from .helper import ( + assert_image_equal_tofile, + assert_image_similar_tofile, + skip_unless_feature, +) FONT_SIZE = 20 FONT_PATH = "Tests/fonts/DejaVuSans/DejaVuSans.ttf" @@ -354,11 +358,27 @@ def test_combine_multiline(anchor: str, align: str) -> None: d.line(((200, 0), (200, 400)), "gray") bbox = d.multiline_textbbox((200, 200), text, anchor=anchor, font=f, align=align) d.rectangle(bbox, outline="red") - d.multiline_text((200, 200), text, fill="black", anchor=anchor, font=f, align=align) + d.multiline_text((200, 200), text, "black", anchor=anchor, font=f, align=align) assert_image_similar_tofile(im, path, 0.015) +def test_combine_multiline_ttb() -> None: + path = "Tests/images/test_combine_multiline_ttb.png" + f = ImageFont.truetype("Tests/fonts/NotoSans-Regular.ttf", 48) + text = "te\nxt" + + im = Image.new("RGB", (400, 400), "white") + d = ImageDraw.Draw(im) + d.line(((0, 200), (400, 200)), "gray") + d.line(((200, 0), (200, 400)), "gray") + bbox = d.multiline_textbbox((200, 200), text, f, direction="ttb") + d.rectangle(bbox, outline="red") + d.multiline_text((200, 200), text, "black", f, direction="ttb") + + assert_image_equal_tofile(im, path) + + def test_anchor_invalid_ttb() -> None: font = ImageFont.truetype(FONT_PATH, FONT_SIZE) im = Image.new("RGB", (100, 100), "white") @@ -378,8 +398,3 @@ def test_anchor_invalid_ttb() -> None: d.multiline_text((0, 0), "foo\nbar", anchor=anchor, direction="ttb") with pytest.raises(ValueError): d.multiline_textbbox((0, 0), "foo\nbar", anchor=anchor, direction="ttb") - # ttb multiline text does not support anchors at all - with pytest.raises(ValueError): - d.multiline_text((0, 0), "foo\nbar", anchor="mm", direction="ttb") - with pytest.raises(ValueError): - d.multiline_textbbox((0, 0), "foo\nbar", anchor="mm", direction="ttb") diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 742b5f587..2cb9860b7 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -708,24 +708,18 @@ class ImageDraw: str, list[tuple[tuple[float, float], AnyStr]], ]: - if direction == "ttb": - msg = "ttb direction is unsupported for multiline text" - raise ValueError(msg) - if anchor is None: - anchor = "la" + anchor = "lt" if direction == "ttb" else "la" elif len(anchor) != 2: msg = "anchor must be a 2 character string" raise ValueError(msg) - elif anchor[1] in "tb": + elif anchor[1] in "tb" and direction != "ttb": msg = "anchor not supported for multiline text" raise ValueError(msg) if font is None: font = self._getfont(font_size) - widths = [] - max_width: float = 0 lines = text.split("\n" if isinstance(text, str) else b"\n") line_spacing = ( self.textbbox((0, 0), "A", font, stroke_width=stroke_width)[3] @@ -733,67 +727,75 @@ class ImageDraw: + spacing ) - for line in lines: - line_width = self.textlength( - line, - font, - direction=direction, - features=features, - language=language, - embedded_color=embedded_color, - ) - widths.append(line_width) - max_width = max(max_width, line_width) - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - parts = [] - for idx, line in enumerate(lines): + if direction == "ttb": left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align in ("left", "justify"): - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - msg = 'align must be "left", "center", "right" or "justify"' - raise ValueError(msg) - - if align == "justify" and width_difference != 0: - words = line.split(" " if isinstance(text, str) else b" ") - word_widths = [ - self.textlength( - word, - font, - direction=direction, - features=features, - language=language, - embedded_color=embedded_color, - ) - for word in words - ] - width_difference = max_width - sum(word_widths) - for i, word in enumerate(words): - parts.append(((left, top), word)) - left += word_widths[i] + width_difference / (len(words) - 1) - else: + for line in lines: parts.append(((left, top), line)) + left += line_spacing + else: + widths = [] + max_width: float = 0 + for line in lines: + line_width = self.textlength( + line, + font, + direction=direction, + features=features, + language=language, + embedded_color=embedded_color, + ) + widths.append(line_width) + max_width = max(max_width, line_width) - top += line_spacing + if anchor[1] == "m": + top -= (len(lines) - 1) * line_spacing / 2.0 + elif anchor[1] == "d": + top -= (len(lines) - 1) * line_spacing + + for idx, line in enumerate(lines): + left = xy[0] + width_difference = max_width - widths[idx] + + # first align left by anchor + if anchor[0] == "m": + left -= width_difference / 2.0 + elif anchor[0] == "r": + left -= width_difference + + # then align by align parameter + if align in ("left", "justify"): + pass + elif align == "center": + left += width_difference / 2.0 + elif align == "right": + left += width_difference + else: + msg = 'align must be "left", "center", "right" or "justify"' + raise ValueError(msg) + + if align == "justify" and width_difference != 0: + words = line.split(" " if isinstance(text, str) else b" ") + word_widths = [ + self.textlength( + word, + font, + direction=direction, + features=features, + language=language, + embedded_color=embedded_color, + ) + for word in words + ] + width_difference = max_width - sum(word_widths) + for i, word in enumerate(words): + parts.append(((left, top), word)) + left += word_widths[i] + width_difference / (len(words) - 1) + else: + parts.append(((left, top), line)) + + top += line_spacing return font, anchor, parts From 6c7917d7a6031ae22e1d9eaccc2e536123ea25c2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 17 Mar 2025 07:54:47 +1100 Subject: [PATCH 011/268] Revert to zlib on macOS < 10.15 --- .github/workflows/wheels-dependencies.sh | 7 ++++++- Tests/check_wheel.py | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index e9c54536e..e0c18d6c2 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -45,6 +45,7 @@ OPENJPEG_VERSION=2.5.3 XZ_VERSION=5.6.4 TIFF_VERSION=4.7.0 LCMS2_VERSION=2.17 +ZLIB_VERSION=1.3.1 ZLIB_NG_VERSION=2.2.4 LIBWEBP_VERSION=1.5.0 BZIP2_VERSION=1.0.8 @@ -106,7 +107,11 @@ function build { if [ -z "$IS_ALPINE" ] && [ -z "$SANITIZER" ] && [ -z "$IS_MACOS" ]; then yum remove -y zlib-devel fi - build_zlib_ng + if [[ -n "$IS_MACOS" ]] && [[ "$MACOSX_DEPLOYMENT_TARGET" == "10.10" || "$MACOSX_DEPLOYMENT_TARGET" == "10.13" ]]; then + build_new_zlib + else + build_zlib_ng + fi build_simple xcb-proto 1.17.0 https://xorg.freedesktop.org/archive/individual/proto if [ -n "$IS_MACOS" ]; then diff --git a/Tests/check_wheel.py b/Tests/check_wheel.py index 563be0b74..8ba40ba3f 100644 --- a/Tests/check_wheel.py +++ b/Tests/check_wheel.py @@ -1,9 +1,12 @@ from __future__ import annotations +import platform import sys from PIL import features +from .helper import is_pypy + def test_wheel_modules() -> None: expected_modules = {"pil", "tkinter", "freetype2", "littlecms2", "webp"} @@ -40,5 +43,7 @@ def test_wheel_features() -> None: if sys.platform == "win32": expected_features.remove("xcb") + elif sys.platform == "darwin" and not is_pypy() and platform.processor() != "arm": + expected_features.remove("zlib_ng") assert set(features.get_supported_features()) == expected_features From 722283e8199ab071906982d5efde51f2122ed5ae Mon Sep 17 00:00:00 2001 From: Adian Kozlica Date: Fri, 28 Mar 2025 16:43:10 +0100 Subject: [PATCH 012/268] Add KDE Wayland support for ImageGrab --- Tests/test_imagegrab.py | 4 +--- src/PIL/ImageGrab.py | 9 +++++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index 5cd510751..e8fd9524c 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -40,9 +40,7 @@ class TestImageGrab: @pytest.mark.skipif(Image.core.HAVE_XCB, reason="tests missing XCB") def test_grab_no_xcb(self) -> None: - if sys.platform not in ("win32", "darwin") and not shutil.which( - "gnome-screenshot" - ): + if sys.platform not in ("win32", "darwin") and not shutil.which("gnome-screenshot") and not shutil.which('spectacle'): with pytest.raises(OSError) as e: ImageGrab.grab() assert str(e.value).startswith("Pillow was built without XCB support") diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index fe27bfaeb..5ac0b6a21 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -80,11 +80,16 @@ def grab( if ( display_name is None and sys.platform not in ("darwin", "win32") - and shutil.which("gnome-screenshot") ): fh, filepath = tempfile.mkstemp(".png") os.close(fh) - subprocess.call(["gnome-screenshot", "-f", filepath]) + if shutil.which("gnome-screenshot"): + subprocess.call(["gnome-screenshot", "-f", filepath]) + elif shutil.which("spectacle"): + subprocess.call(["spectacle", "-n", "-b", "-f", "-o", filepath]) + else: + os.unlink(filepath) + raise im = Image.open(filepath) im.load() os.unlink(filepath) From eeb494abf714579c0744381eaaaab1fc1f5eac85 Mon Sep 17 00:00:00 2001 From: Adian Kozlica Date: Fri, 28 Mar 2025 17:18:09 +0100 Subject: [PATCH 013/268] Fix formatting --- Tests/test_imagegrab.py | 6 +++++- src/PIL/ImageGrab.py | 7 ++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index e8fd9524c..ab06f04e2 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -40,7 +40,11 @@ class TestImageGrab: @pytest.mark.skipif(Image.core.HAVE_XCB, reason="tests missing XCB") def test_grab_no_xcb(self) -> None: - if sys.platform not in ("win32", "darwin") and not shutil.which("gnome-screenshot") and not shutil.which('spectacle'): + if ( + sys.platform not in ("win32", "darwin") + and not shutil.which("gnome-screenshot") + and not shutil.which("spectacle") + ): with pytest.raises(OSError) as e: ImageGrab.grab() assert str(e.value).startswith("Pillow was built without XCB support") diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index 5ac0b6a21..e79b4d651 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -77,10 +77,7 @@ def grab( raise OSError(msg) size, data = Image.core.grabscreen_x11(display_name) except OSError: - if ( - display_name is None - and sys.platform not in ("darwin", "win32") - ): + if display_name is None and sys.platform not in ("darwin", "win32"): fh, filepath = tempfile.mkstemp(".png") os.close(fh) if shutil.which("gnome-screenshot"): @@ -89,7 +86,7 @@ def grab( subprocess.call(["spectacle", "-n", "-b", "-f", "-o", filepath]) else: os.unlink(filepath) - raise + raise im = Image.open(filepath) im.load() os.unlink(filepath) From e685e2833e9e6de8f03cdc71ac9b58107c909768 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 29 Mar 2025 18:27:02 +1100 Subject: [PATCH 014/268] Do not create temporary file if no utility is available --- src/PIL/ImageGrab.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index e79b4d651..db2a8db06 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -78,15 +78,15 @@ def grab( size, data = Image.core.grabscreen_x11(display_name) except OSError: if display_name is None and sys.platform not in ("darwin", "win32"): + if shutil.which("gnome-screenshot"): + args = ["gnome-screenshot", "-f"] + elif shutil.which("spectacle"): + args = ["spectacle", "-n", "-b", "-f", "-o"] + else: + raise fh, filepath = tempfile.mkstemp(".png") os.close(fh) - if shutil.which("gnome-screenshot"): - subprocess.call(["gnome-screenshot", "-f", filepath]) - elif shutil.which("spectacle"): - subprocess.call(["spectacle", "-n", "-b", "-f", "-o", filepath]) - else: - os.unlink(filepath) - raise + subprocess.call(args + [filepath]) im = Image.open(filepath) im.load() os.unlink(filepath) From e053be3412ea6db562cd4f240471e79f6bdbae53 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sun, 30 Mar 2025 07:27:30 +1100 Subject: [PATCH 015/268] Updated version Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- docs/reference/ImageGrab.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/ImageGrab.rst b/docs/reference/ImageGrab.rst index 6435e1a0c..671d1ccee 100644 --- a/docs/reference/ImageGrab.rst +++ b/docs/reference/ImageGrab.rst @@ -43,7 +43,7 @@ or the clipboard to a PIL image memory. :param handle: HWND, to capture a single window. Windows only. - .. versionadded:: 11.1.0 + .. versionadded:: 11.2.0 :return: An image .. py:function:: grabclipboard() From 382c3ab10d5583072a70250218d1bd5bef65ef8a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Mar 2025 11:16:05 +1100 Subject: [PATCH 016/268] spectacle may also be used on Linux --- docs/reference/ImageGrab.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/reference/ImageGrab.rst b/docs/reference/ImageGrab.rst index db2987eb0..1b81bc42c 100644 --- a/docs/reference/ImageGrab.rst +++ b/docs/reference/ImageGrab.rst @@ -16,8 +16,9 @@ or the clipboard to a PIL image memory. the entire screen is copied, and on macOS, it will be at 2x if on a Retina screen. On Linux, if ``xdisplay`` is ``None`` and the default X11 display does not return - a snapshot of the screen, ``gnome-screenshot`` will be used as fallback if it is - installed. To disable this behaviour, pass ``xdisplay=""`` instead. + a snapshot of the screen, ``gnome-screenshot`` or ``spectacle`` will be used as a + fallback if they are installed. To disable this behaviour, pass ``xdisplay=""`` + instead. .. versionadded:: 1.1.3 (Windows), 3.0.0 (macOS), 7.1.0 (Linux) From 80d5b421ebd8b8c20c39889862764822366ef183 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sun, 30 Mar 2025 22:13:21 +1100 Subject: [PATCH 017/268] Do not import type checking Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- src/PIL/ImageGrab.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index 0113ebcbf..e978b5d23 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -22,10 +22,9 @@ import shutil import subprocess import sys import tempfile -from typing import TYPE_CHECKING - from . import Image +TYPE_CHECKING = False if TYPE_CHECKING: from . import ImageWin From d2683e052f341a5f53c7bb440af7fba577e0f4d1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 30 Mar 2025 11:13:48 +0000 Subject: [PATCH 018/268] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/PIL/ImageGrab.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index e978b5d23..42abdf8c7 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -22,6 +22,7 @@ import shutil import subprocess import sys import tempfile + from . import Image TYPE_CHECKING = False From b4a480ff2cc3e418c04993a54f43b16df9174c28 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 31 Mar 2025 00:31:56 +1100 Subject: [PATCH 019/268] Corrected documentation --- docs/reference/ImageGrab.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reference/ImageGrab.rst b/docs/reference/ImageGrab.rst index 671d1ccee..54d66db13 100644 --- a/docs/reference/ImageGrab.rst +++ b/docs/reference/ImageGrab.rst @@ -9,7 +9,7 @@ or the clipboard to a PIL image memory. .. versionadded:: 1.1.3 -.. py:function:: grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None) +.. py:function:: grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None, window=None) Take a snapshot of the screen. The pixels inside the bounding box are returned as an "RGBA" on macOS, or an "RGB" image otherwise. If the bounding box is omitted, @@ -40,7 +40,7 @@ or the clipboard to a PIL image memory. .. versionadded:: 7.1.0 - :param handle: + :param window: HWND, to capture a single window. Windows only. .. versionadded:: 11.2.0 From 25af4f1841c837c8e7ad370f4b001409c1b221c2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 31 Mar 2025 00:32:35 +1100 Subject: [PATCH 020/268] Added release notes --- docs/releasenotes/11.2.0.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/releasenotes/11.2.0.rst b/docs/releasenotes/11.2.0.rst index d40d86f21..9f27d8456 100644 --- a/docs/releasenotes/11.2.0.rst +++ b/docs/releasenotes/11.2.0.rst @@ -51,6 +51,15 @@ aligned using ``"justify"`` in :py:mod:`~PIL.ImageDraw`:: draw.multiline_text((0, 0), "Multiline\ntext 1", align="justify") draw.multiline_textbbox((0, 0), "Multiline\ntext 2", align="justify") +Specify window in ImageGrab on Windows +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When using :py:meth:`~PIL.ImageGrab.grab`, a specific window can be selected using the +HWND:: + + from PIL import ImageGrab + ImageGrab.grab(window=hwnd) + Check for MozJPEG ^^^^^^^^^^^^^^^^^ From e995eef424cb996ebf933b690d30c1834b99999d Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 31 Mar 2025 22:31:24 +0300 Subject: [PATCH 021/268] Replace deprecated classifier with licence expression (PEP 639) --- .ci/install.sh | 2 +- pyproject.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index 62677005e..fbb6c28b5 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -50,7 +50,7 @@ if [[ $(uname) != CYGWIN* ]]; then # Pyroma uses non-isolated build and fails with old setuptools if [[ $GHA_PYTHON_VERSION == 3.9 ]]; then # To match pyproject.toml - python3 -m pip install "setuptools>=67.8" + python3 -m pip install "setuptools>=77" fi # webp diff --git a/pyproject.toml b/pyproject.toml index 780a938a3..3f9c916c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [build-system] build-backend = "backend" requires = [ - "setuptools>=67.8", + "setuptools>=77", ] backend-path = [ "_custom_build", @@ -14,14 +14,14 @@ readme = "README.md" keywords = [ "Imaging", ] -license = { text = "MIT-CMU" } +license = "MIT-CMU" +license-files = [ "LICENSE" ] authors = [ { name = "Jeffrey A. Clark", email = "aclark@aclark.net" }, ] requires-python = ">=3.9" classifiers = [ "Development Status :: 6 - Mature", - "License :: OSI Approved :: CMU License (MIT-CMU)", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", From d8a0cb5db104cc5d9acc6b4ba1ba871636132f51 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 31 Mar 2025 22:53:51 +0300 Subject: [PATCH 022/268] Work around pyroma test --- Tests/test_pyroma.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Tests/test_pyroma.py b/Tests/test_pyroma.py index c2f7fe22e..8235daf32 100644 --- a/Tests/test_pyroma.py +++ b/Tests/test_pyroma.py @@ -23,5 +23,11 @@ def test_pyroma() -> None: ) else: - # Should have a perfect score - assert rating == (10, []) + # Should have a perfect score, but pyroma does not support PEP 639 yet. + assert rating == ( + 9, + [ + "Your package does neither have a license field " + "nor any license classifiers." + ], + ) From 999d9a7f0cab002c78c93c3790307474256f7d90 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:09:09 +1100 Subject: [PATCH 023/268] Updated xz to 5.8.0 on manylinux2014 by removing po4a dependency (#8848) --- .github/workflows/wheels-dependencies.sh | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index 4858f6d69..2e842df64 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -42,11 +42,7 @@ HARFBUZZ_VERSION=11.0.0 LIBPNG_VERSION=1.6.47 JPEGTURBO_VERSION=3.1.0 OPENJPEG_VERSION=2.5.3 -if [[ $MB_ML_VER == 2014 ]]; then - XZ_VERSION=5.6.4 -else - XZ_VERSION=5.8.0 -fi +XZ_VERSION=5.8.0 TIFF_VERSION=4.7.0 LCMS2_VERSION=2.17 ZLIB_VERSION=1.3.1 @@ -56,6 +52,20 @@ BZIP2_VERSION=1.0.8 LIBXCB_VERSION=1.17.0 BROTLI_VERSION=1.1.0 +if [[ $MB_ML_VER == 2014 ]]; then + function build_xz { + if [ -e xz-stamp ]; then return; fi + yum install -y gettext-devel + fetch_unpack https://tukaani.org/xz/xz-$XZ_VERSION.tar.gz + (cd xz-$XZ_VERSION \ + && ./autogen.sh --no-po4a \ + && ./configure --prefix=$BUILD_PREFIX \ + && make -j4 \ + && make install) + touch xz-stamp + } +fi + function build_pkg_config { if [ -e pkg-config-stamp ]; then return; fi # This essentially duplicates the Homebrew recipe From 7d50816f0a6e607b04f9bdc8af7482a29ba578e3 Mon Sep 17 00:00:00 2001 From: Frankie Dintino Date: Tue, 1 Apr 2025 00:13:21 -0400 Subject: [PATCH 024/268] Add AVIF plugin (decoder + encoder using libavif) (#5201) Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .ci/install.sh | 5 +- .github/workflows/macos-install.sh | 7 + .github/workflows/test-mingw.yml | 1 + .github/workflows/test-windows.yml | 6 +- .github/workflows/wheels-dependencies.sh | 43 +- .github/workflows/wheels.yml | 5 + Tests/check_wheel.py | 8 +- Tests/images/avif/exif.avif | Bin 0 -> 16078 bytes Tests/images/avif/hopper-missing-pixi.avif | Bin 0 -> 5435 bytes Tests/images/avif/hopper.avif | Bin 0 -> 3077 bytes Tests/images/avif/hopper.heif | Bin 0 -> 3555 bytes Tests/images/avif/hopper_avif_write.png | Bin 0 -> 30311 bytes Tests/images/avif/icc_profile.avif | Bin 0 -> 6460 bytes Tests/images/avif/icc_profile_none.avif | Bin 0 -> 3303 bytes Tests/images/avif/rot0mir0.avif | Bin 0 -> 16357 bytes Tests/images/avif/rot0mir1.avif | Bin 0 -> 17157 bytes Tests/images/avif/rot1mir0.avif | Bin 0 -> 17182 bytes Tests/images/avif/rot1mir1.avif | Bin 0 -> 16588 bytes Tests/images/avif/rot2mir0.avif | Bin 0 -> 17001 bytes Tests/images/avif/rot2mir1.avif | Bin 0 -> 16387 bytes Tests/images/avif/rot3mir0.avif | Bin 0 -> 16568 bytes Tests/images/avif/rot3mir1.avif | Bin 0 -> 17290 bytes Tests/images/avif/star.avifs | Bin 0 -> 29724 bytes Tests/images/avif/star.gif | Bin 0 -> 2900 bytes Tests/images/avif/star.png | Bin 0 -> 3844 bytes Tests/images/avif/transparency.avif | Bin 0 -> 6441 bytes Tests/images/avif/xmp_tags_orientation.avif | Bin 0 -> 6686 bytes Tests/test_file_avif.py | 778 +++++++++++++++++ depends/install_libavif.sh | 64 ++ docs/handbook/image-file-formats.rst | 79 +- docs/installation/building-from-source.rst | 29 +- docs/reference/features.rst | 1 + docs/reference/plugins.rst | 8 + docs/releasenotes/11.2.0.rst | 9 + setup.py | 19 + src/PIL/AvifImagePlugin.py | 292 +++++++ src/PIL/Image.py | 2 + src/PIL/__init__.py | 1 + src/PIL/_avif.pyi | 3 + src/PIL/features.py | 2 + src/_avif.c | 908 ++++++++++++++++++++ wheels/dependency_licenses/AOM.txt | 26 + wheels/dependency_licenses/DAV1D.txt | 23 + wheels/dependency_licenses/LIBAVIF.txt | 387 +++++++++ wheels/dependency_licenses/LIBYUV.txt | 29 + wheels/dependency_licenses/RAV1E.txt | 25 + wheels/dependency_licenses/SVT-AV1.txt | 26 + winbuild/build.rst | 1 + winbuild/build_prepare.py | 28 + 49 files changed, 2807 insertions(+), 8 deletions(-) create mode 100644 Tests/images/avif/exif.avif create mode 100644 Tests/images/avif/hopper-missing-pixi.avif create mode 100644 Tests/images/avif/hopper.avif create mode 100644 Tests/images/avif/hopper.heif create mode 100644 Tests/images/avif/hopper_avif_write.png create mode 100644 Tests/images/avif/icc_profile.avif create mode 100644 Tests/images/avif/icc_profile_none.avif create mode 100644 Tests/images/avif/rot0mir0.avif create mode 100644 Tests/images/avif/rot0mir1.avif create mode 100644 Tests/images/avif/rot1mir0.avif create mode 100644 Tests/images/avif/rot1mir1.avif create mode 100644 Tests/images/avif/rot2mir0.avif create mode 100644 Tests/images/avif/rot2mir1.avif create mode 100644 Tests/images/avif/rot3mir0.avif create mode 100644 Tests/images/avif/rot3mir1.avif create mode 100644 Tests/images/avif/star.avifs create mode 100644 Tests/images/avif/star.gif create mode 100644 Tests/images/avif/star.png create mode 100644 Tests/images/avif/transparency.avif create mode 100644 Tests/images/avif/xmp_tags_orientation.avif create mode 100644 Tests/test_file_avif.py create mode 100755 depends/install_libavif.sh create mode 100644 src/PIL/AvifImagePlugin.py create mode 100644 src/PIL/_avif.pyi create mode 100644 src/_avif.c create mode 100644 wheels/dependency_licenses/AOM.txt create mode 100644 wheels/dependency_licenses/DAV1D.txt create mode 100644 wheels/dependency_licenses/LIBAVIF.txt create mode 100644 wheels/dependency_licenses/LIBYUV.txt create mode 100644 wheels/dependency_licenses/RAV1E.txt create mode 100644 wheels/dependency_licenses/SVT-AV1.txt diff --git a/.ci/install.sh b/.ci/install.sh index 62677005e..83d5df01c 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -23,7 +23,7 @@ if [[ $(uname) != CYGWIN* ]]; then sudo apt-get -qq install libfreetype6-dev liblcms2-dev libtiff-dev python3-tk\ ghostscript libjpeg-turbo8-dev libopenjp2-7-dev\ cmake meson imagemagick libharfbuzz-dev libfribidi-dev\ - sway wl-clipboard libopenblas-dev + sway wl-clipboard libopenblas-dev nasm fi python3 -m pip install --upgrade pip @@ -62,6 +62,9 @@ if [[ $(uname) != CYGWIN* ]]; then # raqm pushd depends && ./install_raqm.sh && popd + # libavif + pushd depends && CMAKE_POLICY_VERSION_MINIMUM=3.5 ./install_libavif.sh && popd + # extra test images pushd depends && ./install_extra_test_images.sh && popd else diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index 6aa59a4ac..099f4a582 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -6,6 +6,8 @@ if [[ "$ImageOS" == "macos13" ]]; then brew uninstall gradle maven fi brew install \ + aom \ + dav1d \ freetype \ ghostscript \ jpeg-turbo \ @@ -14,6 +16,8 @@ brew install \ libtiff \ little-cms2 \ openjpeg \ + rav1e \ + svt-av1 \ webp export PKG_CONFIG_PATH="/usr/local/opt/openblas/lib/pkgconfig" @@ -27,5 +31,8 @@ python3 -m pip install -U pytest-timeout python3 -m pip install pyroma python3 -m pip install numpy +# libavif +pushd depends && ./install_libavif.sh && popd + # extra test images pushd depends && ./install_extra_test_images.sh && popd diff --git a/.github/workflows/test-mingw.yml b/.github/workflows/test-mingw.yml index bb6d7dc37..5a83c16c3 100644 --- a/.github/workflows/test-mingw.yml +++ b/.github/workflows/test-mingw.yml @@ -60,6 +60,7 @@ jobs: mingw-w64-x86_64-gcc \ mingw-w64-x86_64-ghostscript \ mingw-w64-x86_64-lcms2 \ + mingw-w64-x86_64-libavif \ mingw-w64-x86_64-libimagequant \ mingw-w64-x86_64-libjpeg-turbo \ mingw-w64-x86_64-libraqm \ diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index a780c7835..0c3f44e96 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -42,7 +42,7 @@ jobs: # Test the oldest Python on 32-bit - { python-version: "3.9", architecture: "x86", os: "windows-2019" } - timeout-minutes: 30 + timeout-minutes: 45 name: Python ${{ matrix.python-version }} (${{ matrix.architecture }}) @@ -145,6 +145,10 @@ jobs: if: steps.build-cache.outputs.cache-hit != 'true' run: "& winbuild\\build\\build_dep_libpng.cmd" + - name: Build dependencies / libavif + if: steps.build-cache.outputs.cache-hit != 'true' && matrix.architecture == 'x64' + run: "& winbuild\\build\\build_dep_libavif.cmd" + # for FreeType WOFF2 font support - name: Build dependencies / brotli if: steps.build-cache.outputs.cache-hit != 'true' diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index 2e842df64..2f2e75b6c 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -25,7 +25,7 @@ else MB_ML_LIBC=${AUDITWHEEL_POLICY::9} MB_ML_VER=${AUDITWHEEL_POLICY:9} fi -PLAT=$CIBW_ARCHS +PLAT="${CIBW_ARCHS:-$AUDITWHEEL_ARCH}" # Define custom utilities source wheels/multibuild/common_utils.sh @@ -51,6 +51,7 @@ LIBWEBP_VERSION=1.5.0 BZIP2_VERSION=1.0.8 LIBXCB_VERSION=1.17.0 BROTLI_VERSION=1.1.0 +LIBAVIF_VERSION=1.2.1 if [[ $MB_ML_VER == 2014 ]]; then function build_xz { @@ -116,6 +117,45 @@ function build_harfbuzz { touch harfbuzz-stamp } +function build_libavif { + if [ -e libavif-stamp ]; then return; fi + + python3 -m pip install meson ninja + + if [[ "$PLAT" == "x86_64" ]] || [ -n "$SANITIZER" ]; then + build_simple nasm 2.16.03 https://www.nasm.us/pub/nasm/releasebuilds/2.16.03 + fi + + # For rav1e + curl https://sh.rustup.rs -sSf | sh -s -- -y + . "$HOME/.cargo/env" + if [ -z "$IS_ALPINE" ] && [ -z "$SANITIZER" ] && [ -z "$IS_MACOS" ]; then + yum install -y perl + if [[ "$MB_ML_VER" == 2014 ]]; then + yum install -y perl-IPC-Cmd + fi + fi + + local out_dir=$(fetch_unpack https://github.com/AOMediaCodec/libavif/archive/refs/tags/v$LIBAVIF_VERSION.tar.gz libavif-$LIBAVIF_VERSION.tar.gz) + (cd $out_dir \ + && CMAKE_POLICY_VERSION_MINIMUM=3.5 cmake \ + -DCMAKE_INSTALL_PREFIX=$BUILD_PREFIX \ + -DCMAKE_INSTALL_LIBDIR=$BUILD_PREFIX/lib \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DAVIF_LIBSHARPYUV=LOCAL \ + -DAVIF_LIBYUV=LOCAL \ + -DAVIF_CODEC_AOM=LOCAL \ + -DAVIF_CODEC_DAV1D=LOCAL \ + -DAVIF_CODEC_RAV1E=LOCAL \ + -DAVIF_CODEC_SVT=LOCAL \ + -DENABLE_NASM=ON \ + -DCMAKE_MODULE_PATH=/tmp/cmake/Modules \ + . \ + && make install) + touch libavif-stamp +} + function build { build_xz if [ -z "$IS_ALPINE" ] && [ -z "$SANITIZER" ] && [ -z "$IS_MACOS" ]; then @@ -150,6 +190,7 @@ function build { build_tiff fi + build_libavif build_libpng build_lcms2 build_openjpeg diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 1fe6badae..2a8594f49 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -160,6 +160,11 @@ jobs: & python.exe winbuild\build_prepare.py -v --no-imagequant --architecture=${{ matrix.cibw_arch }} shell: pwsh + - name: Update rust + if: matrix.cibw_arch == 'AMD64' + run: | + rustup update + - name: Build wheels run: | setlocal EnableDelayedExpansion diff --git a/Tests/check_wheel.py b/Tests/check_wheel.py index 8ba40ba3f..582fc92c2 100644 --- a/Tests/check_wheel.py +++ b/Tests/check_wheel.py @@ -1,6 +1,7 @@ from __future__ import annotations import platform +import struct import sys from PIL import features @@ -9,7 +10,7 @@ from .helper import is_pypy def test_wheel_modules() -> None: - expected_modules = {"pil", "tkinter", "freetype2", "littlecms2", "webp"} + expected_modules = {"pil", "tkinter", "freetype2", "littlecms2", "webp", "avif"} # tkinter is not available in cibuildwheel installed CPython on Windows try: @@ -19,6 +20,11 @@ def test_wheel_modules() -> None: except ImportError: expected_modules.remove("tkinter") + # libavif is not available on Windows for x86 and ARM64 architectures + if sys.platform == "win32": + if platform.machine() == "ARM64" or struct.calcsize("P") == 4: + expected_modules.remove("avif") + assert set(features.get_supported_modules()) == expected_modules diff --git a/Tests/images/avif/exif.avif b/Tests/images/avif/exif.avif new file mode 100644 index 0000000000000000000000000000000000000000..07964487f3cb9ae2a801dfaf63a01f0ab570cf09 GIT binary patch literal 16078 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 Z_~Q~NBps!GIgGP2wZlMPQgBD`{{tjqpyL1l literal 0 HcmV?d00001 diff --git a/Tests/images/avif/hopper-missing-pixi.avif b/Tests/images/avif/hopper-missing-pixi.avif new file mode 100644 index 0000000000000000000000000000000000000000..c793ade1c21da30de4937836db18887d311b739f GIT binary patch literal 5435 zcmXv}1y~eZuwA;lJ4Cu0SC9}XNs&fkSzyVP4(XEaZjh9vnA?zxU4l z?wpx9^PRaD001yrx_Cm(+#r^KXZ&M(h^2r%#LQAvMnLAdwQdh~G5e=IgWcM~&gp+s z000UBx%_|rkL@7l|8Ij2g}B)Nry)H@dWfAP=wI~~06=;^{~`bh3jiP$e9qY+5QqPE z|EEwt7hvRn!_PBjZu|mrj&_d!t<;A=ouJQsAOs3>d}dOJGZg%9@EQL9cX7?!1mpr3 zpDO@>1mtMvWu`GCl#@tJFWRwZ~BDdTH@5NKzuZ(;bs{-&Z zvM##SJWN>@y=nonity8Y7UZC_Z(k)-3SA_)$5C6#Yw=E}x0R!|KE{uASxjFY5c#5| z+F8o6x#${T)uyTxV5hO_pp!9BW(!h;zts4Ryj$fdr_r==&OH`Yx5AYP)^aWT z7LjdIT!a|!FA`~5*l%m+nddS=TuXmsl!j5Z&!Tq@(8o zn*nd2W`gK6w(#OG)&a)6=3KT+rd=Y@K3#?G@cjVoq54X3a}~-?_xe260kjagx5gPW z*O{?8=Pw(>2a~Mz@ur9KO%I13(-O{Rcvop!HwJ)(WuJ7jZ$Dvxazod2?P?YY-Hx7O zwl$d7w3&ZYUmG^PhVPdu; znN)39p0Ekm-#iUkaLcq(0TY+a|JIsdsGAgBb6sPYx<#~)d3X*ISVLjZq)wedQ&+*% zizDk?2H`#%iN)}{C1pSO{em!~uPxp=GYGwR_oySe>^q8a>^a6epywV`k1#J#RLQFX z6!ulSOzRavz5V6KyLEAUFxo~fSn-lk5;lF*vC<%T3=i7~OE^vZCt zBMl-A5 z5doLyRc3n?7xm%`I#J)P{jEdgiQ6%0DV$Eo-`-Br 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 Tojj2C+Idjr^nh=P!vB8&%2-KI literal 0 HcmV?d00001 diff --git a/Tests/images/avif/hopper.avif b/Tests/images/avif/hopper.avif new file mode 100644 index 0000000000000000000000000000000000000000..87e4394f0596e22b50895bef01121f676d731ed1 GIT binary patch literal 3077 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 ey3`G4a>V#pn^&w7}i~P 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 KMNUMnLSTYt*17Qj literal 0 HcmV?d00001 diff --git a/Tests/images/avif/icc_profile.avif b/Tests/images/avif/icc_profile.avif new file mode 100644 index 0000000000000000000000000000000000000000..658cfec176e8576bfd28711d879c2cfff4564915 GIT binary patch literal 6460 zcmbW42Q*w;^ziRgjNUt=6H!L=-h1yn#2ACYFvjSDAQ2=;AyE=Sq9!CnjSwwD^b(RF zBt%Ig2toK}-uwRVz3*G=U)F!mnsa`4m)ZO7bMCrx002PxkzxqwNSq%)7Rrpr`JwPQ zw4aq8N)G_&P4HL}nqni1WPool@h=1b0uDp^52nn)IG_Lc83qE5g#Xh9B98*N;7|ulx02rVF-~fu8852&haxiwJM4A~HAj8Q{6#hqkzW%dbU{c1^ z7K!{v|34yT41q}Q9mtmKea06XPVNpUmCV6WBmzahNoF>mAPR$_6ef}jBr_L<{r}?A zfBO8zx)k=shxn3xC^Zv&@xB!9CG(}o2rQW)mSnydiNi*bd5X-U!4Y_JuORzmX2WCA z;Q#=oqv%OkOaPhX$xKIdv^OBLCIC>=`TvW3{>3D0G`UUyFbE~Y5OMwiB%~xp3W-uv zQ$?C$qk^#{l8h}H6ND!EA`L?E1awFY0Q_~&lqi6O(px0C$;v1-Wn~!!S#taTmjBZD zx7U9Sl(qfKW83b}H3M-B{iFLQ_8(nnDFCSMl6#Z$kIp9_0GclV0N2}pbfP5yz?cdE zO{4$19}dcX2_TUO>T+^XQBkruEJl{n(7)xsb@ zmAvCaBZ$aw0vdxw%KZPE_A*XUC?=oD7KY6)Bd~qaPXb2J) z@}I5n|1#`fHBj)ceN6_|d&dCVSy_N-lnsD<9Ri@Nv;f584%q_wd)+K)oB_&{=OVcJ z*S;q++5YGF{|w-4@+CMN=Z~bQ4eT9}mHjz1NVR`pcbeHnt^tp3wQy% z0>*%8;2p3CtN@>ZP2eYR2m*nqK=dG15I0B=BnFZODS%W#+8`s4CCDD+2J!~^gF-+N zpm)_AfJB2_-s1FBA{391#UeQH{2L23nRV`_Km5b9*= zJnCxd4(bW&Rq8_;CK@psbs8HQUz!-2Y?^yCZ8W1aD>R1)W`qPn3*m?eM4U(5LewJq z5OauaT3T9RS~XfbS{!W>?Je3zv@dCwXn)bM(4C?)p!1-Mpv$7GpnFdDhHjglo?e_@ zm)@P8M4v@pMc+feK)=tx${@>N#^B44$WX}8#4y3|jgf{?j8Tu#i!qilkFkMql<^A_ z4U;&N0TY@jfvJ$Gm1%})mzk9r#cacjXTHo_%{;)o#zMs+&SJ#k%aY1c#?r&`krl!! z!fL>ZVNGGZ$J)ob!UkuPU^8P2WXoiG$Tq^Z$X;f>hX-a5fHScMD)DqT0Yu(ja)JAH1 zYnNy*>ImtebxL(U=!)q2>Xz%S>PhJZ>OIi=rZ2Bg)Nj<^Gf+1;XYkw*VrXKRVK`#M zV&r60V6z~Y1D zDNCYdn-$o~-0Hg3oVA#Bh;_3KU}I);-Dcia!ZytIsU6(T)~?X*lRe5l-oD>~)#0o| zwZl(GeaCFacTSQ{5l-FCjLsg;RnB`ZhA!7!7G33B&$+&G<8i~ewYXEcJG+;=@BU%* zNA4dh9!ee;JzjfCct(2;c=31zdp$eLcou!O!5il7;$7{1gtkGKqIZ4Fe2RQFF$S2M zn9shtzBhc=v0B(`*i}C*ziWPL{#yRm{nrC@0`daB;0$mDxUE3bz~aEYAe*3ypp#&i z;5s}t-W%TN)044Y&bSH`= zrY5c=nIu)7N1P8jKb$O|d@Xq=#U-UJl|MBp_2UJT3pE!RE)p-!q-mrTUxHr3T^dP0 zlb)Y`oZ*`>m?@u`mw9vdLJvCs}@3BiYK?cXHr4Avv$F>Rhe7#(XXI+Q;iw z*PCu2Z)Duq$vvApkf)eed=qgq;^yKl%Udn^qWL-bM+E@|(}ntlbwzwd=|y|DeQ!_P z(Y;e!%wL>Yd{BZbnZ0Xrx2aUTG_MR^7FqV`p7Xu_`>OY=%6ZB&%YRpdR4i87SN2w^ zR8>{;RcF_LYa(jaA9y?%duaHurB_Pv+NE;M{37OXKd&0bHej4 zUH)AkyU%vN>v8Rw>b2_~>9gp2`NH@`PrqJ&=S!`Z?E~rqt%ItA&99VSH4P~ZH4ZBc zH;yQeG>xi^wv4HbwT)|zcTDI^bWIvgzL+wbdNpl5J^tG1_3Vtt%;K!??An{)H(PHb z-yXh8nuE<{%rnjBE$}UrzL$Dmx2U}MY{_tG=!3(DcONkyKQD(bAFZT*qW_e)D!5v; zrm)t&ZoEFW@yEu>XTs;hFBiWue=YhZ`R&Pf-S0!2uA3`c#I2Jbm$$jMD|Qrjx_51N z7k=V@9`0rAbMIIFQvKC`;Bv5f7%a<$dJ8Ygl&E*D7k`6--Ya`*AN(?r>Hq>3#9LkMU zBenq(X?z8t&kb&J!uMGcG$%&K5GAC`9>t3n(!<=UPCVrNXYDO#UZfj$U-8Sf%G^x3 znbvjYLKyhrqJC?^)|(@xgwj_h_pPVQlU%ZWQfPXsOhOq5Nd=c9a}8~>lz@H?&OKGt z^d9$l)XiyI@PYtj?@)ELlRN&4v8;ZJ;DM`qHR~hjL)M#R@O2GOFa3@&3C8R9+{O%C z9A^X=u70}T!f*U~4(oPTc8{&*YcD-AYBCL4n)s+`({rsffOkTb7?i1I+hDSd;OZE1 zrW;sgEY>o{=CeFf%4bmbGU9Jvzhh9Abz&6Ss#WoNePY`abYiS1Lc7YYh1#s`A8X4$ z|6_GOUMQCb;dEHzc7T&ESYK;j%G*XO+o%_;F<-;a>-8cgv9X-Dk84{i&)MJCzOKG# zj{p54fCn6_>ae^zbm!~c`ASi>EZIj4(Q4t&^equjwbOjyeO<0tZaKmUjxvSKpcE*y94uFyk8fLa6n z%9U5%4v{VqgPaAB-^jB$f5Of~ny{gms#*a+Fe>8n*8TPZs!=MatS1)qs_+W_8@@?d=2( zGi&UGP(;tEeYBOA>imizdKU)q9n>lMK7?NxT?bWZdrhSvzSm$MRbI%cv&_D|ygsKc z(xmeJa_&<>1dQnu$7TrUHwM7cZ2Wt!?R7@=!fl737eOk^eI^~Em$~)t6UV_n;^-f} zK=j!T@0?})Ri`TY(jchD`@Z2VDjKbzJma|&wdK|(3`rx5@>g^ z$-FG23c>?uxLy=N2gi z_saA4;FP%50OB?OppEK(BG8zG;u^?imM9;&@o6K#!o^T+K*v3Jy)WzOe@T{jX4i|(q*{t=c~veG0yxlbY- zd`mh3DwLX|{magAH#rK4d~K)e?D;w!G~A^ccGZ9U#5!_~(aSR8RNocN&E{9a8x0Kw z_rivPxp(MS(&WzBQP;C2C@{8p;N|_2y~Rfh`-CngA769zyBYfJ`e(e+JKEIwTi`No z7Tt20yQX7opH!z;`P5I=vrU~&PKrYzKd_5p?-=r^WS!6T>NHwJ5b-^~^OPRp&?wX5tW1QCknkVOkIBENM?9nJ2Ei7R!y5(TtfYIi&qW#npI8 zHY`E8*gbzYbPIV|OybG-kgy}2?=k})y|8&Aa_OOUu%Xx51t}pyTD`0Iwdr3reLt)X z=j$SAdL_G5HWmYYmK^XhPM5NDaN)&(Wfy*XWO7xz(@X-BHQENbB^_n6Uc9^u@nrbo@mx*WlFyW|=F>olZS%v=nUjxuTwdDWFo&~NHV=2MgfS-9ROT#aJQZ*bGA<%aK}=1r-_=o2CeQDB%`tmz)LziQUe9iW)vVXdEKR!&_0zX$jiVK- zHIwU#@gWieZxw$&nBH-gPOi8*mYRk@^RLj}fePkkJ!} zTb5J)<3*{uc)M_X9tkBFt1sc`g(#G=zRF_JW|LJO@Fp~4yxGERu&b?xM;8^|BebIO zTdB51htq0~bLfGz2>;WLUoIPccIi|8Wy8J=_juZFKRp3RJFsypACK|!2g}~;d7DcIHRsORW$d(%?lWkP_lzFVy=A!3n=>M9QccT| zJCO`mE-?y@4M7jz%Dl@^ylVtI3%%|t{_+X1EWu&yhfoaYlI}FucBnX@9=H+zv97gq zj_{CJA}AOasB3;D=e?v_m)zAYPp`+cXhk@_mQ=4yYI1DsbI(6s`{Jo?eWQN&&ooQL=sB^Q04zg!~LDdM?*(# zk+YN0+zFPUFy|wMB2K}@M4!R7@1pp6CF4fMWIl{5$G4k<@DH=F{E7kIl$?Qv395Qb zcLY$D6|SW6{y5%C~#_g|5sh+g47hxB0BO zQ4fEin4+yGYnznO%ZYak;-fqCA2-yUP4 z=yMBpPjEGGCv-`uvCd1HW&$f8Po+0E-d7v%iebN)m)&6H*L`uHWXRd>So5WJ?!6&Y^y~NhE%~tAw#f@`XH{AT4;_AanMBi9$`kUsS zOx{9T%*MBRfJ&MkN1chzcIaIwg36|ZTIq0=?pZLcKj+2tXCy%67(^<%ZFPIM=2aQl zgV0JUTXE{pS_GKE}kaVH}uq(4E=KSp`Sh_s<%Xwrn~SV?@`@E HF5mwF+?@?J literal 0 HcmV?d00001 diff --git a/Tests/images/avif/icc_profile_none.avif b/Tests/images/avif/icc_profile_none.avif new file mode 100644 index 0000000000000000000000000000000000000000..c73e70a3a525c68a16f5c2bbc075b69ab2704cd5 GIT binary patch literal 3303 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 PMJg=(O0BBIq_F-6#F!Ng literal 0 HcmV?d00001 diff --git a/Tests/images/avif/rot0mir0.avif b/Tests/images/avif/rot0mir0.avif new file mode 100644 index 0000000000000000000000000000000000000000..f57203093656d8c0bf5caaa95928f2447e9e8992 GIT binary patch literal 16357 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 RmVbqbo3jf9uwz-@Eq)%)BzFJ+ literal 0 HcmV?d00001 diff --git a/Tests/images/avif/rot1mir1.avif b/Tests/images/avif/rot1mir1.avif new file mode 100644 index 0000000000000000000000000000000000000000..0181b088cec5012953258419b42cbc90ea44b948 GIT binary patch literal 16588 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 literal 0 HcmV?d00001 diff --git a/Tests/images/avif/rot2mir0.avif b/Tests/images/avif/rot2mir0.avif new file mode 100644 index 0000000000000000000000000000000000000000..ddaa02f3f890f0cd65035a89294893956c2a30fd GIT binary patch literal 17001 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 literal 0 HcmV?d00001 diff --git a/Tests/images/avif/rot3mir1.avif b/Tests/images/avif/rot3mir1.avif new file mode 100644 index 0000000000000000000000000000000000000000..ccd8861d5ae9378bcb6613f6391f2c4270c5f706 GIT binary patch literal 17290 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 literal 0 HcmV?d00001 diff --git a/Tests/images/avif/star.avifs b/Tests/images/avif/star.avifs new file mode 100644 index 0000000000000000000000000000000000000000..f2753395f8c3c131267eb4d1846ca9a21a6a47a3 GIT binary patch literal 29724 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 literal 0 HcmV?d00001 diff --git a/Tests/images/avif/star.png b/Tests/images/avif/star.png new file mode 100644 index 0000000000000000000000000000000000000000..468dcde005da39fc6807cfda46036dc78a1efe1c GIT binary patch literal 3844 zcmV+f5BuIr?fN3wSlaXSgJjniUG{R$dEc}9{yuv5Jn!GH{`;Kw{(_?-RM&gj-~BPw z^`2=ham7_!rSva;1avcn#a}TkC9a5R0dYk0xeuYd1SEkW;7Unnw;7fdJ6z_g1Z4vw z#sg>o{@S3L*y1u@nP@(DBg%{CeBiNCnzAoMuPDB_%vT1gD(E;_PI**S-H*8pocYS3 zzo#9zZp_b=YbbQz8Lgmr<9?|nqMA#P=QZHc3BL9QDVB<4i&5!{GcNO$N}f(8HXgtt z`n4?zIkkW@UkQx1<<^z-Ws$#dZNJiR<|~Cl_wB&a62E;p`P{8x%BdBc`AR`~xV#7C ztKkT#Eu8r#K?~h0f$PhB>^jYF`kgTJ)Dq5olTp+^ujo0I%ATtuT*G(*^kD89JpQxd z0G@ZXG_`LDP*P3dGT%fRCw9f0OEdphZ0YQfcaXJ1AYX zgv)&6QPlgXzJ3z;-r6AK)FLkPje#D?H8aEx;Jg6B4U!yQAdPn)3?Nob;WFP?oX~p- z#&`hJDJH%cP^_B5Wxlh}J)5U9?bvppIk=$gXON5KqU^E2V%7jI^PSDK<9|Sq#sd&8 zUpfJ%=^zLXxSeii;ws~G3YXo9urQR^$_FVdx+9d>F~ynhbW|S< zH@-X&YW$et%r}bmbzcvBB;;al(7ughFT<}xocT_n(PSmhyFZe0Vt^ZJ0kn{NKR#~( zi3o~wQ*NWU%m?7h14LsyfCR7iVjB0GT@5f(d0GC5xwKhYOqnbzSl zpD$k`TH^ssXSn!LK zSHDwkb(!)tzwvU^`xUnQ|Ah}rD*HdCWkgMVWE!WQEJsG4ni8p57GKtyQY(-$Je zUPg|ywS^(Hc!^|IziV1Zl+<75^M==Am+=4^5buvoi-?-K%6y|!Y1@HWrnQX05xk)V z()7u^X(3TjUzu;1`>@k^0JG3!U1h(z$$Wa?pJtJGZwHVvtz`oGDNemunm>NTw2&yM zpUjsy{w3@-9zYuJMBOYnsEf>}@BIBVX3yxw)I4r^>|=n|df4MzADORl=DozjcmQ*l zDQirNh=Q8We0unY8HR^{4WvzLDT6+|p@p^H^Q~F)sph88?_YuEeGTPi(|Ri4In;lI zwD+<|_JnCMVGwKcsph6|*jvDGu@&(yLHt&HX+^jMScH9p$(1k!yn*r?M0!DcQSBv} z=%vx$5ocpsYd+Q76b=^8ry((yqO{^^3o3IFZAEEeqz$)#=r;b?N*>sYum`0V)xC)9 z!Pj0Sv6rF2?K0=n1Exieg%R_qJ~Nd=$L8Vt^MLulJn%0BnU69LVIDBYl)f56fqe+O zQ1*cC1aB9x8`z2G?Pm6QyG3q$FKS_-{BgDLWC|Ku@wEkHE=a4(Sk`l921R=jZ!blE z56NUNv(r08RtyJOU`6ITWv-&MB7Q6CwczPolvZFd!5ysVu!kYwU4-6qUhm0duQavw zmK$(F^XdNFOcMSQ#9Ick40IW=1p8+S9MO{pwt;K|-HQ5KDSEHU1=*wHJ#dcswC|~l zkmS9fzt6}X2iNX$REh$x0zXC*e=C``U8jGTJm>3P@=jFCylc$i7!zUS!o;OWaX0X- z(?2|SdabGd+rTd)k>;omg#RKn^SfvN^Eu`dSu=zdyMP^$2y@gr+wl`^V-4kuxv)So ztKY@*R|0!Nm*%KtcH{Xso!!52;?IB&l>4ls zX4#JC-&F1)=VkBVkW||ahFK15EB9GPP4WglH&k-Ee#P^)dMKC1=U-5+sWgTo_Pk63 zzbCV@2P%2E;@xX9JKGNpw*dcMX$(iKc@aIaqEh2Qm0KqzbytDZ%$pIOt|pEncKkB~ z+$NcO4p$Q-kmXXUxda9MHY%SFBA&x$^a)ZId@hJp&4I1eQ&l0~^C-CGST&2v-;i!! zD4DH|aFvz2( zb<`<}>enRGx!#lj<9~F`Z~6=>-(#$!I~-wAMD>f3={)BYfhaL>jZw&NvMR&s1@*jSbMPU5y_2F9Bs z+ZydN9$1?BPNGM0%?$B8Bd1$B%3~|Z;g!;O_d(M_#>2|YcM_SEJ-{%lfZv$b5-XIq z7#dz>v+=<4%y$wkY`g;B`)|`aVuR;jS;{Fg3vVN#V^_i*Uj~>OX_bZ1XQp~jd7IOPD-=U*RaKh4`;rL5bNvB>JG=q9$yXvQ%!4$A;(GO8%5R( znHDl0c4xjm|8ku1DrFjl%o5WgCcc?s)Z9af`i^)(fCo6mJNszdCqKfBE*uCq}U zmUq^y?QrP++)R=bfP`r+F{a3gvch+-bAdeAwMsjtv%fI;`w)=%HMiA_uWlU(8SvoIi3)s9o5Z z`G)msobiG}7}6_Dix>+#&F9(MNRB0z)~B83v$&BQODwHVJIx1Inifz~SUOW=o%!^@ zQ!NmiP2xq<0!rjU-JhFdTEy8{XFie%>sR0+{1jysDW;=x3(E7RB~40FtgBc1Hs<(p z6~SC&9R|MueOOYRzc}sRo&%oK{@e|~2H<)#(k5YKS^bYp%QzkTGM}9@8*ieLCDpN9 z(q|a&6q3&VT+-R!#@CyHtr6>+91-i<(e|0ouFl48RQ`|@OC;0LEi!pZmh(G*MymNr zRKEc1i9lniSohksY9LqhPhE^A-Z8BM7zFty#VKEx=8qq#G>GomJe_HSe**HCz^nlE zRVXNNk!0F-nU--9yE30|ytAPQ-AH1wq&wDCV>|$9xqVR5og4631bhdG{C=}D@Ps4ss7B?iw-q;~oRM%%^-f!qNsoHZaU$NoRjhN@pSnL_{Us@gxIW z3c3!c>eXH*R%JeGIvm=cn-2u~x*M-3gdRxzSpp6(ddUTO^%b4tfU=-f)v(&4wa-%!h_?6xvZlzRCa}lvKwPQMK!;LDHR@8Q?NR z{|X3U%cDJ~yxP>}dyC*M`WtE2DGy3IyECAek#kym@N)#Wjr0vkXBP()t17H8pYD5N z22-XTCYVh8BI4aIsrFw55X%ZiZ(w>HxG{imMUJ1>C@r@S1`w+%?0D@qOj|~^T9mgC zy-U*B6}4nM0BP!aS<>0xMWhXQyUK70rW~{4^eQ{dhgNfbZ~=53>6uF<)%lNsNwN@0 zb^MT2ei6c2pipt3g#1=;sw&40^GQWF44pvv2Fc_HB;C0|mM|2==PWU_0e@e_Tasj?Vpy!)V}JHHGpq})Xd;>`E| zD5X_~@;n|_ODda{rmkw+J~e@)vpY`>QY$Z%_>?o>DP&Ufy^cy>ED?DeLat9Rq1< z-y)gp%F&h7lXbY9`2e)=WC}=)^YJ#2)udiuDw&S%D0Rh^k(Jc1Uj=$M@ai~UYu3K+ zH%6&zER2uyjk9|B6+|AV>9y~RtT(#=GsdW@kk5S#k*}bfc|NlRtD4R4Uh^rA{sesB z-%uWtO!ir`qH2TD>BP;zX6^6374#uS2C4-uT0hko37XH{HM*qA5i;7Jo3HuYU8Z$7 z91e%W;cz${4u`|xa5x+ehr{7;I2;a#!{Kl^91e%$4E_%R{vO%sunm9!0000-6bF)1Jd2yEhSw;4LJ;5(%mK94bt7+B`qCF3DOP1hrZu?oge3{ z>)HFhSL{_k9{>PAY2oYvF>wW30AA%U+JP8gU*D?$t;}qp z|DgZ?1PpTiFaL|SVAKDm!GM6B?f&^-UT;RQtpn(npE&pBO z{2(w0!tdna*l4;? zTohdBy)whbBf}<+2hY^amuG87i6-+gZX+AK zm&0z!pQz*MsL^sTrhNV;fym^&O7WX78eylmOb zuObh1BVU56(|hr~FcR`nu@+_q+I!8N)w9YpRLy^i9(nGFc)V;8Kox02VC6{iC8 zl;riD8VQI;&0#{Fu77y6tB+IqxJK8610!)`_>^_Ce03g~t!8+9$p*DRJ&uy`K1s_T z5VDrl$u}KJbGCToqPJv4wpVDhcV!rc-JItPJ<5`ZMJP3LP^=Pu-}c8_HK0o{8~Y@a z7vyc*$&n6rhYF3J@lPR$Jq?fLX=`$w< z8-%bh_L*4YP4uZq=@b6`-l9;!y;sLWH)VFRxt6ky@%6346z_JgSgi5}a!oEuPio)d zl)NX{R;7ao4VQ77S)*=)(6NzI7pj%wljo)}Xj@N+hTiZ?Cc{|8K@Ls0A~I0yv*1A{ z9e!}bG)g`!rEY}Fn&sD-xvI+o8nEg$yR<2XXA1aRrp%kAZk$liA_4=lU>?PBH#c#m^bKq(>QCc3&p3WoIpcN(}az0cK7ACnNm_pm(kcdxGnNKkk zCy(ML#Z~uk9Qh8Oe3@K}RJVEjl2Vb}33Cs3m|db1+t3%Qfh25C<)zxBJe=LIFX+L9 zi=ORsK8QQY-g})PzdnLLH?ujGY_THtmuv#7<1o=xg@tt>G9E-pJgV%VcGv}6=o-8_yK8*MO^Y*6blmna zrx2$>F9zV%OFdfIPn4Ao13**1q?HkZ07aD82o&{_L@erAl)54nDH<&cehdGe4BO9e z0~tSlq;p1u<69!s9q0kRiAwC<@4Oky=)1c+%vDukNR1ToeqyZH{VffJtxk%bGuITJ z(7sma-%^p`o3E>VuCgRgnkQ{HIh$TyR^xX40&qW&%RW&Tl$%XzZeR zu&%oc4GaOo+KQfMgy|W-?5e2YumT@F%6gSPjKbxMf_%!CMTL(*T>hCDlT`RzdB~ii z92hj_uIIx?V~$n;P2HsAQCi^OIMS(7wVHPE(`84m&(#{7+6U>Dx%ehzggGn_my&be zYO`Md!=Kq(EMmif9AwS~iZ<;l9CbVDI;yK&o;VE}+`N7% z)v`nnfjRuYjQM%mYScGxNiT}4Q}-oyBGcEdEu`9a)UIGupAM*gxflv#Fn2G94@&cl zjQg1ql|s@3l7g?e%Sgh-4W20Z$06Z|o+Fv73HY7bLoYg0dY@zw^{}@BtzhYPZ^h?$ z=RG7{!$>4*Hl|W`Ch&^)akAL*i5s1M1pxB@d^hd|1-OZHgXb#SeG?49mRI?x-Pi^G z4S`KuH^U<&0xs1u9+`Ep3ZJ2jgs#zhAV0}P+z(~KQN>qewr>*vU3l8yZ6Vg&OXrC$ zYGeLD9mLVD6vcgiz@k<_qhv3_HNE=azT39=%S&c`_sx+8FWGTM-bnfWUxq-@F#p*l8{CXGSC>(FJ#kd z5w^s`Xg|H67zP=lyweR`V&GJ@UZyI*cPw70N+E{=(F)+8F{8ne+5Xvs)^sdUPMC5N zfi3S+KD_U2S<7H~!8@r5{3Jo*;etmu({xzE5n8q!S`&K|R(P)KBzRIeHsGLf=O!Sd zlFnd0r#X+|y$rI{V9p`u51FGLygjRYIaquHr)ciiQ9D24d=Sb#FUB?fM1hR#`^21^ zC{qWejb}`-)7t;gg#V5K?OhX#ymf!GfRKdfrh(;`8o*Vhb@B)O9eH!-`a#yuc4c&* z;o-bIA~b{#!0-aP1eN}FxSJC`v*hGY=7C^_>qe)&eF}8crYPTn>adiZQ37rD>$~eM(PM14h zRhFOk&aW(~cStB#Pj8MngOtaYFIar4wk#i25#!>2%AQ&dwsjUxNq*h3K|+~tRU63> zOF)`@@7U~Y!mFxJOgrn^v;4Mc=p|Hy<*dm0?%8V){{2!xyKVbaztmCs^^B5&r+_Bn zQ3E~L@v7g)Pr<-VasmZSvQKV;3HoblMuoH$dW@AUBM)NkOnpg9ab2Ah&G}Olt*LfG z6HC{^xP3hRCvooQxLoB|ev9WKB(bPfH;dqc3y3 z*I0^27$HdlYLal@DFK%UyMKRFEQNvld&5xitGRcazHM~`8FOx1Gib;1ouV~px{c5u zK|zy?r@)?6-Hs2eM%Mr-ngh?dc<dU5Grn7g70g@hz?dp{Bzl3&`RIcZ}i;{ zPnp{xj#$$`kO40yB31(>QONERaj;}OEBuyM$RozhS8&4yKu%fdgz)JadY4=lE3S1J30iXq7*rPJ~SIB-D%`FTwaWu zklnl#UQKLHtjOr^UZq=D;QYy1H0!e7^c;HE>s-(jI6N;G1dgQXZEb#_|o09!FwWAUQRdH?!gl zH(LIZ+7p!%SjM-Z_pQw^0;`U-+B}+(WzW;KCbkiz*VWvdM_N7={PtGRsT8xjttYc6 zW=mXwCCJHLkT?to>CUxI{+>9XyW@Y4;}icwzaz$HB?R}xV@&o(G`WXgE(VD6&#?kd zXx#>06GOCgk_3aU>ISHo*s!o)m!|7icMc-T1TDm*>5+_p-Tr#Z{v6UdZqpzm5P4g!f>Uj4yyP$Q;_eXvIpktnZzdVkCqxbN zF73;A5BA)dy5~_8=V0e3ddS6+q@p^holCfg4tnTdg*h)*-@!kvc*;e{72Jf4_26Hg zcuprC|CJ@Wb2kp*7;npk! zNr_B1w~tGC_Zn^!)BF38L6|o{*iAN?LSrk&_p4+GGT%G7oYje$j|8=5OwL&&Ls5f@ zN0jPJKT%0}TR9e=j{6S!A9C1k=W7@%)}Z>SBZ>A8FX;&~dlk(6pu$q3SE<0|@zX>T z97J|=CZNc%!%3F4Y1a=A8|fJ%IT2BaY0Ej5$j}f<<XI83KZnv+mhhsu}{;?*^p1^zs1@2L=CVQBt1gQ&NDW&qPK53f2t zS?Fxq6a|MQYd_`DrXv}HwWuX|{+nFmJfx0rc(Jk0bTVFyj?@nkHZ0T=SOkYBqM14{ zrR3{Ch0)1M>?^M^P|w0Hp}(*9%Yg&}WSR7R@1f*bnDnwGLyyA$0r(ux*wD|2i-4yT zua}&i)^96)*utFY{Vm`Ej(o!YPwqG}1jRMxVn%(=Gvs;>>;2#mCpY z9XQJb{9XLbCy5QY;Um_imZ-Ceq2nqi>0o4j0|TAiCw{Iw_%7P(u_rERfd}M@TX1Y3`CQ01?Q7skV##s8141wH%vbk z*z!dg(NQIjU6SJ(zoLi0E~hOk$p20C4ws?WV^#%;;3K!~YM!pJf20zr>|_w2(3s0_ zc8{Jn&{ha@Mt)l9v%VesI!D$p9}ktu@FI+*B5*e0IXK!<6Jkb21^!Rvs$s= z^VFz?VICnO;E%8!6Dsp&E^4pIvTS5wE%D%pr2Egw6WI<7Qr**91Op97nz}smFAz!K zAx1ok`ol}9-_mbb?Wj`6EUhOR%wWle7-RF?)4jhy#>G>8nK9n?h8DPrA&l((Xx0_4 zYG!NY;5pj3m&5;ri}9?Hm-CTs>C#*5A`4c$(|#cUs%=8zca&Nr3+sz9do*17=DsU&YhVViY_4AEx)Y zAA}o@KENV^)2e(Z^1<2za5mR4#X*PqyrPBSnC!9CypL(jO078YSi(&*kPs zf@-L;HZC>n)ivp~E0RAenkX@*Rh>kc)r$}f5!CUJMXyV$z^Say-N9@?(BD^Gk-W|J zdMg({rRgtQ&cxlU#$qO&jP!8um5%IkBUYk|J6x^<0|r#ljd4!IoMHRJ_?wewYcb-K zsiqYwRgK}-b2fG9U~6A_g;FC^|L+S;*gb|FiNR?-MGXvnR909VtTBuhPf^e4CWwj# zlp7Zw&7Vh$mODmxiCNJVeOp{+sezR<)1+;CI_B7PHr@Jx1LkKPQTG$;kGivaU)$)N z2JSpheU~73u#&vFl&h0PhX;pNJ5i0z+IC z+~ceBXyj6t;ySrPv-A3|ZzYv^h|^2dtt`R&l3#^l1lrfaV+(LIKMppN;};I@co8M4u%h|_Bpu{iP^@l##AB}YXi7uf6z6mw zIc*IN&Nls<`&IqD%T1^QT3tzpwon58jD%&fS>CK$>Jjn{qwQ^z@p}CmENCY^KhA*P z&kyvi>#VWaUghSOA8yAiWKP(0f9!(mT?7RUiovN(doH(S!630@4MMj(~JQx*)wHO0R+< zy$T43H{qP~dH>vX?~glcP4=_PJhNx-nRl%K005vP+7D^}2<`~L46JmAI|{qQ?HzTM zgp~mRJTG?`+8*n}3?65w8|rTe03hKI^uHJ@-QW)Y(vTzJX!mO$4(3+??&bl(YN`ML zE&yx6Ond_XfMx`vUu$?TFybu+o510S>rAda3>XE54Z*IkeIJ#Z0>g-#21lZh80iB? zLOd{$G;l8@47&ugp*m)gVgMx)?hD6S@Q8?rFoM+nk+4b-0PDgPfOxo}kSGrfJ1!8r zJ1!+A8w46MCbO365h!;}Hz(5Df^{>R@KjUQbx;lUfK`hrF z`~L}%Kw+4Z0RWen35Ot2nBL$xV=%i98i~cR7);~fdW~OUF$$9)#$JcTPJiRR>zKds z{B?|pkqRbeAA`vquJLs@$esSin9~Bt|JfG<0TkE$(X~fIoPn4UU`_wO0}b=NzH=%b zNIw+Z$r%k)!c+Tfo-%)IfAaZb3w8wn)G@UqkoaRW zVg~?9`~U#PsXsP0O#pz369A|NLcCFr{$aww83q9UHysm8jlC-fh?_6w_Td5u0x>3f zIMUtzUm5@oJ`Qfk4SWFLc8ojJ9(_;27ikZ1g`t5CFef-dj*Sfnhsv>;i|Y#MB2{3{ za7}*{%-CPg1mf=sk%qD<$dlajmGN~)V&5webM+BkGQM(b_D~N8m<$GE&0sd*bqLy3 zjt%o*fGQp+7*HG}1`=YECjs8WycroIRrP-sV>CH7XEYiq0|xu}_<(#wK^`b4u&}hW zG+0OkEFvO^i4gSiL!j+_1rc8CSc<7&E}C|rBv+E9zN`C+1Do@0?H*9>UvmLxLuO;@d_7zSe6<%gmQYcC9S-BH zX(RalT+01#@9d+4qE)Fiel~8D)~tP@?@dCUpZKz$l2gi)+UotLZ&S+4OwS6Rd^CQ_ z%ufgYsAxicLdo&qYB1KS_odnb^^abnSlbxdMWEBKn||eSqk5*Pje2PoC<%&fSv1j6 zJUK4t;`^+bXo%FfF{Qzq!=_G~z4)E2oZ{!4#9;wAO8K>s6Q$g1{nbf!aE8_x8^_mj z(r?p4WZORfCPvqnaQ~!lh(}9g`nUHL-=_%-$79Zlk@DbQY@4>VE&ehm|8nq>#;BL^ zVvs#MFJgz5r`R|5=e9=TVahy5=A9{US54QrH6(SQnh*-a2l9JGxp0hjsWGd(w7Fe> z!0X*vUZx*)k9yK{?QZp6#|Ls*{p2GBcc9i#fJvRcHX|KtS>9+1sqEB{r(J-S?~v`& z(9(h4stckaif3$LUB+F4r1@RN6z=!V;OnvDZ=`mE5B8IL$AUBHrkgmX;>B(>t1I8_ zC`1wJTcvdl%0o3Bx{_mZ@~A!DT%_{G@zeF! zaC>GrE`UsGNk^M(A27{>Rt$nug@^q_NpM4?Sefc@-m2Y##Z>m!dUA6O)h?o)SIMN{ zPhZ}kvI(QsEE=03CR5rnoc6EK&kof_Mu4c}M0y>hNvC*Jl&H(3UsUkukqsU|aO#z= zQqM+0@~eY$aL?2Q*C#f&oEZ>xi`;rIkyd{9B_}su@7U`mW|ku=Wsgf7L*JDVFDVZOt+v`&YabA#81=3r~aaY?Ni z{-U2-WZ$N($sk;K1J_JK3A$xp<_VQ$R9-TBalho)Tl3=aRlM%o z=lRDD31zySCy`)a4EJe2a8YeSytpbN=Q!3odiPR4V+sFTX)(J= z8THbRlU+|c8~F^0YV^YK+(lZh7jX`~D)0#nbl>lBbMsZ7XQINJ6o2jD)h(;Picp&x zJZdib8zRxq!%w6Som5Dq3zlUy!ybQ$D4T%L-Cw4Y$lJM`oZXSg1=Su59ipikl$UIu5-oU`7@w5YML^Pd{?8(IMs zuWZgu;uwmEb9}EKofK9V1^TCxh_&R=8n?6w?n1pV%DO4ANti%Bx&Z(W4Xa}KfU8} zmA%|rp7AR!b(GCARkd*#gL_15>Nar5>o=RE#ck-zl?Obx+Tc^voQYLy6+RRN{EaM= zoWs%b&YI`!6b|x}79D8>wIaVLfXN-&H43NE$two z&V!&+?-zNb4i{;+zFSW<;pCDgF0XIv2*ko{eFtrwC%dZE3%waDOceqg`2=SSvmzcR zR@UH|@C^Ub&N-5*F^A0u)U~Ra3Q_SCpyK&=UP4rpKIn+?4-N+&RtM$udg^q}rZk*{ zhExeHeutX%qi?9>-mb!DmzdHXCDT)rc+9xUAtB4M7EBye^jYfMd)d<3=9}JK!jZ`| zXo+O;UK!U6w3%8?c+GA~FgR@1Sh%=q_GkYp8EzU0o&x(3cZg9#&_hw?`}70K%W-wb^1rrN4Ri*g2>eU&k4A(Qih{%ZlgRF*h13P( zvI@0--B2l0jQoA4u<&^l5O>cp(DGLM&&Z|j7oaag?GtA~oJ_=0T8M8{Ui*Ur>s6e^ z^OhI^i;waxVJr}4KTl3P49fB)Wg+>;W$#!mqVKynC0 zyb^VtCn6WO`Wz;EL|B@qcRVd+u8n?_RP0My8Ij7i4=g&+N`*cm@*d_MW7#J` zRTcKhb8`KuG!A4MrpuvZCXDS~)~n#DtZCHE+mh-DCF2K3o=mo=J8d5`g@i@}!rv`1 zj5J9FK4viAg=)zBXbK;7k)907<`#3^B8(Nr4@{cW8C>~*yVKtB!9kH__45hLIXI-F5fOBjou_k|+vr%X@T!4tw=Z0iQ$EtC!&Lm` zDOej`^s2-TFzCnc$jLLcX#A62RtUzpA3Qb(SH!Ci`5j9*JbL1_0(&aLRSVitJ1vSS zME7}&s~a?^uw(R%0 z6)!B(Ozg-E{Ls2_UDi$P86c4g-Z+=gc=HR7cl)=gO-P+W4Ofiv+M;o?D=FR=#r0U1 zqQ1J2=Q4KK9Z?h__p?LSGw2Fcj~R=Vt9${eGaF+{#ykQ-l{$0I&CGZy_^(qTUJET! z)4XJIQwqt1o#qGVc*4Ndm|8q)*kw3lF+jy8dGAW`Wa6afLn)n_m4&VI9`Vq}+0(xF z&b}!#2~J6e_#+$}Yf&rTGSyC!?{O7@liV~KV;$D5O(fgpk{8q;4sr1XKO}k2g^Hse zUu!0u%6)jhr@WkL&Nw;PtG5De#Vx{G7v&@XJ6Ts-FOy-goNFmqwv|0fXCeJE$edto z6{yet9tR#(h#u%HZ80CJWl^>u+_%kUd^+C3?ekcy?8E-8MRPxzym%YOe!XvqyJ3dK z?L}cTuC8=m!RBL>11D^$>47b19S4)ms*lgtVXhj#>k&z<9gCH5ptq4Vt>=q%<(*@` z`IAbr?~igw5bI9CL-Od!DZ~Bz`XWfd^zsA|KuFZXkaq9H*gqbvaj& ztAAVE&q4%dDH7TA*pTdX#P6>qsFi{RcDKBJ8L^i3h<@C!?C?G2{s1pEZmq_jdtvu? zDlEtK0v}v}*%rk=5ARJ+29pqG*^$k-kuLaWRavhvz06r)`Bpp9*U;A_V3|E8;*)+U z>E?bSi;@~I!tW)0>yaOUc>Se&Ch&-WS)4F(we^`I=drv=f+L=mO_s@h7WK2tx*ja{r2&;QK}?&$=vN{#ZBtZ1m3JXf`xXa2YG6k^jczC zd%^I1bGrRQN_)aL2a85^!x9ymtk;`Q9|F2qD(ZtEj)5amQ*w2Qem=JJPN8Ig)Yr5I zFrb26tEMY4f(R56W7AfX)!(Wan?9&3;7KF_?YT)_aY3@aQ;tTl^QZ)tLtjWKc39@` zuD^X87;>B7FCM+Gt3-0R?u>BB)B7!hsne8Z{&}@otu09ih&lYo4Yv(p- zKau5p{8nlzD+YWO<3%ziY7x7Jr>2eMhTaRfs>{1!qWq6$!}@<0riwzb#9e=fE;J%aHo57^C;5_{ zjefJk8APOav6#8cMeI;gs$~#Bw(J0HMQIb0^de(6$eL}-jd?hB-T5`&3%$2B#}}D~ z_YFss9~6>VDumc{A7f1pF>$!nj~Kp`!jptEFIUlt+`sUauld8qLUb zPB#d&9S6q61>&ZY7maJ(d|#U|{^VZewRCoHO^Ru+Y=nPgAv;6Q4PJTouv-%0vpqz# zN>sk#`{+FJ@&uG$r#VnNL{jX#(Um&y!Ol~NOV>_N6-s6MGp@wmPFT7?ZOuk%z96_J z{fH(uWm)q5daATzdQLdWna$;Sr{A{~)=Lw@cP}h&JKI4L5jVB{o{oO;?6C=NHq@XL zEa80gW7CC9Zp~R)e|J$?+dc;n!^^g?!N|*MC#6C8%okF%75o03cXR6r}8#j=H)L zUS?cPGnzjxkfUro_P9%noj=dYWIab=$1Y{;P_{o+WNtsBjfR9v+XCU%FB4>B)md~V z`o<14u7pqi=4xkVq|w^6wN_gAG*U>Lqp|tB=VxG6df<6sgjvx%Pr+fiWD@!GTSi_r zKo9g++bCSPvRL!EJmG{ocxy?crTg`=ok#CHtE09KgEMg8;o?1kMDT&YL^0Ws3YYc7 ze5J|9Hm23!%I?^HVkIhQBf{jqywdE(TwmDP(_A}_0qN%jYo>w4F6x|2W>&(p1I+L1 z`E;z9BzDgQ#aClv1IK5GR|W%5?(2SWUNQyIljqa_IOS#x{`~e^z_?g`dWd6VfoB)% zR0QMc9>CsjPIu;UZEN`?TMbjg$U;C2Q|v(Q;_Y< z4)KrAF@Mq*FRJ(PT)6P%9^R=5gzg>81)jcNOj@hi#}!w+P-wA&?LCmBVf=h12`t;K zmxdD1qO%H3J>NLj43C2SO%gtcCDVc2ly1C8s25T9I+@(NB4f-bN`QX_;=z@URGO!u}kC`<3keEKWns7;?#-LwT2^v|5f@dO%6dd$uTm7tz@vP#i~V;W}m+-LE@XQ$9T zM^c;j&tULKZ}I6{Vn3jePp(Wo$2I1n4T#u%y;4;%yseDy#dH1AZ&!e30~gUI)4#%7 z&k^l5`P0;ArPCq^zHV+u`Ho;CU~JO`I!)Fn{I6HJua*mFwxC@$*EkB&x_VND2vxE;Q_0Y9vUs{`+j{WXHWtBl@pZVrx7;`p*^fS_bZbq z-)8z$zSa0qaec#rRaBFk{|C(yyOZq4B~CGB+2V%<{0dRN;D*S1(*mo{pJi4@9|~#r zKt)aBhe%^uI5#)Wp3&3}e91_BH1)gT4t^%y4^D7bls35IiB#i>LBwPo85g{3%2eq_ zt{JoP8^mJVsKuor4ed`FKlY^#lpQw_DM?uhQgcPw)9uPKhl>D(bN46NQj@by!hZpe CD~X2y literal 0 HcmV?d00001 diff --git a/Tests/test_file_avif.py b/Tests/test_file_avif.py new file mode 100644 index 000000000..392a4bbd5 --- /dev/null +++ b/Tests/test_file_avif.py @@ -0,0 +1,778 @@ +from __future__ import annotations + +import gc +import os +import re +import warnings +from collections.abc import Generator, Sequence +from contextlib import contextmanager +from io import BytesIO +from pathlib import Path +from typing import Any + +import pytest + +from PIL import ( + AvifImagePlugin, + Image, + ImageDraw, + ImageFile, + UnidentifiedImageError, + features, +) + +from .helper import ( + PillowLeakTestCase, + assert_image, + assert_image_similar, + assert_image_similar_tofile, + hopper, + skip_unless_feature, +) + +try: + from PIL import _avif + + HAVE_AVIF = True +except ImportError: + HAVE_AVIF = False + + +TEST_AVIF_FILE = "Tests/images/avif/hopper.avif" + + +def assert_xmp_orientation(xmp: bytes, expected: int) -> None: + assert int(xmp.split(b'tiff:Orientation="')[1].split(b'"')[0]) == expected + + +def roundtrip(im: ImageFile.ImageFile, **options: Any) -> ImageFile.ImageFile: + out = BytesIO() + im.save(out, "AVIF", **options) + return Image.open(out) + + +def skip_unless_avif_decoder(codec_name: str) -> pytest.MarkDecorator: + reason = f"{codec_name} decode not available" + return pytest.mark.skipif( + not HAVE_AVIF or not _avif.decoder_codec_available(codec_name), reason=reason + ) + + +def skip_unless_avif_encoder(codec_name: str) -> pytest.MarkDecorator: + reason = f"{codec_name} encode not available" + return pytest.mark.skipif( + not HAVE_AVIF or not _avif.encoder_codec_available(codec_name), reason=reason + ) + + +def is_docker_qemu() -> bool: + try: + init_proc_exe = os.readlink("/proc/1/exe") + except (FileNotFoundError, PermissionError): + return False + return "qemu" in init_proc_exe + + +class TestUnsupportedAvif: + def test_unsupported(self, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(AvifImagePlugin, "SUPPORTED", False) + + with pytest.warns(UserWarning): + with pytest.raises(UnidentifiedImageError): + with Image.open(TEST_AVIF_FILE): + pass + + def test_unsupported_open(self, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(AvifImagePlugin, "SUPPORTED", False) + + with pytest.raises(SyntaxError): + AvifImagePlugin.AvifImageFile(TEST_AVIF_FILE) + + +@skip_unless_feature("avif") +class TestFileAvif: + def test_version(self) -> None: + version = features.version_module("avif") + assert version is not None + assert re.search(r"^\d+\.\d+\.\d+$", version) + + def test_codec_version(self) -> None: + assert AvifImagePlugin.get_codec_version("unknown") is None + + for codec_name in ("aom", "dav1d", "rav1e", "svt"): + codec_version = AvifImagePlugin.get_codec_version(codec_name) + if _avif.decoder_codec_available( + codec_name + ) or _avif.encoder_codec_available(codec_name): + assert codec_version is not None + assert re.search(r"^v?\d+\.\d+\.\d+(-([a-z\d])+)*$", codec_version) + else: + assert codec_version is None + + def test_read(self) -> None: + """ + Can we read an AVIF file without error? + Does it have the bits we expect? + """ + + with Image.open(TEST_AVIF_FILE) as image: + assert image.mode == "RGB" + assert image.size == (128, 128) + assert image.format == "AVIF" + assert image.get_format_mimetype() == "image/avif" + image.getdata() + + # generated with: + # avifdec hopper.avif hopper_avif_write.png + assert_image_similar_tofile( + image, "Tests/images/avif/hopper_avif_write.png", 11.5 + ) + + def test_write_rgb(self, tmp_path: Path) -> None: + """ + Can we write a RGB mode file to avif without error? + Does it have the bits we expect? + """ + + temp_file = tmp_path / "temp.avif" + + im = hopper() + im.save(temp_file) + with Image.open(temp_file) as reloaded: + assert reloaded.mode == "RGB" + assert reloaded.size == (128, 128) + assert reloaded.format == "AVIF" + reloaded.getdata() + + # avifdec hopper.avif avif/hopper_avif_write.png + assert_image_similar_tofile( + reloaded, "Tests/images/avif/hopper_avif_write.png", 6.02 + ) + + # This test asserts that the images are similar. If the average pixel + # difference between the two images is less than the epsilon value, + # then we're going to accept that it's a reasonable lossy version of + # the image. + assert_image_similar(reloaded, im, 8.62) + + def test_AvifEncoder_with_invalid_args(self) -> None: + """ + Calling encoder functions with no arguments should result in an error. + """ + with pytest.raises(TypeError): + _avif.AvifEncoder() + + def test_AvifDecoder_with_invalid_args(self) -> None: + """ + Calling decoder functions with no arguments should result in an error. + """ + with pytest.raises(TypeError): + _avif.AvifDecoder() + + def test_invalid_dimensions(self, tmp_path: Path) -> None: + test_file = tmp_path / "temp.avif" + im = Image.new("RGB", (0, 0)) + with pytest.raises(ValueError): + im.save(test_file) + + def test_encoder_finish_none_error( + self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path + ) -> None: + """Save should raise an OSError if AvifEncoder.finish returns None""" + + class _mock_avif: + class AvifEncoder: + def __init__(self, *args: Any) -> None: + pass + + def add(self, *args: Any) -> None: + pass + + def finish(self) -> None: + return None + + monkeypatch.setattr(AvifImagePlugin, "_avif", _mock_avif) + + im = Image.new("RGB", (150, 150)) + test_file = tmp_path / "temp.avif" + with pytest.raises(OSError): + im.save(test_file) + + def test_no_resource_warning(self, tmp_path: Path) -> None: + with Image.open(TEST_AVIF_FILE) as im: + with warnings.catch_warnings(): + warnings.simplefilter("error") + + im.save(tmp_path / "temp.avif") + + @pytest.mark.parametrize("major_brand", [b"avif", b"avis", b"mif1", b"msf1"]) + def test_accept_ftyp_brands(self, major_brand: bytes) -> None: + data = b"\x00\x00\x00\x1cftyp%s\x00\x00\x00\x00" % major_brand + assert AvifImagePlugin._accept(data) is True + + def test_file_pointer_could_be_reused(self) -> None: + with open(TEST_AVIF_FILE, "rb") as blob: + with Image.open(blob) as im: + im.load() + with Image.open(blob) as im: + im.load() + + def test_background_from_gif(self, tmp_path: Path) -> None: + with Image.open("Tests/images/chi.gif") as im: + original_value = im.convert("RGB").getpixel((1, 1)) + + # Save as AVIF + out_avif = tmp_path / "temp.avif" + im.save(out_avif, save_all=True) + + # Save as GIF + out_gif = tmp_path / "temp.gif" + with Image.open(out_avif) as im: + im.save(out_gif) + + with Image.open(out_gif) as reread: + reread_value = reread.convert("RGB").getpixel((1, 1)) + difference = sum([abs(original_value[i] - reread_value[i]) for i in range(3)]) + assert difference <= 3 + + def test_save_single_frame(self, tmp_path: Path) -> None: + temp_file = tmp_path / "temp.avif" + with Image.open("Tests/images/chi.gif") as im: + im.save(temp_file) + with Image.open(temp_file) as im: + assert im.n_frames == 1 + + def test_invalid_file(self) -> None: + invalid_file = "Tests/images/flower.jpg" + + with pytest.raises(SyntaxError): + AvifImagePlugin.AvifImageFile(invalid_file) + + def test_load_transparent_rgb(self) -> None: + test_file = "Tests/images/avif/transparency.avif" + with Image.open(test_file) as im: + assert_image(im, "RGBA", (64, 64)) + + # image has 876 transparent pixels + assert im.getchannel("A").getcolors()[0] == (876, 0) + + def test_save_transparent(self, tmp_path: Path) -> None: + im = Image.new("RGBA", (10, 10), (0, 0, 0, 0)) + assert im.getcolors() == [(100, (0, 0, 0, 0))] + + test_file = tmp_path / "temp.avif" + im.save(test_file) + + # check if saved image contains the same transparency + with Image.open(test_file) as im: + assert_image(im, "RGBA", (10, 10)) + assert im.getcolors() == [(100, (0, 0, 0, 0))] + + def test_save_icc_profile(self) -> None: + with Image.open("Tests/images/avif/icc_profile_none.avif") as im: + assert "icc_profile" not in im.info + + with Image.open("Tests/images/avif/icc_profile.avif") as with_icc: + expected_icc = with_icc.info["icc_profile"] + assert expected_icc is not None + + im = roundtrip(im, icc_profile=expected_icc) + assert im.info["icc_profile"] == expected_icc + + def test_discard_icc_profile(self) -> None: + with Image.open("Tests/images/avif/icc_profile.avif") as im: + im = roundtrip(im, icc_profile=None) + assert "icc_profile" not in im.info + + def test_roundtrip_icc_profile(self) -> None: + with Image.open("Tests/images/avif/icc_profile.avif") as im: + expected_icc = im.info["icc_profile"] + + im = roundtrip(im) + assert im.info["icc_profile"] == expected_icc + + def test_roundtrip_no_icc_profile(self) -> None: + with Image.open("Tests/images/avif/icc_profile_none.avif") as im: + assert "icc_profile" not in im.info + + im = roundtrip(im) + assert "icc_profile" not in im.info + + def test_exif(self) -> None: + # With an EXIF chunk + with Image.open("Tests/images/avif/exif.avif") as im: + exif = im.getexif() + assert exif[274] == 1 + + with Image.open("Tests/images/avif/xmp_tags_orientation.avif") as im: + exif = im.getexif() + assert exif[274] == 3 + + @pytest.mark.parametrize("use_bytes", [True, False]) + @pytest.mark.parametrize("orientation", [1, 2]) + def test_exif_save( + self, + tmp_path: Path, + use_bytes: bool, + orientation: int, + ) -> None: + exif = Image.Exif() + exif[274] = orientation + exif_data = exif.tobytes() + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + im.save(test_file, exif=exif_data if use_bytes else exif) + + with Image.open(test_file) as reloaded: + if orientation == 1: + assert "exif" not in reloaded.info + else: + assert reloaded.info["exif"] == exif_data + + def test_exif_without_orientation(self, tmp_path: Path) -> None: + exif = Image.Exif() + exif[272] = b"test" + exif_data = exif.tobytes() + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + im.save(test_file, exif=exif) + + with Image.open(test_file) as reloaded: + assert reloaded.info["exif"] == exif_data + + def test_exif_invalid(self, tmp_path: Path) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + with pytest.raises(SyntaxError): + im.save(test_file, exif=b"invalid") + + @pytest.mark.parametrize( + "rot, mir, exif_orientation", + [ + (0, 0, 4), + (0, 1, 2), + (1, 0, 5), + (1, 1, 7), + (2, 0, 2), + (2, 1, 4), + (3, 0, 7), + (3, 1, 5), + ], + ) + def test_rot_mir_exif( + self, rot: int, mir: int, exif_orientation: int, tmp_path: Path + ) -> None: + with Image.open(f"Tests/images/avif/rot{rot}mir{mir}.avif") as im: + exif = im.getexif() + assert exif[274] == exif_orientation + + test_file = tmp_path / "temp.avif" + im.save(test_file, exif=exif) + with Image.open(test_file) as reloaded: + assert reloaded.getexif()[274] == exif_orientation + + def test_xmp(self) -> None: + with Image.open("Tests/images/avif/xmp_tags_orientation.avif") as im: + xmp = im.info["xmp"] + assert_xmp_orientation(xmp, 3) + + def test_xmp_save(self, tmp_path: Path) -> None: + xmp_arg = "\n".join( + [ + '', + '', + ' ', + ' ', + " ", + "", + '', + ] + ) + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + im.save(test_file, xmp=xmp_arg) + + with Image.open(test_file) as reloaded: + xmp = reloaded.info["xmp"] + assert_xmp_orientation(xmp, 1) + + def test_tell(self) -> None: + with Image.open(TEST_AVIF_FILE) as im: + assert im.tell() == 0 + + def test_seek(self) -> None: + with Image.open(TEST_AVIF_FILE) as im: + im.seek(0) + + with pytest.raises(EOFError): + im.seek(1) + + @pytest.mark.parametrize("subsampling", ["4:4:4", "4:2:2", "4:2:0", "4:0:0"]) + def test_encoder_subsampling(self, tmp_path: Path, subsampling: str) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + im.save(test_file, subsampling=subsampling) + + def test_encoder_subsampling_invalid(self, tmp_path: Path) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + with pytest.raises(ValueError): + im.save(test_file, subsampling="foo") + + @pytest.mark.parametrize("value", ["full", "limited"]) + def test_encoder_range(self, tmp_path: Path, value: str) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + im.save(test_file, range=value) + + def test_encoder_range_invalid(self, tmp_path: Path) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + with pytest.raises(ValueError): + im.save(test_file, range="foo") + + @skip_unless_avif_encoder("aom") + def test_encoder_codec_param(self, tmp_path: Path) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + im.save(test_file, codec="aom") + + def test_encoder_codec_invalid(self, tmp_path: Path) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + with pytest.raises(ValueError): + im.save(test_file, codec="foo") + + @skip_unless_avif_decoder("dav1d") + def test_decoder_codec_cannot_encode(self, tmp_path: Path) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + with pytest.raises(ValueError): + im.save(test_file, codec="dav1d") + + @skip_unless_avif_encoder("aom") + @pytest.mark.parametrize( + "advanced", + [ + { + "aq-mode": "1", + "enable-chroma-deltaq": "1", + }, + (("aq-mode", "1"), ("enable-chroma-deltaq", "1")), + [("aq-mode", "1"), ("enable-chroma-deltaq", "1")], + ], + ) + def test_encoder_advanced_codec_options( + self, advanced: dict[str, str] | Sequence[tuple[str, str]] + ) -> None: + with Image.open(TEST_AVIF_FILE) as im: + ctrl_buf = BytesIO() + im.save(ctrl_buf, "AVIF", codec="aom") + test_buf = BytesIO() + im.save( + test_buf, + "AVIF", + codec="aom", + advanced=advanced, + ) + assert ctrl_buf.getvalue() != test_buf.getvalue() + + @skip_unless_avif_encoder("aom") + @pytest.mark.parametrize("advanced", [{"foo": "bar"}, {"foo": 1234}, 1234]) + def test_encoder_advanced_codec_options_invalid( + self, tmp_path: Path, advanced: dict[str, str] | int + ) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + with pytest.raises(ValueError): + im.save(test_file, codec="aom", advanced=advanced) + + @skip_unless_avif_decoder("aom") + def test_decoder_codec_param(self, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(AvifImagePlugin, "DECODE_CODEC_CHOICE", "aom") + + with Image.open(TEST_AVIF_FILE) as im: + assert im.size == (128, 128) + + @skip_unless_avif_encoder("rav1e") + def test_encoder_codec_cannot_decode( + self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path + ) -> None: + monkeypatch.setattr(AvifImagePlugin, "DECODE_CODEC_CHOICE", "rav1e") + + with pytest.raises(ValueError): + with Image.open(TEST_AVIF_FILE): + pass + + def test_decoder_codec_invalid(self, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(AvifImagePlugin, "DECODE_CODEC_CHOICE", "foo") + + with pytest.raises(ValueError): + with Image.open(TEST_AVIF_FILE): + pass + + @skip_unless_avif_encoder("aom") + def test_encoder_codec_available(self) -> None: + assert _avif.encoder_codec_available("aom") is True + + def test_encoder_codec_available_bad_params(self) -> None: + with pytest.raises(TypeError): + _avif.encoder_codec_available() + + @skip_unless_avif_decoder("dav1d") + def test_encoder_codec_available_cannot_decode(self) -> None: + assert _avif.encoder_codec_available("dav1d") is False + + def test_encoder_codec_available_invalid(self) -> None: + assert _avif.encoder_codec_available("foo") is False + + def test_encoder_quality_valueerror(self, tmp_path: Path) -> None: + with Image.open(TEST_AVIF_FILE) as im: + test_file = tmp_path / "temp.avif" + with pytest.raises(ValueError): + im.save(test_file, quality="invalid") + + @skip_unless_avif_decoder("aom") + def test_decoder_codec_available(self) -> None: + assert _avif.decoder_codec_available("aom") is True + + def test_decoder_codec_available_bad_params(self) -> None: + with pytest.raises(TypeError): + _avif.decoder_codec_available() + + @skip_unless_avif_encoder("rav1e") + def test_decoder_codec_available_cannot_decode(self) -> None: + assert _avif.decoder_codec_available("rav1e") is False + + def test_decoder_codec_available_invalid(self) -> None: + assert _avif.decoder_codec_available("foo") is False + + def test_p_mode_transparency(self, tmp_path: Path) -> None: + im = Image.new("P", size=(64, 64)) + draw = ImageDraw.Draw(im) + draw.rectangle(xy=[(0, 0), (32, 32)], fill=255) + draw.rectangle(xy=[(32, 32), (64, 64)], fill=255) + + out_png = tmp_path / "temp.png" + im.save(out_png, transparency=0) + with Image.open(out_png) as im_png: + out_avif = tmp_path / "temp.avif" + im_png.save(out_avif, quality=100) + + with Image.open(out_avif) as expected: + assert_image_similar(im_png.convert("RGBA"), expected, 0.17) + + def test_decoder_strict_flags(self) -> None: + # This would fail if full avif strictFlags were enabled + with Image.open("Tests/images/avif/hopper-missing-pixi.avif") as im: + assert im.size == (128, 128) + + @skip_unless_avif_encoder("aom") + @pytest.mark.parametrize("speed", [-1, 1, 11]) + def test_aom_optimizations(self, tmp_path: Path, speed: int) -> None: + test_file = tmp_path / "temp.avif" + hopper().save(test_file, codec="aom", speed=speed) + + @skip_unless_avif_encoder("svt") + def test_svt_optimizations(self, tmp_path: Path) -> None: + test_file = tmp_path / "temp.avif" + hopper().save(test_file, codec="svt", speed=1) + + +@skip_unless_feature("avif") +class TestAvifAnimation: + @contextmanager + def star_frames(self) -> Generator[list[Image.Image], None, None]: + with Image.open("Tests/images/avif/star.png") as f: + yield [f, f.rotate(90), f.rotate(180), f.rotate(270)] + + def test_n_frames(self) -> None: + """ + Ensure that AVIF format sets n_frames and is_animated attributes + correctly. + """ + + with Image.open(TEST_AVIF_FILE) as im: + assert im.n_frames == 1 + assert not im.is_animated + + with Image.open("Tests/images/avif/star.avifs") as im: + assert im.n_frames == 5 + assert im.is_animated + + def test_write_animation_P(self, tmp_path: Path) -> None: + """ + Convert an animated GIF to animated AVIF, then compare the frame + count, and ensure the frames are visually similar to the originals. + """ + + with Image.open("Tests/images/avif/star.gif") as original: + assert original.n_frames > 1 + + temp_file = tmp_path / "temp.avif" + original.save(temp_file, save_all=True) + with Image.open(temp_file) as im: + assert im.n_frames == original.n_frames + + # Compare first frame in P mode to frame from original GIF + assert_image_similar(im, original.convert("RGBA"), 2) + + # Compare later frames in RGBA mode to frames from original GIF + for frame in range(1, original.n_frames): + original.seek(frame) + im.seek(frame) + assert_image_similar(im, original, 2.54) + + def test_write_animation_RGBA(self, tmp_path: Path) -> None: + """ + Write an animated AVIF from RGBA frames, and ensure the frames + are visually similar to the originals. + """ + + def check(temp_file: Path) -> None: + with Image.open(temp_file) as im: + assert im.n_frames == 4 + + # Compare first frame to original + assert_image_similar(im, frame1, 2.7) + + # Compare second frame to original + im.seek(1) + assert_image_similar(im, frame2, 4.1) + + with self.star_frames() as frames: + frame1 = frames[0] + frame2 = frames[1] + temp_file1 = tmp_path / "temp.avif" + frames[0].copy().save(temp_file1, save_all=True, append_images=frames[1:]) + check(temp_file1) + + # Test appending using a generator + def imGenerator( + ims: list[Image.Image], + ) -> Generator[Image.Image, None, None]: + yield from ims + + temp_file2 = tmp_path / "temp_generator.avif" + frames[0].copy().save( + temp_file2, + save_all=True, + append_images=imGenerator(frames[1:]), + ) + check(temp_file2) + + def test_sequence_dimension_mismatch_check(self, tmp_path: Path) -> None: + temp_file = tmp_path / "temp.avif" + frame1 = Image.new("RGB", (100, 100)) + frame2 = Image.new("RGB", (150, 150)) + with pytest.raises(ValueError): + frame1.save(temp_file, save_all=True, append_images=[frame2]) + + def test_heif_raises_unidentified_image_error(self) -> None: + with pytest.raises(UnidentifiedImageError): + with Image.open("Tests/images/avif/hopper.heif"): + pass + + @pytest.mark.parametrize("alpha_premultiplied", [False, True]) + def test_alpha_premultiplied( + self, tmp_path: Path, alpha_premultiplied: bool + ) -> None: + temp_file = tmp_path / "temp.avif" + color = (200, 200, 200, 1) + im = Image.new("RGBA", (1, 1), color) + im.save(temp_file, alpha_premultiplied=alpha_premultiplied) + + expected = (255, 255, 255, 1) if alpha_premultiplied else color + with Image.open(temp_file) as reloaded: + assert reloaded.getpixel((0, 0)) == expected + + def test_timestamp_and_duration(self, tmp_path: Path) -> None: + """ + Try passing a list of durations, and make sure the encoded + timestamps and durations are correct. + """ + + durations = [1, 10, 20, 30, 40] + temp_file = tmp_path / "temp.avif" + with self.star_frames() as frames: + frames[0].save( + temp_file, + save_all=True, + append_images=(frames[1:] + [frames[0]]), + duration=durations, + ) + + with Image.open(temp_file) as im: + assert im.n_frames == 5 + assert im.is_animated + + # Check that timestamps and durations match original values specified + timestamp = 0 + for frame in range(im.n_frames): + im.seek(frame) + im.load() + assert im.info["duration"] == durations[frame] + assert im.info["timestamp"] == timestamp + timestamp += durations[frame] + + def test_seeking(self, tmp_path: Path) -> None: + """ + Create an animated AVIF file, and then try seeking through frames in + reverse-order, verifying the timestamps and durations are correct. + """ + + duration = 33 + temp_file = tmp_path / "temp.avif" + with self.star_frames() as frames: + frames[0].save( + temp_file, + save_all=True, + append_images=(frames[1:] + [frames[0]]), + duration=duration, + ) + + with Image.open(temp_file) as im: + assert im.n_frames == 5 + assert im.is_animated + + # Traverse frames in reverse, checking timestamps and durations + timestamp = duration * (im.n_frames - 1) + for frame in reversed(range(im.n_frames)): + im.seek(frame) + im.load() + assert im.info["duration"] == duration + assert im.info["timestamp"] == timestamp + timestamp -= duration + + def test_seek_errors(self) -> None: + with Image.open("Tests/images/avif/star.avifs") as im: + with pytest.raises(EOFError): + im.seek(-1) + + with pytest.raises(EOFError): + im.seek(42) + + +MAX_THREADS = os.cpu_count() or 1 + + +@skip_unless_feature("avif") +class TestAvifLeaks(PillowLeakTestCase): + mem_limit = MAX_THREADS * 3 * 1024 + iterations = 100 + + @pytest.mark.skipif( + is_docker_qemu(), reason="Skipping on cross-architecture containers" + ) + def test_leak_load(self) -> None: + with open(TEST_AVIF_FILE, "rb") as f: + im_data = f.read() + + def core() -> None: + with Image.open(BytesIO(im_data)) as im: + im.load() + gc.collect() + + self._test_leak(core) diff --git a/depends/install_libavif.sh b/depends/install_libavif.sh new file mode 100755 index 000000000..fc10d3e54 --- /dev/null +++ b/depends/install_libavif.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +set -eo pipefail + +version=1.2.1 + +./download-and-extract.sh libavif-$version https://github.com/AOMediaCodec/libavif/archive/refs/tags/v$version.tar.gz + +pushd libavif-$version + +if [ $(uname) == "Darwin" ] && [ -x "$(command -v brew)" ]; then + PREFIX=$(brew --prefix) +else + PREFIX=/usr +fi + +PKGCONFIG=${PKGCONFIG:-pkg-config} + +LIBAVIF_CMAKE_FLAGS=() +HAS_DECODER=0 +HAS_ENCODER=0 + +if $PKGCONFIG --exists aom; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_AOM=SYSTEM) + HAS_ENCODER=1 + HAS_DECODER=1 +fi + +if $PKGCONFIG --exists dav1d; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_DAV1D=SYSTEM) + HAS_DECODER=1 +fi + +if $PKGCONFIG --exists libgav1; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_LIBGAV1=SYSTEM) + HAS_DECODER=1 +fi + +if $PKGCONFIG --exists rav1e; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_RAV1E=SYSTEM) + HAS_ENCODER=1 +fi + +if $PKGCONFIG --exists SvtAv1Enc; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_SVT=SYSTEM) + HAS_ENCODER=1 +fi + +if [ "$HAS_ENCODER" != 1 ] || [ "$HAS_DECODER" != 1 ]; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_AOM=LOCAL) +fi + +cmake \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_INSTALL_NAME_DIR=$PREFIX/lib \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_MACOSX_RPATH=OFF \ + -DAVIF_LIBSHARPYUV=LOCAL \ + -DAVIF_LIBYUV=LOCAL \ + "${LIBAVIF_CMAKE_FLAGS[@]}" \ + . + +sudo make install + +popd diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index c0b1a9d4e..bfa462c04 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -24,6 +24,83 @@ present, and the :py:attr:`~PIL.Image.Image.format` attribute will be ``None``. Fully supported formats ----------------------- +AVIF +^^^^ + +Pillow reads and writes AVIF files, including AVIF sequence images. +It is only possible to save 8-bit AVIF images, and all AVIF images are decoded +as 8-bit RGB(A). + +The :py:meth:`~PIL.Image.Image.save` method supports the following options: + +**quality** + Integer, 0-100, defaults to 75. 0 gives the smallest size and poorest + quality, 100 the largest size and best quality. + +**subsampling** + If present, sets the subsampling for the encoder. Defaults to ``4:2:0``. + Options include: + + * ``4:0:0`` + * ``4:2:0`` + * ``4:2:2`` + * ``4:4:4`` + +**speed** + Quality/speed trade-off (0=slower/better, 10=fastest). Defaults to 6. + +**max_threads** + Limit the number of active threads used. By default, there is no limit. If the aom + codec is used, there is a maximum of 64. + +**range** + YUV range, either "full" or "limited". Defaults to "full". + +**codec** + AV1 codec to use for encoding. Specific values are "aom", "rav1e", and + "svt", presuming the chosen codec is available. Defaults to "auto", which + will choose the first available codec in the order of the preceding list. + +**tile_rows** / **tile_cols** + For tile encoding, the (log 2) number of tile rows and columns to use. + Valid values are 0-6, default 0. Ignored if "autotiling" is set to true. + +**autotiling** + Split the image up to allow parallelization. Enabled automatically if "tile_rows" + and "tile_cols" both have their default values of zero. + +**alpha_premultiplied** + Encode the image with premultiplied alpha. Defaults to ``False``. + +**advanced** + Codec specific options. + +**icc_profile** + The ICC Profile to include in the saved file. + +**exif** + The exif data to include in the saved file. + +**xmp** + The XMP data to include in the saved file. + +Saving sequences +~~~~~~~~~~~~~~~~ + +When calling :py:meth:`~PIL.Image.Image.save` to write an AVIF file, by default +only the first frame of a multiframe image will be saved. If the ``save_all`` +argument is present and true, then all frames will be saved, and the following +options will also be available. + +**append_images** + A list of images to append as additional frames. Each of the + images in the list can be single or multiframe images. + +**duration** + The display duration of each frame, in milliseconds. Pass a single + integer for a constant duration, or a list or tuple to set the + duration for each frame separately. + BLP ^^^ @@ -242,7 +319,7 @@ following options are available:: **append_images** A list of images to append as additional frames. Each of the images in the list can be single or multiframe images. - This is currently supported for GIF, PDF, PNG, TIFF, and WebP. + This is supported for AVIF, GIF, PDF, PNG, TIFF and WebP. It is also supported for ICO and ICNS. If images are passed in of relevant sizes, they will be used instead of scaling down the main image. diff --git a/docs/installation/building-from-source.rst b/docs/installation/building-from-source.rst index 2790bc2e6..9f953e718 100644 --- a/docs/installation/building-from-source.rst +++ b/docs/installation/building-from-source.rst @@ -89,6 +89,14 @@ Many of Pillow's features require external libraries: * **libxcb** provides X11 screengrab support. +* **libavif** provides support for the AVIF format. + + * Pillow requires libavif version **1.0.0** or greater. + * libavif is merely an API that wraps AVIF codecs. If you are compiling + libavif from source, you will also need to install both an AVIF encoder + and decoder, such as rav1e and dav1d, or libaom, which both encodes and + decodes AVIF images. + .. tab:: Linux If you didn't build Python from source, make sure you have Python's @@ -117,6 +125,12 @@ Many of Pillow's features require external libraries: To install libraqm, ``sudo apt-get install meson`` and then see ``depends/install_raqm.sh``. + Build prerequisites for libavif on Ubuntu are installed with:: + + sudo apt-get install cmake ninja-build nasm + + Then see ``depends/install_libavif.sh`` to build and install libavif. + Prerequisites are installed on recent **Red Hat**, **CentOS** or **Fedora** with:: sudo dnf install libtiff-devel libjpeg-devel openjpeg2-devel zlib-devel \ @@ -148,7 +162,15 @@ Many of Pillow's features require external libraries: The easiest way to install external libraries is via `Homebrew `_. After you install Homebrew, run:: - brew install libjpeg libraqm libtiff little-cms2 openjpeg webp + brew install libavif libjpeg libraqm libtiff little-cms2 openjpeg webp + + If you would like to use libavif with more codecs than just aom, then + instead of installing libavif through Homebrew directly, you can use + Homebrew to install libavif's build dependencies:: + + brew install aom dav1d rav1e svt-av1 + + Then see ``depends/install_libavif.sh`` to install libavif. .. tab:: Windows @@ -187,7 +209,8 @@ Many of Pillow's features require external libraries: mingw-w64-x86_64-libwebp \ mingw-w64-x86_64-openjpeg2 \ mingw-w64-x86_64-libimagequant \ - mingw-w64-x86_64-libraqm + mingw-w64-x86_64-libraqm \ + mingw-w64-x86_64-libavif .. tab:: FreeBSD @@ -199,7 +222,7 @@ Many of Pillow's features require external libraries: Prerequisites are installed on **FreeBSD 10 or 11** with:: - sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 openjpeg harfbuzz fribidi libxcb + sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 openjpeg harfbuzz fribidi libxcb libavif Then see ``depends/install_raqm_cmake.sh`` to install libraqm. diff --git a/docs/reference/features.rst b/docs/reference/features.rst index 0e173fe87..c5d89b838 100644 --- a/docs/reference/features.rst +++ b/docs/reference/features.rst @@ -21,6 +21,7 @@ Support for the following modules can be checked: * ``freetype2``: FreeType font support via :py:func:`PIL.ImageFont.truetype`. * ``littlecms2``: LittleCMS 2 support via :py:mod:`PIL.ImageCms`. * ``webp``: WebP image support. +* ``avif``: AVIF image support. .. autofunction:: PIL.features.check_module .. autofunction:: PIL.features.version_module diff --git a/docs/reference/plugins.rst b/docs/reference/plugins.rst index 454b94d8c..c789f5757 100644 --- a/docs/reference/plugins.rst +++ b/docs/reference/plugins.rst @@ -1,6 +1,14 @@ Plugin reference ================ +:mod:`~PIL.AvifImagePlugin` Module +---------------------------------- + +.. automodule:: PIL.AvifImagePlugin + :members: + :undoc-members: + :show-inheritance: + :mod:`~PIL.BmpImagePlugin` Module --------------------------------- diff --git a/docs/releasenotes/11.2.0.rst b/docs/releasenotes/11.2.0.rst index d40d86f21..dbaa8a4a4 100644 --- a/docs/releasenotes/11.2.0.rst +++ b/docs/releasenotes/11.2.0.rst @@ -68,3 +68,12 @@ Compressed DDS images can now be saved using a ``pixel_format`` argument. DXT1, DXT5, BC2, BC3 and BC5 are supported:: im.save("out.dds", pixel_format="DXT1") + +Other Changes +============= + +Reading and writing AVIF images +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pillow can now read and write AVIF images. If you are building Pillow from source, this +will require libavif 1.0.0 or later. diff --git a/setup.py b/setup.py index 9fac993b1..9d69b1d6e 100644 --- a/setup.py +++ b/setup.py @@ -32,6 +32,7 @@ configuration: dict[str, list[str]] = {} PILLOW_VERSION = get_version() +AVIF_ROOT = None FREETYPE_ROOT = None HARFBUZZ_ROOT = None FRIBIDI_ROOT = None @@ -306,6 +307,7 @@ class pil_build_ext(build_ext): "jpeg2000", "imagequant", "xcb", + "avif", ] required = {"jpeg", "zlib"} @@ -481,6 +483,7 @@ class pil_build_ext(build_ext): # # add configured kits for root_name, lib_name in { + "AVIF_ROOT": "avif", "JPEG_ROOT": "libjpeg", "JPEG2K_ROOT": "libopenjp2", "TIFF_ROOT": ("libtiff-5", "libtiff-4"), @@ -846,6 +849,12 @@ class pil_build_ext(build_ext): if _find_library_file(self, "xcb"): feature.set("xcb", "xcb") + if feature.want("avif"): + _dbg("Looking for avif") + if _find_include_file(self, "avif/avif.h"): + if _find_library_file(self, "avif"): + feature.set("avif", "avif") + for f in feature: if not feature.get(f) and feature.require(f): if f in ("jpeg", "zlib"): @@ -934,6 +943,14 @@ class pil_build_ext(build_ext): else: self._remove_extension("PIL._webp") + if feature.get("avif"): + libs = [feature.get("avif")] + if sys.platform == "win32": + libs.extend(["ntdll", "userenv", "ws2_32", "bcrypt"]) + self._update_extension("PIL._avif", libs) + else: + self._remove_extension("PIL._avif") + tk_libs = ["psapi"] if sys.platform in ("win32", "cygwin") else [] self._update_extension("PIL._imagingtk", tk_libs) @@ -976,6 +993,7 @@ class pil_build_ext(build_ext): (feature.get("lcms"), "LITTLECMS2"), (feature.get("webp"), "WEBP"), (feature.get("xcb"), "XCB (X protocol)"), + (feature.get("avif"), "LIBAVIF"), ] all = 1 @@ -1018,6 +1036,7 @@ ext_modules = [ Extension("PIL._imagingft", ["src/_imagingft.c"]), Extension("PIL._imagingcms", ["src/_imagingcms.c"]), Extension("PIL._webp", ["src/_webp.c"]), + Extension("PIL._avif", ["src/_avif.c"]), Extension("PIL._imagingtk", ["src/_imagingtk.c", "src/Tk/tkImaging.c"]), Extension("PIL._imagingmath", ["src/_imagingmath.c"]), Extension("PIL._imagingmorph", ["src/_imagingmorph.c"]), diff --git a/src/PIL/AvifImagePlugin.py b/src/PIL/AvifImagePlugin.py new file mode 100644 index 000000000..b2c5ab15d --- /dev/null +++ b/src/PIL/AvifImagePlugin.py @@ -0,0 +1,292 @@ +from __future__ import annotations + +import os +from io import BytesIO +from typing import IO + +from . import ExifTags, Image, ImageFile + +try: + from . import _avif + + SUPPORTED = True +except ImportError: + SUPPORTED = False + +# Decoder options as module globals, until there is a way to pass parameters +# to Image.open (see https://github.com/python-pillow/Pillow/issues/569) +DECODE_CODEC_CHOICE = "auto" +# Decoding is only affected by this for libavif **0.8.4** or greater. +DEFAULT_MAX_THREADS = 0 + + +def get_codec_version(codec_name: str) -> str | None: + versions = _avif.codec_versions() + for version in versions.split(", "): + if version.split(" [")[0] == codec_name: + return version.split(":")[-1].split(" ")[0] + return None + + +def _accept(prefix: bytes) -> bool | str: + if prefix[4:8] != b"ftyp": + return False + major_brand = prefix[8:12] + if major_brand in ( + # coding brands + b"avif", + b"avis", + # We accept files with AVIF container brands; we can't yet know if + # the ftyp box has the correct compatible brands, but if it doesn't + # then the plugin will raise a SyntaxError which Pillow will catch + # before moving on to the next plugin that accepts the file. + # + # Also, because this file might not actually be an AVIF file, we + # don't raise an error if AVIF support isn't properly compiled. + b"mif1", + b"msf1", + ): + if not SUPPORTED: + return ( + "image file could not be identified because AVIF support not installed" + ) + return True + return False + + +def _get_default_max_threads() -> int: + if DEFAULT_MAX_THREADS: + return DEFAULT_MAX_THREADS + if hasattr(os, "sched_getaffinity"): + return len(os.sched_getaffinity(0)) + else: + return os.cpu_count() or 1 + + +class AvifImageFile(ImageFile.ImageFile): + format = "AVIF" + format_description = "AVIF image" + __frame = -1 + + def _open(self) -> None: + if not SUPPORTED: + msg = "image file could not be opened because AVIF support not installed" + raise SyntaxError(msg) + + if DECODE_CODEC_CHOICE != "auto" and not _avif.decoder_codec_available( + DECODE_CODEC_CHOICE + ): + msg = "Invalid opening codec" + raise ValueError(msg) + self._decoder = _avif.AvifDecoder( + self.fp.read(), + DECODE_CODEC_CHOICE, + _get_default_max_threads(), + ) + + # Get info from decoder + self._size, self.n_frames, self._mode, icc, exif, exif_orientation, xmp = ( + self._decoder.get_info() + ) + self.is_animated = self.n_frames > 1 + + if icc: + self.info["icc_profile"] = icc + if xmp: + self.info["xmp"] = xmp + + if exif_orientation != 1 or exif: + exif_data = Image.Exif() + if exif: + exif_data.load(exif) + original_orientation = exif_data.get(ExifTags.Base.Orientation, 1) + else: + original_orientation = 1 + if exif_orientation != original_orientation: + exif_data[ExifTags.Base.Orientation] = exif_orientation + exif = exif_data.tobytes() + if exif: + self.info["exif"] = exif + self.seek(0) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + + # Set tile + self.__frame = frame + self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 0, self.mode)] + + def load(self) -> Image.core.PixelAccess | None: + if self.tile: + # We need to load the image data for this frame + data, timescale, pts_in_timescales, duration_in_timescales = ( + self._decoder.get_frame(self.__frame) + ) + self.info["timestamp"] = round(1000 * (pts_in_timescales / timescale)) + self.info["duration"] = round(1000 * (duration_in_timescales / timescale)) + + if self.fp and self._exclusive_fp: + self.fp.close() + self.fp = BytesIO(data) + + return super().load() + + def load_seek(self, pos: int) -> None: + pass + + def tell(self) -> int: + return self.__frame + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False +) -> None: + info = im.encoderinfo.copy() + if save_all: + append_images = list(info.get("append_images", [])) + else: + append_images = [] + + total = 0 + for ims in [im] + append_images: + total += getattr(ims, "n_frames", 1) + + quality = info.get("quality", 75) + if not isinstance(quality, int) or quality < 0 or quality > 100: + msg = "Invalid quality setting" + raise ValueError(msg) + + duration = info.get("duration", 0) + subsampling = info.get("subsampling", "4:2:0") + speed = info.get("speed", 6) + max_threads = info.get("max_threads", _get_default_max_threads()) + codec = info.get("codec", "auto") + if codec != "auto" and not _avif.encoder_codec_available(codec): + msg = "Invalid saving codec" + raise ValueError(msg) + range_ = info.get("range", "full") + tile_rows_log2 = info.get("tile_rows", 0) + tile_cols_log2 = info.get("tile_cols", 0) + alpha_premultiplied = bool(info.get("alpha_premultiplied", False)) + autotiling = bool(info.get("autotiling", tile_rows_log2 == tile_cols_log2 == 0)) + + icc_profile = info.get("icc_profile", im.info.get("icc_profile")) + exif_orientation = 1 + if exif := info.get("exif"): + if isinstance(exif, Image.Exif): + exif_data = exif + else: + exif_data = Image.Exif() + exif_data.load(exif) + if ExifTags.Base.Orientation in exif_data: + exif_orientation = exif_data.pop(ExifTags.Base.Orientation) + exif = exif_data.tobytes() if exif_data else b"" + elif isinstance(exif, Image.Exif): + exif = exif_data.tobytes() + + xmp = info.get("xmp") + + if isinstance(xmp, str): + xmp = xmp.encode("utf-8") + + advanced = info.get("advanced") + if advanced is not None: + if isinstance(advanced, dict): + advanced = advanced.items() + try: + advanced = tuple(advanced) + except TypeError: + invalid = True + else: + invalid = any(not isinstance(v, tuple) or len(v) != 2 for v in advanced) + if invalid: + msg = ( + "advanced codec options must be a dict of key-value string " + "pairs or a series of key-value two-tuples" + ) + raise ValueError(msg) + + # Setup the AVIF encoder + enc = _avif.AvifEncoder( + im.size, + subsampling, + quality, + speed, + max_threads, + codec, + range_, + tile_rows_log2, + tile_cols_log2, + alpha_premultiplied, + autotiling, + icc_profile or b"", + exif or b"", + exif_orientation, + xmp or b"", + advanced, + ) + + # Add each frame + frame_idx = 0 + frame_duration = 0 + cur_idx = im.tell() + is_single_frame = total == 1 + try: + for ims in [im] + append_images: + # Get number of frames in this image + nfr = getattr(ims, "n_frames", 1) + + for idx in range(nfr): + ims.seek(idx) + + # Make sure image mode is supported + frame = ims + rawmode = ims.mode + if ims.mode not in {"RGB", "RGBA"}: + rawmode = "RGBA" if ims.has_transparency_data else "RGB" + frame = ims.convert(rawmode) + + # Update frame duration + if isinstance(duration, (list, tuple)): + frame_duration = duration[frame_idx] + else: + frame_duration = duration + + # Append the frame to the animation encoder + enc.add( + frame.tobytes("raw", rawmode), + frame_duration, + frame.size, + rawmode, + is_single_frame, + ) + + # Update frame index + frame_idx += 1 + + if not save_all: + break + + finally: + im.seek(cur_idx) + + # Get the final output from the encoder + data = enc.finish() + if data is None: + msg = "cannot write file as AVIF (encoder returned None)" + raise OSError(msg) + + fp.write(data) + + +Image.register_open(AvifImageFile.format, AvifImageFile, _accept) +if SUPPORTED: + Image.register_save(AvifImageFile.format, _save) + Image.register_save_all(AvifImageFile.format, _save_all) + Image.register_extensions(AvifImageFile.format, [".avif", ".avifs"]) + Image.register_mime(AvifImageFile.format, "image/avif") diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 19b22342a..60850f4ff 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1520,6 +1520,8 @@ class Image: # XMP tags if ExifTags.Base.Orientation not in self._exif: xmp_tags = self.info.get("XML:com.adobe.xmp") + if not xmp_tags and (xmp_tags := self.info.get("xmp")): + xmp_tags = xmp_tags.decode("utf-8") if xmp_tags: match = re.search(r'tiff:Orientation(="|>)([0-9])', xmp_tags) if match: diff --git a/src/PIL/__init__.py b/src/PIL/__init__.py index 09546fe63..6e4c23f89 100644 --- a/src/PIL/__init__.py +++ b/src/PIL/__init__.py @@ -25,6 +25,7 @@ del _version _plugins = [ + "AvifImagePlugin", "BlpImagePlugin", "BmpImagePlugin", "BufrStubImagePlugin", diff --git a/src/PIL/_avif.pyi b/src/PIL/_avif.pyi new file mode 100644 index 000000000..e27843e53 --- /dev/null +++ b/src/PIL/_avif.pyi @@ -0,0 +1,3 @@ +from typing import Any + +def __getattr__(name: str) -> Any: ... diff --git a/src/PIL/features.py b/src/PIL/features.py index ae7ea4255..573f1d412 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -17,6 +17,7 @@ modules = { "freetype2": ("PIL._imagingft", "freetype2_version"), "littlecms2": ("PIL._imagingcms", "littlecms_version"), "webp": ("PIL._webp", "webpdecoder_version"), + "avif": ("PIL._avif", "libavif_version"), } @@ -288,6 +289,7 @@ def pilinfo(out: IO[str] | None = None, supported_formats: bool = True) -> None: ("freetype2", "FREETYPE2"), ("littlecms2", "LITTLECMS2"), ("webp", "WEBP"), + ("avif", "AVIF"), ("jpg", "JPEG"), ("jpg_2000", "OPENJPEG (JPEG2000)"), ("zlib", "ZLIB (PNG/ZIP)"), diff --git a/src/_avif.c b/src/_avif.c new file mode 100644 index 000000000..eabd9958e --- /dev/null +++ b/src/_avif.c @@ -0,0 +1,908 @@ +#define PY_SSIZE_T_CLEAN + +#include +#include "avif/avif.h" + +// Encoder type +typedef struct { + PyObject_HEAD avifEncoder *encoder; + avifImage *image; + int first_frame; +} AvifEncoderObject; + +static PyTypeObject AvifEncoder_Type; + +// Decoder type +typedef struct { + PyObject_HEAD avifDecoder *decoder; + Py_buffer buffer; +} AvifDecoderObject; + +static PyTypeObject AvifDecoder_Type; + +static int +normalize_tiles_log2(int value) { + if (value < 0) { + return 0; + } else if (value > 6) { + return 6; + } else { + return value; + } +} + +static PyObject * +exc_type_for_avif_result(avifResult result) { + switch (result) { + case AVIF_RESULT_INVALID_EXIF_PAYLOAD: + case AVIF_RESULT_INVALID_CODEC_SPECIFIC_OPTION: + return PyExc_ValueError; + case AVIF_RESULT_INVALID_FTYP: + case AVIF_RESULT_BMFF_PARSE_FAILED: + case AVIF_RESULT_TRUNCATED_DATA: + case AVIF_RESULT_NO_CONTENT: + return PyExc_SyntaxError; + default: + return PyExc_RuntimeError; + } +} + +static uint8_t +irot_imir_to_exif_orientation(const avifImage *image) { + uint8_t axis = image->imir.axis; + int imir = image->transformFlags & AVIF_TRANSFORM_IMIR; + int irot = image->transformFlags & AVIF_TRANSFORM_IROT; + if (irot) { + uint8_t angle = image->irot.angle; + if (angle == 1) { + if (imir) { + return axis ? 7 // 90 degrees anti-clockwise then swap left and right. + : 5; // 90 degrees anti-clockwise then swap top and bottom. + } + return 6; // 90 degrees anti-clockwise. + } + if (angle == 2) { + if (imir) { + return axis + ? 4 // 180 degrees anti-clockwise then swap left and right. + : 2; // 180 degrees anti-clockwise then swap top and bottom. + } + return 3; // 180 degrees anti-clockwise. + } + if (angle == 3) { + if (imir) { + return axis + ? 5 // 270 degrees anti-clockwise then swap left and right. + : 7; // 270 degrees anti-clockwise then swap top and bottom. + } + return 8; // 270 degrees anti-clockwise. + } + } + if (imir) { + return axis ? 2 // Swap left and right. + : 4; // Swap top and bottom. + } + return 1; // Default orientation ("top-left", no-op). +} + +static void +exif_orientation_to_irot_imir(avifImage *image, int orientation) { + // Mapping from Exif orientation as defined in JEITA CP-3451C section 4.6.4.A + // Orientation to irot and imir boxes as defined in HEIF ISO/IEC 28002-12:2021 + // sections 6.5.10 and 6.5.12. + switch (orientation) { + case 2: // The 0th row is at the visual top of the image, and the 0th column is + // the visual right-hand side. + image->transformFlags |= AVIF_TRANSFORM_IMIR; + image->imir.axis = 1; + break; + case 3: // The 0th row is at the visual bottom of the image, and the 0th column + // is the visual right-hand side. + image->transformFlags |= AVIF_TRANSFORM_IROT; + image->irot.angle = 2; + break; + case 4: // The 0th row is at the visual bottom of the image, and the 0th column + // is the visual left-hand side. + image->transformFlags |= AVIF_TRANSFORM_IMIR; + break; + case 5: // The 0th row is the visual left-hand side of the image, and the 0th + // column is the visual top. + image->transformFlags |= AVIF_TRANSFORM_IROT | AVIF_TRANSFORM_IMIR; + image->irot.angle = 1; // applied before imir according to MIAF spec + // ISO/IEC 28002-12:2021 - section 7.3.6.7 + break; + case 6: // The 0th row is the visual right-hand side of the image, and the 0th + // column is the visual top. + image->transformFlags |= AVIF_TRANSFORM_IROT; + image->irot.angle = 3; + break; + case 7: // The 0th row is the visual right-hand side of the image, and the 0th + // column is the visual bottom. + image->transformFlags |= AVIF_TRANSFORM_IROT | AVIF_TRANSFORM_IMIR; + image->irot.angle = 3; // applied before imir according to MIAF spec + // ISO/IEC 28002-12:2021 - section 7.3.6.7 + break; + case 8: // The 0th row is the visual left-hand side of the image, and the 0th + // column is the visual bottom. + image->transformFlags |= AVIF_TRANSFORM_IROT; + image->irot.angle = 1; + break; + } +} + +static int +_codec_available(const char *name, avifCodecFlags flags) { + avifCodecChoice codec = avifCodecChoiceFromName(name); + if (codec == AVIF_CODEC_CHOICE_AUTO) { + return 0; + } + const char *codec_name = avifCodecName(codec, flags); + return (codec_name == NULL) ? 0 : 1; +} + +PyObject * +_decoder_codec_available(PyObject *self, PyObject *args) { + char *codec_name; + if (!PyArg_ParseTuple(args, "s", &codec_name)) { + return NULL; + } + int is_available = _codec_available(codec_name, AVIF_CODEC_FLAG_CAN_DECODE); + return PyBool_FromLong(is_available); +} + +PyObject * +_encoder_codec_available(PyObject *self, PyObject *args) { + char *codec_name; + if (!PyArg_ParseTuple(args, "s", &codec_name)) { + return NULL; + } + int is_available = _codec_available(codec_name, AVIF_CODEC_FLAG_CAN_ENCODE); + return PyBool_FromLong(is_available); +} + +PyObject * +_codec_versions(PyObject *self, PyObject *args) { + char buffer[256]; + avifCodecVersions(buffer); + return PyUnicode_FromString(buffer); +} + +static int +_add_codec_specific_options(avifEncoder *encoder, PyObject *opts) { + Py_ssize_t i, size; + PyObject *keyval, *py_key, *py_val; + if (!PyTuple_Check(opts)) { + PyErr_SetString(PyExc_ValueError, "Invalid advanced codec options"); + return 1; + } + size = PyTuple_GET_SIZE(opts); + + for (i = 0; i < size; i++) { + keyval = PyTuple_GetItem(opts, i); + if (!PyTuple_Check(keyval) || PyTuple_GET_SIZE(keyval) != 2) { + PyErr_SetString(PyExc_ValueError, "Invalid advanced codec options"); + return 1; + } + py_key = PyTuple_GetItem(keyval, 0); + py_val = PyTuple_GetItem(keyval, 1); + if (!PyUnicode_Check(py_key) || !PyUnicode_Check(py_val)) { + PyErr_SetString(PyExc_ValueError, "Invalid advanced codec options"); + return 1; + } + const char *key = PyUnicode_AsUTF8(py_key); + const char *val = PyUnicode_AsUTF8(py_val); + if (key == NULL || val == NULL) { + PyErr_SetString(PyExc_ValueError, "Invalid advanced codec options"); + return 1; + } + + avifResult result = avifEncoderSetCodecSpecificOption(encoder, key, val); + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Setting advanced codec options failed: %s", + avifResultToString(result) + ); + return 1; + } + } + return 0; +} + +// Encoder functions +PyObject * +AvifEncoderNew(PyObject *self_, PyObject *args) { + unsigned int width, height; + AvifEncoderObject *self = NULL; + avifEncoder *encoder = NULL; + + char *subsampling; + int quality; + int speed; + int exif_orientation; + int max_threads; + Py_buffer icc_buffer; + Py_buffer exif_buffer; + Py_buffer xmp_buffer; + int alpha_premultiplied; + int autotiling; + int tile_rows_log2; + int tile_cols_log2; + + char *codec; + char *range; + + PyObject *advanced; + int error = 0; + + if (!PyArg_ParseTuple( + args, + "(II)siiissiippy*y*iy*O", + &width, + &height, + &subsampling, + &quality, + &speed, + &max_threads, + &codec, + &range, + &tile_rows_log2, + &tile_cols_log2, + &alpha_premultiplied, + &autotiling, + &icc_buffer, + &exif_buffer, + &exif_orientation, + &xmp_buffer, + &advanced + )) { + return NULL; + } + + // Create a new animation encoder and picture frame + avifImage *image = avifImageCreateEmpty(); + if (image == NULL) { + PyErr_SetString(PyExc_ValueError, "Image creation failed"); + error = 1; + goto end; + } + + // Set these in advance so any upcoming RGB -> YUV use the proper coefficients + if (strcmp(range, "full") == 0) { + image->yuvRange = AVIF_RANGE_FULL; + } else if (strcmp(range, "limited") == 0) { + image->yuvRange = AVIF_RANGE_LIMITED; + } else { + PyErr_SetString(PyExc_ValueError, "Invalid range"); + error = 1; + goto end; + } + if (strcmp(subsampling, "4:0:0") == 0) { + image->yuvFormat = AVIF_PIXEL_FORMAT_YUV400; + } else if (strcmp(subsampling, "4:2:0") == 0) { + image->yuvFormat = AVIF_PIXEL_FORMAT_YUV420; + } else if (strcmp(subsampling, "4:2:2") == 0) { + image->yuvFormat = AVIF_PIXEL_FORMAT_YUV422; + } else if (strcmp(subsampling, "4:4:4") == 0) { + image->yuvFormat = AVIF_PIXEL_FORMAT_YUV444; + } else { + PyErr_Format(PyExc_ValueError, "Invalid subsampling: %s", subsampling); + error = 1; + goto end; + } + + // Validate canvas dimensions + if (width == 0 || height == 0) { + PyErr_SetString(PyExc_ValueError, "invalid canvas dimensions"); + error = 1; + goto end; + } + image->width = width; + image->height = height; + + image->depth = 8; + image->alphaPremultiplied = alpha_premultiplied ? AVIF_TRUE : AVIF_FALSE; + + encoder = avifEncoderCreate(); + if (!encoder) { + PyErr_SetString(PyExc_MemoryError, "Can't allocate encoder"); + error = 1; + goto end; + } + + int is_aom_encode = strcmp(codec, "aom") == 0 || + (strcmp(codec, "auto") == 0 && + _codec_available("aom", AVIF_CODEC_FLAG_CAN_ENCODE)); + encoder->maxThreads = is_aom_encode && max_threads > 64 ? 64 : max_threads; + + encoder->quality = quality; + + if (strcmp(codec, "auto") == 0) { + encoder->codecChoice = AVIF_CODEC_CHOICE_AUTO; + } else { + encoder->codecChoice = avifCodecChoiceFromName(codec); + } + if (speed < AVIF_SPEED_SLOWEST) { + speed = AVIF_SPEED_SLOWEST; + } else if (speed > AVIF_SPEED_FASTEST) { + speed = AVIF_SPEED_FASTEST; + } + encoder->speed = speed; + encoder->timescale = (uint64_t)1000; + + encoder->autoTiling = autotiling ? AVIF_TRUE : AVIF_FALSE; + if (!autotiling) { + encoder->tileRowsLog2 = normalize_tiles_log2(tile_rows_log2); + encoder->tileColsLog2 = normalize_tiles_log2(tile_cols_log2); + } + + if (advanced != Py_None && _add_codec_specific_options(encoder, advanced)) { + error = 1; + goto end; + } + + self = PyObject_New(AvifEncoderObject, &AvifEncoder_Type); + if (!self) { + PyErr_SetString(PyExc_RuntimeError, "could not create encoder object"); + error = 1; + goto end; + } + self->first_frame = 1; + + avifResult result; + if (icc_buffer.len) { + result = avifImageSetProfileICC(image, icc_buffer.buf, icc_buffer.len); + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Setting ICC profile failed: %s", + avifResultToString(result) + ); + error = 1; + goto end; + } + // colorPrimaries and transferCharacteristics are ignored when an ICC + // profile is present, so set them to UNSPECIFIED. + image->colorPrimaries = AVIF_COLOR_PRIMARIES_UNSPECIFIED; + image->transferCharacteristics = AVIF_TRANSFER_CHARACTERISTICS_UNSPECIFIED; + } else { + image->colorPrimaries = AVIF_COLOR_PRIMARIES_BT709; + image->transferCharacteristics = AVIF_TRANSFER_CHARACTERISTICS_SRGB; + } + image->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_BT601; + + if (exif_buffer.len) { + result = avifImageSetMetadataExif(image, exif_buffer.buf, exif_buffer.len); + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Setting EXIF data failed: %s", + avifResultToString(result) + ); + error = 1; + goto end; + } + } + + if (xmp_buffer.len) { + result = avifImageSetMetadataXMP(image, xmp_buffer.buf, xmp_buffer.len); + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Setting XMP data failed: %s", + avifResultToString(result) + ); + error = 1; + goto end; + } + } + + if (exif_orientation > 1) { + exif_orientation_to_irot_imir(image, exif_orientation); + } + + self->image = image; + self->encoder = encoder; + +end: + PyBuffer_Release(&icc_buffer); + PyBuffer_Release(&exif_buffer); + PyBuffer_Release(&xmp_buffer); + + if (error) { + if (image) { + avifImageDestroy(image); + } + if (encoder) { + avifEncoderDestroy(encoder); + } + if (self) { + PyObject_Del(self); + } + return NULL; + } + + return (PyObject *)self; +} + +PyObject * +_encoder_dealloc(AvifEncoderObject *self) { + if (self->encoder) { + avifEncoderDestroy(self->encoder); + } + if (self->image) { + avifImageDestroy(self->image); + } + Py_RETURN_NONE; +} + +PyObject * +_encoder_add(AvifEncoderObject *self, PyObject *args) { + uint8_t *rgb_bytes; + Py_ssize_t size; + unsigned int duration; + unsigned int width; + unsigned int height; + char *mode; + unsigned int is_single_frame; + int error = 0; + + avifRGBImage rgb; + avifResult result; + + avifEncoder *encoder = self->encoder; + avifImage *image = self->image; + avifImage *frame = NULL; + + if (!PyArg_ParseTuple( + args, + "y#I(II)sp", + (char **)&rgb_bytes, + &size, + &duration, + &width, + &height, + &mode, + &is_single_frame + )) { + return NULL; + } + + if (image->width != width || image->height != height) { + PyErr_Format( + PyExc_ValueError, + "Image sequence dimensions mismatch, %ux%u != %ux%u", + image->width, + image->height, + width, + height + ); + return NULL; + } + + if (self->first_frame) { + // If we don't have an image populated with yuv planes, this is the first frame + frame = image; + } else { + frame = avifImageCreateEmpty(); + if (image == NULL) { + PyErr_SetString(PyExc_ValueError, "Image creation failed"); + return NULL; + } + + frame->width = width; + frame->height = height; + frame->colorPrimaries = image->colorPrimaries; + frame->transferCharacteristics = image->transferCharacteristics; + frame->matrixCoefficients = image->matrixCoefficients; + frame->yuvRange = image->yuvRange; + frame->yuvFormat = image->yuvFormat; + frame->depth = image->depth; + frame->alphaPremultiplied = image->alphaPremultiplied; + } + + avifRGBImageSetDefaults(&rgb, frame); + + if (strcmp(mode, "RGBA") == 0) { + rgb.format = AVIF_RGB_FORMAT_RGBA; + } else { + rgb.format = AVIF_RGB_FORMAT_RGB; + } + + result = avifRGBImageAllocatePixels(&rgb); + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Pixel allocation failed: %s", + avifResultToString(result) + ); + error = 1; + goto end; + } + + if (rgb.rowBytes * rgb.height != size) { + PyErr_Format( + PyExc_RuntimeError, + "rgb data has incorrect size: %u * %u (%u) != %u", + rgb.rowBytes, + rgb.height, + rgb.rowBytes * rgb.height, + size + ); + error = 1; + goto end; + } + + // rgb.pixels is safe for writes + memcpy(rgb.pixels, rgb_bytes, size); + + Py_BEGIN_ALLOW_THREADS; + result = avifImageRGBToYUV(frame, &rgb); + Py_END_ALLOW_THREADS; + + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Conversion to YUV failed: %s", + avifResultToString(result) + ); + error = 1; + goto end; + } + + uint32_t addImageFlags = + is_single_frame ? AVIF_ADD_IMAGE_FLAG_SINGLE : AVIF_ADD_IMAGE_FLAG_NONE; + + Py_BEGIN_ALLOW_THREADS; + result = avifEncoderAddImage(encoder, frame, duration, addImageFlags); + Py_END_ALLOW_THREADS; + + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Failed to encode image: %s", + avifResultToString(result) + ); + error = 1; + goto end; + } + +end: + if (&rgb) { + avifRGBImageFreePixels(&rgb); + } + if (!self->first_frame) { + avifImageDestroy(frame); + } + + if (error) { + return NULL; + } + self->first_frame = 0; + Py_RETURN_NONE; +} + +PyObject * +_encoder_finish(AvifEncoderObject *self) { + avifEncoder *encoder = self->encoder; + + avifRWData raw = AVIF_DATA_EMPTY; + avifResult result; + PyObject *ret = NULL; + + Py_BEGIN_ALLOW_THREADS; + result = avifEncoderFinish(encoder, &raw); + Py_END_ALLOW_THREADS; + + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Failed to finish encoding: %s", + avifResultToString(result) + ); + avifRWDataFree(&raw); + return NULL; + } + + ret = PyBytes_FromStringAndSize((char *)raw.data, raw.size); + + avifRWDataFree(&raw); + + return ret; +} + +// Decoder functions +PyObject * +AvifDecoderNew(PyObject *self_, PyObject *args) { + Py_buffer buffer; + AvifDecoderObject *self = NULL; + avifDecoder *decoder; + + char *codec_str; + avifCodecChoice codec; + int max_threads; + + avifResult result; + + if (!PyArg_ParseTuple(args, "y*si", &buffer, &codec_str, &max_threads)) { + return NULL; + } + + if (strcmp(codec_str, "auto") == 0) { + codec = AVIF_CODEC_CHOICE_AUTO; + } else { + codec = avifCodecChoiceFromName(codec_str); + } + + self = PyObject_New(AvifDecoderObject, &AvifDecoder_Type); + if (!self) { + PyErr_SetString(PyExc_RuntimeError, "could not create decoder object"); + PyBuffer_Release(&buffer); + return NULL; + } + + decoder = avifDecoderCreate(); + if (!decoder) { + PyErr_SetString(PyExc_MemoryError, "Can't allocate decoder"); + PyBuffer_Release(&buffer); + PyObject_Del(self); + return NULL; + } + decoder->maxThreads = max_threads; + // Turn off libavif's 'clap' (clean aperture) property validation. + decoder->strictFlags &= ~AVIF_STRICT_CLAP_VALID; + // Allow the PixelInformationProperty ('pixi') to be missing in AV1 image + // items. libheif v1.11.0 and older does not add the 'pixi' item property to + // AV1 image items. + decoder->strictFlags &= ~AVIF_STRICT_PIXI_REQUIRED; + decoder->codecChoice = codec; + + result = avifDecoderSetIOMemory(decoder, buffer.buf, buffer.len); + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Setting IO memory failed: %s", + avifResultToString(result) + ); + avifDecoderDestroy(decoder); + PyBuffer_Release(&buffer); + PyObject_Del(self); + return NULL; + } + + result = avifDecoderParse(decoder); + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Failed to decode image: %s", + avifResultToString(result) + ); + avifDecoderDestroy(decoder); + PyBuffer_Release(&buffer); + PyObject_Del(self); + return NULL; + } + + self->decoder = decoder; + self->buffer = buffer; + + return (PyObject *)self; +} + +PyObject * +_decoder_dealloc(AvifDecoderObject *self) { + if (self->decoder) { + avifDecoderDestroy(self->decoder); + } + PyBuffer_Release(&self->buffer); + Py_RETURN_NONE; +} + +PyObject * +_decoder_get_info(AvifDecoderObject *self) { + avifDecoder *decoder = self->decoder; + avifImage *image = decoder->image; + + PyObject *icc = NULL; + PyObject *exif = NULL; + PyObject *xmp = NULL; + PyObject *ret = NULL; + + if (image->xmp.size) { + xmp = PyBytes_FromStringAndSize((const char *)image->xmp.data, image->xmp.size); + } + + if (image->exif.size) { + exif = + PyBytes_FromStringAndSize((const char *)image->exif.data, image->exif.size); + } + + if (image->icc.size) { + icc = PyBytes_FromStringAndSize((const char *)image->icc.data, image->icc.size); + } + + ret = Py_BuildValue( + "(II)IsSSIS", + image->width, + image->height, + decoder->imageCount, + decoder->alphaPresent ? "RGBA" : "RGB", + NULL == icc ? Py_None : icc, + NULL == exif ? Py_None : exif, + irot_imir_to_exif_orientation(image), + NULL == xmp ? Py_None : xmp + ); + + Py_XDECREF(xmp); + Py_XDECREF(exif); + Py_XDECREF(icc); + + return ret; +} + +PyObject * +_decoder_get_frame(AvifDecoderObject *self, PyObject *args) { + PyObject *bytes; + PyObject *ret; + Py_ssize_t size; + avifResult result; + avifRGBImage rgb; + avifDecoder *decoder; + avifImage *image; + uint32_t frame_index; + + decoder = self->decoder; + + if (!PyArg_ParseTuple(args, "I", &frame_index)) { + return NULL; + } + + result = avifDecoderNthImage(decoder, frame_index); + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Failed to decode frame %u: %s", + frame_index, + avifResultToString(result) + ); + return NULL; + } + + image = decoder->image; + + avifRGBImageSetDefaults(&rgb, image); + + rgb.depth = 8; + rgb.format = decoder->alphaPresent ? AVIF_RGB_FORMAT_RGBA : AVIF_RGB_FORMAT_RGB; + + result = avifRGBImageAllocatePixels(&rgb); + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Pixel allocation failed: %s", + avifResultToString(result) + ); + return NULL; + } + + Py_BEGIN_ALLOW_THREADS; + result = avifImageYUVToRGB(image, &rgb); + Py_END_ALLOW_THREADS; + + if (result != AVIF_RESULT_OK) { + PyErr_Format( + exc_type_for_avif_result(result), + "Conversion from YUV failed: %s", + avifResultToString(result) + ); + avifRGBImageFreePixels(&rgb); + return NULL; + } + + if (rgb.height > PY_SSIZE_T_MAX / rgb.rowBytes) { + PyErr_SetString(PyExc_MemoryError, "Integer overflow in pixel size"); + return NULL; + } + + size = rgb.rowBytes * rgb.height; + + bytes = PyBytes_FromStringAndSize((char *)rgb.pixels, size); + avifRGBImageFreePixels(&rgb); + + ret = Py_BuildValue( + "SKKK", + bytes, + decoder->timescale, + decoder->imageTiming.ptsInTimescales, + decoder->imageTiming.durationInTimescales + ); + + Py_DECREF(bytes); + + return ret; +} + +/* -------------------------------------------------------------------- */ +/* Type Definitions */ +/* -------------------------------------------------------------------- */ + +// AvifEncoder methods +static struct PyMethodDef _encoder_methods[] = { + {"add", (PyCFunction)_encoder_add, METH_VARARGS}, + {"finish", (PyCFunction)_encoder_finish, METH_NOARGS}, + {NULL, NULL} /* sentinel */ +}; + +// AvifEncoder type definition +static PyTypeObject AvifEncoder_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "AvifEncoder", + .tp_basicsize = sizeof(AvifEncoderObject), + .tp_dealloc = (destructor)_encoder_dealloc, + .tp_methods = _encoder_methods, +}; + +// AvifDecoder methods +static struct PyMethodDef _decoder_methods[] = { + {"get_info", (PyCFunction)_decoder_get_info, METH_NOARGS}, + {"get_frame", (PyCFunction)_decoder_get_frame, METH_VARARGS}, + {NULL, NULL} /* sentinel */ +}; + +// AvifDecoder type definition +static PyTypeObject AvifDecoder_Type = { + PyVarObject_HEAD_INIT(NULL, 0).tp_name = "AvifDecoder", + .tp_basicsize = sizeof(AvifDecoderObject), + .tp_dealloc = (destructor)_decoder_dealloc, + .tp_methods = _decoder_methods, +}; + +/* -------------------------------------------------------------------- */ +/* Module Setup */ +/* -------------------------------------------------------------------- */ + +static PyMethodDef avifMethods[] = { + {"AvifDecoder", AvifDecoderNew, METH_VARARGS}, + {"AvifEncoder", AvifEncoderNew, METH_VARARGS}, + {"decoder_codec_available", _decoder_codec_available, METH_VARARGS}, + {"encoder_codec_available", _encoder_codec_available, METH_VARARGS}, + {"codec_versions", _codec_versions, METH_NOARGS}, + {NULL, NULL} +}; + +static int +setup_module(PyObject *m) { + if (PyType_Ready(&AvifDecoder_Type) < 0 || PyType_Ready(&AvifEncoder_Type) < 0) { + return -1; + } + + PyObject *d = PyModule_GetDict(m); + PyObject *v = PyUnicode_FromString(avifVersion()); + PyDict_SetItemString(d, "libavif_version", v ? v : Py_None); + Py_XDECREF(v); + + return 0; +} + +PyMODINIT_FUNC +PyInit__avif(void) { + PyObject *m; + + static PyModuleDef module_def = { + PyModuleDef_HEAD_INIT, + .m_name = "_avif", + .m_size = -1, + .m_methods = avifMethods, + }; + + m = PyModule_Create(&module_def); + if (setup_module(m) < 0) { + Py_DECREF(m); + return NULL; + } + +#ifdef Py_GIL_DISABLED + PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); +#endif + + return m; +} diff --git a/wheels/dependency_licenses/AOM.txt b/wheels/dependency_licenses/AOM.txt new file mode 100644 index 000000000..3a2e46c26 --- /dev/null +++ b/wheels/dependency_licenses/AOM.txt @@ -0,0 +1,26 @@ +Copyright (c) 2016, Alliance for Open Media. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/DAV1D.txt b/wheels/dependency_licenses/DAV1D.txt new file mode 100644 index 000000000..875b138ec --- /dev/null +++ b/wheels/dependency_licenses/DAV1D.txt @@ -0,0 +1,23 @@ +Copyright © 2018-2019, VideoLAN and dav1d authors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/LIBAVIF.txt b/wheels/dependency_licenses/LIBAVIF.txt new file mode 100644 index 000000000..350eb9d15 --- /dev/null +++ b/wheels/dependency_licenses/LIBAVIF.txt @@ -0,0 +1,387 @@ +Copyright 2019 Joe Drago. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ + +Files: src/obu.c + +Copyright © 2018-2019, VideoLAN and dav1d authors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ + +Files: third_party/iccjpeg/* + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + +------------------------------------------------------------------------------ + +Files: contrib/gdk-pixbuf/* + +Copyright 2020 Emmanuel Gil Peyrot. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ + +Files: android_jni/gradlew* + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +------------------------------------------------------------------------------ + +Files: third_party/libyuv/* + +Copyright 2011 The LibYuv Project Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/LIBYUV.txt b/wheels/dependency_licenses/LIBYUV.txt new file mode 100644 index 000000000..c911747a6 --- /dev/null +++ b/wheels/dependency_licenses/LIBYUV.txt @@ -0,0 +1,29 @@ +Copyright 2011 The LibYuv Project Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/RAV1E.txt b/wheels/dependency_licenses/RAV1E.txt new file mode 100644 index 000000000..3d6c825c4 --- /dev/null +++ b/wheels/dependency_licenses/RAV1E.txt @@ -0,0 +1,25 @@ +BSD 2-Clause License + +Copyright (c) 2017-2023, the rav1e contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/SVT-AV1.txt b/wheels/dependency_licenses/SVT-AV1.txt new file mode 100644 index 000000000..532a982b3 --- /dev/null +++ b/wheels/dependency_licenses/SVT-AV1.txt @@ -0,0 +1,26 @@ +Copyright (c) 2019, Alliance for Open Media. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/winbuild/build.rst b/winbuild/build.rst index aae78ce12..3c20c7d17 100644 --- a/winbuild/build.rst +++ b/winbuild/build.rst @@ -61,6 +61,7 @@ Run ``build_prepare.py`` to configure the build:: --no-imagequant skip GPL-licensed optional dependency libimagequant --no-fribidi, --no-raqm skip LGPL-licensed optional dependency FriBiDi + --no-avif skip optional dependency libavif Arguments can also be supplied using the environment variables PILLOW_BUILD, PILLOW_DEPS, ARCHITECTURE. See winbuild\build.rst for more information. diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 2e9e18719..e4901859e 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -116,6 +116,7 @@ V = { "HARFBUZZ": "11.0.0", "JPEGTURBO": "3.1.0", "LCMS2": "2.17", + "LIBAVIF": "1.2.1", "LIBIMAGEQUANT": "4.3.4", "LIBPNG": "1.6.47", "LIBWEBP": "1.5.0", @@ -378,6 +379,26 @@ DEPS: dict[str, dict[str, Any]] = { ], "bins": [r"*.dll"], }, + "libavif": { + "url": f"https://github.com/AOMediaCodec/libavif/archive/v{V['LIBAVIF']}.zip", + "filename": f"libavif-{V['LIBAVIF']}.zip", + "license": "LICENSE", + "build": [ + f"{sys.executable} -m pip install meson", + *cmds_cmake( + "avif_static", + "-DBUILD_SHARED_LIBS=OFF", + "-DAVIF_LIBSHARPYUV=LOCAL", + "-DAVIF_LIBYUV=LOCAL", + "-DAVIF_CODEC_AOM=LOCAL", + "-DAVIF_CODEC_DAV1D=LOCAL", + "-DAVIF_CODEC_RAV1E=LOCAL", + "-DAVIF_CODEC_SVT=LOCAL", + ), + cmd_xcopy("include", "{inc_dir}"), + ], + "libs": ["avif.lib"], + }, } @@ -683,6 +704,11 @@ def main() -> None: action="store_true", help="skip LGPL-licensed optional dependency FriBiDi", ) + parser.add_argument( + "--no-avif", + action="store_true", + help="skip optional dependency libavif", + ) args = parser.parse_args() arch_prefs = ARCHITECTURES[args.architecture] @@ -723,6 +749,8 @@ def main() -> None: disabled += ["libimagequant"] if args.no_fribidi: disabled += ["fribidi"] + if args.no_avif or args.architecture != "AMD64": + disabled += ["libavif"] prefs = { "architecture": args.architecture, From 81412212016a70eb160460e26dc552a0f8a8c153 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Apr 2025 08:35:19 +1100 Subject: [PATCH 025/268] Allow cmake<4 when building libtiff --- winbuild/build_prepare.py | 1 + 1 file changed, 1 insertion(+) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index e4901859e..b45148ee8 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -235,6 +235,7 @@ DEPS: dict[str, dict[str, Any]] = { "-DBUILD_SHARED_LIBS:BOOL=OFF", "-DWebP_LIBRARY=libwebp", '-DCMAKE_C_FLAGS="-nologo -DLZMA_API_STATIC"', + "-DCMAKE_POLICY_VERSION_MINIMUM=3.5", ) ], "headers": [r"libtiff\tiff*.h"], From 348bf6550d3937d14bbd04251c12bed6dfed9eec Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Apr 2025 16:33:55 +1100 Subject: [PATCH 026/268] Allow cmake<4 when building libavif --- winbuild/build_prepare.py | 1 + 1 file changed, 1 insertion(+) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index b45148ee8..e118cd994 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -395,6 +395,7 @@ DEPS: dict[str, dict[str, Any]] = { "-DAVIF_CODEC_DAV1D=LOCAL", "-DAVIF_CODEC_RAV1E=LOCAL", "-DAVIF_CODEC_SVT=LOCAL", + "-DCMAKE_POLICY_VERSION_MINIMUM=3.5", ), cmd_xcopy("include", "{inc_dir}"), ], From 5c76e7ec17813eefaa1fdd8948e0165ee644e11f Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 1 Apr 2025 07:10:45 +0100 Subject: [PATCH 027/268] Image -> Arrow support (#8330) Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .ci/install.sh | 3 + .github/workflows/macos-install.sh | 3 + .github/workflows/test-windows.yml | 4 + Tests/test_arrow.py | 164 ++++++++++++++++ Tests/test_pyarrow.py | 112 +++++++++++ docs/reference/Image.rst | 3 + docs/reference/arrow_support.rst | 88 +++++++++ docs/reference/block_allocator.rst | 3 + docs/reference/internal_design.rst | 1 + pyproject.toml | 5 + setup.py | 1 + src/PIL/Image.py | 80 ++++++++ src/_imaging.c | 115 +++++++++++ src/libImaging/Arrow.c | 299 +++++++++++++++++++++++++++++ src/libImaging/Arrow.h | 48 +++++ src/libImaging/Imaging.h | 38 ++++ src/libImaging/Storage.c | 199 ++++++++++++++++++- 17 files changed, 1165 insertions(+), 1 deletion(-) create mode 100644 Tests/test_arrow.py create mode 100644 Tests/test_pyarrow.py create mode 100644 docs/reference/arrow_support.rst create mode 100644 src/libImaging/Arrow.c create mode 100644 src/libImaging/Arrow.h diff --git a/.ci/install.sh b/.ci/install.sh index 83d5df01c..ba32eab04 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -36,6 +36,9 @@ python3 -m pip install -U pytest python3 -m pip install -U pytest-cov python3 -m pip install -U pytest-timeout python3 -m pip install pyroma +# optional test dependency, only install if there's a binary package. +# fails on beta 3.14 and PyPy +python3 -m pip install --only-binary=:all: pyarrow || true if [[ $(uname) != CYGWIN* ]]; then python3 -m pip install numpy diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index 099f4a582..94e3d5d08 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -30,6 +30,9 @@ python3 -m pip install -U pytest-cov python3 -m pip install -U pytest-timeout python3 -m pip install pyroma python3 -m pip install numpy +# optional test dependency, only install if there's a binary package. +# fails on beta 3.14 and PyPy +python3 -m pip install --only-binary=:all: pyarrow || true # libavif pushd depends && ./install_libavif.sh && popd diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 0c3f44e96..bf8ec2f2c 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -88,6 +88,10 @@ jobs: run: | python3 -m pip install PyQt6 + - name: Install PyArrow dependency + run: | + python3 -m pip install --only-binary=:all: pyarrow || true + - name: Install dependencies id: install run: | diff --git a/Tests/test_arrow.py b/Tests/test_arrow.py new file mode 100644 index 000000000..b86c77b9a --- /dev/null +++ b/Tests/test_arrow.py @@ -0,0 +1,164 @@ +from __future__ import annotations + +import pytest + +from PIL import Image + +from .helper import hopper + + +@pytest.mark.parametrize( + "mode, dest_modes", + ( + ("L", ["I", "F", "LA", "RGB", "RGBA", "RGBX", "CMYK", "YCbCr", "HSV"]), + ("I", ["L", "F"]), # Technically I;32 can work for any 4x8bit storage. + ("F", ["I", "L", "LA", "RGB", "RGBA", "RGBX", "CMYK", "YCbCr", "HSV"]), + ("LA", ["L", "F"]), + ("RGB", ["L", "F"]), + ("RGBA", ["L", "F"]), + ("RGBX", ["L", "F"]), + ("CMYK", ["L", "F"]), + ("YCbCr", ["L", "F"]), + ("HSV", ["L", "F"]), + ), +) +def test_invalid_array_type(mode: str, dest_modes: list[str]) -> None: + img = hopper(mode) + for dest_mode in dest_modes: + with pytest.raises(ValueError): + Image.fromarrow(img, dest_mode, img.size) + + +def test_invalid_array_size() -> None: + img = hopper("RGB") + + assert img.size != (10, 10) + with pytest.raises(ValueError): + Image.fromarrow(img, "RGB", (10, 10)) + + +def test_release_schema() -> None: + # these should not error out, valgrind should be clean + img = hopper("L") + schema = img.__arrow_c_schema__() + del schema + + +def test_release_array() -> None: + # these should not error out, valgrind should be clean + img = hopper("L") + array, schema = img.__arrow_c_array__() + del array + del schema + + +def test_readonly() -> None: + img = hopper("L") + reloaded = Image.fromarrow(img, img.mode, img.size) + assert reloaded.readonly == 1 + reloaded._readonly = 0 + assert reloaded.readonly == 1 + + +def test_multiblock_l_image() -> None: + block_size = Image.core.get_block_size() + + # check a 2 block image in single channel mode + size = (4096, 2 * block_size // 4096) + img = Image.new("L", size, 128) + + with pytest.raises(ValueError): + (schema, arr) = img.__arrow_c_array__() + + +def test_multiblock_rgba_image() -> None: + block_size = Image.core.get_block_size() + + # check a 2 block image in 4 channel mode + size = (4096, (block_size // 4096) // 2) + img = Image.new("RGBA", size, (128, 127, 126, 125)) + + with pytest.raises(ValueError): + (schema, arr) = img.__arrow_c_array__() + + +def test_multiblock_l_schema() -> None: + block_size = Image.core.get_block_size() + + # check a 2 block image in single channel mode + size = (4096, 2 * block_size // 4096) + img = Image.new("L", size, 128) + + with pytest.raises(ValueError): + img.__arrow_c_schema__() + + +def test_multiblock_rgba_schema() -> None: + block_size = Image.core.get_block_size() + + # check a 2 block image in 4 channel mode + size = (4096, (block_size // 4096) // 2) + img = Image.new("RGBA", size, (128, 127, 126, 125)) + + with pytest.raises(ValueError): + img.__arrow_c_schema__() + + +def test_singleblock_l_image() -> None: + Image.core.set_use_block_allocator(1) + + block_size = Image.core.get_block_size() + + # check a 2 block image in 4 channel mode + size = (4096, 2 * (block_size // 4096)) + img = Image.new("L", size, 128) + assert img.im.isblock() + + (schema, arr) = img.__arrow_c_array__() + assert schema + assert arr + + Image.core.set_use_block_allocator(0) + + +def test_singleblock_rgba_image() -> None: + Image.core.set_use_block_allocator(1) + block_size = Image.core.get_block_size() + + # check a 2 block image in 4 channel mode + size = (4096, (block_size // 4096) // 2) + img = Image.new("RGBA", size, (128, 127, 126, 125)) + assert img.im.isblock() + + (schema, arr) = img.__arrow_c_array__() + assert schema + assert arr + Image.core.set_use_block_allocator(0) + + +def test_singleblock_l_schema() -> None: + Image.core.set_use_block_allocator(1) + block_size = Image.core.get_block_size() + + # check a 2 block image in single channel mode + size = (4096, 2 * block_size // 4096) + img = Image.new("L", size, 128) + assert img.im.isblock() + + schema = img.__arrow_c_schema__() + assert schema + Image.core.set_use_block_allocator(0) + + +def test_singleblock_rgba_schema() -> None: + Image.core.set_use_block_allocator(1) + block_size = Image.core.get_block_size() + + # check a 2 block image in 4 channel mode + size = (4096, (block_size // 4096) // 2) + img = Image.new("RGBA", size, (128, 127, 126, 125)) + assert img.im.isblock() + + schema = img.__arrow_c_schema__() + assert schema + Image.core.set_use_block_allocator(0) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py new file mode 100644 index 000000000..ece9f8f26 --- /dev/null +++ b/Tests/test_pyarrow.py @@ -0,0 +1,112 @@ +from __future__ import annotations + +from typing import Any # undone + +import pytest + +from PIL import Image + +from .helper import ( + assert_deep_equal, + assert_image_equal, + hopper, +) + +pyarrow = pytest.importorskip("pyarrow", reason="PyArrow not installed") + +TEST_IMAGE_SIZE = (10, 10) + + +def _test_img_equals_pyarray( + img: Image.Image, arr: Any, mask: list[int] | None +) -> None: + assert img.height * img.width == len(arr) + px = img.load() + assert px is not None + for x in range(0, img.size[0], int(img.size[0] / 10)): + for y in range(0, img.size[1], int(img.size[1] / 10)): + if mask: + for ix, elt in enumerate(mask): + pixel = px[x, y] + assert isinstance(pixel, tuple) + assert pixel[ix] == arr[y * img.width + x].as_py()[elt] + else: + assert_deep_equal(px[x, y], arr[y * img.width + x].as_py()) + + +# really hard to get a non-nullable list type +fl_uint8_4_type = pyarrow.field( + "_", pyarrow.list_(pyarrow.field("_", pyarrow.uint8()).with_nullable(False), 4) +).type + + +@pytest.mark.parametrize( + "mode, dtype, mask", + ( + ("L", pyarrow.uint8(), None), + ("I", pyarrow.int32(), None), + ("F", pyarrow.float32(), None), + ("LA", fl_uint8_4_type, [0, 3]), + ("RGB", fl_uint8_4_type, [0, 1, 2]), + ("RGBA", fl_uint8_4_type, None), + ("RGBX", fl_uint8_4_type, None), + ("CMYK", fl_uint8_4_type, None), + ("YCbCr", fl_uint8_4_type, [0, 1, 2]), + ("HSV", fl_uint8_4_type, [0, 1, 2]), + ), +) +def test_to_array(mode: str, dtype: Any, mask: list[int] | None) -> None: + img = hopper(mode) + + # Resize to non-square + img = img.crop((3, 0, 124, 127)) + assert img.size == (121, 127) + + arr = pyarrow.array(img) + _test_img_equals_pyarray(img, arr, mask) + assert arr.type == dtype + + reloaded = Image.fromarrow(arr, mode, img.size) + + assert reloaded + + assert_image_equal(img, reloaded) + + +def test_lifetime() -> None: + # valgrind shouldn't error out here. + # arrays should be accessible after the image is deleted. + + img = hopper("L") + + arr_1 = pyarrow.array(img) + arr_2 = pyarrow.array(img) + + del img + + assert arr_1.sum().as_py() > 0 + del arr_1 + + assert arr_2.sum().as_py() > 0 + del arr_2 + + +def test_lifetime2() -> None: + # valgrind shouldn't error out here. + # img should remain after the arrays are collected. + + img = hopper("L") + + arr_1 = pyarrow.array(img) + arr_2 = pyarrow.array(img) + + assert arr_1.sum().as_py() > 0 + del arr_1 + + assert arr_2.sum().as_py() > 0 + del arr_2 + + img2 = img.copy() + px = img2.load() + assert px # make mypy happy + assert isinstance(px[0, 0], int) diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index bc3758218..a3ba8cfd8 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -79,6 +79,7 @@ Constructing images .. autofunction:: new .. autofunction:: fromarray +.. autofunction:: fromarrow .. autofunction:: frombytes .. autofunction:: frombuffer @@ -370,6 +371,8 @@ Protocols .. autoclass:: SupportsArrayInterface :show-inheritance: +.. autoclass:: SupportsArrowArrayInterface + :show-inheritance: .. autoclass:: SupportsGetData :show-inheritance: diff --git a/docs/reference/arrow_support.rst b/docs/reference/arrow_support.rst new file mode 100644 index 000000000..4a5c45e86 --- /dev/null +++ b/docs/reference/arrow_support.rst @@ -0,0 +1,88 @@ +.. _arrow-support: + +============= +Arrow Support +============= + +`Arrow `__ +is an in-memory data exchange format that is the spiritual +successor to the NumPy array interface. It provides for zero-copy +access to columnar data, which in our case is ``Image`` data. + +The goal with Arrow is to provide native zero-copy interoperability +with any Arrow provider or consumer in the Python ecosystem. + +.. warning:: Zero-copy does not mean zero allocation -- the internal + memory layout of Pillow images contains an allocation for row + pointers, so there is a non-zero, but significantly smaller than a + full-copy memory cost to reading an Arrow image. + + +Data Formats +============ + +Pillow currently supports exporting Arrow images in all modes +**except** for ``BGR;15``, ``BGR;16`` and ``BGR;24``. This is due to +line-length packing in these modes making for non-continuous memory. + +For single-band images, the exported array is width*height elements, +with each pixel corresponding to the appropriate Arrow type. + +For multiband images, the exported array is width*height fixed-length +four-element arrays of uint8. This is memory compatible with the raw +image storage of four bytes per pixel. + +Mode ``1`` images are exported as one uint8 byte/pixel, as this is +consistent with the internal storage. + +Pillow will accept, but not produce, one other format. For any +multichannel image with 32-bit storage per pixel, Pillow will accept +an array of width*height int32 elements, which will then be +interpreted using the mode-specific interpretation of the bytes. + +The image mode must match the Arrow band format when reading single +channel images. + +Memory Allocator +================ + +Pillow's default memory allocator, the :ref:`block_allocator`, +allocates up to a 16 MB block for images by default. Larger images +overflow into additional blocks. Arrow requires a single continuous +memory allocation, so images allocated in multiple blocks cannot be +exported in the Arrow format. + +To enable the single block allocator:: + + from PIL import Image + Image.core.set_use_block_allocator(1) + +Note that this is a global setting, not a per-image setting. + +Unsupported Features +==================== + +* Table/dataframe protocol. We support a single array. +* Null markers, producing or consuming. Null values are inferred from + the mode, e.g. RGB images are stored in the first three bytes of + each 32-bit pixel, and the last byte is an implied null. +* Schema negotiation. There is an optional schema for the requested + datatype in the Arrow source interface. We ignore that + parameter. +* Array metadata. + +Internal Details +================ + +Python Arrow C interface: +https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html + +The memory that is exported from the Arrow interface is shared -- not +copied, so the lifetime of the memory allocation is no longer strictly +tied to the life of the Python object. + +The core imaging struct now has a refcount associated with it, and the +lifetime of the core image struct is now divorced from the Python +image object. Creating an arrow reference to the image increments the +refcount, and the imaging struct is only released when the refcount +reaches zero. diff --git a/docs/reference/block_allocator.rst b/docs/reference/block_allocator.rst index 1abe5280f..f4d27e24e 100644 --- a/docs/reference/block_allocator.rst +++ b/docs/reference/block_allocator.rst @@ -1,3 +1,6 @@ + +.. _block_allocator: + Block Allocator =============== diff --git a/docs/reference/internal_design.rst b/docs/reference/internal_design.rst index 99a18e9ea..041177953 100644 --- a/docs/reference/internal_design.rst +++ b/docs/reference/internal_design.rst @@ -9,3 +9,4 @@ Internal Reference block_allocator internal_modules c_extension_debugging + arrow_support diff --git a/pyproject.toml b/pyproject.toml index 780a938a3..856419215 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,10 @@ optional-dependencies.fpx = [ optional-dependencies.mic = [ "olefile", ] +optional-dependencies.test-arrow = [ + "pyarrow", +] + optional-dependencies.tests = [ "check-manifest", "coverage>=7.4.2", @@ -67,6 +71,7 @@ optional-dependencies.tests = [ "pytest-timeout", "trove-classifiers>=2024.10.12", ] + optional-dependencies.typing = [ "typing-extensions; python_version<'3.10'", ] diff --git a/setup.py b/setup.py index 9d69b1d6e..5ecd6b816 100644 --- a/setup.py +++ b/setup.py @@ -65,6 +65,7 @@ _IMAGING = ("decode", "encode", "map", "display", "outline", "path") _LIB_IMAGING = ( "Access", "AlphaComposite", + "Arrow", "Resample", "Reduce", "Bands", diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 60850f4ff..233df592c 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -577,6 +577,14 @@ class Image: def mode(self) -> str: return self._mode + @property + def readonly(self) -> int: + return (self._im and self._im.readonly) or self._readonly + + @readonly.setter + def readonly(self, readonly: int) -> None: + self._readonly = readonly + def _new(self, im: core.ImagingCore) -> Image: new = Image() new.im = im @@ -728,6 +736,16 @@ class Image: new["shape"], new["typestr"] = _conv_type_shape(self) return new + def __arrow_c_schema__(self) -> object: + self.load() + return self.im.__arrow_c_schema__() + + def __arrow_c_array__( + self, requested_schema: object | None = None + ) -> tuple[object, object]: + self.load() + return (self.im.__arrow_c_schema__(), self.im.__arrow_c_array__()) + def __getstate__(self) -> list[Any]: im_data = self.tobytes() # load image first return [self.info, self.mode, self.size, self.getpalette(), im_data] @@ -3201,6 +3219,18 @@ class SupportsArrayInterface(Protocol): raise NotImplementedError() +class SupportsArrowArrayInterface(Protocol): + """ + An object that has an ``__arrow_c_array__`` method corresponding to the arrow c + data interface. + """ + + def __arrow_c_array__( + self, requested_schema: "PyCapsule" = None # type: ignore[name-defined] # noqa: F821, UP037 + ) -> tuple["PyCapsule", "PyCapsule"]: # type: ignore[name-defined] # noqa: F821, UP037 + raise NotImplementedError() + + def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: """ Creates an image memory from an object exporting the array interface @@ -3289,6 +3319,56 @@ def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) +def fromarrow(obj: SupportsArrowArrayInterface, mode, size) -> Image: + """Creates an image with zero-copy shared memory from an object exporting + the arrow_c_array interface protocol:: + + from PIL import Image + import pyarrow as pa + arr = pa.array([0]*(5*5*4), type=pa.uint8()) + im = Image.fromarrow(arr, 'RGBA', (5, 5)) + + If the data representation of the ``obj`` is not compatible with + Pillow internal storage, a ValueError is raised. + + Pillow images can also be converted to Arrow objects:: + + from PIL import Image + import pyarrow as pa + im = Image.open('hopper.jpg') + arr = pa.array(im) + + As with array support, when converting Pillow images to arrays, + only pixel values are transferred. This means that P and PA mode + images will lose their palette. + + :param obj: Object with an arrow_c_array interface + :param mode: Image mode. + :param size: Image size. This must match the storage of the arrow object. + :returns: An Image object + + Note that according to the Arrow spec, both the producer and the + consumer should consider the exported array to be immutable, as + unsynchronized updates will potentially cause inconsistent data. + + See: :ref:`arrow-support` for more detailed information + + .. versionadded:: 11.2.0 + + """ + if not hasattr(obj, "__arrow_c_array__"): + msg = "arrow_c_array interface not found" + raise ValueError(msg) + + (schema_capsule, array_capsule) = obj.__arrow_c_array__() + _im = core.new_arrow(mode, size, schema_capsule, array_capsule) + if _im: + return Image()._new(_im) + + msg = "new_arrow returned None without an exception" + raise ValueError(msg) + + def fromqimage(im: ImageQt.QImage) -> ImageFile.ImageFile: """Creates an image instance from a QImage image""" from . import ImageQt diff --git a/src/_imaging.c b/src/_imaging.c index 330a7eef4..72f122143 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -230,6 +230,93 @@ PyImaging_GetBuffer(PyObject *buffer, Py_buffer *view) { return PyObject_GetBuffer(buffer, view, PyBUF_SIMPLE); } +/* -------------------------------------------------------------------- */ +/* Arrow HANDLING */ +/* -------------------------------------------------------------------- */ + +PyObject * +ArrowError(int err) { + if (err == IMAGING_CODEC_MEMORY) { + return ImagingError_MemoryError(); + } + if (err == IMAGING_ARROW_INCOMPATIBLE_MODE) { + return ImagingError_ValueError("Incompatible Pillow mode for Arrow array"); + } + if (err == IMAGING_ARROW_MEMORY_LAYOUT) { + return ImagingError_ValueError( + "Image is in multiple array blocks, use imaging_new_block for zero copy" + ); + } + return ImagingError_ValueError("Unknown error"); +} + +void +ReleaseArrowSchemaPyCapsule(PyObject *capsule) { + struct ArrowSchema *schema = + (struct ArrowSchema *)PyCapsule_GetPointer(capsule, "arrow_schema"); + if (schema->release != NULL) { + schema->release(schema); + } + free(schema); +} + +PyObject * +ExportArrowSchemaPyCapsule(ImagingObject *self) { + struct ArrowSchema *schema = + (struct ArrowSchema *)calloc(1, sizeof(struct ArrowSchema)); + int err = export_imaging_schema(self->image, schema); + if (err == 0) { + return PyCapsule_New(schema, "arrow_schema", ReleaseArrowSchemaPyCapsule); + } + free(schema); + return ArrowError(err); +} + +void +ReleaseArrowArrayPyCapsule(PyObject *capsule) { + struct ArrowArray *array = + (struct ArrowArray *)PyCapsule_GetPointer(capsule, "arrow_array"); + if (array->release != NULL) { + array->release(array); + } + free(array); +} + +PyObject * +ExportArrowArrayPyCapsule(ImagingObject *self) { + struct ArrowArray *array = + (struct ArrowArray *)calloc(1, sizeof(struct ArrowArray)); + int err = export_imaging_array(self->image, array); + if (err == 0) { + return PyCapsule_New(array, "arrow_array", ReleaseArrowArrayPyCapsule); + } + free(array); + return ArrowError(err); +} + +static PyObject * +_new_arrow(PyObject *self, PyObject *args) { + char *mode; + int xsize, ysize; + PyObject *schema_capsule, *array_capsule; + PyObject *ret; + + if (!PyArg_ParseTuple( + args, "s(ii)OO", &mode, &xsize, &ysize, &schema_capsule, &array_capsule + )) { + return NULL; + } + + // ImagingBorrowArrow is responsible for retaining the array_capsule + ret = + PyImagingNew(ImagingNewArrow(mode, xsize, ysize, schema_capsule, array_capsule) + ); + if (!ret) { + return ImagingError_ValueError("Invalid Arrow array mode or size mismatch"); + } + return ret; +} + /* -------------------------------------------------------------------- */ /* EXCEPTION REROUTING */ /* -------------------------------------------------------------------- */ @@ -3655,6 +3742,10 @@ static struct PyMethodDef methods[] = { /* Misc. */ {"save_ppm", (PyCFunction)_save_ppm, METH_VARARGS}, + /* arrow */ + {"__arrow_c_schema__", (PyCFunction)ExportArrowSchemaPyCapsule, METH_VARARGS}, + {"__arrow_c_array__", (PyCFunction)ExportArrowArrayPyCapsule, METH_VARARGS}, + {NULL, NULL} /* sentinel */ }; @@ -3722,6 +3813,11 @@ _getattr_unsafe_ptrs(ImagingObject *self, void *closure) { ); } +static PyObject * +_getattr_readonly(ImagingObject *self, void *closure) { + return PyLong_FromLong(self->image->read_only); +} + static struct PyGetSetDef getsetters[] = { {"mode", (getter)_getattr_mode}, {"size", (getter)_getattr_size}, @@ -3729,6 +3825,7 @@ static struct PyGetSetDef getsetters[] = { {"id", (getter)_getattr_id}, {"ptr", (getter)_getattr_ptr}, {"unsafe_ptrs", (getter)_getattr_unsafe_ptrs}, + {"readonly", (getter)_getattr_readonly}, {NULL} }; @@ -3983,6 +4080,21 @@ _set_blocks_max(PyObject *self, PyObject *args) { Py_RETURN_NONE; } +static PyObject * +_set_use_block_allocator(PyObject *self, PyObject *args) { + int use_block_allocator; + if (!PyArg_ParseTuple(args, "i:set_use_block_allocator", &use_block_allocator)) { + return NULL; + } + ImagingMemorySetBlockAllocator(&ImagingDefaultArena, use_block_allocator); + Py_RETURN_NONE; +} + +static PyObject * +_get_use_block_allocator(PyObject *self, PyObject *args) { + return PyLong_FromLong(ImagingDefaultArena.use_block_allocator); +} + static PyObject * _clear_cache(PyObject *self, PyObject *args) { int i = 0; @@ -4104,6 +4216,7 @@ static PyMethodDef functions[] = { {"fill", (PyCFunction)_fill, METH_VARARGS}, {"new", (PyCFunction)_new, METH_VARARGS}, {"new_block", (PyCFunction)_new_block, METH_VARARGS}, + {"new_arrow", (PyCFunction)_new_arrow, METH_VARARGS}, {"merge", (PyCFunction)_merge, METH_VARARGS}, /* Functions */ @@ -4190,9 +4303,11 @@ static PyMethodDef functions[] = { {"get_alignment", (PyCFunction)_get_alignment, METH_VARARGS}, {"get_block_size", (PyCFunction)_get_block_size, METH_VARARGS}, {"get_blocks_max", (PyCFunction)_get_blocks_max, METH_VARARGS}, + {"get_use_block_allocator", (PyCFunction)_get_use_block_allocator, METH_VARARGS}, {"set_alignment", (PyCFunction)_set_alignment, METH_VARARGS}, {"set_block_size", (PyCFunction)_set_block_size, METH_VARARGS}, {"set_blocks_max", (PyCFunction)_set_blocks_max, METH_VARARGS}, + {"set_use_block_allocator", (PyCFunction)_set_use_block_allocator, METH_VARARGS}, {"clear_cache", (PyCFunction)_clear_cache, METH_VARARGS}, {NULL, NULL} /* sentinel */ diff --git a/src/libImaging/Arrow.c b/src/libImaging/Arrow.c new file mode 100644 index 000000000..33ff2ce77 --- /dev/null +++ b/src/libImaging/Arrow.c @@ -0,0 +1,299 @@ + +#include "Arrow.h" +#include "Imaging.h" +#include + +/* struct ArrowSchema* */ +/* _arrow_schema_channel(char* channel, char* format) { */ + +/* } */ + +static void +ReleaseExportedSchema(struct ArrowSchema *array) { + // This should not be called on already released array + // assert(array->release != NULL); + + if (!array->release) { + return; + } + if (array->format) { + free((void *)array->format); + array->format = NULL; + } + if (array->name) { + free((void *)array->name); + array->name = NULL; + } + if (array->metadata) { + free((void *)array->metadata); + array->metadata = NULL; + } + + // Release children + for (int64_t i = 0; i < array->n_children; ++i) { + struct ArrowSchema *child = array->children[i]; + if (child->release != NULL) { + child->release(child); + child->release = NULL; + } + // UNDONE -- should I be releasing the children? + } + + // Release dictionary + struct ArrowSchema *dict = array->dictionary; + if (dict != NULL && dict->release != NULL) { + dict->release(dict); + dict->release = NULL; + } + + // TODO here: release and/or deallocate all data directly owned by + // the ArrowArray struct, such as the private_data. + + // Mark array released + array->release = NULL; +} + +int +export_named_type(struct ArrowSchema *schema, char *format, char *name) { + char *formatp; + char *namep; + size_t format_len = strlen(format) + 1; + size_t name_len = strlen(name) + 1; + + formatp = calloc(format_len, 1); + + if (!formatp) { + return IMAGING_CODEC_MEMORY; + } + + namep = calloc(name_len, 1); + if (!namep) { + free(formatp); + return IMAGING_CODEC_MEMORY; + } + + strncpy(formatp, format, format_len); + strncpy(namep, name, name_len); + + *schema = (struct ArrowSchema){// Type description + .format = formatp, + .name = namep, + .metadata = NULL, + .flags = 0, + .n_children = 0, + .children = NULL, + .dictionary = NULL, + // Bookkeeping + .release = &ReleaseExportedSchema + }; + return 0; +} + +int +export_imaging_schema(Imaging im, struct ArrowSchema *schema) { + int retval = 0; + + if (strcmp(im->arrow_band_format, "") == 0) { + return IMAGING_ARROW_INCOMPATIBLE_MODE; + } + + /* for now, single block images */ + if (!(im->blocks_count == 0 || im->blocks_count == 1)) { + return IMAGING_ARROW_MEMORY_LAYOUT; + } + + if (im->bands == 1) { + return export_named_type(schema, im->arrow_band_format, im->band_names[0]); + } + + retval = export_named_type(schema, "+w:4", ""); + if (retval != 0) { + return retval; + } + // if it's not 1 band, it's an int32 at the moment. 4 uint8 bands. + schema->n_children = 1; + schema->children = calloc(1, sizeof(struct ArrowSchema *)); + schema->children[0] = (struct ArrowSchema *)calloc(1, sizeof(struct ArrowSchema)); + retval = export_named_type(schema->children[0], im->arrow_band_format, "pixel"); + if (retval != 0) { + free(schema->children[0]); + schema->release(schema); + return retval; + } + return 0; +} + +static void +release_const_array(struct ArrowArray *array) { + Imaging im = (Imaging)array->private_data; + + if (array->n_children == 0) { + ImagingDelete(im); + } + + // Free the buffers and the buffers array + if (array->buffers) { + free(array->buffers); + array->buffers = NULL; + } + if (array->children) { + // undone -- does arrow release all the children recursively? + for (int i = 0; i < array->n_children; i++) { + if (array->children[i]->release) { + array->children[i]->release(array->children[i]); + array->children[i]->release = NULL; + free(array->children[i]); + } + } + free(array->children); + array->children = NULL; + } + // Mark released + array->release = NULL; +} + +int +export_single_channel_array(Imaging im, struct ArrowArray *array) { + int length = im->xsize * im->ysize; + + /* for now, single block images */ + if (!(im->blocks_count == 0 || im->blocks_count == 1)) { + return IMAGING_ARROW_MEMORY_LAYOUT; + } + + if (im->lines_per_block && im->lines_per_block < im->ysize) { + length = im->xsize * im->lines_per_block; + } + + MUTEX_LOCK(&im->mutex); + im->refcount++; + MUTEX_UNLOCK(&im->mutex); + // Initialize primitive fields + *array = (struct ArrowArray){// Data description + .length = length, + .offset = 0, + .null_count = 0, + .n_buffers = 2, + .n_children = 0, + .children = NULL, + .dictionary = NULL, + // Bookkeeping + .release = &release_const_array, + .private_data = im + }; + + // Allocate list of buffers + array->buffers = (const void **)malloc(sizeof(void *) * array->n_buffers); + // assert(array->buffers != NULL); + array->buffers[0] = NULL; // no nulls, null bitmap can be omitted + + if (im->block) { + array->buffers[1] = im->block; + } else { + array->buffers[1] = im->blocks[0].ptr; + } + return 0; +} + +int +export_fixed_pixel_array(Imaging im, struct ArrowArray *array) { + int length = im->xsize * im->ysize; + + /* for now, single block images */ + if (!(im->blocks_count == 0 || im->blocks_count == 1)) { + return IMAGING_ARROW_MEMORY_LAYOUT; + } + + if (im->lines_per_block && im->lines_per_block < im->ysize) { + length = im->xsize * im->lines_per_block; + } + + MUTEX_LOCK(&im->mutex); + im->refcount++; + MUTEX_UNLOCK(&im->mutex); + // Initialize primitive fields + // Fixed length arrays are 1 buffer of validity, and the length in pixels. + // Data is in a child array. + *array = (struct ArrowArray){// Data description + .length = length, + .offset = 0, + .null_count = 0, + .n_buffers = 1, + .n_children = 1, + .children = NULL, + .dictionary = NULL, + // Bookkeeping + .release = &release_const_array, + .private_data = im + }; + + // Allocate list of buffers + array->buffers = (const void **)calloc(1, sizeof(void *) * array->n_buffers); + if (!array->buffers) { + goto err; + } + // assert(array->buffers != NULL); + array->buffers[0] = NULL; // no nulls, null bitmap can be omitted + + // if it's not 1 band, it's an int32 at the moment. 4 uint8 bands. + array->n_children = 1; + array->children = calloc(1, sizeof(struct ArrowArray *)); + if (!array->children) { + goto err; + } + array->children[0] = (struct ArrowArray *)calloc(1, sizeof(struct ArrowArray)); + if (!array->children[0]) { + goto err; + } + + MUTEX_LOCK(&im->mutex); + im->refcount++; + MUTEX_UNLOCK(&im->mutex); + *array->children[0] = (struct ArrowArray){// Data description + .length = length * 4, + .offset = 0, + .null_count = 0, + .n_buffers = 2, + .n_children = 0, + .children = NULL, + .dictionary = NULL, + // Bookkeeping + .release = &release_const_array, + .private_data = im + }; + + array->children[0]->buffers = + (const void **)calloc(2, sizeof(void *) * array->n_buffers); + + if (im->block) { + array->children[0]->buffers[1] = im->block; + } else { + array->children[0]->buffers[1] = im->blocks[0].ptr; + } + return 0; + +err: + if (array->children[0]) { + free(array->children[0]); + } + if (array->children) { + free(array->children); + } + if (array->buffers) { + free(array->buffers); + } + return IMAGING_CODEC_MEMORY; +} + +int +export_imaging_array(Imaging im, struct ArrowArray *array) { + if (strcmp(im->arrow_band_format, "") == 0) { + return IMAGING_ARROW_INCOMPATIBLE_MODE; + } + + if (im->bands == 1) { + return export_single_channel_array(im, array); + } + + return export_fixed_pixel_array(im, array); +} diff --git a/src/libImaging/Arrow.h b/src/libImaging/Arrow.h new file mode 100644 index 000000000..0b285fe80 --- /dev/null +++ b/src/libImaging/Arrow.h @@ -0,0 +1,48 @@ +#include +#include + +// Apache License 2.0. +// Source apache arrow project +// https://arrow.apache.org/docs/format/CDataInterface.html + +#ifndef ARROW_C_DATA_INTERFACE +#define ARROW_C_DATA_INTERFACE + +#define ARROW_FLAG_DICTIONARY_ORDERED 1 +#define ARROW_FLAG_NULLABLE 2 +#define ARROW_FLAG_MAP_KEYS_SORTED 4 + +struct ArrowSchema { + // Array type description + const char *format; + const char *name; + const char *metadata; + int64_t flags; + int64_t n_children; + struct ArrowSchema **children; + struct ArrowSchema *dictionary; + + // Release callback + void (*release)(struct ArrowSchema *); + // Opaque producer-specific data + void *private_data; +}; + +struct ArrowArray { + // Array data description + int64_t length; + int64_t null_count; + int64_t offset; + int64_t n_buffers; + int64_t n_children; + const void **buffers; + struct ArrowArray **children; + struct ArrowArray *dictionary; + + // Release callback + void (*release)(struct ArrowArray *); + // Opaque producer-specific data + void *private_data; +}; + +#endif // ARROW_C_DATA_INTERFACE diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index 0fc191d15..234f9943c 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -20,6 +20,8 @@ extern "C" { #define M_PI 3.1415926535897932384626433832795 #endif +#include "Arrow.h" + /* -------------------------------------------------------------------- */ /* @@ -104,6 +106,21 @@ struct ImagingMemoryInstance { /* Virtual methods */ void (*destroy)(Imaging im); + + /* arrow */ + int refcount; /* Number of arrow arrays that have been allocated */ + char band_names[4][3]; /* names of bands, max 2 char + null terminator */ + char arrow_band_format[2]; /* single character + null terminator */ + + int read_only; /* flag for read-only. set for arrow borrowed arrays */ + PyObject *arrow_array_capsule; /* upstream arrow array source */ + + int blocks_count; /* Number of blocks that have been allocated */ + int lines_per_block; /* Number of lines in a block have been allocated */ + +#ifdef Py_GIL_DISABLED + PyMutex mutex; +#endif }; #define IMAGING_PIXEL_1(im, x, y) ((im)->image8[(y)][(x)]) @@ -161,6 +178,7 @@ typedef struct ImagingMemoryArena { int stats_reallocated_blocks; /* Number of blocks which were actually reallocated after retrieving */ int stats_freed_blocks; /* Number of freed blocks */ + int use_block_allocator; /* don't use arena, use block allocator */ #ifdef Py_GIL_DISABLED PyMutex mutex; #endif @@ -174,6 +192,8 @@ extern int ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max); extern void ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size); +extern void +ImagingMemorySetBlockAllocator(ImagingMemoryArena arena, int use_block_allocator); extern Imaging ImagingNew(const char *mode, int xsize, int ysize); @@ -187,6 +207,15 @@ ImagingDelete(Imaging im); extern Imaging ImagingNewBlock(const char *mode, int xsize, int ysize); +extern Imaging +ImagingNewArrow( + const char *mode, + int xsize, + int ysize, + PyObject *schema_capsule, + PyObject *array_capsule +); + extern Imaging ImagingNewPrologue(const char *mode, int xsize, int ysize); extern Imaging @@ -700,6 +729,13 @@ _imaging_seek_pyFd(PyObject *fd, Py_ssize_t offset, int whence); extern Py_ssize_t _imaging_tell_pyFd(PyObject *fd); +/* Arrow */ + +extern int +export_imaging_array(Imaging im, struct ArrowArray *array); +extern int +export_imaging_schema(Imaging im, struct ArrowSchema *schema); + /* Errcodes */ #define IMAGING_CODEC_END 1 #define IMAGING_CODEC_OVERRUN -1 @@ -707,6 +743,8 @@ _imaging_tell_pyFd(PyObject *fd); #define IMAGING_CODEC_UNKNOWN -3 #define IMAGING_CODEC_CONFIG -8 #define IMAGING_CODEC_MEMORY -9 +#define IMAGING_ARROW_INCOMPATIBLE_MODE -10 +#define IMAGING_ARROW_MEMORY_LAYOUT -11 #include "ImagingUtils.h" extern UINT8 *clip8_lookups; diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 522e9f375..4fa4ecd1c 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -58,19 +58,22 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { /* Setup image descriptor */ im->xsize = xsize; im->ysize = ysize; - + im->refcount = 1; im->type = IMAGING_TYPE_UINT8; + strcpy(im->arrow_band_format, "C"); if (strcmp(mode, "1") == 0) { /* 1-bit images */ im->bands = im->pixelsize = 1; im->linesize = xsize; + strcpy(im->band_names[0], "1"); } else if (strcmp(mode, "P") == 0) { /* 8-bit palette mapped images */ im->bands = im->pixelsize = 1; im->linesize = xsize; im->palette = ImagingPaletteNew("RGB"); + strcpy(im->band_names[0], "P"); } else if (strcmp(mode, "PA") == 0) { /* 8-bit palette with alpha */ @@ -78,23 +81,36 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->pixelsize = 4; /* store in image32 memory */ im->linesize = xsize * 4; im->palette = ImagingPaletteNew("RGB"); + strcpy(im->band_names[0], "P"); + strcpy(im->band_names[1], "X"); + strcpy(im->band_names[2], "X"); + strcpy(im->band_names[3], "A"); } else if (strcmp(mode, "L") == 0) { /* 8-bit grayscale (luminance) images */ im->bands = im->pixelsize = 1; im->linesize = xsize; + strcpy(im->band_names[0], "L"); } else if (strcmp(mode, "LA") == 0) { /* 8-bit grayscale (luminance) with alpha */ im->bands = 2; im->pixelsize = 4; /* store in image32 memory */ im->linesize = xsize * 4; + strcpy(im->band_names[0], "L"); + strcpy(im->band_names[1], "X"); + strcpy(im->band_names[2], "X"); + strcpy(im->band_names[3], "A"); } else if (strcmp(mode, "La") == 0) { /* 8-bit grayscale (luminance) with premultiplied alpha */ im->bands = 2; im->pixelsize = 4; /* store in image32 memory */ im->linesize = xsize * 4; + strcpy(im->band_names[0], "L"); + strcpy(im->band_names[1], "X"); + strcpy(im->band_names[2], "X"); + strcpy(im->band_names[3], "a"); } else if (strcmp(mode, "F") == 0) { /* 32-bit floating point images */ @@ -102,6 +118,8 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->pixelsize = 4; im->linesize = xsize * 4; im->type = IMAGING_TYPE_FLOAT32; + strcpy(im->arrow_band_format, "f"); + strcpy(im->band_names[0], "F"); } else if (strcmp(mode, "I") == 0) { /* 32-bit integer images */ @@ -109,6 +127,8 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->pixelsize = 4; im->linesize = xsize * 4; im->type = IMAGING_TYPE_INT32; + strcpy(im->arrow_band_format, "i"); + strcpy(im->band_names[0], "I"); } else if (strcmp(mode, "I;16") == 0 || strcmp(mode, "I;16L") == 0 || strcmp(mode, "I;16B") == 0 || strcmp(mode, "I;16N") == 0) { @@ -118,12 +138,18 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->pixelsize = 2; im->linesize = xsize * 2; im->type = IMAGING_TYPE_SPECIAL; + strcpy(im->arrow_band_format, "s"); + strcpy(im->band_names[0], "I"); } else if (strcmp(mode, "RGB") == 0) { /* 24-bit true colour images */ im->bands = 3; im->pixelsize = 4; im->linesize = xsize * 4; + strcpy(im->band_names[0], "R"); + strcpy(im->band_names[1], "G"); + strcpy(im->band_names[2], "B"); + strcpy(im->band_names[3], "X"); } else if (strcmp(mode, "BGR;15") == 0) { /* EXPERIMENTAL */ @@ -132,6 +158,8 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->pixelsize = 2; im->linesize = (xsize * 2 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; + /* not allowing arrow due to line length packing */ + strcpy(im->arrow_band_format, ""); } else if (strcmp(mode, "BGR;16") == 0) { /* EXPERIMENTAL */ @@ -140,6 +168,8 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->pixelsize = 2; im->linesize = (xsize * 2 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; + /* not allowing arrow due to line length packing */ + strcpy(im->arrow_band_format, ""); } else if (strcmp(mode, "BGR;24") == 0) { /* EXPERIMENTAL */ @@ -148,32 +178,54 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->pixelsize = 3; im->linesize = (xsize * 3 + 3) & -4; im->type = IMAGING_TYPE_SPECIAL; + /* not allowing arrow due to line length packing */ + strcpy(im->arrow_band_format, ""); } else if (strcmp(mode, "RGBX") == 0) { /* 32-bit true colour images with padding */ im->bands = im->pixelsize = 4; im->linesize = xsize * 4; + strcpy(im->band_names[0], "R"); + strcpy(im->band_names[1], "G"); + strcpy(im->band_names[2], "B"); + strcpy(im->band_names[3], "X"); } else if (strcmp(mode, "RGBA") == 0) { /* 32-bit true colour images with alpha */ im->bands = im->pixelsize = 4; im->linesize = xsize * 4; + strcpy(im->band_names[0], "R"); + strcpy(im->band_names[1], "G"); + strcpy(im->band_names[2], "B"); + strcpy(im->band_names[3], "A"); } else if (strcmp(mode, "RGBa") == 0) { /* 32-bit true colour images with premultiplied alpha */ im->bands = im->pixelsize = 4; im->linesize = xsize * 4; + strcpy(im->band_names[0], "R"); + strcpy(im->band_names[1], "G"); + strcpy(im->band_names[2], "B"); + strcpy(im->band_names[3], "a"); } else if (strcmp(mode, "CMYK") == 0) { /* 32-bit colour separation */ im->bands = im->pixelsize = 4; im->linesize = xsize * 4; + strcpy(im->band_names[0], "C"); + strcpy(im->band_names[1], "M"); + strcpy(im->band_names[2], "Y"); + strcpy(im->band_names[3], "K"); } else if (strcmp(mode, "YCbCr") == 0) { /* 24-bit video format */ im->bands = 3; im->pixelsize = 4; im->linesize = xsize * 4; + strcpy(im->band_names[0], "Y"); + strcpy(im->band_names[1], "Cb"); + strcpy(im->band_names[2], "Cr"); + strcpy(im->band_names[3], "X"); } else if (strcmp(mode, "LAB") == 0) { /* 24-bit color, luminance, + 2 color channels */ @@ -181,6 +233,10 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->bands = 3; im->pixelsize = 4; im->linesize = xsize * 4; + strcpy(im->band_names[0], "L"); + strcpy(im->band_names[1], "a"); + strcpy(im->band_names[2], "b"); + strcpy(im->band_names[3], "X"); } else if (strcmp(mode, "HSV") == 0) { /* 24-bit color, luminance, + 2 color channels */ @@ -188,6 +244,10 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { im->bands = 3; im->pixelsize = 4; im->linesize = xsize * 4; + strcpy(im->band_names[0], "H"); + strcpy(im->band_names[1], "S"); + strcpy(im->band_names[2], "V"); + strcpy(im->band_names[3], "X"); } else { free(im); @@ -218,6 +278,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { break; } + // UNDONE -- not accurate for arrow MUTEX_LOCK(&ImagingDefaultArena.mutex); ImagingDefaultArena.stats_new_count += 1; MUTEX_UNLOCK(&ImagingDefaultArena.mutex); @@ -238,8 +299,18 @@ ImagingDelete(Imaging im) { return; } + MUTEX_LOCK(&im->mutex); + im->refcount--; + + if (im->refcount > 0) { + MUTEX_UNLOCK(&im->mutex); + return; + } + MUTEX_UNLOCK(&im->mutex); + if (im->palette) { ImagingPaletteDelete(im->palette); + im->palette = NULL; } if (im->destroy) { @@ -270,6 +341,7 @@ struct ImagingMemoryArena ImagingDefaultArena = { 0, 0, 0, // Stats + 0, // use_block_allocator #ifdef Py_GIL_DISABLED {0}, #endif @@ -302,6 +374,11 @@ ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max) { return 1; } +void +ImagingMemorySetBlockAllocator(ImagingMemoryArena arena, int use_block_allocator) { + arena->use_block_allocator = use_block_allocator; +} + void ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size) { while (arena->blocks_cached > new_size) { @@ -396,11 +473,13 @@ ImagingAllocateArray(Imaging im, ImagingMemoryArena arena, int dirty, int block_ if (lines_per_block == 0) { lines_per_block = 1; } + im->lines_per_block = lines_per_block; blocks_count = (im->ysize + lines_per_block - 1) / lines_per_block; // printf("NEW size: %dx%d, ls: %d, lpb: %d, blocks: %d\n", // im->xsize, im->ysize, aligned_linesize, lines_per_block, blocks_count); /* One extra pointer is always NULL */ + im->blocks_count = blocks_count; im->blocks = calloc(sizeof(*im->blocks), blocks_count + 1); if (!im->blocks) { return (Imaging)ImagingError_MemoryError(); @@ -487,6 +566,58 @@ ImagingAllocateBlock(Imaging im) { return im; } +/* Borrowed Arrow Storage Type */ +/* --------------------------- */ +/* Don't allocate the image. */ + +static void +ImagingDestroyArrow(Imaging im) { + // Rely on the internal Python destructor for the array capsule. + if (im->arrow_array_capsule) { + Py_DECREF(im->arrow_array_capsule); + im->arrow_array_capsule = NULL; + } +} + +Imaging +ImagingBorrowArrow( + Imaging im, + struct ArrowArray *external_array, + int offset_width, + PyObject *arrow_capsule +) { + // offset_width is the number of char* for a single offset from arrow + Py_ssize_t y, i; + + char *borrowed_buffer = NULL; + struct ArrowArray *arr = external_array; + + if (arr->n_children == 1) { + arr = arr->children[0]; + } + if (arr->n_buffers == 2) { + // buffer 0 is the null list + // buffer 1 is the data + borrowed_buffer = (char *)arr->buffers[1] + (offset_width * arr->offset); + } + + if (!borrowed_buffer) { + return (Imaging + )ImagingError_ValueError("Arrow Array, exactly 2 buffers required"); + } + + for (y = i = 0; y < im->ysize; y++) { + im->image[y] = borrowed_buffer + i; + i += im->linesize; + } + im->read_only = 1; + Py_INCREF(arrow_capsule); + im->arrow_array_capsule = arrow_capsule; + im->destroy = ImagingDestroyArrow; + + return im; +} + /* -------------------------------------------------------------------- * Create a new, internally allocated, image. */ @@ -529,11 +660,17 @@ ImagingNewInternal(const char *mode, int xsize, int ysize, int dirty) { Imaging ImagingNew(const char *mode, int xsize, int ysize) { + if (ImagingDefaultArena.use_block_allocator) { + return ImagingNewBlock(mode, xsize, ysize); + } return ImagingNewInternal(mode, xsize, ysize, 0); } Imaging ImagingNewDirty(const char *mode, int xsize, int ysize) { + if (ImagingDefaultArena.use_block_allocator) { + return ImagingNewBlock(mode, xsize, ysize); + } return ImagingNewInternal(mode, xsize, ysize, 1); } @@ -558,6 +695,66 @@ ImagingNewBlock(const char *mode, int xsize, int ysize) { return NULL; } +Imaging +ImagingNewArrow( + const char *mode, + int xsize, + int ysize, + PyObject *schema_capsule, + PyObject *array_capsule +) { + /* A borrowed arrow array */ + Imaging im; + struct ArrowSchema *schema = + (struct ArrowSchema *)PyCapsule_GetPointer(schema_capsule, "arrow_schema"); + + struct ArrowArray *external_array = + (struct ArrowArray *)PyCapsule_GetPointer(array_capsule, "arrow_array"); + + if (xsize < 0 || ysize < 0) { + return (Imaging)ImagingError_ValueError("bad image size"); + } + + im = ImagingNewPrologue(mode, xsize, ysize); + if (!im) { + return NULL; + } + + int64_t pixels = (int64_t)xsize * (int64_t)ysize; + + // fmt:off // don't reformat this + if (((strcmp(schema->format, "I") == 0 // int32 + && im->pixelsize == 4 // 4xchar* storage + && im->bands >= 2) // INT32 into any INT32 Storage mode + || // (()||()) && + (strcmp(schema->format, im->arrow_band_format) == 0 // same mode + && im->bands == 1)) // Single band match + && pixels == external_array->length) { + // one arrow element per, and it matches a pixelsize*char + if (ImagingBorrowArrow(im, external_array, im->pixelsize, array_capsule)) { + return im; + } + } + if (strcmp(schema->format, "+w:4") == 0 // 4 up array + && im->pixelsize == 4 // storage as 32 bpc + && schema->n_children > 0 // make sure schema is well formed. + && schema->children // make sure schema is well formed + && strcmp(schema->children[0]->format, "C") == 0 // Expected format + && strcmp(im->arrow_band_format, "C") == 0 // Expected Format + && pixels == external_array->length // expected length + && external_array->n_children == 1 // array is well formed + && external_array->children // array is well formed + && 4 * pixels == external_array->children[0]->length) { + // 4 up element of char into pixelsize == 4 + if (ImagingBorrowArrow(im, external_array, 1, array_capsule)) { + return im; + } + } + // fmt: on + ImagingDelete(im); + return NULL; +} + Imaging ImagingNew2Dirty(const char *mode, Imaging imOut, Imaging imIn) { /* allocate or validate output image */ From a7537b1b06490ef3dfbf0bf1c48a0b8c9aa36940 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 30 Mar 2025 07:31:17 +1100 Subject: [PATCH 028/268] Only change readonly if saved filename matches opened filename --- Tests/test_image.py | 9 +++++++++ src/PIL/Image.py | 7 ++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index c2e850c36..7e6118d52 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -258,6 +258,15 @@ class TestImage: assert im.readonly im.save(temp_file) + def test_save_without_changing_readonly(self, tmp_path: Path) -> None: + temp_file = tmp_path / "temp.bmp" + + with Image.open("Tests/images/rgb32bf-rgba.bmp") as im: + assert im.readonly + + im.save(temp_file) + assert im.readonly + def test_dump(self, tmp_path: Path) -> None: im = Image.new("L", (10, 10)) im._dump(str(tmp_path / "temp_L.ppm")) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 233df592c..c62d7a8a3 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2540,8 +2540,13 @@ class Image: msg = f"unknown file extension: {ext}" raise ValueError(msg) from e + from . import ImageFile + # may mutate self! - self._ensure_mutable() + if isinstance(self, ImageFile.ImageFile) and filename == self.filename: + self._ensure_mutable() + else: + self.load() save_all = params.pop("save_all", None) self.encoderinfo = {**getattr(self, "encoderinfo", {}), **params} From f205a45f44b237374533d5f41db65d75da474a45 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Apr 2025 19:10:11 +1100 Subject: [PATCH 029/268] Added release notes for #8330 --- docs/releasenotes/11.2.0.rst | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/releasenotes/11.2.0.rst b/docs/releasenotes/11.2.0.rst index 2c1c761e5..de3db3c84 100644 --- a/docs/releasenotes/11.2.0.rst +++ b/docs/releasenotes/11.2.0.rst @@ -81,6 +81,28 @@ DXT5, BC2, BC3 and BC5 are supported:: Other Changes ============= +Arrow support +^^^^^^^^^^^^^ + +`Arrow `__ is an in-memory data exchange format that is the +spiritual successor to the NumPy array interface. It provides for zero-copy access to +columnar data, which in our case is ``Image`` data. + +To create an image with zero-copy shared memory from an object exporting the +arrow_c_array interface protocol:: + + from PIL import Image + import pyarrow as pa + arr = pa.array([0]*(5*5*4), type=pa.uint8()) + im = Image.fromarrow(arr, 'RGBA', (5, 5)) + +Pillow images can also be converted to Arrow objects:: + + from PIL import Image + import pyarrow as pa + im = Image.open('hopper.jpg') + arr = pa.array(im) + Reading and writing AVIF images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 867c4772c22455207d6f1982bfbe130b423b53a5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Apr 2025 20:19:40 +1100 Subject: [PATCH 030/268] Do not import type checking --- Tests/test_image_array.py | 3 ++- Tests/test_numpy.py | 2 +- Tests/test_qt_image_qapplication.py | 3 ++- docs/dater.py | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Tests/test_image_array.py b/Tests/test_image_array.py index eb2309e0f..25cb99c43 100644 --- a/Tests/test_image_array.py +++ b/Tests/test_image_array.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import Any import pytest from packaging.version import parse as parse_version @@ -13,6 +13,7 @@ numpy = pytest.importorskip("numpy", reason="NumPy not installed") im = hopper().resize((128, 100)) +TYPE_CHECKING = False if TYPE_CHECKING: import numpy.typing as npt diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index c4ad19d23..ef54deeeb 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -1,7 +1,6 @@ from __future__ import annotations import warnings -from typing import TYPE_CHECKING import pytest @@ -9,6 +8,7 @@ from PIL import Image, _typing from .helper import assert_deep_equal, assert_image, hopper, skip_unless_feature +TYPE_CHECKING = False if TYPE_CHECKING: import numpy import numpy.typing as npt diff --git a/Tests/test_qt_image_qapplication.py b/Tests/test_qt_image_qapplication.py index 0ed9fbfa5..82a3e0741 100644 --- a/Tests/test_qt_image_qapplication.py +++ b/Tests/test_qt_image_qapplication.py @@ -1,7 +1,7 @@ from __future__ import annotations from pathlib import Path -from typing import TYPE_CHECKING, Union +from typing import Union import pytest @@ -9,6 +9,7 @@ from PIL import Image, ImageQt from .helper import assert_image_equal_tofile, assert_image_similar, hopper +TYPE_CHECKING = False if TYPE_CHECKING: import PyQt6 import PySide6 diff --git a/docs/dater.py b/docs/dater.py index f9fb0c1da..c0302b55c 100644 --- a/docs/dater.py +++ b/docs/dater.py @@ -8,8 +8,8 @@ from __future__ import annotations import re import subprocess -from typing import TYPE_CHECKING +TYPE_CHECKING = False if TYPE_CHECKING: from sphinx.application import Sphinx From 1103e82d17311dac9ec2f32cb7e738fda8c64271 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 2 Apr 2025 11:14:58 +1100 Subject: [PATCH 031/268] Include filename in state --- Tests/test_pickle.py | 1 + src/PIL/ImageFile.py | 4 ++++ src/PIL/JpegImagePlugin.py | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Tests/test_pickle.py b/Tests/test_pickle.py index 70661ecc1..1c48cb743 100644 --- a/Tests/test_pickle.py +++ b/Tests/test_pickle.py @@ -81,6 +81,7 @@ def test_pickle_jpeg() -> None: unpickled_image = pickle.loads(pickle.dumps(image)) # Assert + assert unpickled_image.filename == "Tests/images/hopper.jpg" assert len(unpickled_image.layer) == 3 assert unpickled_image.layers == 3 diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index c5d6383a5..bcb7d462e 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -252,8 +252,12 @@ class ImageFile(Image.Image): return Image.MIME.get(self.format.upper()) return None + def __getstate__(self) -> list[Any]: + return super().__getstate__() + [self.filename] + def __setstate__(self, state: list[Any]) -> None: self.tile = [] + self.filename = state[5] super().__setstate__(state) def verify(self) -> None: diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index cc1d54b93..969528841 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -403,8 +403,8 @@ class JpegImageFile(ImageFile.ImageFile): return super().__getstate__() + [self.layers, self.layer] def __setstate__(self, state: list[Any]) -> None: + self.layers, self.layer = state[6:] super().__setstate__(state) - self.layers, self.layer = state[5:] def load_read(self, read_bytes: int) -> bytes: """ From 8dbbce624f7ce9ad85eb50075d9e3dfdcb0fbfd4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 2 Apr 2025 12:16:25 +1100 Subject: [PATCH 032/268] Compare absolute path of filename --- src/PIL/Image.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index c62d7a8a3..807814c02 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2543,7 +2543,9 @@ class Image: from . import ImageFile # may mutate self! - if isinstance(self, ImageFile.ImageFile) and filename == self.filename: + if isinstance(self, ImageFile.ImageFile) and os.path.abspath( + filename + ) == os.path.abspath(self.filename): self._ensure_mutable() else: self.load() From 7e15c54cad753c30974005230699e888e8902b6c Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 2 Apr 2025 23:53:14 +1100 Subject: [PATCH 033/268] Use multibuild build_github (#8861) --- .github/workflows/wheels-dependencies.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index 2f2e75b6c..accd99901 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -80,11 +80,7 @@ function build_pkg_config { function build_zlib_ng { if [ -e zlib-stamp ]; then return; fi - fetch_unpack https://github.com/zlib-ng/zlib-ng/archive/$ZLIB_NG_VERSION.tar.gz zlib-ng-$ZLIB_NG_VERSION.tar.gz - (cd zlib-ng-$ZLIB_NG_VERSION \ - && ./configure --prefix=$BUILD_PREFIX --zlib-compat \ - && make -j4 \ - && make install) + build_github zlib-ng/zlib-ng $ZLIB_NG_VERSION --zlib-compat if [ -n "$IS_MACOS" ]; then # Ensure that on macOS, the library name is an absolute path, not an From 2d452c82e5f78fb25d0271a4f4534622235176da Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Thu, 3 Apr 2025 21:17:54 +1100 Subject: [PATCH 034/268] Removed condition that is always true (#8862) --- src/_avif.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/_avif.c b/src/_avif.c index eabd9958e..312286787 100644 --- a/src/_avif.c +++ b/src/_avif.c @@ -568,9 +568,7 @@ _encoder_add(AvifEncoderObject *self, PyObject *args) { } end: - if (&rgb) { - avifRGBImageFreePixels(&rgb); - } + avifRGBImageFreePixels(&rgb); if (!self->first_frame) { avifImageDestroy(frame); } From 8691112a2cba76b7bcf1aaa0f4824ff9063f2f7b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Apr 2025 13:23:36 +0300 Subject: [PATCH 035/268] Update scientific-python/upload-nightly-action action to v0.6.2 (#8865) --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 2a8594f49..3b1be9a96 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -245,7 +245,7 @@ jobs: path: dist merge-multiple: true - name: Upload wheels to scientific-python-nightly-wheels - uses: scientific-python/upload-nightly-action@82396a2ed4269ba06c6b2988bb4fd568ef3c3d6b # 0.6.1 + uses: scientific-python/upload-nightly-action@b36e8c0c10dbcfd2e05bf95f17ef8c14fd708dbf # 0.6.2 with: artifacts_path: dist anaconda_nightly_upload_token: ${{ secrets.ANACONDA_ORG_UPLOAD_TOKEN }} From 9f4195752d2231b34909c95fa70d716d4c664491 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Thu, 3 Apr 2025 21:24:37 +1100 Subject: [PATCH 036/268] Added type hints (#8867) --- src/PIL/Image.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 807814c02..88ea6f3b5 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3326,7 +3326,9 @@ def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) -def fromarrow(obj: SupportsArrowArrayInterface, mode, size) -> Image: +def fromarrow( + obj: SupportsArrowArrayInterface, mode: str, size: tuple[int, int] +) -> Image: """Creates an image with zero-copy shared memory from an object exporting the arrow_c_array interface protocol:: From 61d3dd9e83aee05fb19e28274bcc20a8fb8148f6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 4 Apr 2025 22:12:54 +1100 Subject: [PATCH 037/268] Updated xz to 5.8.1, except on Windows x86 --- .github/workflows/wheels-dependencies.sh | 16 +--------------- winbuild/build_prepare.py | 2 +- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index accd99901..04bce62fb 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -42,7 +42,7 @@ HARFBUZZ_VERSION=11.0.0 LIBPNG_VERSION=1.6.47 JPEGTURBO_VERSION=3.1.0 OPENJPEG_VERSION=2.5.3 -XZ_VERSION=5.8.0 +XZ_VERSION=5.8.1 TIFF_VERSION=4.7.0 LCMS2_VERSION=2.17 ZLIB_VERSION=1.3.1 @@ -53,20 +53,6 @@ LIBXCB_VERSION=1.17.0 BROTLI_VERSION=1.1.0 LIBAVIF_VERSION=1.2.1 -if [[ $MB_ML_VER == 2014 ]]; then - function build_xz { - if [ -e xz-stamp ]; then return; fi - yum install -y gettext-devel - fetch_unpack https://tukaani.org/xz/xz-$XZ_VERSION.tar.gz - (cd xz-$XZ_VERSION \ - && ./autogen.sh --no-po4a \ - && ./configure --prefix=$BUILD_PREFIX \ - && make -j4 \ - && make install) - touch xz-stamp - } -fi - function build_pkg_config { if [ -e pkg-config-stamp ]; then return; fi # This essentially duplicates the Homebrew recipe diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index e118cd994..e8e3aacc2 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -122,7 +122,7 @@ V = { "LIBWEBP": "1.5.0", "OPENJPEG": "2.5.3", "TIFF": "4.7.0", - "XZ": "5.6.4", + "XZ": "5.6.4" if struct.calcsize("P") == 4 else "5.8.1", "ZLIBNG": "2.2.4", } V["LIBPNG_XY"] = "".join(V["LIBPNG"].split(".")[:2]) From 9f654ff748919d92ac0710a573e239b18c82e806 Mon Sep 17 00:00:00 2001 From: Frankie Dintino Date: Fri, 4 Apr 2025 09:41:11 -0400 Subject: [PATCH 038/268] Fixed conversion of AVIF image rotation property to EXIF orientation (#8866) --- Tests/test_file_avif.py | 3 ++- src/_avif.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_avif.py b/Tests/test_file_avif.py index 392a4bbd5..bd87947c0 100644 --- a/Tests/test_file_avif.py +++ b/Tests/test_file_avif.py @@ -309,7 +309,7 @@ class TestFileAvif: assert exif[274] == 3 @pytest.mark.parametrize("use_bytes", [True, False]) - @pytest.mark.parametrize("orientation", [1, 2]) + @pytest.mark.parametrize("orientation", [1, 2, 3, 4, 5, 6, 7, 8]) def test_exif_save( self, tmp_path: Path, @@ -327,6 +327,7 @@ class TestFileAvif: if orientation == 1: assert "exif" not in reloaded.info else: + assert reloaded.getexif()[274] == orientation assert reloaded.info["exif"] == exif_data def test_exif_without_orientation(self, tmp_path: Path) -> None: diff --git a/src/_avif.c b/src/_avif.c index 312286787..7e7bee703 100644 --- a/src/_avif.c +++ b/src/_avif.c @@ -59,7 +59,7 @@ irot_imir_to_exif_orientation(const avifImage *image) { return axis ? 7 // 90 degrees anti-clockwise then swap left and right. : 5; // 90 degrees anti-clockwise then swap top and bottom. } - return 6; // 90 degrees anti-clockwise. + return 8; // 90 degrees anti-clockwise. } if (angle == 2) { if (imir) { @@ -75,7 +75,7 @@ irot_imir_to_exif_orientation(const avifImage *image) { ? 5 // 270 degrees anti-clockwise then swap left and right. : 7; // 270 degrees anti-clockwise then swap top and bottom. } - return 8; // 270 degrees anti-clockwise. + return 6; // 270 degrees anti-clockwise. } } if (imir) { From 1ba32fce487cba432fd56c694651f15e0b32e25f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 5 Apr 2025 15:44:46 +1100 Subject: [PATCH 039/268] Updated harfbuzz to 11.0.1 --- .github/workflows/wheels-dependencies.sh | 2 +- winbuild/build_prepare.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index accd99901..06c968d67 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -38,7 +38,7 @@ ARCHIVE_SDIR=pillow-depends-main # Package versions for fresh source builds FREETYPE_VERSION=2.13.3 -HARFBUZZ_VERSION=11.0.0 +HARFBUZZ_VERSION=11.0.1 LIBPNG_VERSION=1.6.47 JPEGTURBO_VERSION=3.1.0 OPENJPEG_VERSION=2.5.3 diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index e118cd994..cf6dd0661 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -113,7 +113,7 @@ V = { "BROTLI": "1.1.0", "FREETYPE": "2.13.3", "FRIBIDI": "1.0.16", - "HARFBUZZ": "11.0.0", + "HARFBUZZ": "11.0.1", "JPEGTURBO": "3.1.0", "LCMS2": "2.17", "LIBAVIF": "1.2.1", From 1db27be6a0a56eefb08f7f7ed5064b2af875a6fd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 5 Apr 2025 16:09:12 +1100 Subject: [PATCH 040/268] Use same URL as wheels-dependencies.sh --- winbuild/build_prepare.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index cf6dd0661..5806d88da 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -349,8 +349,8 @@ DEPS: dict[str, dict[str, Any]] = { "libs": [r"..\target\release\imagequant_sys.lib"], }, "harfbuzz": { - "url": f"https://github.com/harfbuzz/harfbuzz/archive/{V['HARFBUZZ']}.zip", - "filename": f"harfbuzz-{V['HARFBUZZ']}.zip", + "url": f"https://github.com/harfbuzz/harfbuzz/releases/download/{V['HARFBUZZ']}/FILENAME", + "filename": f"harfbuzz-{V['HARFBUZZ']}.tar.xz", "license": "COPYING", "build": [ *cmds_cmake( @@ -514,8 +514,8 @@ def extract_dep(url: str, filename: str, prefs: dict[str, str]) -> None: msg = "Attempted Path Traversal in Zip File" raise RuntimeError(msg) zf.extractall(sources_dir) - elif filename.endswith((".tar.gz", ".tgz")): - with tarfile.open(file, "r:gz") as tgz: + elif filename.endswith((".tar.gz", ".tar.xz")): + with tarfile.open(file, "r:xz" if filename.endswith(".xz") else "r:gz") as tgz: for member in tgz.getnames(): member_abspath = os.path.abspath(os.path.join(sources_dir, member)) member_prefix = os.path.commonpath([sources_dir_abs, member_abspath]) @@ -776,7 +776,7 @@ def main() -> None: for k, v in DEPS.items(): if "dir" not in v: - v["dir"] = re.sub(r"\.(tar\.gz|zip)", "", v["filename"]) + v["dir"] = re.sub(r"\.(tar\.gz|tar\.xz|zip)", "", v["filename"]) prefs[f"dir_{k}"] = os.path.join(sources_dir, v["dir"]) print() From 82bccf70a0113617492b163f30e2bf31294c0a09 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 6 Apr 2025 11:10:05 +1000 Subject: [PATCH 041/268] Added XZ_CLMUL_CRC:BOOL=OFF to allow Windows x86 to use xz 5.8.1 --- winbuild/build_prepare.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index e8e3aacc2..f40312506 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -122,7 +122,7 @@ V = { "LIBWEBP": "1.5.0", "OPENJPEG": "2.5.3", "TIFF": "4.7.0", - "XZ": "5.6.4" if struct.calcsize("P") == 4 else "5.8.1", + "XZ": "5.8.1", "ZLIBNG": "2.2.4", } V["LIBPNG_XY"] = "".join(V["LIBPNG"].split(".")[:2]) @@ -181,7 +181,11 @@ DEPS: dict[str, dict[str, Any]] = { "filename": f"xz-{V['XZ']}.tar.gz", "license": "COPYING", "build": [ - *cmds_cmake("liblzma", "-DBUILD_SHARED_LIBS:BOOL=OFF"), + *cmds_cmake( + "liblzma", + "-DBUILD_SHARED_LIBS:BOOL=OFF" + + (" -DXZ_CLMUL_CRC:BOOL=OFF" if struct.calcsize("P") == 4 else ""), + ), cmd_mkdir(r"{inc_dir}\lzma"), cmd_copy(r"src\liblzma\api\lzma\*.h", r"{inc_dir}\lzma"), ], From f6eb2e7fa50fc707aca36efd3d0dccd64edf1979 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 17:17:00 +0000 Subject: [PATCH 042/268] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.9.9 → v0.11.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.9...v0.11.4) - [github.com/pre-commit/mirrors-clang-format: v19.1.7 → v20.1.0](https://github.com/pre-commit/mirrors-clang-format/compare/v19.1.7...v20.1.0) - [github.com/python-jsonschema/check-jsonschema: 0.31.2 → 0.32.1](https://github.com/python-jsonschema/check-jsonschema/compare/0.31.2...0.32.1) - [github.com/woodruffw/zizmor-pre-commit: v1.4.1 → v1.5.2](https://github.com/woodruffw/zizmor-pre-commit/compare/v1.4.1...v1.5.2) - [github.com/abravalheri/validate-pyproject: v0.23 → v0.24.1](https://github.com/abravalheri/validate-pyproject/compare/v0.23...v0.24.1) --- .pre-commit-config.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5ff947d41..66cf6d118 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.9 + rev: v0.11.4 hooks: - id: ruff args: [--exit-non-zero-on-fix] @@ -24,7 +24,7 @@ repos: exclude: (Makefile$|\.bat$|\.cmake$|\.eps$|\.fits$|\.gd$|\.opt$) - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v19.1.7 + rev: v20.1.0 hooks: - id: clang-format types: [c] @@ -50,14 +50,14 @@ repos: exclude: ^.github/.*TEMPLATE|^Tests/(fonts|images)/ - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.31.2 + rev: 0.32.1 hooks: - id: check-github-workflows - id: check-readthedocs - id: check-renovate - repo: https://github.com/woodruffw/zizmor-pre-commit - rev: v1.4.1 + rev: v1.5.2 hooks: - id: zizmor @@ -72,7 +72,7 @@ repos: - id: pyproject-fmt - repo: https://github.com/abravalheri/validate-pyproject - rev: v0.23 + rev: v0.24.1 hooks: - id: validate-pyproject additional_dependencies: [trove-classifiers>=2024.10.12] From a5a8ece5d2211e3121ba0508d9ca78d4afd90e90 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 17:17:33 +0000 Subject: [PATCH 043/268] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/libImaging/QuantHash.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libImaging/QuantHash.h b/src/libImaging/QuantHash.h index 0462cfd49..d75d55ce0 100644 --- a/src/libImaging/QuantHash.h +++ b/src/libImaging/QuantHash.h @@ -20,8 +20,12 @@ typedef uint32_t HashVal_t; typedef uint32_t (*HashFunc)(const HashTable *, const HashKey_t); typedef int (*HashCmpFunc)(const HashTable *, const HashKey_t, const HashKey_t); -typedef void (*IteratorFunc)(const HashTable *, const HashKey_t, const HashVal_t, void *); -typedef void (*IteratorUpdateFunc)(const HashTable *, const HashKey_t, HashVal_t *, void *); +typedef void (*IteratorFunc)( + const HashTable *, const HashKey_t, const HashVal_t, void * +); +typedef void (*IteratorUpdateFunc)( + const HashTable *, const HashKey_t, HashVal_t *, void * +); typedef void (*ComputeFunc)(const HashTable *, const HashKey_t, HashVal_t *); typedef void (*CollisionFunc)( const HashTable *, HashKey_t *, HashVal_t *, HashKey_t, HashVal_t From 8c4510cb236597df034ab3cec97d4ec6ca3ba9a1 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 7 Apr 2025 22:25:12 +0300 Subject: [PATCH 044/268] Fix clang-format: Configuration file(s) do(es) not support C --- .clang-format | 1 - src/_imagingcms.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.clang-format b/.clang-format index 143dde82c..f01a1151a 100644 --- a/.clang-format +++ b/.clang-format @@ -11,7 +11,6 @@ ColumnLimit: 88 DerivePointerAlignment: false IndentGotoLabels: false IndentWidth: 4 -Language: Cpp PointerAlignment: Right ReflowComments: true SortIncludes: false diff --git a/src/_imagingcms.c b/src/_imagingcms.c index ea2f70186..f93c1613b 100644 --- a/src/_imagingcms.c +++ b/src/_imagingcms.c @@ -1402,8 +1402,8 @@ static struct PyGetSetDef cms_profile_getsetters[] = { {"colorant_table_out", (getter)cms_profile_getattr_colorant_table_out}, {"intent_supported", (getter)cms_profile_getattr_is_intent_supported}, {"clut", (getter)cms_profile_getattr_is_clut}, - {"icc_measurement_condition", (getter)cms_profile_getattr_icc_measurement_condition - }, + {"icc_measurement_condition", + (getter)cms_profile_getattr_icc_measurement_condition}, {"icc_viewing_condition", (getter)cms_profile_getattr_icc_viewing_condition}, {NULL} From 8b7d72440e5d8a1acbe3f4692003d6c6eabd2205 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 8 Apr 2025 20:15:45 +1000 Subject: [PATCH 045/268] Specify both C and Cpp --- .clang-format | 21 +++++++++++++++++++++ .pre-commit-config.yaml | 1 + 2 files changed, 22 insertions(+) diff --git a/.clang-format b/.clang-format index f01a1151a..1871d1f7a 100644 --- a/.clang-format +++ b/.clang-format @@ -1,5 +1,26 @@ # A clang-format style that approximates Python's PEP 7 # Useful for IDE integration +Language: C +BasedOnStyle: Google +AlwaysBreakAfterReturnType: All +AllowShortIfStatementsOnASingleLine: false +AlignAfterOpenBracket: BlockIndent +BinPackArguments: false +BinPackParameters: false +BreakBeforeBraces: Attach +ColumnLimit: 88 +DerivePointerAlignment: false +IndentGotoLabels: false +IndentWidth: 4 +PointerAlignment: Right +ReflowComments: true +SortIncludes: false +SpaceBeforeParens: ControlStatements +SpacesInParentheses: false +TabWidth: 4 +UseTab: Never +--- +Language: Cpp BasedOnStyle: Google AlwaysBreakAfterReturnType: All AllowShortIfStatementsOnASingleLine: false diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 66cf6d118..140ce33be 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,6 +44,7 @@ repos: - id: check-json - id: check-toml - id: check-yaml + args: [--allow-multiple-documents] - id: end-of-file-fixer exclude: ^Tests/images/ - id: trailing-whitespace From 179ae9d395d5ad87e7d9f5db6e93a2cdd69af9ce Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 8 Apr 2025 22:05:29 +1000 Subject: [PATCH 046/268] Disable building harfbuzz tests --- .github/workflows/wheels-dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index 06c968d67..7f1f22a3e 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -107,7 +107,7 @@ function build_harfbuzz { local out_dir=$(fetch_unpack https://github.com/harfbuzz/harfbuzz/releases/download/$HARFBUZZ_VERSION/harfbuzz-$HARFBUZZ_VERSION.tar.xz harfbuzz-$HARFBUZZ_VERSION.tar.xz) (cd $out_dir \ - && meson setup build --prefix=$BUILD_PREFIX --libdir=$BUILD_PREFIX/lib --buildtype=release -Dfreetype=enabled -Dglib=disabled) + && meson setup build --prefix=$BUILD_PREFIX --libdir=$BUILD_PREFIX/lib --buildtype=release -Dfreetype=enabled -Dglib=disabled -Dtests=disabled) (cd $out_dir/build \ && meson install) touch harfbuzz-stamp From 6b5f8d768d2d388f2c9475f6ae9ca3780dafb8c8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 10 Apr 2025 13:55:02 +1000 Subject: [PATCH 047/268] Do not include libavif in wheels --- .github/workflows/wheels-dependencies.sh | 41 --- .github/workflows/wheels.yml | 7 +- Tests/check_wheel.py | 8 +- docs/releasenotes/11.2.0.rst | 5 +- wheels/dependency_licenses/AOM.txt | 26 -- wheels/dependency_licenses/DAV1D.txt | 23 -- wheels/dependency_licenses/LIBAVIF.txt | 387 ----------------------- wheels/dependency_licenses/LIBYUV.txt | 29 -- wheels/dependency_licenses/RAV1E.txt | 25 -- wheels/dependency_licenses/SVT-AV1.txt | 26 -- 10 files changed, 5 insertions(+), 572 deletions(-) delete mode 100644 wheels/dependency_licenses/AOM.txt delete mode 100644 wheels/dependency_licenses/DAV1D.txt delete mode 100644 wheels/dependency_licenses/LIBAVIF.txt delete mode 100644 wheels/dependency_licenses/LIBYUV.txt delete mode 100644 wheels/dependency_licenses/RAV1E.txt delete mode 100644 wheels/dependency_licenses/SVT-AV1.txt diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index accd99901..395db86b6 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -51,7 +51,6 @@ LIBWEBP_VERSION=1.5.0 BZIP2_VERSION=1.0.8 LIBXCB_VERSION=1.17.0 BROTLI_VERSION=1.1.0 -LIBAVIF_VERSION=1.2.1 if [[ $MB_ML_VER == 2014 ]]; then function build_xz { @@ -113,45 +112,6 @@ function build_harfbuzz { touch harfbuzz-stamp } -function build_libavif { - if [ -e libavif-stamp ]; then return; fi - - python3 -m pip install meson ninja - - if [[ "$PLAT" == "x86_64" ]] || [ -n "$SANITIZER" ]; then - build_simple nasm 2.16.03 https://www.nasm.us/pub/nasm/releasebuilds/2.16.03 - fi - - # For rav1e - curl https://sh.rustup.rs -sSf | sh -s -- -y - . "$HOME/.cargo/env" - if [ -z "$IS_ALPINE" ] && [ -z "$SANITIZER" ] && [ -z "$IS_MACOS" ]; then - yum install -y perl - if [[ "$MB_ML_VER" == 2014 ]]; then - yum install -y perl-IPC-Cmd - fi - fi - - local out_dir=$(fetch_unpack https://github.com/AOMediaCodec/libavif/archive/refs/tags/v$LIBAVIF_VERSION.tar.gz libavif-$LIBAVIF_VERSION.tar.gz) - (cd $out_dir \ - && CMAKE_POLICY_VERSION_MINIMUM=3.5 cmake \ - -DCMAKE_INSTALL_PREFIX=$BUILD_PREFIX \ - -DCMAKE_INSTALL_LIBDIR=$BUILD_PREFIX/lib \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=OFF \ - -DAVIF_LIBSHARPYUV=LOCAL \ - -DAVIF_LIBYUV=LOCAL \ - -DAVIF_CODEC_AOM=LOCAL \ - -DAVIF_CODEC_DAV1D=LOCAL \ - -DAVIF_CODEC_RAV1E=LOCAL \ - -DAVIF_CODEC_SVT=LOCAL \ - -DENABLE_NASM=ON \ - -DCMAKE_MODULE_PATH=/tmp/cmake/Modules \ - . \ - && make install) - touch libavif-stamp -} - function build { build_xz if [ -z "$IS_ALPINE" ] && [ -z "$SANITIZER" ] && [ -z "$IS_MACOS" ]; then @@ -186,7 +146,6 @@ function build { build_tiff fi - build_libavif build_libpng build_lcms2 build_openjpeg diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 3b1be9a96..40d3dc7e8 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -157,14 +157,9 @@ jobs: # Install extra test images xcopy /S /Y Tests\test-images\* Tests\images - & python.exe winbuild\build_prepare.py -v --no-imagequant --architecture=${{ matrix.cibw_arch }} + & python.exe winbuild\build_prepare.py -v --no-imagequant --no-avif --architecture=${{ matrix.cibw_arch }} shell: pwsh - - name: Update rust - if: matrix.cibw_arch == 'AMD64' - run: | - rustup update - - name: Build wheels run: | setlocal EnableDelayedExpansion diff --git a/Tests/check_wheel.py b/Tests/check_wheel.py index 582fc92c2..8ba40ba3f 100644 --- a/Tests/check_wheel.py +++ b/Tests/check_wheel.py @@ -1,7 +1,6 @@ from __future__ import annotations import platform -import struct import sys from PIL import features @@ -10,7 +9,7 @@ from .helper import is_pypy def test_wheel_modules() -> None: - expected_modules = {"pil", "tkinter", "freetype2", "littlecms2", "webp", "avif"} + expected_modules = {"pil", "tkinter", "freetype2", "littlecms2", "webp"} # tkinter is not available in cibuildwheel installed CPython on Windows try: @@ -20,11 +19,6 @@ def test_wheel_modules() -> None: except ImportError: expected_modules.remove("tkinter") - # libavif is not available on Windows for x86 and ARM64 architectures - if sys.platform == "win32": - if platform.machine() == "ARM64" or struct.calcsize("P") == 4: - expected_modules.remove("avif") - assert set(features.get_supported_modules()) == expected_modules diff --git a/docs/releasenotes/11.2.0.rst b/docs/releasenotes/11.2.0.rst index de3db3c84..ed41c2116 100644 --- a/docs/releasenotes/11.2.0.rst +++ b/docs/releasenotes/11.2.0.rst @@ -106,5 +106,6 @@ Pillow images can also be converted to Arrow objects:: Reading and writing AVIF images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Pillow can now read and write AVIF images. If you are building Pillow from source, this -will require libavif 1.0.0 or later. +Pillow can now read and write AVIF images. However, due to concern over size, this +functionality is not included in our prebuilt wheels. You will need to build Pillow +from source with libavif 1.0.0 or later. diff --git a/wheels/dependency_licenses/AOM.txt b/wheels/dependency_licenses/AOM.txt deleted file mode 100644 index 3a2e46c26..000000000 --- a/wheels/dependency_licenses/AOM.txt +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2016, Alliance for Open Media. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/DAV1D.txt b/wheels/dependency_licenses/DAV1D.txt deleted file mode 100644 index 875b138ec..000000000 --- a/wheels/dependency_licenses/DAV1D.txt +++ /dev/null @@ -1,23 +0,0 @@ -Copyright © 2018-2019, VideoLAN and dav1d authors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/LIBAVIF.txt b/wheels/dependency_licenses/LIBAVIF.txt deleted file mode 100644 index 350eb9d15..000000000 --- a/wheels/dependency_licenses/LIBAVIF.txt +++ /dev/null @@ -1,387 +0,0 @@ -Copyright 2019 Joe Drago. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------------------------------------------------------------------------------- - -Files: src/obu.c - -Copyright © 2018-2019, VideoLAN and dav1d authors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------------------------------------------------------------------------------- - -Files: third_party/iccjpeg/* - -In plain English: - -1. We don't promise that this software works. (But if you find any bugs, - please let us know!) -2. You can use this software for whatever you want. You don't have to pay us. -3. You may not pretend that you wrote this software. If you use it in a - program, you must acknowledge somewhere in your documentation that - you've used the IJG code. - -In legalese: - -The authors make NO WARRANTY or representation, either express or implied, -with respect to this software, its quality, accuracy, merchantability, or -fitness for a particular purpose. This software is provided "AS IS", and you, -its user, assume the entire risk as to its quality and accuracy. - -This software is copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding. -All Rights Reserved except as specified below. - -Permission is hereby granted to use, copy, modify, and distribute this -software (or portions thereof) for any purpose, without fee, subject to these -conditions: -(1) If any part of the source code for this software is distributed, then this -README file must be included, with this copyright and no-warranty notice -unaltered; and any additions, deletions, or changes to the original files -must be clearly indicated in accompanying documentation. -(2) If only executable code is distributed, then the accompanying -documentation must state that "this software is based in part on the work of -the Independent JPEG Group". -(3) Permission for use of this software is granted only if the user accepts -full responsibility for any undesirable consequences; the authors accept -NO LIABILITY for damages of any kind. - -These conditions apply to any software derived from or based on the IJG code, -not just to the unmodified library. If you use our work, you ought to -acknowledge us. - -Permission is NOT granted for the use of any IJG author's name or company name -in advertising or publicity relating to this software or products derived from -it. This software may be referred to only as "the Independent JPEG Group's -software". - -We specifically permit and encourage the use of this software as the basis of -commercial products, provided that all warranty or liability claims are -assumed by the product vendor. - - -The Unix configuration script "configure" was produced with GNU Autoconf. -It is copyright by the Free Software Foundation but is freely distributable. -The same holds for its supporting scripts (config.guess, config.sub, -ltmain.sh). Another support script, install-sh, is copyright by X Consortium -but is also freely distributable. - -The IJG distribution formerly included code to read and write GIF files. -To avoid entanglement with the Unisys LZW patent, GIF reading support has -been removed altogether, and the GIF writer has been simplified to produce -"uncompressed GIFs". This technique does not use the LZW algorithm; the -resulting GIF files are larger than usual, but are readable by all standard -GIF decoders. - -We are required to state that - "The Graphics Interchange Format(c) is the Copyright property of - CompuServe Incorporated. GIF(sm) is a Service Mark property of - CompuServe Incorporated." - ------------------------------------------------------------------------------- - -Files: contrib/gdk-pixbuf/* - -Copyright 2020 Emmanuel Gil Peyrot. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------------------------------------------------------------------------------- - -Files: android_jni/gradlew* - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ------------------------------------------------------------------------------- - -Files: third_party/libyuv/* - -Copyright 2011 The LibYuv Project Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google nor the names of its contributors may - be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/LIBYUV.txt b/wheels/dependency_licenses/LIBYUV.txt deleted file mode 100644 index c911747a6..000000000 --- a/wheels/dependency_licenses/LIBYUV.txt +++ /dev/null @@ -1,29 +0,0 @@ -Copyright 2011 The LibYuv Project Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google nor the names of its contributors may - be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/RAV1E.txt b/wheels/dependency_licenses/RAV1E.txt deleted file mode 100644 index 3d6c825c4..000000000 --- a/wheels/dependency_licenses/RAV1E.txt +++ /dev/null @@ -1,25 +0,0 @@ -BSD 2-Clause License - -Copyright (c) 2017-2023, the rav1e contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/SVT-AV1.txt b/wheels/dependency_licenses/SVT-AV1.txt deleted file mode 100644 index 532a982b3..000000000 --- a/wheels/dependency_licenses/SVT-AV1.txt +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2019, Alliance for Open Media. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. From c8d98d56a02e0729f794546d6f270b3cea5baecf Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Thu, 10 Apr 2025 16:21:48 +1000 Subject: [PATCH 048/268] Added avif to config settings (#8875) --- docs/installation/building-from-source.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/installation/building-from-source.rst b/docs/installation/building-from-source.rst index 9f953e718..9ba389b66 100644 --- a/docs/installation/building-from-source.rst +++ b/docs/installation/building-from-source.rst @@ -284,14 +284,16 @@ Build Options * Config settings: ``-C zlib=disable``, ``-C jpeg=disable``, ``-C tiff=disable``, ``-C freetype=disable``, ``-C raqm=disable``, ``-C lcms=disable``, ``-C webp=disable``, - ``-C jpeg2000=disable``, ``-C imagequant=disable``, ``-C xcb=disable``. + ``-C jpeg2000=disable``, ``-C imagequant=disable``, ``-C xcb=disable``, + ``-C avif=disable``. Disable building the corresponding feature even if the development libraries are present on the building machine. * Config settings: ``-C zlib=enable``, ``-C jpeg=enable``, ``-C tiff=enable``, ``-C freetype=enable``, ``-C raqm=enable``, ``-C lcms=enable``, ``-C webp=enable``, - ``-C jpeg2000=enable``, ``-C imagequant=enable``, ``-C xcb=enable``. + ``-C jpeg2000=enable``, ``-C imagequant=enable``, ``-C xcb=enable``, + ``-C avif=enable``. Require that the corresponding feature is built. The build will raise an exception if the libraries are not found. Tcl and Tk must be used together. From 75d3f1d3bdaee8b4e44ac1c437866e63ff577069 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 10 Apr 2025 18:41:12 +1000 Subject: [PATCH 049/268] Assert palette is not None --- Tests/test_file_gif.py | 2 ++ Tests/test_image.py | 1 + Tests/test_image_quantize.py | 1 + Tests/test_image_transform.py | 1 + 4 files changed, 5 insertions(+) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 20d58a9dd..7ce6b7c8c 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -224,6 +224,7 @@ def test_optimize_if_palette_can_be_reduced_by_half() -> None: out = BytesIO() im.save(out, "GIF", optimize=optimize) with Image.open(out) as reloaded: + assert reloaded.palette is not None assert len(reloaded.palette.palette) // 3 == colors @@ -1359,6 +1360,7 @@ def test_palette_save_all_P(tmp_path: Path) -> None: # Assert that the frames are correct, and each frame has the same palette assert_image_equal(im.convert("RGB"), frames[0].convert("RGB")) assert im.palette is not None + assert im.global_palette is not None assert im.palette.palette == im.global_palette.palette im.seek(1) diff --git a/Tests/test_image.py b/Tests/test_image.py index 7e6118d52..2a1911517 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -673,6 +673,7 @@ class TestImage: im_remapped = im.remap_palette(list(range(256))) assert_image_equal(im, im_remapped) assert im.palette is not None + assert im_remapped.palette is not None assert im.palette.palette == im_remapped.palette.palette # Test illegal image mode diff --git a/Tests/test_image_quantize.py b/Tests/test_image_quantize.py index 0ca7ad86e..6d313cb8c 100644 --- a/Tests/test_image_quantize.py +++ b/Tests/test_image_quantize.py @@ -70,6 +70,7 @@ def test_quantize_no_dither() -> None: converted = image.quantize(dither=Image.Dither.NONE, palette=palette) assert converted.mode == "P" assert converted.palette is not None + assert palette.palette is not None assert converted.palette.palette == palette.palette.palette diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index 77916929b..0429eb99d 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -48,6 +48,7 @@ class TestImageTransform: im.size, Image.Transform.AFFINE, [1, 0, 0, 0, 1, 0] ) assert im.palette is not None + assert transformed.palette is not None assert im.palette.palette == transformed.palette.palette def test_extent(self) -> None: From 7b459a8524a1aa7b5180cd868df3a78c6fc8ff4b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 9 Apr 2025 19:33:17 +1000 Subject: [PATCH 050/268] Improved reading XPM images --- Tests/test_file_xpm.py | 2 +- src/PIL/XpmImagePlugin.py | 42 ++++++++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Tests/test_file_xpm.py b/Tests/test_file_xpm.py index 73c62a44d..b604f07f5 100644 --- a/Tests/test_file_xpm.py +++ b/Tests/test_file_xpm.py @@ -17,7 +17,7 @@ def test_sanity() -> None: assert im.format == "XPM" # large error due to quantization->44 colors. - assert_image_similar(im.convert("RGB"), hopper("RGB"), 60) + assert_image_similar(im.convert("RGB"), hopper("RGB"), 23) def test_invalid_file() -> None: diff --git a/src/PIL/XpmImagePlugin.py b/src/PIL/XpmImagePlugin.py index 3c932c41b..304f58361 100644 --- a/src/PIL/XpmImagePlugin.py +++ b/src/PIL/XpmImagePlugin.py @@ -53,24 +53,20 @@ class XpmImageFile(ImageFile.ImageFile): self._size = int(m.group(1)), int(m.group(2)) - pal = int(m.group(3)) + palette_length = int(m.group(3)) bpp = int(m.group(4)) - if pal > 256 or bpp != 1: + if palette_length > 256 or bpp != 1: msg = "cannot read this XPM file" raise ValueError(msg) # # load palette description - palette = [b"\0\0\0"] * 256 + palette = {} - for _ in range(pal): - s = self.fp.readline() - if s.endswith(b"\r\n"): - s = s[:-2] - elif s.endswith((b"\r", b"\n")): - s = s[:-1] + for _ in range(palette_length): + s = self.fp.readline().rstrip() c = s[1] s = s[2:-2].split() @@ -82,7 +78,6 @@ class XpmImageFile(ImageFile.ImageFile): if rgb == b"None": self.info["transparency"] = c elif rgb.startswith(b"#"): - # FIXME: handle colour names (see ImagePalette.py) rgb = int(rgb[1:], 16) palette[c] = ( o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255) @@ -99,9 +94,12 @@ class XpmImageFile(ImageFile.ImageFile): raise ValueError(msg) self._mode = "P" - self.palette = ImagePalette.raw("RGB", b"".join(palette)) + self.palette = ImagePalette.raw("RGB", b"".join(palette.values())) - self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, self.fp.tell(), "P")] + palette_keys = tuple(palette.keys()) + self.tile = [ + ImageFile._Tile("xpm", (0, 0) + self.size, self.fp.tell(), (palette_keys,)) + ] def load_read(self, read_bytes: int) -> bytes: # @@ -114,11 +112,31 @@ class XpmImageFile(ImageFile.ImageFile): return b"".join(s) +class XpmDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + self.fd.readline() # Read '/* pixels */' + + data = bytearray() + palette_keys = self.args[0] + dest_length = self.state.xsize * self.state.ysize + while len(data) < dest_length: + s = self.fd.readline().rstrip()[1:] + s = s[: -1 if s.endswith(b'"') else -2] + for key in s: + data += o8(palette_keys.index(key)) + self.set_as_raw(bytes(data)) + return -1, 0 + + # # Registry Image.register_open(XpmImageFile.format, XpmImageFile, _accept) +Image.register_decoder("xpm", XpmDecoder) Image.register_extension(XpmImageFile.format, ".xpm") From 89ac20d2b9690bed2a10195b8acaf405aeaf2fbc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 9 Apr 2025 19:38:13 +1000 Subject: [PATCH 051/268] Allow more than 1 character per pixel --- Tests/images/hopper_bpp2.xpm | 390 +++++++++++++++++++++++++++++++++++ Tests/test_file_xpm.py | 7 +- src/PIL/XpmImagePlugin.py | 15 +- 3 files changed, 405 insertions(+), 7 deletions(-) create mode 100644 Tests/images/hopper_bpp2.xpm diff --git a/Tests/images/hopper_bpp2.xpm b/Tests/images/hopper_bpp2.xpm new file mode 100644 index 000000000..fe97b83ba --- /dev/null +++ b/Tests/images/hopper_bpp2.xpm @@ -0,0 +1,390 @@ +/* XPM */ +static const char *hopper[] = { +/* columns rows colors chars-per-pixel */ +"128 128 256 2 ", +" c #0C0C0D", +". c #0A0708", +"X c #1C0A04", +"o c #120B0C", +"O c #170808", +"+ c #0B110D", +"@ c #16120C", +"# c #0D0D12", +"$ c #0D0D1A", +"% c #070A16", +"& c #120D13", +"* c #120E1A", +"= c #1A0C16", +"- c #0D1114", +"; c #0D121B", +": c #091518", +"> c #131215", +", c #14131B", +"< c #1A141C", +"1 c #1B191D", +"2 c #191517", +"3 c #250906", +"4 c #390904", +"5 c #27150A", +"6 c #250A18", +"7 c #251719", +"8 c #361410", +"9 c #342215", +"0 c #0C0C24", +"q c #0C0D2B", +"w c #060927", +"e c #130D24", +"r c #150D2A", +"t c #0C1225", +"y c #0C122C", +"u c #061227", +"i c #151422", +"p c #1A1522", +"a c #1C1B23", +"s c #13132C", +"d c #19172A", +"f c #0C0D35", +"g c #130E37", +"h c #0D1436", +"j c #131333", +"k c #13143C", +"l c #191838", +"z c #241926", +"x c #231B38", +"c c #2E1226", +"v c #372628", +"b c #292538", +"n c #362B37", +"m c #2F2A2F", +"M c #1A2233", +"N c #4C150D", +"B c #740F10", +"V c #512916", +"C c #793419", +"Z c #6D2C13", +"A c #4E1524", +"S c #741624", +"D c #4E332E", +"F c #6F3629", +"G c #574438", +"H c #744831", +"J c #775A2E", +"K c #0E1444", +"L c #141443", +"P c #1B1A44", +"I c #14144B", +"U c #1A1B4C", +"Y c #181747", +"T c #1B1B53", +"R c #181955", +"E c #0F0E44", +"W c #231C46", +"Q c #231C56", +"! c #1C234E", +"~ c #272547", +"^ c #2E2F52", +"/ c #2E3765", +"( c #483947", +") c #742D4A", +"_ c #364970", +"` c #534A51", +"' c #6E534D", +"] c #756654", +"[ c #53556D", +"{ c #6B5B69", +"} c #746B71", +"| c #5E616A", +" . c #880C15", +".. c #881217", +"X. c #8D0D0F", +"o. c #8B3218", +"O. c #8C3828", +"+. c #AC2F30", +"@. c #9A1825", +"#. c #CE202B", +"$. c #8A452A", +"%. c #974A2B", +"&. c #884934", +"*. c #954B35", +"=. c #995539", +"-. c #895736", +";. c #A75738", +":. c #A84E30", +">. c #996839", +",. c #B6683B", +"<. c #AE6835", +"1. c #A35419", +"2. c #D26D19", +"3. c #CC712E", +"4. c #CD6922", +"5. c #A83152", +"6. c #985845", +"7. c #8A5748", +"8. c #AE5A46", +"9. c #916A4F", +"0. c #A96647", +"q. c #B76947", +"w. c #BA744A", +"e. c #B97757", +"r. c #AB6F53", +"t. c #8D736D", +"y. c #B27669", +"u. c #91566F", +"i. c #C56B4A", +"p. c #C8764B", +"a. c #C87856", +"s. c #D47A59", +"d. c #C96E53", +"f. c #C77C64", +"g. c #D17969", +"h. c #D45D68", +"j. c #C52A46", +"k. c #D58932", +"l. c #B38355", +"z. c #968775", +"x. c #BA8667", +"c. c #B38C74", +"v. c #AB9C73", +"b. c #C9845A", +"n. c #D7855B", +"m. c #D39454", +"M. c #E28C5B", +"N. c #F7B251", +"B. c #C78867", +"V. c #D98866", +"C. c #D8956A", +"Z. c #C79878", +"A. c #D89876", +"S. c #CD8C70", +"D. c #E38A68", +"F. c #E5956A", +"G. c #E79776", +"H. c #ED9176", +"J. c #D6A371", +"K. c #E8A379", +"L. c #F3A677", +"P. c #D8A05D", +"I. c #3D65AB", +"U. c #3F67B2", +"Y. c #3B5C9C", +"T. c #506796", +"R. c #72748D", +"E. c #446AAE", +"W. c #4869A9", +"Q. c #4166B2", +"!. c #436BB3", +"~. c #496EB4", +"^. c #476DB9", +"/. c #4A71B6", +"(. c #4C73BA", +"). c #4772B6", +"_. c #5176BC", +"`. c #547BBD", +"'. c #577BB7", +"]. c #5572A9", +"[. c #6B7CAA", +"{. c #505B8C", +"}. c #557CC1", +"|. c #4C73C2", +" X c #897987", +".X c #9F7593", +"XX c #C46B87", +"oX c #5981BF", +"OX c #5884BD", +"+X c #768AB9", +"@X c #7288B5", +"#X c #5C83C3", +"$X c #5D8AC5", +"%X c #6186C5", +"&X c #648AC6", +"*X c #6B8DC6", +"=X c #668BC9", +"-X c #6B8ECA", +";X c #6586C6", +":X c #738DC7", +">X c #6D91CB", +",X c #6C94C6", +" b R.DXPXLXHXHXHXHXCX~ / T.Y.T.T.W.T.W.E.Q.I.E.I.I.E.E.I.I.I.I.I.Y.I.Q.^.Q.E.E.E.E.Q.Q.~.U.U.U.U.U.U.Q.Q.U.U.U.U.U.U.Q.Q.Q.Q.U.U.U.Q.~.~.Q.U.Q.~.^._._._._._._._._.(.(.(.", +"L k f L L k y h T R I L U U L U R R T L E E E R I R I U l XuX' fXV v [ / P h z V Z.G a y l [ 7XCXHXJXHXHXCXb ! {.{.T.{._ _ {.T.W.W.T.T.W.I.I.U.U.I.I.E.W.I.I.Q.Q.E.E.E.Q.Q.~.~.~.U.U.U.U.Q.Q.Q.Q.U.U.U.U.U.Q.~.~.~.U.U.U.U.U.Q.~.Q.Q.Q.~.~._._._.'.`._._._._._.", +"L k f L L k 0 h T T I E U U L T T T U L h h E U R R E U W R.{ D pXF z l L U ^ p F fXD i P W Y ~ n CXHXHXHXFX8Xl W ~ ~ l ^ b b ^ ^ / [ T.W._.U.^.U.U.Q.E.W.W.~.^.E.E.E.~.~.Q.~.~.~.~.~.~.~.~.Q.Q.Q.Q.U.U.U.U.U.U.~.Q.U.U.U.U.U.U.^.~.~.Q.~.~._._.`.`.`.`._._.|.|.", +"k k f L L k 0 h U T L h I U I T T T U k h k E U Q I E U k ` m ' hXV z k U I Q d V fX( j L U W W z VXLX8X XuX( z b x d ` X X` n n b b ! {.W.~.I.Q.Q.Q.E.W.].~.I.~.~.~.~.~.~.~.Q.~.~.~.~.~.~.~.~.~.Q.Q.Q.U.U.U.U.U.Q.U.U.~.~.Q.Q.Q.Q.Q.Q.Q.~._._._._._._._._.|.|.", +"k k f L L k q j U T L h U U I T R T U k h h E I E R I I k b p ' Z.V z k ! T U p H Z.c k U L U W n CXCXn z = c c v 7X8X` 8XPX} c R.tX` n b / {.].W.~.~.E.W.E.~.^.~.~.~.~.^.~.~.~.~.~.E.E.~.~.~.~.~.~.~.~.~.~.U.U.~.U.~.~.~.~.~.Q.U.Q.~.~.E.~.~./././.(.(.(.(.(.(.", +"h k h P L k q j U T L h U U I T R T U h h h E E I R I E k d p ' dXV x P U L L z J fXv l L L P j n IX` m = = 7 ' HXLXKXCX7XKXtXrXLXKXJXqXv n ^ {.T.T.T.W.].E.Q.^.~.~.~.~.^.^.~.~.E.E.E.E.E.~.~.~.~.~.~.~.~.~.U.U.~.~.~.~.U.U.U.U.Q.Q.~.~.E.~.~.E.~.~.~./././.(.(.", +"j k k P Y k q h U U k h U R I R R T U h h h E E R R E I Y d d ' Z.V p L ! ! Y = H Z.v j h ! l b n iXtX7Xa p t.LXZX0XHXPXKXKXPXLXLXCXbXAXVXn m 8XVXeX[.T.W.W.^.^.~.~.~.^.^.^.^.~.E.E.E.E.E.~.U.U.~.~.~.~.~.~.~.~.~.~.~.U.I.I.I.~.~.Q.Q.~.~.~.~.E.~.~.~./.(.(.(.(.", +"j k k U P k 0 y L U k h U R I R T Q T E f E E E E I I I f k z ` Z.V d U T L P z >.B.c j l l l } IXKXKX8Xp ` t.` t.' G ] tXIXIXwX] ' z.t.` { c n PXKXLXUX+X].E.~.~.~.~.~.^.^.^.~.Q.E.E.E.E.U.U.U.~.~.~.~.~.~.~.~.~.~.I.I.I.I.~.~.~.Q.Q.Q.~.~.~.~.~.~.~./.(.(.(.(.", +"j k R.~ k k q q Y T k f Q T I I I Q I L E L E E R I I E f d x ` dXV d T T T U z -.Z.c b s b CXLXKXLXKX} z 7 7 z.hXSXSXz.AXbXmXbX0XJXmXmX` 1 n b iXKXLXLXLXDX@XT.].W.E.(.U.|.^.^.~.~.W.E.~.~.~.~.~.~.U.~.~.~.~.~.~.U.I.I.I.U.~.~.Q.~.~.~.~.E.~.~.~.~.~.~.~.~.^.^.", +"j ~ DX[ W q s q Q I f h Q L R R R R I I L f E I I I I L P d x ` dXV d R R T Y z -.Z.7 0 ` GXLXKXJXLXJX` 7 7 7 t.hXMXmXJXLXJXJXJXJXSXSXmX' n z b 7XKXKXPXKXLXPXBX].T.W./.^.^.U.|.~.~.~.~.~.~.~.^.~.U.U.~.~.~.~.~.~.~.U.U.I.U.~.~.~.~.~.~.E.E.~.~.~.~.~.~.~.~.^.^.", +"r x DXIX~ s $ b L U L L Y Q L I I I T L f L U E T T L k k d x ` dXV x T R U L p 9.Z.7 | KXKXLXLXJXSXZXD v 7 7 D mXMXmXSXZXZXCXZXAXZXdXmXG v n n 7XKXLXKXKXKXLXKXDX[.T.]./.I.}.U.~.~.~.~.~.~.~.U.~.U.U.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.U.~.~.~.~.^.^.^.^.", +"r b CXPX X[ iX[ Y U L k P [.~ k U T U L f f f L I U U k f d x ` dXV z T T U L z 9.x.D LXHXJXJXZXqXqXmXD @ 7 7 9 ] mXbXJXKXKXKXLXJXJXMXv.9 7 7 7 } HXKXKXHXLXJXLXKXDX[.T.W.(.~.^.Q.Q.E.E.E.~.U.U.~.U.U.U.~.U.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.U.~.~.~.~.~.^.^.^.", +"d x VXKXPXGXCX` P U L Y ~ BX| l k P k k k P w k h L L P j d d ( dXZ z P ! L k z 9.B.mXJXJXSX9Xz.t.D 5 5 5 7 7 9 hXmXv.mXLXKXKXKXJXSXv.mX] v c v D t.xXZXJXJXJXLXPXKXUXT.W.E.~.~.Q.Q.E.E.E.E.Q.Q.~.I.I.~.~.E.E.~.~.~.~.~.~.~.~.~.~.~.~.I.~.~.U.U.~.~.~.~.^.^.^.(.", +"x 8XGXPXHXHXtXb k U U k l CXtXd b ~ | {.j q k f P / h k k d d ( dXF < k ! L k z 7.zXSXJXSXt.] V 3 3 X 5 @ 2 c 7 z.v.bXSXAXKXLXLXZXmXhXMX' 7 n 7 9 3 8 ] qXZXJXLXLXKXPX@X].W.I.^.~.~.~.E.E.~.~.~.E.I.E.~.~.E.E.~.~.~.~.~.~.~.~.~.~.~.~.~.~.U.U.U.~.~.~.~.^.^.(.(.", +"uXGXHXLXJXAX} & W Q g g ~ DXCX` [ VXDX[ s j s y ^ eX~ j j d l ( pXF 7 k ! L L z 7.nXJXAX] D 3 3 3 X ' ] 7 1 = 9 t.SXSXMX9XZXJXJXxXmXSXSXJ v v 7 9 ] 9 9 5 ' 9XxXJXHXGXDX{.'.).~.~.~.E.E.E.E.~.~.~.~.~.~.~.E.I.~.~.~.~.~.~.I.I.~.~.~.~.~.~.~.U.~.U.U.~.~.^.(.(.(.", +"iXFXPXLXLXLXyX( k W k ~ b CXGXFXPXGXtXl l s 0 j ^ DX` d d d x D pXF z P T L P z ' AXAXz.5 X 3 9.] 9 5 v.5 G ` 9 J hXhXhXmX9X' ] qXhXhXMX] 9 D 9 G z.5 ] t.8 8 G wXHXPXIX[.T.W.].~.~.~.~.E.E.~.~.~.~.~.~.~.E.E.~.I.~.~.~.~.I.I.I.~.~.~.~.U.U.U.~.U.U.U.~.^.(.(.(.", +"d n } LXLXCXVX[ W W d ` tXHXAXAXHXIX^ x j l w s ` GX7X7 n } ~ D dXH p k ! P k l ` xX8X2 @ 5 7 gXbXhXhXv.hXmXSXmXMX9.J 5 5 V 9 9 9 V G dXhXSXSXdXhXl.MXMXdXV J V 9 wXLXFXtXR.T.T.W.~.^.~./.E.E.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.).~.~.~.^.^.^.^.~.^.(.(.(.", +"d d [ LXVX( ^ ~ k ^ 7XFXLXHXJXHXAX} x l k w l i ` GXCX8XbX Xx v Z.H z k ! P d d i . & @ . 2 7 v z.v.V dXmXdXZ.mXSXSXSXbXt.` 7 D ] bXJXSXSXSXMXSXSXl.hXMXhXmXMXV 5 v xXxX} ^ ! {.W.~.^.U.).E.E.E.~.~.E.E.~.~.~.E.~.~.~.~.~.~.~.~.~.~.).).).).(.(.(.(.(.(.(.(.(.(.", +"f ~ ` PXR.l l j Y ~ { uXFXLXJXHXFXuX~ W f f d a } HXZXxXyXn d n Z.H 7 j P l j r p & o @ @ @ o 7 X 9 D ] V 5 hXbXqXv.] G D ` n ` G ' 0X9XmXmXz.G 9.9.3 8 ] hXgX9XwXv D z > $ l ! W.~.^.U.).E.~.E.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.^.~.)./.(././.(.(.(.(.(.(.(.(.(.(.", +"g W ^ DX( l l q L W r b ` CXLXLXPXPXR.k k ^ | 8XCXHXbXxX{ < d v Z.J 7 j l d r * . > 2 o . @ 2 = 7 X X 5 D 5 5 5 9 9 9 @ 7 7 2 v 7 7 v 9 v V D G qXgXxXD 3 3 ' z.D 9 2 > 1 # d u Y.W.~.~.).E.W.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.^.~.)././././.(.(.(.(.(.(.(.(.(.(.", +"U U / eXP P l f L L d r b CXPXR. XUXDX/ k ~ ` 7XCXZXZXyXv p k v B.-.o d l i * * & o o 2 @ . & . < & o 7 o 7 2 @ @ @ 7 2 v < z < z 7 2 7 9 7 5 9 ] z.ZXCX` 7 5 X @ @ & . o # % u _ W.E.E.E.E.E././././././.~.~.~.~.~.~.~.~.~.~.~././.(.(./.(.(.(.(.(.(.(.(.(.(.(.", +"f U ~ / L U k f U Y k x d DXVX~ x W {.[ f d 2 7 t.ZXZXxX} x k z x.-.3 d a $ & & . 2 o . @ . # p # , & . > & o z 7 2 2 2 o & < & < . > 7 > 7 7 7 v ' m 7 @ 2 . @ . + . > . > % y _ W.E.E.E.E.~./././.(.(././.~.~.(.(.~./.~.~.~.~.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.", +"I T P P ^ ~ k k L U q l ~ DX{.W W Q Q ~ d * * o { HXxXVXCX^ q z x.>.5 i , # & & > o > . + + > . # . * * . < & . o o 2 7 & 2 2 2 > > < > 2 7 o o @ . @ . o . . + . . # & . . ; u / ].W././././.(././.(.(././././.(.(.(.(.(.(././.(.(.(.(.(.(.(.(.(.(.(.(.(.(.}.}.", +"E Q L P Q Q P f f L k k ^ BXU ~ P W T Y j i * * XFX` b 7XR.l 7 l.>.7 , # # < o o . > . - - - $ # # . & , . & . o o o . . o . o o . . . . . o o o @ . . . . 2 . + . - . > > . w _ ].W./././.~.(./.(.(.(.(././.(.(.(.(.(.(.(.(.(.(./.(.(.).).(.(.(.(.(.(.(.(.(.}.", +"I U U U T Q k h L L h P Q / T L U T T U j 0 0 r 7XuXd r d ^ l < r.0.5 ; - - - & . > # # - + % # . . + . # # . . . . . . . . . . & # . . o o o o . o o . . . . . + . # # . > ; w _ ].]./.E.(.(.}.(.(.(.(./././././.(.(.(.(.(.(.(././././.(.(.(.(._.(.(.(.(.(.(.(.", +"L U U U T Q k q k L k P U Q U U U T T U k q q r X( j d 0 t y 7 r.0.@ ; + - - & . > & . . - - , - + + + . . + > . . . . . . . . . . . . o o o o o o o . . . . . . . % . . . - t / ].].]./.`.(.|.(.(._._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.", +"L U U T T Q k q k k k P I I I T R R T U L f q f / L W q w s s 2 0.r.X ; % - # # > > . # > + . . . . . @ @ o . o o o o o o o o o o o o o o o X X o o o o o . # # - . # > o . # w ^ ].].'./.`.(.}.(._.`.`.`._._._.`.`.`.`._.(.(.(._._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.", +"L U I T R Q j q k k h L I I R T R R T U L f q f E T U f j j 0 7 0.l.X ; % - # . . # . . . . o @ X X X X X X X 3 3 3 3 3 o o 3 3 o o 3 3 3 3 3 3 3 3 X X o X o o . . . & o o - % ! ].].'./.(.(.}.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.(.`.`._.(.(.(.(.(.(.(.(.(.(.(.(.(.", +"k U U T R Q k q l k f L T I T T R R T U k f 0 q I R E L q q q 7 >.l.X , % + . . . & = o @ X X X 3 4 N N N V V V V N N N N N N N N N V V F F H H H H F V 8 3 3 3 o . & o . . > % P ].].'./.'._.}.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.(.(.(._._.`.(.(.(.(.(.(._._.", +"k P U T R Q k q k k k L T I T T R R T U k q 0 q I I T f w j j 6 >.r.3 - . + + . > . X @ X X 3 N F 6.r.y.y.y.y.y.y.r.r.0.6.7.6.7.7.6.6.0.r.y.B.B.y.y.x.x.y.7.V 3 X . & & @ . # % h ].].'.'.'.`.}.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._._._._.(._._.}.", +"k P U T Q Q k q f l k L T E T T R R R U j 0 0 y k E I L k j q 7 0.<.3 # . + . . o o X X 3 9 ' c.Z.A.aXaXaXaXjXjXjXA.A.A.S.B.S.B.S.S.A.A.G.K.K.G.A.C.C.Z.A.Z.r.' 9 o X o o @ - ; u ].].'.'.'.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.}.}.`.`.`.`.`._._._.}.}.", +"d W U R R Q k q f k g L T I Q R T R R U j 0 0 y k L I I f f f 6 r.>.3 # . . . . X 7 7 8 G t.pXaXaXA.A.fXzXzXzXlXzXjXzXlXzXzXzXzXkXzXkXzXlXlXzXjXK.K.K.A.A.K.Z.c.t.G 5 3 X o . t u '.'.'.'.'.'.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.}.`.}.}.`.`.`.`.`.`.}.}.}.}.", +"` b U Q R Q k q q l L L L T T R T T R U k 0 0 t j U I E L f f 7 r.r.X . . @ o o v ' F H y.Z.fXfXK.jXjXzXzXzXzXlXcXlXzXlXzXzXnXcXzXlXlXlXzXnXnXcXlXjXzXA.jXA.J.B.c.t.-.D 3 X & % K '.'.].'.'.oX`.oX`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.}.}.`.}.}.}.#X#X", +"xXz W Q I _ ~ y j j f U I I U U U R T U k q 0 t k U I L L f f = 0.l.X @ @ . . 9 ' ' H 0.B.A.fXfXjXjXzXzXzXlXcXcXzXzXlXnXcXzXzXzXcXcXlXcXzXzXzXzXzXcXjXA.G.A.C.B.Z.y.e.-.D o @ % K '.'./.'.'.'.oXoXoX`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.}.}.}.}.}.}.}.}.}.}.", +"HX7Xx ^ eXBXM $ l x Y U R R I R I I T U k q 0 y k U I I k j j = 0.l.X > o o 7 D ' H 7.y.B.A.fXfXjXzXzXzXzXzXjXjXzXzXlXnXlXzXzXzXjXzXzXsXsXD.B.e.x.x.S.A.B.B.S.Z.Z.c.l.e.' 7 @ , ! [.'.`.'.'.oX#XoXoXoXoXoXoXoXoXoXoXoXoXoX`.`.`.`.}.}.#X#X}.#X#X}.}.}.#X}.#X}.}.", +"AXZX{ CXPX| d 0 ` R.d Y U R I U E L R U k q q y L U U U k h l o r.l.X > . o v D H H r.x.l.B.A.A.B.B.B.e.e.e.B.S.jXzXzXlXzXzXcXzXfXjXjXD.D.a.q.e.r.e.Z.A.jXA.Z.Z.Z.c.e.e.9.G 5 # ^ [.'.`.'.'.'.'.oXoXoXoX#X#XoXoX#XoXoXoXoXoXoXoX#X#X#X#X#X#X#X#X}.}.#X#X#X#X#X#X", +"ZXHXHXGXVXb i i ` FX^ W Y g ~ P k L U I k q q q L U I U k q y @ >.l.X $ & 7 9 F ' 7.r.e.x.Z.A.A.A.V.a.a.a.f.B.A.A.jXzXzXzXzXlXzXzXfXA.D.D.8.*.=.*.6.r.B.fXaXfXc.c.Z.B.9.t.` v 7 ^ @XoX'.'.#X%X}.#XoXoXoX#X#X#XoXoXoXoXoX#X#X#XoX#X#X#X#X#X#X}.}.#X#X}.}.#X#X$X$X", +"HXAXZXFX{ x b # { FXrXx x {.eX^ k L U L k q 0 q f L E E f 0 t @ >.<.X , & 7 G 7.7.9.r.x.Z.Z.S.S.B.e.0.6.6.0.0.0.B.A.jXK.A.jXlXzXjXfXA.g.i.:.%.*.O.Z F Z Z F F F H ' -.7.t.` v c [ @X@X'.oX=X#X#XoXoXoX#X#X#X#XoX#XoXoX#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X;X;X", +"ZXAXZXGX` b & & ` ZXHX} uXGX8Xl k L U L j r r 0 r W Y f q 0 i 5 w.>.5 , . 9 7.9.-.-.9.c.c.x.B.B.x.r.9.7.7.6.r.y.r.B.A.jXG.jXlXlXzXK.B.e.0.=.C N Z &.6.*.&.H N V t.' V F ' { v v [ @XoX'.oX#X`.#X#X#XoX#X#X#X#XoX#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X$X", +"AXJXHXFXIX^ x = ] ZXAXAXCXVXb j k L U Y d i & & x ^ ~ f q q i X 0.<.5 & 7 D 9.9.-.J H ' G V V N 4 8 N N N N V Z $.r.G.lXlXzXlXnXlXK.b.0.C C 6.B.r.y.y.S.r.c.SX9.8 V A D ` ' D D R.eX+X%X$XoXoX$X#X#X#X#X#X#X#XoX&X#X#X#X#X#X#X#X#X#X#X#X%X%X#X#X#X#X#X#X#X#X#X#X", +"gXAXCXFXPXuXz D bXAXSXZXCX{ b k L L Y W r ` n v 7XtXx j w r r 3 0.>.8 2 9 ] y.9.H F 8 D D V N 0.cXaXy.r.r.B.S.*.O.Z <.n.kXkXL.L.F.p.;.0.jXy.9.V N N F F r.r.c.MXD V ' F D ' u.' XR.+X%X$X$XoX#X#X#X#X#X#X#X#X#X#X#X%X&X&X%X#X#X#X#X#X%X%X%X#X#X%X#X#X#X#X#X;X;X", +"z.ZX` ( { eX{ n CXZXZXZXxXm x k L U Y W r ` } z.iX` r w r r 0 3 0.>.8 D G 9.r.-.F V 3 8 3 N r.y.y.7.F V V N &.B.a.w.p.p.F.F.F.b.p.,.,.q.0.6.V H N V V N C $.H C H F V N V H r.9XgXrX[.*X&XOX&X=X%X%X%X#X#X#X#X#X&X&X&X&X&X&X%X%X%X%X%X%X%X%X%X#X#X#X#X%X%X;X=X=X", +"z.xXx ~ f x x z t.ZXAXAXCX} x Y U T U k p v ] ] } z r r 0 r s 6 r.r.8 D 9.r.6.C V V D D 8 7.9.r.' V N N N N Z F 0.;.;.s.n.p.a.p.3.1.p.p.;.Z O.V 4 N N N B o.o.%.0.-.H H &.r.f.6.y.yX@X:X'.oX-X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X%X%X%X%X#X%X%X%X&X=X=X=X", +"} } k W U k 0 & v CXAXCXGXCX~ f L T U k z D t.] 9 o p d w r d = >.l.N D c.e.0.6.F H V F V H F 6.V N V 4 4 N &.6.C O.%.s.i.F.zXkXF.n.M.s.;.i.8.=.&.O.F O.%.%.;.q.B.e.b.w.;.;.q.o.Z 0XeX:X[.@X-X'.&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X%X=X=X=X=X=X%X%X", +"[ ( Q L I U r * 7 CX8Xv } iXR.j L T U k r ( } t.{ . r r s 0 r 6 >.w.N ' y.$.$.=.6.6.6.r.6.$.O.O.O.C O.O.=.=.=.w.d.n.n.M.:.G.lXlXL.,.H.H.D.d.q.g.a.q.0.,.q.d.s.p.a.b.C.w.<.;.d.s.Z t. X[.:X;X;X=X&X&X&X&X&X&X&X&X=X=X=X=X&X&X&X&X&X&X&X=X=X=X=X=X&X=X=X=X=X;X;X%X", +"~ k L T T U 0 $ b CX` x x x ^ k L L U P d ( ' } 7X` r r s s 0 o 0.w.4 7.6.O.8.8.0.6.B.B.0.;.o.o.o.o.:.s.G.V.s.V.s.H.kXF.%.G.lXlXlXF.H.L.D.s.H.G.kXzXsXD.s.D.F.n.V.V.V.w.<.n.V.a.O.y. X[.:X;X;X2X=X=X=X=X=X=X=X=X=X=X=X=X=X&X&X&X&X&X=X=X=X=X=X=X%X=X=X=X=X=X=X=X", +"f k Y U L k 0 $ b 7Xj W Q L k q L U U Y r p 2 7 [ } d d 0 s t o r.r.4 F &.o.q.8.=.;.a.C.w.w.:.O.O.;.d.sXsXkXH.s.i.L.lXs.q.kXlXzXlXK.a.kXkXV.a.G.L.H.D.M.p.D.F.V.A.A.A.B.q.D.kXV.%.y.eXoX@X*X$X=X=X=X=X=X=X=X=X-X=X=X=X=X=X=X&X&X&X&X=X=X=X=X=X=X=X=X=X=X=X=X=X=X", +"k j L k P P q 0 x ^ Y Q R R L k h U U k j * # * p x k l q 0 t @ >.w.8 V 6.C a.g.q.%.w.n.p.p.d.q.:.i.i.V.s.i.q.d.lXkXH.,.V.lXlXlXzXlXs.G.K.lXkXn.n.i.p.i.p.p.G.C.B.V.B.B.a.q.V.A.=..X@X*XoX-X=X$X=X=X=X=X>X-X-X>X-X-X-X-X-X=X=X&X-X-X-X=X=X=X&X&X=X=X=X=X=X=X=X=X", +"j k L U U k q 0 j j Y U U L L L Y W L k y w ; $ 0 q h k q y y o >.w.4 8 r.O.V.s.8.%.d.s.n.p.n.q.%.i.p.a.a.f.sXlXlXzXF.q.kXlXnXcXnXnXjXB.zXlXlXnXlXkXG.V.V.G.L.F.V.n.b.b.8.o.i.D.r.t.@X+X@X*X-X>X>X-X*X*X*X-X*X*X*X*X-X>X-X*X&X*X-X-X-X-X=X=X&X&X=X=X=X=X=X=X=X=X", +"j k L U U k q 0 j f k Y Y k k L U W L k y u t 0 w j f f k y s 3 0.l.3 V r.=.D.s.:.%.i.i.n.n.V.q.,.s.G.kXlXnXnXcXlXnXb.C.zXlXcXnXnXlXnXS.G.zXlXlXlXlXzXK.K.K.F.V.V.n.,.C.d.o.;.S.c.8XeX:X@X;X-X=X>X-X*X*X*X-X*X*X>X-X-X-X-X*X*X*X-X-X-X-X=X=X=X=X=X=X=X=X=X-X-X=X", +"j k L L P j 0 0 j k L P Y k k L U U L h y 0 r r f f f f k w i 5 >.w.V 9XcXe.V.V.%.q.s.i.p.n.b.w.:.,.L.nXnXnXnXnXnXlXq.jXlXlXcXnXnXlXlXjXq.sXzXzXlXlXK.F.G.F.V.n.V.p.w.C.sX8.q.f.9X8X+X*X*X-X2X-X>X-X-X-X-X-X-X-X>X-X-X-X-X-X*X>X-X-X-X-X-X=X=X=X=X=X-X-X-X-X-X-X", +"h k L L P j 0 0 j k Y U P Y k Y Y U k h y w r r j r j f y t r X C C.c.hXcXA.K.p.w.A.C.q.<.p.a.b.p.i.F.lXcXnXlXzXjXq.q.G.kXlXcXlXnXnXnXzX0.:.s.H.G.G.G.K.kXkXF.n.a.e.b.C.kXD.q.y.0XeX+X*X*X-X-X=X>X>X-X-X-X-X-X-X>X-X-X-X>X-X-X>X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"h k L L k s $ $ y j L Y Y L L Y Y U k h y 0 r r r f k r r d & 9 w.C.c.hXcXA.G.n.C.jXG.q.<.p.w.b.D.i.p.D.kXkXV.i.;.:.D.H.kXlXnXcXcXlXlXlXsXi.8.8.:.;.a.G.G.G.F.a.a.a.l.C.kXs.q.S.8X@X:X>X-X-X>X=X>X-X-X-X-X>X-X-X-X-X*X>X>X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"k k L L l t $ $ y k L Y L L L Y Y P k h y 0 r r r f f s r # 7 t.J.P.c.hXMXfXC.G.C.K.K.a.q.i.w.p.F.M.i.:.%.;.;.:.o.s.kXH.kXzXcXlXlXlXzXzXsXH.8.H.H.H.sXkXD.V.V.a.b.e.B.A.G.q.V.B.8X@X*X-X-X-X2X2X>X>X-X-X>X>X>X-X-X-X-X>X>X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"k L L L l t % $ y k L I P P L L L Y h h y y s q r r r s * & ' hXK.J.x.hXcXx.B.K.C.A.J.b.i.i.p.b.a.F.D.s.V.H.V.i.:.H.D.V.G.sXzXzXjXG.sXV.s.s.:.q.H.kXkXH.D.n.n.V.b.e.B.A.b.V.G.c.eX:X>X-X&X*X*X&X>X>X-X-X>X>X>X>X>X-X>X>X>X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"k k L k j t # ; y k L I L L L k g L f h y y s 0 q r s r * D wXgXJ.P.x.cXMXl.b.C.jXA.C.e.q.i.a.b.p.n.V.H.sXkXV.%.o.;.O.%.q.q.f.B.B.f.8.:.Z O.B O.s.G.H.D.H.V.V.C.B.e.B.0.C.K.s.pXeX&X=X-X,X,XX>X-X-X>X>X>X>X>X>X>X>X>X-X-X>X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"f P k f ~ 0 $ ; j w I T L L f L Y P k y y y y % 0 w y i ` 0XgXhXP.P.x.cXhXl.x.A.b.b.%.w.p.i.a.n.p.n.V.D.G.V.:.o.V.q.Z Z C o.$.$.$.O.=.o.%.g.:.B :.s.g.s.V.n.V.C.V.B.e.q.q.w.A.9X+X-X=X>X*X*X*X,X*X>X>X>X>X-X>X>XX>X-X-X*X*X*X-X-X-X-X-X-X-X-X-X-X-X-X-X2X3X3X", +"d j f W s s $ % s k g L L k h g g k f y t t t t w y t | tXwXgXfXP.P.B.cXhXc.x.A.C.B.C.K.V.i.p.n.n.a.F.V.V.i.o.i.G.G.V.V.V.0.o.N C 8.g.V.g.D.i.Z B ;.d.s.s.s.V.C.B.C.kXG.K.C.fX0X+X=X=X-X*X*X*X:X*X>X>X>X>X-X>X>X>X>X>X-X*X*X*X*X-X-X-X-X-X-X-X-X-X-X-X-X-X-X>X>X", +"p d W / d $ i i 0 k P U P k L k g f q q i i $ i $ d 8XiXrXgXgXfXP.P.B.cXhXZ.x.S.jXA.jXkXsXa.p.n.F.n.n.V.i.O.:.D.H.D.H.V.H.H.g.q.a.V.s.V.s.a.V.q.B o.:.,.i.s.V.C.V.C.jXzXC.fXgX8X+X*X-X>X,X*X:X,X*X>X>X>X-X-X>X>X>X-X-X*X*X*X*X*X*X*X-X-X-X-X-X-X-X-X-X-X-X-X-X>X", +"( m X[ d s $ $ l q j k k k h f g k j 0 i , & * x 7XiXtXyXqXgXdXP.P.B.cXhXZ.r.e.jXzXjXlXjXa.b.V.C.n.a.p.%.o.s.D.H.H.G.H.G.G.sXH.sXH.V.V.D.V.H.s.O.B O.;.a.V.s.b.b.A.zXjXK.dX0X8X+X*X-X>X,X:X:X,X*X>X>X>X-X-X-X>X-X-X-X*X*X*X*X*X-X*X-X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"qX0X8Xx r r * $ 0 s j j j f g k g j j r * & 6 D XrXuXyXyXgXgXfXP.P.B.zXhXZ.9.=.A.jXjXzXr.e.V.b.F.b.n.<.o.:.s.D.G.sXsXkXsXkXlXzXzXsXsXD.H.G.G.V.s.O.o.:.i.s.V.C.B.B.zXjXB.c.7XeX+X*X-X>X>X*X*X-X-X>X>X>X-X-X-X>X-X-X*X*X*X*X-X-X-X*X*X*X-X-X-X-X-X-X-X-X-X-X-X-X", +"mXqX} z p z $ * b ` b j l w k k h f s i = 6 A u.rXrXyXxXqXqXxXfXJ.P.B.zXhXZ.-.H >.B.A.0.N -.e.C.C.C.n.:.o.p.d.H.G.sXG.kXsXkXlXzXzXkXsXsXsXG.G.V.V.i.o.d.n.V.F.b.B.*.r.B.e.9XeX@X+X*X-X-X-X*X*X-X-X-X>X>X-X-X-X>X-X-X-X-X-X-X-X-X*X*X*X*X-X-X*X*X-X-X-X-X-X-X-X-X", +"hXqXD z z e * ( R.[ d $ d s q q h h j r 6 c A u..XvXxXyXqXqXxXdXP.P.x.hXzXZ.7.H -.0.0.Z 4 H w.V.V.G.V.,.:.s.s.D.s.a.q.d.i.d.H.H.g.s.i.s.s.a.s.D.s.V.;.s.H.F.G.V.e.C F 6.fXwX+X+X+X+X-X-X-X*X-X-X-X-X>X-X-X*X-X>X>X>X-X-X-X-X>X>X*X*X*X*X*X*X*X*X-X-X-X-X-X-X-X-X", +"bXqX( z = p & ` } p d d 0 s q k q h j $ 6 c A &.y.gXxXxXyXqXgXhXP.P.B.fXzXZ.9.H H =.x.9.V V e.C.C.F.kXs.i.d.s.d.%.o.o.o.o.o.:.:.o.o.o.o.o.o.o.:.q.d.D.F.kXF.n.B.B.C *.c.c.z.eX+X:X:X-X5X-X-X>X>X-X-X>X-X-X-X-X>X>X>X>X-X-X>X>X>X-X*X*X*X*X*X-X*X*X-X-X-X-X-X-X-X", +"ZXxX.Xz z = . ` n x d s l q q h f j s r = A S S r.9XgXyXxXqXgXfXC.F.m.fXfXe.6.H F V D D V N 0.b.V.G.L.L.i.i.:.O.o.%.:.;.8.8.+.+.:.d.H.D.s.D.n.a.i.s.n.L.L.F.S.Z.e.H -.y.qXtX@X,X*X-X5X5X5X>X>X>X>X,X,X,X,X,X-X-XX,X*X>X>X*X*X-X-X-X>X-X-X-X*X*X-X-X-X-X-X-X2X", +"0XyXuX( = p . { ^ * d j j h y s r j s r 6 A S B 6.pXgXyXgXgXgXfXF.F.m.jXZ.0.>.;.Z N 3 9 v V =.b.b.n.G.L.V.p.a.p.s.s.g.H.sXsXH.sXsXH.G.sXH.D.s.n.V.p.F.L.F.n.A.B.9.H 9.c.yXtX+X+X-X2X5X5X5X-X>X>X>X>X,X,X>X>X-X-X>X,X,X*X*X*X*X>X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X>X", +"` = { } z & < 7X{ * d r q j 0 s s r y r 6 A S B ..g.gXgXgXgXgXfXF.P.B.fXZ.>.;.,.<.Z N N N N F w.p.n.L.F.n.p.M.n.s.n.n.V.H.sXsXH.H.D.H.V.d.p.n.F.F.p.F.L.n.n.B.x.-.H 9.0XtXeX+XX>X>X*X,X>X>X>X>X>X>X>X-X-X-X*X*X,X*X*X*X*X,X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X>X", +"z p r z r * & } Xx d r r s 0 s s s t * 6 N S B B r.gXgXgXgXhXfXP.P.B.J.Z.0.,.<.3.3.<.Z N N Z 0.a.b.V.F.M.3.n.M.s.p.p.p.i.q.8.;.:.:.8.q.p.D.F.V.V.a.M.M.M.a.B.r.J -.t.8X7X@X:XX>X,X,X,X>X>XX>X>X>X>X-X-X*X*X*X*X*X*X*X*X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"i d r s r * $ < } b d r d r 0 d y s i & 3 N B B B O.aXgXgXgXhXA.P.P.l.J.Z.0.,.<.3.2.k.k.<.Z N *.w.p.p.F.n.p.n.n.F.D.n.d.,.;.;.;.;.:.;.<.p.n.n.p.V.V.n.n.s.a.y.7.7.9.} 8XeX:XX>X>X>X>XX>X>X>X>X>XX*X*X*X*X*X*X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"y q j q $ r * * b x d r d q i i t i = 6 N B B B B ..h.aXgXgXhXZ.P.m.b.J.A.>.<.<.3.2.2.2.3.1.B *.q.n.p.p.,.n.D.s.p.s.s.a.V.G.G.G.D.V.V.a.p.p.p.n.C.V.s.D.i.a.y.H 9.t.} eX+X1XX>X>X,X>X>XX>X>X>X>XX>X*X>X>X>X*X>X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"l w h l s $ . & $ i s q j q y 0 t * 6 A B B B B B .+.aXaXaXgXZ.P.m.b.K.A.<.,.3.4.2.2.2.4.1...O.d.w.q.a.n.n.D.F.F.D.V.H.zXzXzXzXzXL.kXkXL.L.L.L.C.a.n.d.s.q.B.' } 8XeX+X+X,X,X,X,X,X,X>X2X3X3X3XXX>X>X>X>X>X>X>X>X-X-X-X-X-X-X-X-X-X-X-X-X-X", +"y l h s $ $ * & i 0 j f h q t ; , o 4 A S .B B B .. .g.aXaXgXZ.m.P.m.G.C.q.3.4.4.2.2.2.4.4.o.o.s.q.p.p.V.a.n.V.s.D.D.D.L.lXlXlXzXH.kXkXL.L.F.L.B.b.a.;.a.e.c.t.} eXeX+X>X>X,X,X,X,X,X2X2X3X3X3XX>XX>X>X>XX>X>X>X-X-X-X-X-X-X-X-X-X-X-X-X", +"y h j s r $ # # i t q y h q t , = c A S . .B B .X...+.aXpXpXx.k.N.m.n.n.,.p.4.4.2.2.2.4.3.Z B e.b.q.w.p.b.p.n.n.M.n.n.F.F.L.kXH.G.kXzXkXL.C.C.e.0.;.q.q.r.y.t. XeX:X1X3X2X1X,X,X,X,X>X2X2X3X3XX>XX>X>X>XX>X>X>X-X-X-X-X-X-X-X-X-X-X-X", +"y s s s r $ # # $ d l q q q i = c A S ..X.X.B B .X...@.f.S.aXe.k.N.k.p.p.<.3.4.3.2.2.2.3.,.Z F A.b.;.;.w.p.,.p.n.n.n.p.n.n.F.V.V.D.G.A.F.F.n.e.0.$.%.o.%.x.y.D 7X[.+X5X3X3X-X>X,X,X,X,X>X>XX>X>X>XX>X>X-X-X-X-X-X-X-X-X-X-X-X-X", +"r s s i r $ # # ; d j q r d = 6 A S S ..X.X. .X. .....B :.S.aXe.k.N.k.<.<.<.3.<.2.2.2.k.<.$.8 gXaXB.r.%.$.%.%.;.a.n.b.a.s.e.e.q.e.g.B.f.a.a.q.=.F C Z C r.Z.t.o ^ R.+X5X3X6X6X2X>X,X,X,X>X>XX>X>XX>X-X-X-X-X-X-X-X-X-X-X-X-X", +"r s s r r $ # - ; i q r r 6 6 A S S ....X.X. . . ..... .o.g.S.b.k.N.k.<.<.1.3.3.k.2.2.3.;.4 9 AXc.S.f.*.Z N Z C =.0.q.0.=.$.&.=.6.6.6.=.=.%.%.o.Z N Z r.B.Z.t.X < M T.:X5X3X3X4X3XX>X>X>XX>X-X-X-X-X-X-X-X-X-X-X-X-X", +"s s s r r $ # - ; i r r 6 6 N S S .X.X.X.X. .B . . . .B i.V.b.k.N.k.<.<.:.3.3.3.4.k.<.4 X t.bX9.S.f.e.$.N N N Z F F Z V N V F F V N N Z Z C o.Z Z 0.B.B.Z.t.@ > $ y {.NX3X3X-X3X3XX>X>X>X>XX>X>X-X-X-X-X-X-X-X-X-X-X-X", +"j j j r 0 $ # ; i p p 6 8 A S .. .X.X.X.X. . .B B B ..B X.:.D.,.k.N.k.1.:.%.p.<.,.<.-.8 X X wXgXH S.f.f.r.C C Z Z Z N 4 4 8 8 4 4 4 4 4 N C $.$.F 6.f.a.Z.Z.t.o . - $ y [ +X1X6X3X4X4XXX>X>XX>X>X>X-X>X>X>X>X2X2X2X2X", +"j j j q 0 $ # ; , * c c A S .. . .X.X.X.X. .B B B B .. .X.+.D.;.k.N.N.1.1.%.w.%.0.V 3 3 = & xXgXZ A.B.e.r.*.&.&.&.H V N 8 8 3 3 3 4 N V F =.6.*.*.0.e.B.B.pXz.X < # # ; % ^ @X,X>X3X4X3X1XX>XX>XX>X>X>X>X>X>X>X2X2X2X2X", +"j j j q 0 $ # - , z ( ) S S ..X. .X.X.X.X.X.B B B S B ..X.X.g.;.m.N.P.1.%.$.r.H 3 3 @ o * . CXmXV C.B.e.e.;.$.6.=.7.F V N 8 8 8 4 N V F &.6.6.*.6.f.e.B.B.mXt.o # , & . - + h _ @X:X1XNX1XX>XX>X>X>X>X2X2X2X", +"s s d w r $ # . 7 } vXXXS ..X.X.X.X.X.X.X.B B B B B B X.....f.;.m.L.P.-.Z N 3 X o o # # # & CXZXF e.B.e.e.;.;.=.6.6.&.F Z V N 8 N N Z C =.6.*.*.0.f.e.B.hXZX} ; # # & & # # ; u w ! {.+XNX,X,X4X1XXX3X4X4X1XX*X*X*X-X.Z 3 X X . . # # # # > @ CXZXF 0.A.e.0.q.;.=.;.=.O.O.C Z V V F C O.%.6.;.%.;.e.e.B.Z.SXAX| % # # # # # # # # ; t u h _ +XNX+XX>X4X4XX , i t t y h h ^ T.+X+X+X1X1XX>X>X # # # # # # # # & # # i d i r t h w h {.eXNX1X1X,X,X1X1X1XX4XX,X,X & o XFXHXt.&.f.a.,.w.<.q.0.=.&.*.*.=.8.;.:.;.0.q.;.;.e.0.pXAXZXPXVXo & # # # # # # # # & & < < , * , a i d y y l / T.+XNX1X1X1X,X,X1X4XX>X>X-X5X > > + + + . . . & # # | CXHXZXF 0.s.,.<.w.w.;.=.&.=.*.;.8.;.:.;.w.q.;.0.r.r.ZXAXGXGX} = o # # # # # # # # & & & < < < , < , i i i t y h h ^ _ ].+X1XNX1X,X1XX2X>X-X-X5X5X5X5X", +"s q q 0 , o 9 9XgXgXxXyXxXCXgXD 3 o o @ + + + . - . # - > # , . > . . . @ . . . . . . # # , | IXHXHXt.F e.a.,.<.w.;.=.&.=.%.;.8.;.;.;.q.;.=.=.-.hXAXHXGXGX` o & . # # . . . # # & < < * , < < > < < , , i d s y h l h h ! [ @XNX1X1X1X1XX-X3X2X>X-X5X-X5X-X", +"j q s 0 * o 9 9XgXxXxXyXtX X7 o o o . + . . . . & # # - - - - + + . . . o o . . > . # . # # ` IXFXLXZXF =.e.p.<.w.q.=.*.*.o.;.;.;.=.,.q.;.*.F c.ZXJXHXGXFX< & . . . # . . # # # # # * , i i , , < < < p i i i i s d l l y q l ! T.NX1X,X,X1X*XX>X2X2X-X-X5X5X", +"y y r r = o 5 9XqXbXwX7 2 2 . 2 & & & > # # & o & & # + + . . . . . . . o & & & # # , > - # n GXFXHXJXmX&.r.w.p.w.e.=.$.=.C $.$.$.=.%.w.;.C 9.ZXHXHXLXGX7X& $ # . . # . . . # # * , , , i i i i < < < < < p p p a i i d d s s j h ! T.NX1X,X,X*XX2X2X-X-X5X5X", +"0 s r r p & @ qXbXyX7 2 o & > & & = & & & # & # . . . . o o o o . . . # # & * * * * * , # & z FXPXHXLXAXZX6.a.s.e.e.6.*.=.C $.*.$.O.0.0.$.7.AXHXKXPXPXGXD . $ # . . . # # # # # * ; ; ; i i i i , < p p < < < < z < < p a p i r y h L _ @XeX1X,XX-X-X-X-X", +"i i $ r * & o wXxX` o < . # # # = = & & & & # - . . . . o o o o # # # # $ $ $ * * * * & . & 2 tXFXLXPXLXJXcX6.g.A.e.r.0.%.C *.&.$.&.e.0.H SXHXKXKXLXPXCX2 . # # & # # # . # # - # $ ; ; i t i i i i i i < < < < 7 < < < < < < p d s y h h ^ [.1X:X5X5X5X-X-X-X-X", +"p = * * * & o 0XyXo 7 . $ 1 # > & & & & & > - - . . . . o o o o # # # $ $ $ $ $ $ # * * & & & ` FXGXKXKXLXJXpX6.B.B.b.e.=.$.r.&.&.y.r.H SXLXLXKXKXKXLX X& & & & > # # # # - - - # - ; i i i i i i i i i , , < < < < < < < < p a a x i t y h / NX:X5X5X5X-X-X-X-X", +"v = * i # & = 0X' o . 1 , . & > - - & & & > & - . . . . . . . . # # # # # # # # # # & & , & < < xXFXPXKXKXLXJXc.r.B.A.B.e.0.y.0.r.y.7.AXLXLXKXKXKXKXPXn , > & > > > # # - - > > > , , i i i i i i i i i i , p < p , < , p i , , & & z i t y u [.:X > . + - & & & & & & # # # # . . . . . o o . . . . + + + + . - # p * t.GXPXKXKXKXJXJXx.e.B.B.x.e.y.e.e.c.AXLXLXKXKXKXKXKXtX# , > > > , ; # # - > > > > > > , , , i i i i i i i i i p i i , i i i t $ 7 o 7 > $ s u _ :X5X5X5X5X-X-X-X", +"yXD & > # # o } o X > > - # o @ + + o o & & & & . # # # # # # . o o o o . . . . + . . . - # , p ` GXGXKXKXLXLXJXAXx.Z.fXMXnXcXcXcX9XAXKXKXKXKXKXKXLX| , , # < & , ; # - - > > > > > > > , , , i i i i i i i i i , i i i * t i i = 2 & > a % y K :X5X5X5X-X-X-X-X", +"xX8X3 o o o 2 n o o > > > > & & > - # & o . & # . . . # # # # . # o & o . . . . . . # # # & , , m IXGXLXKXKXKXKXLXJXHXAXAXZXxXwXD 5 D FXKXKXKXKXLXCX, , 1 > . > > > > > > > , , , , , , , , , , i i i i i i , , , , , , , , , , # > , , > - $ q @X:X5X3X-X>X*X>X", +"xXqXG X o o = z & & o > > & & # & # # . # # # # . . # # # # # . . # # - # # # # # # # # # # & & < tXPXPXLXKXKXKXKX8X` ` n v z < < < & m CXKXKXKXKX} , - > > > > > > > > , , , , , , , i , , , , i i i i i i , , i i i i , , * $ $ ; , , > & # 0 {.:X3X-X>X,X*X # # # . . . - - - # # # . . . . # # # # # # # # # # # # # & < } FXPXKXLXKXLX} < . a > & < > & > z > m IXKXLXGXb 1 , > < > > , , , , , , , , , , i i i i , , p i p p p p i i p p i , , * $ $ $ , , , & & - t ! 1X3X*X>X*X>X>X", +"gXgXgXt.3 7 7 & & & o & & & # # # - # # # # # . > > > # . . . # . . # # # # # # . # # # # # # & > ` FXKXKXKXLX{ > & 1 1 < a < & 1 o . . a n GXKX8X< , 1 > < > > , , , , , , , , p p p p i , , , i i i p p p i i i i , , * * * $ $ , * * & & - t h +X*X > # # . . . . . . - - # # # # . # # # # # # & , b CXPXLXKX| # & , , . > , > 1 > 2 < < > & ` GXn , > , > > < > , , , , , , , , a a p p p , , , , i i i i i i i i i , , , , * $ , * * * & # # $ q {.+XX3X-X", +"hXpXgX0X' 7 X o o o o & & & & & # # # - > # # . > > # # # # . . . # - # # # . . # # # # # # # # & a R.PXKX| , , , # & & & > & > & & & & . z # ` 1 # 1 > > > 1 > < < , , , , , , p p p p p i , , , i i i i i i i i i i i , , , * * * * * & # # $ q ! 1X:X,X > > > . . # . . . - # # . . . # # # # # # # # # # # # # & # a ` PX} , # # & . > > . > > # > 2 < & a . , 1 a > z , > , < > , , , , , , , , p p p p i , , , i i i i i i i p i i i , i , , * $ $ * * & # # $ t u [.+X,X > > . . . . . . - - # . . . # . # # # # . # # # # # > , , # z | & , > . # # > # . # . > & & < > # a , 1 , , , , & 1 > > , , , , , , , , p p p p i , , , , , , , , , , i , * , * , , , , $ $ * & & # # # % u _ +X,X-X3X3X", +"fXpXpX9Xt.9 X o o . . # # # & > # . . . . # # - > # . # # # . . . . . . # # # # # # # # # # # > , , a # - 1 . > 1 > > > < . > m 7 z m , , , , < , , , , , , , > , , , , , , i p p i , i p p , , , , , * * , , i , , , , , , , * $ $ $ # & & & - ; u P +X1X5X3X2X", +"fXpXpX9Xt.5 X o o . # # # # # # # - . . # # > > # . . # # # # . . . . . # # # # # # # # # # # & , , 1 > # # . > # # # 8XtXCXCXCXCXCXiX7Xa > , > , , , , , , , > , > > > , , , , , , , i p p < , , , , * * , , i i , , , , , * * $ $ $ # # # # # # % y [.:X > > - # . . . # # # # # . . # # # # # # # # # # # # # ; , , & , 1 & 1 , | CXPXKXKXKXKXKXPXIX| 1 > # > > > , , , , > , , > > & > , , , , , p p p , , , , , * * , , , i , , , * * * $ , , ; - # # # # # % % [ +X1X3X3X", +"fXdXpX9Xt.3 o o o # # # # # # . - - - - # > > > # . . . . # - # # # # # # # # # # & # # # # # # # ; ; , > , 1 # > 1 uXIXKXKXLXKXKXKXPXIX} 1 # , > > > , , , > > , , > > , , , , , , , p p i , , , , , * * * , , , , , * * * * $ , # # # # # # # # # % ^ :X1X2X3X", +"fXdX9X9Xt.X o o o # . . # # # # . . . # # # # # - # . . . # # # # - - - # # # # # # # # # # # # , # # , , > < a < { CXLXKXKXKXKXKXKXPXGX( > , ; , , , , , , , < , , , , , , , , , i p p i , & # , , , * $ $ * , , , * * * * * $ # # # # # $ $ # o . $ P NX1X3X2X", +"fXdXpX9X' X o o # # . . # # # & . . # # # # # # > > # . . # # # - - # - # # # # # # # # # # # # # ; , , a 1 > > n tXFXKXKXKXKXKXKXPXGXtX, , a # , , , , , , , < , , , , , , , , p p p i , * # # , , * * $ $ * , , * * * * * * # # # . # # $ * # o . ; u +X1X3X2X", +"fXpXpX9XG X o o # # # # # # # # . . . . - # # # > > - . # . . . . . # # # # # # # # # # # # # # # , , # , , & m 7XCXLXKXKXKXKXKXKXPXCX` , , 1 , , , 1 1 , , , , , < , , , , i i p p i , * $ & & , , , , * $ * , , , * * * * $ # # # . . # $ * & o . # w [.1X @ - . > > - # # . . . . . # # # # # # # # # # # # # & , # , a a # m 7XCXGXKXKXLXKXKXKXPXCXuX< 1 a , i 1 1 1 1 , > > , 1 1 1 < 1 , p a p p < , $ # & * , , , , , ; , , , , , * & & # # # # . # # $ $ # & & # y {.1X & # . . # # # . . > . 1 @ . @ > . . > . . . . . 2 & . # # > . > > & # # # # & , # a , a , 7XCXGXKXLXKXKXKXKXLXCXVX( z a 1 , i a 1 , , > > > > 1 - 1 , , 1 , , , & = o , # * = < & , $ , , ; , , - ; & & & # # $ # & # # # $ $ ; # $ t [ NX4X3X", +"aXpXpX9X9 X & # & & & o . . # # > . . 1 . . 1 . @ @ o 2 . o > > . . . & , < . 1 & & & # # # # # # , , , i M R.CXFXKXKXKXKXKXPXIXrX} z < < a , 1 1 1 , < , > > > < > < a 1 , a < < = = = . & = 6 7 & a # - % ; , , # # # & & & - # # # & # # $ $ $ $ $ 0 _ NX4X3X", +"fXZ.9X9X5 X & # # # & o . . # # . o 8X8X8X} } | ` ` n m 2 > o . 2 & > & . < . # # & # # # # # # # 1 # , , a ` iXIXPXLXKXKXLXCX7X} n , , , a , , < < < < < > > , , a < < , , < = 6 6 6 c 6 c 6 6 6 6 , ; t : & & = * & & & & . # # # # & # # $ $ $ ; * 0 ^ NX4X4X", +"fXZ.9X9XX o & # # . o o # . # # 7 . 8XxXKXKXLX7X7X7XrXuXiXxXtXrX8X X{ ` & . 1 > # & # # # # # # # , # , , , a 7XVXHXKXLXLXFXrX{ ` i i a i a i , i < p < < , , , * x p p p < 1 ` D ) ) ) ) ) ) ) ) u.2 + + ; o = & & o > * # # - # # # o # # $ $ $ ; * 0 ! NX3X4X", +"dXZ.9Xz.X o & # . # o o & # # # . z 8XCXLXKXCXt.8X7X7XrXtXiXxXxXiXiXtXtX{ > . . & & > # # # # # & # , a i i , | iXFXLXHXZX7X} } n t i i a $ i p i p p p p , , , d r * < z & o 8X5.5.5.5.5.5.5.5.5.vX7 + ; , = = 2 > @ > $ % . . # # # & # # $ $ # ; # $ l +X & & & & & # # - > , # , , i a , m uXVXZXFXtX X8X8Xi t i i a * p p p p p i i 1 , , ; i x = < < 6 0X5.5.5.5.5.5.5.5.5.vXv @ = = 8 3 3 3 X 2 , % # . # # # & & & ; ; ; - , $ h [.1X4X", +"pXpXpX' o o . # & & o o . . # # < D yXCXCXVXFX7X8XuXVXCXCXCXVXCXCXVXxXiXVX7X` . & & & & # & > > , , , , , i a & 8XCXFXxX8XrXVX` , i p , p p p p i a i i , 1 , , 1 > 6 7 { rXu.u.u.) .Xu.u.u.XXu..X7X' t.u.7.O.@.O.7.9.] ( r o o # # & & > > ; ; ; , < , y {.1X4X", +"pXpX9XD o o . & > o o o . . # # & ` XuXFXFX7Xt.8XrXrXrXtXuXuXiXiXuXyXtXuXtX7Xz & & & & # # > > # , # a i * a < ` VXxXrX8X8X7X= < * < * * p , , i a i 1 , , , > @ 5 A ' yXPXvXu..X} uX X.Xu.vX{ BX} ] cXXXh.+.j.+.h.pX9X' = o = & - & > > > ; ; - # , $ y [ 1X4X", +"dX9X9X9 o > # # . . o o . . # # & n { } } } X7X7X7X7XrXtXtXuXuXtXtXtXtXrXrX7Xz # & # & # # # # > , ; ; , , , < & uXyX} ` 8Xv & < * * * * , , , i , , , < < < 7 4 V O.u.vXPXvXu..X{ VX X7Xt.vX} BXR.9.aXg.h.j.#.#.h.g.pX' z & > & > > > > $ ; ; ; > , $ y / 1X4X", +"dXpX9X9 @ > . # # . o o o o & > . & & # . . < z m n n ` ` { } } 8X7X8X7X7X7X7Xz # # # # # # # # > > , , , * , * < ' 8X` D { & = , , , , , , , , ; ; , < = 6 6 8 Z *.8.8.5.h.5.u. XrX8X X X7Xu.t.8X} ' 8.5.j.#.#.#.#.+.r.A & . > # > > > , ; ; ; ; > > , y ^ NXNX", +"pXpXz.5 @ > . - . . o o o . # # # # . # & & # # & & & # . . # & & & 2 z m n n & # . # # # # # > > & # # $ * * & = 7 ` D ( c & & # - - - , , 1 1 1 1 , 2 6 c A F 0.G.G.D.+.j.5.XXrXVX` 7XiXGX( { uXrXu.5.j.#.#.#.#.#.+.h.c * # > # & > > , , ; ; ; - > i t h NX4X", +"pXpXt.X @ > . > . . . o . . # # . . . # # - # # # # # # # # # & & . o & . . # & # # . # # # # & > & # # $ $ # & & & 7 ( D . < & # - - - - ; 1 1 1 1 , = 6 c D F e.K.A.B.+.+.5.u.rXVX| 7XrXCX' t.uX.Xu.5.j.+.+.+.+.+.+.y.v ; . . # , > > , ; ; ; ; > > i t u NX4X", +"pX9X] X o & . # # . o o o . # # - > > . . . . # . . # # # # # # o o 2 . # < & . # # # # # # # # & & # # # # # # & & > m < > # , - - - - - - , , 1 , > 2 7 c A A F H F D A A A A ( ( a M b ` c v n m c 4 N N 4 4 N 4 N N O . - , ; , > & & $ ; ; ; , , , t u NX1X", +"pX9X' X o & . . . . o o o o . # # + - > > > > # # > > > > > > & > & < . . & . # # # # # # # # # & & & # # # # - > & > & . < # - - - - - > , < 1 , ; - > < 7 6 6 6 7 o 7 6 6 7 z z < i a z < , 1 < < 6 c o 2 @ @ 7 3 3 X = . - - ; , * & * $ ; ; ; , , * t u @X1X", +"pX9XD X o . . . . . . . . . . . > . . . . . # & # & # # . . . . . . > & , . . > # # # # # # # # & # # # # - - , & , > > # - , # - - , * < < p < , ; ; - , > < < p < z z a < = 7 z z a , p x d - , < < z < , , p = < z = = o . # , * * * * $ ; ; ; - , # t u {.NX", +"pXc.D X o . # # . . o o o o # & # . @ > - > & & & & & & & & & & > . > . > # , # # # # . # # # # & . # # # ; ; , , . # > . - , , , , , < z 6 = * # ; : : : , 1 1 i i p p ; a 7 7 < < < z z = i i , 1 < & , p i r r r * * o & & > $ * , , * , ; ; ; # , # i q _ NX" +}; diff --git a/Tests/test_file_xpm.py b/Tests/test_file_xpm.py index b604f07f5..7b0429301 100644 --- a/Tests/test_file_xpm.py +++ b/Tests/test_file_xpm.py @@ -17,7 +17,12 @@ def test_sanity() -> None: assert im.format == "XPM" # large error due to quantization->44 colors. - assert_image_similar(im.convert("RGB"), hopper("RGB"), 23) + assert_image_similar(im.convert("RGB"), hopper(), 23) + + +def test_read_bpp2() -> None: + with Image.open("Tests/images/hopper_bpp2.xpm") as im: + assert_image_similar(im.convert("RGB"), hopper(), 11) def test_invalid_file() -> None: diff --git a/src/PIL/XpmImagePlugin.py b/src/PIL/XpmImagePlugin.py index 304f58361..fcee142e3 100644 --- a/src/PIL/XpmImagePlugin.py +++ b/src/PIL/XpmImagePlugin.py @@ -56,7 +56,7 @@ class XpmImageFile(ImageFile.ImageFile): palette_length = int(m.group(3)) bpp = int(m.group(4)) - if palette_length > 256 or bpp != 1: + if palette_length > 256: msg = "cannot read this XPM file" raise ValueError(msg) @@ -68,8 +68,8 @@ class XpmImageFile(ImageFile.ImageFile): for _ in range(palette_length): s = self.fp.readline().rstrip() - c = s[1] - s = s[2:-2].split() + c = s[1 : bpp + 1] + s = s[bpp + 1 : -2].split() for i in range(0, len(s), 2): if s[i] == b"c": @@ -98,7 +98,9 @@ class XpmImageFile(ImageFile.ImageFile): palette_keys = tuple(palette.keys()) self.tile = [ - ImageFile._Tile("xpm", (0, 0) + self.size, self.fp.tell(), (palette_keys,)) + ImageFile._Tile( + "xpm", (0, 0) + self.size, self.fp.tell(), (bpp, palette_keys) + ) ] def load_read(self, read_bytes: int) -> bytes: @@ -120,12 +122,13 @@ class XpmDecoder(ImageFile.PyDecoder): self.fd.readline() # Read '/* pixels */' data = bytearray() - palette_keys = self.args[0] + bpp, palette_keys = self.args dest_length = self.state.xsize * self.state.ysize while len(data) < dest_length: s = self.fd.readline().rstrip()[1:] s = s[: -1 if s.endswith(b'"') else -2] - for key in s: + for i in range(0, len(s), bpp): + key = s[i : i + bpp] data += o8(palette_keys.index(key)) self.set_as_raw(bytes(data)) return -1, 0 From 395bd6bd12138ec5b6b97ff172758446895cc9c6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 10 Apr 2025 18:56:15 +1000 Subject: [PATCH 052/268] Allow more than 256 colours --- Tests/images/hopper_rgb.xpm | 11174 +++++++++++++++++++++++++ Tests/test_file_xpm.py | 8 +- docs/handbook/image-file-formats.rst | 3 +- src/PIL/XpmImagePlugin.py | 41 +- 4 files changed, 11207 insertions(+), 19 deletions(-) create mode 100644 Tests/images/hopper_rgb.xpm diff --git a/Tests/images/hopper_rgb.xpm b/Tests/images/hopper_rgb.xpm new file mode 100644 index 000000000..063833b3a --- /dev/null +++ b/Tests/images/hopper_rgb.xpm @@ -0,0 +1,11174 @@ +/* XPM */ +static char *dummy[]={ +"128 128 11043 3", +".F0 c #000000", +".Jj c #000001", +"#94 c #000002", +".F5 c #000003", +"ax0 c #000004", +".Gy c #000005", +".HF c #000006", +".Mc c #000007", +"#G5 c #000008", +".F2 c #00000b", +".HC c #00000d", +".Dj c #000010", +"#g# c #000012", +".7l c #00001d", +"#aa c #00001e", +".qa c #000028", +".LB c #00002d", +".KU c #000100", +"aPY c #000102", +".KG c #000103", +".KV c #000104", +".KW c #000106", +"abf c #000107", +"acJ c #000108", +".EX c #00010e", +"#ve c #000114", +"#D2 c #000121", +".LC c #000127", +".Hv c #000200", +".Jo c #000201", +"aD6 c #000204", +"abc c #000205", +".SU c #000206", +".QD c #00020b", +"axP c #00020e", +".Hp c #000210", +"#7j c #000214", +"#Fs c #00021e", +"#eC c #000220", +"a.O c #000223", +".4f c #00022e", +".2z c #000230", +".Jn c #000300", +".Ky c #000304", +".Jk c #000305", +".Rr c #000307", +".IN c #000308", +"a#G c #00030a", +"aua c #000313", +".BL c #000314", +"#hQ c #000321", +".N5 c #000332", +".Kz c #000405", +".KX c #000407", +"aIk c #000408", +".KS c #00040a", +"aP7 c #00040c", +"#92 c #00040d", +"aCO c #00040f", +".Di c #000412", +"avW c #000417", +"#hF c #00041b", +"#kY c #000421", +"#mm c #000422", +".4e c #000436", +".T5 c #000437", +"ab# c #000507", +"aJL c #000508", +".KR c #00050a", +"az2 c #00050b", +"az4 c #00050f", +"#tr c #000512", +"#nM c #000522", +"aN2 c #000609", +"#uZ c #000616", +"#3T c #000617", +"atm c #00061f", +"#A5 c #00062b", +"#hW c #00062d", +"a#D c #000701", +"aPD c #000709", +".Jl c #00070a", +".IX c #00070f", +"#2x c #000715", +"#tb c #000716", +"#Fx c #000717", +"avo c #00071d", +".BN c #00071f", +"axg c #000720", +"#86 c #000722", +"#On c #000728", +"#Cy c #000729", +"arw c #000730", +"abe c #000809", +"#2w c #00080c", +".Jm c #00080d", +"#5D c #000818", +".A# c #00081d", +"axQ c #000820", +".IW c #00090f", +".IY c #000911", +"#ts c #00091b", +"asO c #000927", +"asc c #00092b", +"az3 c #000a11", +"awR c #000a25", +"asN c #000a26", +"#Rr c #000a2b", +"aOL c #000a2c", +"acE c #000b00", +"#tt c #000b1c", +"akR c #000b24", +"akS c #000b27", +"#87 c #000b29", +"aPH c #000b2d", +"aM1 c #000c2e", +"#D4 c #000c2f", +"#Cx c #000c30", +"atn c #000d28", +"aCB c #000e0a", +".Sa c #000f33", +"#7m c #000f35", +"#tq c #001020", +".TG c #001032", +"aiF c #001034", +"adG c #001232", +".QE c #001439", +".Vi c #00143a", +"#2y c #001c36", +"aAn c #010000", +".H0 c #010001", +"azp c #010002", +"adp c #010003", +".I. c #010008", +"#k3 c #010018", +".2A c #010020", +".lR c #010037", +".l2 c #01003f", +".IZ c #010107", +"awn c #01010a", +"#wx c #010124", +".DB c #01012f", +"acM c #010202", +"asx c #010204", +".Uv c #01020b", +"#x4 c #01020d", +".FX c #010301", +"as7 c #010304", +"aQD c #01030a", +"#7h c #010311", +"Qta c #010332", +"aK0 c #010405", +".Kq c #010406", +".Kk c #010409", +".Mh c #01040b", +".Mi c #010410", +"#5C c #010414", +"#K. c #010420", +".SH c #010424", +".ht c #010428", +".fZ c #010429", +"aPV c #010507", +".Kr c #010509", +"#8n c #01050e", +"ayT c #010513", +"#kL c #010518", +"#jl c #01051a", +"#p# c #010523", +".IU c #010609", +"#7i c #010615", +"#mc c #010616", +"awo c #010618", +".Xt c #010622", +"#qx c #010623", +"#rX c #010624", +"aM. c #01070a", +"#rP c #010714", +"#qo c #010715", +"#VG c #010718", +"akQ c #01071d", +"ab6 c #010720", +"aIb c #010723", +".qc c #010731", +"#Rs c #010823", +"aGQ c #010824", +".IV c #01090d", +"#7k c #01091f", +"#Rp c #010929", +"acF c #010b10", +"#vc c #010d1c", +"#5F c #010d25", +".Go c #020000", +"agL c #020002", +"aai c #020003", +"aj6 c #020004", +"#Ls c #02000a", +"#7R c #020015", +"#eW c #020022", +".oS c #020032", +"#95 c #020102", +"aup c #020109", +"#x3 c #020113", +"#Fr c #020124", +".Oh c #02012f", +".oR c #020132", +".Ei c #020200", +".Kn c #020203", +".QC c #020207", +".I5 c #020209", +"ay4 c #020210", +"#PV c #020218", +"acm c #02021b", +"#M3 c #020225", +"#hT c #02022d", +"a#J c #020303", +"asA c #020304", +".KB c #020305", +"aL3 c #020306", +"aeQ c #020307", +"abg c #020309", +".Gz c #02030a", +"#3i c #02030c", +"avV c #02030e", +"#c5 c #020317", +".#Y c #020332", +"as4 c #020404", +"#93 c #020406", +".Jp c #020408", +"aMj c #02040b", +"#8m c #02040d", +"#ZI c #02040f", +".Ju c #020412", +"#wL c #020413", +"#Cs c #02041b", +"#Ly c #020420", +".Re c #020425", +".PJ c #02042a", +".5O c #020430", +"#2v c #020506", +".Kx c #020507", +".KQ c #020509", +".Jq c #02050a", +".SI c #020523", +".Lw c #020525", +"#nR c #020528", +".ew c #020529", +".bq c #02052a", +".Ip c #020534", +".Jr c #020608", +"a#H c #02060c", +"axf c #020613", +".Y2 c #020616", +"#o2 c #020617", +"#nB c #02061a", +"#SS c #020626", +"a#C c #020703", +".SV c #02070c", +"aD7 c #020710", +"#nC c #020713", +"#He c #020716", +"#jx c #020733", +"#o3 c #020810", +"ayR c #020818", +"a.M c #020820", +"#Ro c #020822", +"#hU c #020835", +"aP8 c #02090f", +"adF c #020924", +"#to c #020926", +"#SR c #02092b", +"ahw c #020a2a", +".eJ c #020a4b", +".iX c #020a4c", +"#vb c #020b20", +"#Rq c #020b2f", +"#D5 c #020c2d", +"#A4 c #020c32", +"ajL c #020d2a", +".Gq c #030000", +"azg c #030001", +".HO c #030002", +".H2 c #030003", +".I6 c #030005", +"ayY c #030006", +".F1 c #030010", +".HB c #030013", +".SM c #030037", +"aJP c #030103", +"abb c #030105", +"ami c #030108", +"axq c #030109", +"aAF c #03010b", +"az6 c #03010e", +"ay5 c #030111", +".nt c #03013b", +".QB c #030202", +"a#K c #030203", +"arQ c #030204", +"asF c #030205", +"aj7 c #030207", +"awP c #030208", +"avC c #03020a", +"#wN c #030214", +"#wu c #03021d", +"#c4 c #030221", +"#Lx c #030225", +".km c #030244", +".KF c #030305", +"aN9 c #030306", +"#8p c #030307", +"aeP c #030308", +".I3 c #030309", +".I4 c #03030a", +"#1l c #030312", +".FR c #030316", +"#P1 c #030326", +"#A2 c #030327", +".LS c #030400", +".FY c #030402", +"acL c #030404", +".KD c #030406", +"a.E c #030408", +"ahj c #030409", +".2e c #03040a", +"#43 c #03040c", +"#Yg c #03040f", +"aAb c #030412", +".bn c #030433", +"a#I c #030504", +"aOV c #030508", +"a#F c #03050d", +"avn c #030512", +"ae2 c #03051e", +".Lx c #030523", +".J9 c #030526", +".IA c #03052b", +".MH c #03052c", +".Sy c #030535", +".GY c #030539", +"aOY c #030608", +".Oo c #03060a", +".M2 c #03060b", +"#mb c #03061e", +"#kK c #030621", +"#jk c #030623", +"#hE c #030625", +".#1 c #03062a", +"Qte c #03062b", +".Lj c #03062c", +"aPW c #030709", +"aCJ c #03070a", +".PV c #03070c", +"aNh c #03070d", +"#1. c #03070e", +"aL4 c #03070f", +"aAa c #030714", +"am7 c #030718", +"#eD c #030719", +"#Oz c #03071d", +".Im c #03072d", +".Lk c #030731", +".5N c #030738", +".Op c #03080d", +"#SO c #03081c", +"aa9 c #030900", +"#qp c #03090e", +"#91 c #030912", +"#85 c #03091f", +"ajK c #030922", +".hE c #03093b", +"acD c #030a00", +"#rQ c #030a0d", +"aiD c #030a27", +"aav c #030b28", +"#jy c #030b36", +"aPw c #030c0e", +"ayP c #030c16", +"alW c #030d23", +"aiE c #030f30", +"#tp c #031026", +"aBf c #031114", +"#vd c #03111d", +"adI c #031539", +".xN c #040000", +".ET c #040001", +".KH c #040002", +".Oq c #040003", +".HU c #040004", +".Wj c #040005", +".HJ c #040007", +".HI c #040008", +"ayJ c #04000f", +"#MX c #040014", +".vH c #04001e", +"#jw c #040027", +"#IE c #040028", +".Gu c #040101", +".HP c #040102", +"aAD c #040105", +"aei c #040108", +"acn c #040111", +".Me c #040201", +".Ji c #040202", +".FD c #040203", +"aJN c #040204", +".F8 c #040205", +"ax9 c #040206", +"avU c #040208", +"ai3 c #040209", +"#8l c #04020a", +"avm c #04020b", +"aAE c #04020c", +"axM c #04020f", +".5K c #040212", +".0O c #040225", +".LM c #040304", +"arR c #040305", +"#8q c #040306", +".H7 c #040307", +"aqZ c #040308", +"av5 c #04030b", +"#Ub c #040312", +".Hq c #040314", +"aFs c #040315", +"aaQ c #04031d", +"#Ox c #040326", +".Q7 c #04032a", +".Px c #04032b", +".nw c #04033c", +".LR c #040400", +"acN c #040402", +"ann c #040405", +"anm c #040406", +".KP c #040407", +"aq0 c #040408", +"aBp c #040409", +".Mb c #04040a", +".EV c #04040b", +"aCM c #04040c", +"auN c #04040d", +"aCN c #04040e", +"#Rl c #04040f", +"#SM c #040413", +"aD8 c #040416", +".N2 c #04042b", +".DI c #040432", +".hH c #040447", +".KT c #040500", +"abk c #040505", +".KE c #040507", +"#3S c #040509", +"aBq c #04050a", +"aA# c #04050b", +"atl c #04050c", +"aeR c #04050d", +"#9Z c #04050f", +".Ea c #04051c", +"#tn c #04052a", +".cY c #040534", +".MT c #040535", +".df c #040547", +"abl c #040604", +"abj c #040607", +"aJK c #040608", +"aOX c #040609", +".Vh c #04060b", +"aI. c #04060d", +"#81 c #04060f", +"alS c #040618", +".MP c #040624", +".IB c #040627", +".Lv c #04062c", +".Ht c #040704", +".Hz c #040705", +".IT c #040709", +"aCK c #04070c", +".NA c #040712", +"#wv c #040717", +"aQE c #04071d", +"#Ha c #040722", +".Sx c #040732", +".Kw c #040809", +".IO c #04080d", +"aO# c #04080e", +"awQ c #040817", +".FQ c #040818", +"aiC c #040822", +".Q8 c #040833", +".2y c #04083c", +"abd c #04090b", +"aBo c #04090d", +"aKS c #040911", +".VT c #040933", +".g. c #04093b", +"ayy c #040a0a", +".Ks c #040a0e", +"aFt c #040a27", +".eG c #040a3c", +"ab. c #040b0d", +"aBh c #040b10", +"#IK c #040b21", +"aOd c #040c12", +"ab7 c #040c27", +".gb c #040c4e", +"ahx c #040d2f", +"aqL c #040e3e", +"aCC c #04100d", +"#88 c #041032", +"ajM c #041434", +"adH c #041738", +".EP c #050000", +"#2O c #050001", +".KI c #050002", +"aDl c #050004", +"#pf c #050009", +"#6e c #05000b", +"#yc c #050020", +".87 c #050024", +"amJ c #050106", +"al9 c #050107", +"#zt c #05010f", +"aaR c #050112", +".Ay c #050123", +"#u7 c #05013e", +"ail c #050206", +".J# c #050207", +"afv c #050209", +"#ZG c #05020a", +"#09 c #05020b", +"axN c #050211", +"#2L c #050221", +".Sw c #05022a", +"aN3 c #050304", +".Gw c #050305", +".Mf c #050307", +"ale c #050309", +"awI c #05030a", +"av6 c #05030b", +".3X c #05030c", +"awN c #05030e", +"a#E c #05030f", +"axd c #050310", +"aAc c #050313", +".5J c #050318", +"#qz c #05031d", +".2s c #050323", +".0V c #050326", +".Ed c #050403", +"alc c #050404", +"anl c #050406", +"arf c #050407", +"#6I c #050408", +"#44 c #050409", +".HH c #05040a", +".H9 c #05040b", +".I# c #05040c", +"awl c #05040d", +"awM c #05040e", +"#W8 c #05040f", +"aDB c #050411", +"#Rk c #050413", +"#Z0 c #050418", +".uj c #05041d", +"aaO c #05041f", +".4g c #050422", +".rw c #050426", +"#zz c #05042d", +"#u2 c #050430", +".kn c #050446", +".Ej c #050503", +"aee c #050504", +".O8 c #050506", +".KC c #050507", +"apj c #050508", +"apk c #050509", +"ajw c #05050a", +"aFp c #05050b", +".I2 c #05050c", +"#Rm c #05050d", +"#SN c #05050e", +"#YA c #05050f", +"#Z1 c #050510", +"aGP c #050515", +"#ST c #05051f", +".Fn c #050538", +"Qtx c #050548", +"asB c #050607", +"ay0 c #050609", +"ahi c #05060a", +"ay1 c #05060b", +"aqK c #05060c", +"asa c #05060e", +"#hX c #050624", +"#x6 c #050626", +"#Cv c #050628", +"#o4 c #05062d", +"#rR c #05062e", +"#eL c #05062f", +".Rg c #05063e", +".FV c #050705", +".IR c #050706", +"as6 c #050708", +"aOT c #050709", +"ayZ c #05070b", +"aGO c #05070e", +"aeS c #05070f", +"#zu c #05071f", +"#IG c #050723", +".K. c #050725", +".2v c #05072c", +".at c #050730", +".et c #050736", +".iR c #05073f", +"aA. c #05080c", +"aMk c #05080e", +"aJy c #050814", +"aJz c #050815", +"aPG c #05081e", +"ab5 c #050820", +".PK c #050826", +"#ms c #050827", +"aNi c #05090f", +"aFq c #050911", +"#90 c #050912", +"#Rt c #05091b", +"aOK c #05091f", +".iV c #05093f", +".iW c #050943", +"aD5 c #050a08", +"ayO c #050a13", +"#Hb c #050a20", +"#mr c #050a30", +"#zC c #050a34", +".da c #050a3c", +".g# c #050a3f", +".hF c #050a43", +".Kt c #050b11", +"#hP c #050b2d", +".bC c #050b3d", +"ayB c #050c11", +"#Uc c #050c1e", +"am8 c #050c20", +"#k1 c #050c35", +"#vf c #050d1e", +".a# c #050d4f", +"#5E c #050e22", +"QtH c #050e37", +"aD0 c #050f09", +"#tc c #050f16", +".BM c #050f25", +"#Hd c #050f27", +"aQB c #051112", +".W6 c #05193e", +".A9 c #060000", +".KJ c #060002", +".Nv c #060004", +"aMd c #060005", +".HT c #060008", +"#7S c #060009", +"#bK c #06000e", +"##9 c #06000f", +"#AW c #060010", +".7m c #06001c", +".xt c #060026", +".HV c #060103", +"ax4 c #060104", +"aNb c #060105", +"#8k c #060106", +".lM c #060125", +"#3k c #060205", +"ahh c #060206", +"aqj c #060207", +".HL c #060208", +"ak4 c #060209", +"aj0 c #06020a", +".k. c #060229", +".CE c #060303", +".O7 c #060304", +"#45 c #060305", +"awm c #060307", +".I8 c #060308", +"aef c #06030a", +".Zf c #060320", +".Ze c #060329", +".Wb c #06032d", +".Uo c #06032f", +".Gv c #060404", +"ai2 c #060405", +"aK2 c #060406", +"aPP c #060407", +"atd c #060409", +"aeg c #06040b", +"atA c #06040c", +"awk c #06040d", +"ay# c #06040e", +"a.G c #060410", +"avk c #060411", +"a.H c #060413", +"#Yz c #060418", +"#W7 c #060419", +".4# c #06041a", +".2t c #06041c", +".0P c #06041e", +".sU c #060420", +".oT c #060436", +".lS c #06043d", +".l1 c #060443", +"acP c #060500", +"agO c #060505", +".LP c #060506", +"api c #060507", +"ano c #060508", +"amg c #060509", +"anp c #06050a", +"avl c #06050b", +".I0 c #06050c", +"avB c #06050d", +"aAG c #06050e", +"awL c #060510", +"asM c #060513", +"aCR c #06051a", +".4. c #060523", +".MU c #06052f", +".nu c #06053e", +".nz c #060543", +".l3 c #060544", +".ko c #060547", +".LU c #060601", +"acO c #060603", +"ank c #060607", +"aqY c #060608", +".TE c #060609", +".S. c #06060a", +"aim c #06060b", +"aGM c #06060c", +".Kl c #06060d", +"aqJ c #06060e", +"#VF c #06060f", +"aog c #060610", +"ay2 c #060611", +"#IL c #060612", +"asb c #060614", +"aIa c #060616", +"a#b c #060620", +"#Ka c #060626", +"#Cw c #06062a", +".Ri c #060641", +"acR c #060705", +"abm c #060706", +"abh c #06070b", +"aH8 c #06070c", +"art c #06070e", +"af7 c #06070f", +".S# c #060710", +"aBr c #060713", +"#82 c #060714", +"#hR c #060722", +"#nD c #06072e", +"#qq c #06072f", +".0U c #060738", +".GR c #06073c", +".PO c #06073f", +".hy c #060740", +".f4 c #060741", +".c6 c #060742", +".U. c #060747", +".FU c #060806", +".Ny c #06080a", +"abi c #06080b", +".Nz c #06080f", +"af8 c #060810", +".P. c #060812", +"amY c #06081a", +"amZ c #06081b", +"ajJ c #06081d", +"#mn c #060823", +".IG c #060830", +".hU c #060831", +".PI c #060834", +"#qv c #060836", +".GT c #06083d", +".eA c #060841", +".8X c #060845", +".Js c #06090d", +"aMl c #06090f", +"aMm c #060910", +".KY c #060912", +"ay3 c #060917", +"aM0 c #06091f", +".IC c #060927", +"Qtf c #06092d", +".Oc c #060935", +".PA c #060938", +".Kv c #060a0b", +"aPZ c #060a0c", +"aNT c #060a0d", +"aCL c #060a0f", +"aL5 c #060a1f", +"#M4 c #060a20", +"#ta c #060a26", +"#g. c #060a27", +"#IJ c #060a29", +".br c #060a2d", +".eH c #060a44", +"aGN c #060b11", +"aJA c #060b12", +"#rW c #060b33", +"Qtr c #060b3d", +".db c #060b40", +".Ku c #060c12", +"aKi c #060c14", +"#qw c #060c34", +"aO7 c #060d13", +"aNm c #060d14", +"#ZJ c #060d1e", +"alV c #060d21", +"#PT c #060d2d", +"#7l c #06102c", +"a.N c #06102f", +"aOc c #061117", +"#tu c #06111f", +"#Fw c #06122c", +"aBg c #061719", +".Jf c #070000", +".EC c #070002", +".Eo c #070004", +".El c #070009", +"#1W c #07000c", +"ahK c #070017", +"aD3 c #070100", +".M5 c #070101", +".KK c #070102", +"abp c #070103", +"aq# c #070104", +"aqi c #070106", +"aK8 c #070107", +"aK7 c #070108", +"#Ow c #070127", +".Er c #070200", +".Gs c #070202", +".sF c #070203", +".M4 c #070204", +"aNc c #070206", +"aM# c #070208", +".Wh c #07020a", +".Uu c #07020b", +"aER c #070212", +"#Or c #070213", +"##0 c #070228", +"#mp c #07022a", +".Je c #070303", +".Jd c #070304", +"amf c #070306", +"af6 c #070307", +".HK c #070309", +"#2N c #070311", +"#mt c #070318", +".XG c #070323", +".sJ c #070326", +"#.E c #070327", +"#wH c #07032c", +".PW c #070401", +".LZ c #070402", +".KO c #070405", +"auq c #070406", +".H4 c #070407", +"aec c #070408", +".I7 c #070409", +"ar0 c #07040a", +"ai4 c #07040b", +"aCi c #070410", +"avT c #070411", +"aqH c #070414", +"#6d c #07041a", +"#2M c #07041d", +".Fq c #070433", +".GZ c #070437", +"#y. c #070438", +"#wD c #07043b", +"aJM c #070505", +"aed c #070506", +"aK1 c #070507", +"azn c #070508", +"ax8 c #070509", +"ark c #07050a", +"#3j c #07050b", +"auM c #07050c", +"aun c #07050d", +"auL c #07050e", +"#9Y c #07050f", +"auK c #070510", +"au# c #070511", +"au. c #070512", +"aCQ c #070513", +".HD c #070514", +".4a c #070515", +"#bt c #070518", +"#VE c #070519", +"#Ua c #07051a", +"#VI c #070520", +"#9w c #070521", +"#7Q c #070522", +".XF c #07052d", +"#x9 c #070537", +".kd c #070541", +".Ef c #070605", +"abn c #070606", +".LL c #070608", +"arX c #070609", +".Mg c #07060b", +".XR c #07060c", +".IP c #07060d", +"acH c #07060e", +"azs c #07060f", +"awj c #070611", +"asL c #070612", +"as# c #070613", +"apQ c #070614", +"atk c #070615", +"#pe c #07061e", +"#LA c #070621", +".sV c #070622", +".5I c #070624", +"#II c #07062c", +".LV c #070701", +"abX c #070706", +"awx c #070708", +".H6 c #070709", +"apl c #07070b", +"aky c #07070c", +"apN c #07070e", +"aoc c #07070f", +"#YB c #070710", +"aH9 c #070711", +"aru c #070712", +"arv c #070713", +"ao5 c #070714", +"aoh c #070715", +"#nE c #070732", +".iL c #07073a", +".T9 c #070740", +".bv c #070742", +".Ra c #070743", +"aD4 c #070804", +"acK c #070809", +"#8o c #07080c", +".O9 c #07080e", +"aLn c #07080f", +"af9 c #070812", +"aCP c #070813", +"#nN c #070823", +"#nS c #070824", +"#pd c #070828", +".fW c #070837", +".ho c #07083a", +".Of c #07083d", +".#5 c #070843", +"Qtj c #070844", +".bH c #07084a", +".FZ c #070907", +".IS c #070909", +"as5 c #07090a", +".Kp c #07090b", +"aOI c #070910", +"aeT c #070912", +".EW c #070914", +"#W9 c #070919", +"#D0 c #070922", +"#qy c #070923", +"#rY c #070924", +"#MU c #070926", +"#gg c #070932", +".rB c #070935", +"#o9 c #070937", +".Sz c #07093c", +".Ul c #070946", +".Um c #070948", +".Hy c #070a07", +"aNj c #070a10", +"aPm c #070a12", +".Jt c #070a13", +"am0 c #070a1d", +"#rO c #070a25", +"#P2 c #070a26", +"#qn c #070a27", +".c2 c #070a2d", +".ex c #070a2e", +"#zD c #070a31", +".Iz c #070a35", +".R. c #070a39", +"aOG c #070b0f", +"aO8 c #070b11", +"am1 c #070b1f", +"#Rn c #070b20", +"#Ft c #070b22", +".JY c #070b35", +".2x c #070b3d", +".bD c #070b45", +"aOH c #070c14", +"ayD c #070c15", +"a.L c #070c23", +"#va c #070c28", +"#Oo c #070c2a", +"Qts c #070c41", +"#p. c #070d34", +".iY c #070d4f", +".Dk c #070f22", +"aO6 c #071017", +"ayQ c #07101c", +"#hV c #07103c", +"ayS c #07111e", +"aNl c #071319", +"#89 c #071437", +".P# c #071d45", +".M6 c #080000", +".zu c #080001", +"abq c #080003", +"aps c #080004", +"aFW c #080005", +".SW c #080006", +"ayN c #08000a", +"#Ix c #08000e", +".ml c #080010", +".7e c #08001c", +"#s7 c #080025", +"am# c #080101", +".HS c #08010c", +"#Ot c #08010d", +"#J2 c #08010f", +".9. c #080110", +".ES c #080201", +".A5 c #080202", +"al# c #080203", +"a#M c #080204", +"aEe c #080206", +"aGX c #080207", +"aKR c #080208", +"agy c #08021d", +"#ab c #08021e", +".HX c #080302", +".Jc c #080305", +"azl c #080306", +"aMa c #080309", +"aiS c #08030e", +"#zs c #080315", +".n# c #080321", +".Oi c #080327", +"#.F c #080328", +".L0 c #080402", +"aPO c #080403", +"awO c #080406", +"atI c #080407", +".HM c #080408", +"aeb c #080409", +"aMb c #08040a", +".Hb c #080410", +"aHt c #080415", +".XH c #08041f", +".V7 c #080426", +".lO c #080428", +"#hS c #08042c", +"#u6 c #08043f", +".Km c #080502", +".LY c #080503", +".TD c #080504", +"a#L c #080506", +".HN c #080507", +".HY c #080508", +"aea c #080509", +".J. c #08050a", +"ald c #08050c", +"aBe c #08050e", +".3W c #080512", +"at9 c #080513", +"apM c #080515", +".HA c #08051a", +".V8 c #080521", +"#wI c #080527", +"acQ c #080600", +".R9 c #080605", +"aJO c #080608", +"azm c #080609", +"aPS c #08060a", +"aoR c #08060b", +"afy c #08060c", +"afx c #08060d", +"auo c #08060e", +"avj c #080611", +"avS c #080612", +"aap c #080613", +"apL c #080615", +"#Rj c #08061a", +"#r2 c #080624", +".B8 c #08062e", +".MQ c #080631", +"#u3 c #080636", +".l7 c #080648", +"aa8 c #080700", +".Eg c #080706", +".Nx c #080708", +".LN c #080709", +"aow c #08070b", +"anq c #08070c", +"aEB c #08070d", +"aHj c #08070e", +"atB c #08070f", +"azr c #080710", +"avi c #080711", +"awK c #080712", +"apO c #080713", +"aof c #080714", +"as. c #080715", +"aqI c #080716", +"aBs c #08071d", +".5P c #080724", +"#v# c #08072b", +".2r c #080730", +".0N c #080733", +"#eB c #080735", +".LQ c #080803", +"acS c #080806", +"aw1 c #08080a", +"aO. c #08080b", +"amM c #08080d", +".I1 c #08080e", +"aO0 c #080810", +".Wi c #080811", +"aod c #080813", +"apP c #080816", +"#Kb c #08081b", +"#wK c #08081c", +"#M5 c #08081d", +"#ew c #080831", +"asz c #08090b", +"alG c #08090d", +"avN c #08090f", +"ahk c #080911", +"acj c #080923", +"aaP c #080925", +"acl c #080926", +"#jn c #080934", +".hp c #080938", +".fV c #08093b", +"#dc c #080943", +".PD c #080944", +"aOF c #080a0e", +"aJB c #080a11", +"ain c #080a12", +"aio c #080a13", +"ag. c #080a14", +"#wM c #080a16", +".4b c #080a2d", +".iM c #080a39", +".N6 c #080a3e", +".T4 c #080a41", +"##1 c #080a47", +".Hw c #080b08", +".Hu c #080b09", +"aLo c #080b12", +"aQt c #080b14", +".KZ c #080b18", +"aas c #080b24", +".CA c #080b26", +"#o1 c #080b29", +".f0 c #080b2e", +".hu c #080b2f", +".vU c #080b32", +".SG c #080b36", +".J8 c #080b37", +".KA c #080c0d", +"aKj c #080c13", +"#84 c #080c1e", +"Qtt c #080c46", +"#Hc c #080d30", +".Z# c #080d45", +"#tv c #080e18", +"adE c #080e28", +"#nL c #080e35", +"#SQ c #080f2e", +"aCA c #081011", +"#Om c #081133", +".bR c #08123a", +"agl c #081339", +"aPx c #081717", +"#5G c #081736", +"a#N c #090003", +"#D7 c #090013", +".Eb c #090016", +".Rl c #09001b", +"#VJ c #09001e", +"aLc c #090107", +"aBl c #09010a", +"#zF c #09011e", +"#4x c #090203", +"arU c #090207", +"#9W c #09020d", +"ayH c #090214", +"##R c #09021a", +".CB c #09021d", +"#nP c #090229", +".Gl c #090301", +".Eq c #090302", +"aCG c #090305", +"arV c #090308", +"aK6 c #090309", +"aFn c #09030b", +".Up c #09031e", +"#bL c #09031f", +"adX c #090324", +".bY c #090325", +"#r1 c #090326", +".QA c #090404", +"aAo c #090406", +".Gb c #090407", +".Jb c #090409", +".Ja c #09040a", +".Uw c #09040c", +"#9X c #09040e", +"adY c #09041e", +"#qC c #090428", +".IQ c #090502", +".LW c #090503", +"abo c #090506", +".M3 c #090507", +"aq8 c #090508", +"ae# c #090509", +"afu c #09050a", +".BJ c #09050b", +"#4w c #090511", +"ayU c #090514", +"#PW c #090517", +"#Ln c #09051d", +".Ui c #090523", +".Uh c #090528", +".V6 c #090530", +"#wE c #09053e", +".L1 c #090603", +".LX c #090604", +"acT c #090607", +"#6J c #090608", +".Nw c #09060a", +".Dg c #09060b", +"arl c #09060c", +"afz c #09060d", +"aLl c #09060e", +"aLm c #09060f", +".5u c #090612", +"#SU c #090616", +"#9x c #090619", +".Zg c #09061e", +"#1k c #090621", +"#yb c #09062c", +".Ug c #090631", +".T6 c #090632", +".VW c #090636", +".oH c #09063a", +"acC c #090700", +".Md c #090701", +"aM8 c #090709", +".F7 c #09070a", +"aba c #09070b", +"anO c #09070c", +"aj9 c #09070e", +"atE c #09070f", +"aJx c #090710", +"aEC c #090711", +"awi c #090712", +"avR c #090713", +"auI c #090714", +"ao4 c #090716", +".2u c #09071a", +"#ZZ c #090721", +"a#. c #090722", +".XL c #09072f", +"#Fu c #090733", +".nk c #09073d", +"aw0 c #09080a", +"ay. c #09080b", +"aQA c #09080d", +"#ZH c #090810", +"aDn c #090811", +"aFr c #090813", +"aOJ c #090814", +"aoe c #090816", +"ay6 c #09081f", +"a## c #090824", +"#9v c #090826", +"#J9 c #09082b", +"#x8 c #090833", +"#zA c #090834", +"#y# c #090836", +"axp c #09090b", +"atb c #09090c", +"alb c #09090f", +".GB c #090914", +"aF6 c #090918", +"#OA c #09091b", +"adB c #09091e", +".39 c #090930", +"#qk c #090936", +"#js c #09093a", +".gv c #09093b", +".Fm c #09093c", +".Ko c #090a0b", +"aaj c #090a0c", +"ayv c #090a0d", +"avd c #090a0f", +"auB c #090a10", +"aOa c #090a11", +".TF c #090a12", +"aip c #090a15", +"ahl c #090a16", +"amQ c #090a17", +"#83 c #090a1a", +"ae1 c #090a22", +"ack c #090a26", +"#Cu c #090a29", +".Kd c #090a2d", +".hM c #090a30", +"#mq c #090a33", +"#hH c #090a35", +"#oY c #090a36", +".W# c #090a49", +".gd c #090a4c", +"aCI c #090b0d", +"akz c #090b13", +"amP c #090b16", +"#Ru c #090b18", +".A. c #090b19", +"#nA c #090b2d", +"#nK c #090b39", +".iQ c #090b41", +"#VH c #090c21", +"#Oy c #090c28", +".xH c #090c31", +".Lu c #090c38", +".J0 c #090c3b", +".V0 c #090c52", +"aPX c #090d0f", +".EY c #090d1b", +"#PU c #090d28", +".XA c #090d48", +"aQa c #090e0c", +"aNU c #090e13", +"aPE c #090e15", +"#IH c #090e24", +"aau c #090e29", +"aP9 c #090f14", +"#SP c #090f28", +"#ml c #090f37", +".5D c #090f3e", +".0K c #090f44", +"#vg c #09111f", +"ab8 c #09122f", +"ayx c #091311", +"aLr c #09131a", +".Aa c #091731", +".M. c #0a0000", +"#8j c #0a0003", +"#ye c #0a000c", +"aco c #0a0104", +"aBi c #0a010c", +".zy c #0a0203", +"aiT c #0a0206", +".On c #0a020a", +"ayK c #0a0214", +"#IB c #0a0216", +"aak c #0a030d", +".HR c #0a0310", +"adZ c #0a0313", +".za c #0a0329", +"#kZ c #0a032a", +".0b c #0a0400", +".ER c #0a0402", +".A8 c #0a0404", +"acU c #0a0407", +".F9 c #0a0408", +"as9 c #0a0409", +"aK5 c #0a040a", +".89 c #0a0420", +"afi c #0a0423", +"#ID c #0a042a", +".Jh c #0a0504", +"aN1 c #0a0505", +"ame c #0a0506", +"ahT c #0a0507", +"azi c #0a0508", +"am. c #0a0509", +"aM9 c #0a050a", +"aMc c #0a050b", +".86 c #0a0520", +"#Rf c #0a052b", +".k# c #0a052c", +"#v. c #0a0530", +".ks c #0a0545", +"axe c #0a0605", +".HW c #0a0606", +"ar# c #0a0609", +"agN c #0a060a", +"agM c #0a060b", +"aJw c #0a060f", +"a.F c #0a0612", +".Ar c #0a0628", +"#dl c #0a062a", +"#H. c #0a062e", +".CH c #0a0706", +"#96 c #0a0709", +"ahU c #0a070b", +".I9 c #0a070c", +"agP c #0a070e", +"aao c #0a0713", +"aob c #0a0717", +"a#c c #0a0719", +"#r3 c #0a071a", +".0Q c #0a071c", +"#Yy c #0a0721", +"#W6 c #0a0722", +"#4u c #0a0726", +".sZ c #0a0734", +".H1 c #0a080a", +"aPR c #0a080b", +"aOU c #0a080c", +"anN c #0a080d", +"aN5 c #0a080e", +"ai6 c #0a080f", +"atD c #0a0810", +"aDm c #0a0812", +"atj c #0a0813", +"at5 c #0a0814", +"at6 c #0a0815", +"aoa c #0a0817", +"apK c #0a0818", +"#9u c #0a0824", +"#6c c #0a0825", +".ry c #0a082a", +".Zl c #0a082d", +"#zB c #0a0836", +".G2 c #0a0838", +"#f7 c #0a0849", +".kk c #0a084b", +"adq c #0a0907", +".Ee c #0a0908", +"arS c #0a090b", +".Gx c #0a090c", +"ai1 c #0a090e", +"avh c #0a0910", +"avA c #0a0911", +"avQ c #0a0913", +"auH c #0a0914", +"akL c #0a0919", +"#P3 c #0a091a", +"#MW c #0a0920", +".sT c #0a0925", +"#u0 c #0a0930", +".IF c #0a0933", +"#ex c #0a093a", +".dx c #0a0941", +".H5 c #0a0a0a", +"atT c #0a0a10", +"#Yf c #0a0a11", +"acG c #0a0a12", +"aDD c #0a0a17", +"akD c #0a0a19", +"a.I c #0a0a1b", +"#jA c #0a0a26", +"a#a c #0a0a27", +"#H# c #0a0a2d", +"#nw c #0a0a35", +".Uj c #0a0a3a", +".es c #0a0a3d", +".gw c #0a0a3e", +".XK c #0a0a41", +".VY c #0a0a46", +".LT c #0a0b05", +".FW c #0a0b09", +"asw c #0a0b0c", +"ayw c #0a0b0d", +"azM c #0a0b0f", +"ave c #0a0b10", +"a.D c #0a0b11", +".Dh c #0a0b15", +".0A c #0a0b16", +"ag# c #0a0b17", +"amR c #0a0b18", +"akC c #0a0b1a", +"amX c #0a0b1b", +"alR c #0a0b1d", +"#zw c #0a0b28", +"#zy c #0a0b2f", +".do c #0a0b31", +"#l8 c #0a0b35", +"Qt# c #0a0b3c", +".Zk c #0a0b3f", +".c5 c #0a0b46", +".bu c #0a0b47", +"aOW c #0a0c0e", +"acI c #0a0c13", +"alH c #0a0c14", +"alI c #0a0c15", +"aDy c #0a0c18", +"#uY c #0a0c28", +".MJ c #0a0c40", +".hx c #0a0c43", +".W. c #0a0c48", +"#gh c #0a0c49", +".Py c #0a0d38", +".Ll c #0a0d39", +".kp c #0a0d50", +"aP0 c #0a0e10", +"ayA c #0a0e12", +"aQC c #0a0e16", +".MI c #0a0e38", +".i7 c #0a0e3d", +".hG c #0a0e4b", +".qd c #0a0f3c", +"#Yh c #0a1023", +"aD9 c #0a102f", +"#kX c #0a1038", +".35 c #0a1040", +".2n c #0a1042", +"#PS c #0a1437", +"aQd c #0a171a", +".Os c #0b0000", +".PZ c #0b0001", +".M# c #0b0003", +".Nu c #0b0004", +"aLj c #0b0005", +"#Cn c #0b0013", +"#0B c #0b0107", +"aFo c #0b010c", +".Jg c #0b0200", +"aCF c #0b0203", +".M1 c #0b020a", +"aaS c #0b0306", +".PU c #0b030b", +"aiQ c #0b0314", +"aIS c #0b040e", +"akN c #0b0410", +"#P0 c #0b0417", +".oY c #0b0433", +".kt c #0b0437", +".Df c #0b0505", +".O6 c #0b0508", +"aK4 c #0b050b", +"az9 c #0b050e", +"##S c #0b0515", +"ayG c #0b0517", +".Wc c #0b051f", +"#bO c #0b0521", +".FB c #0b0524", +"#G9 c #0b052a", +"#wG c #0b0534", +"axO c #0b0605", +".Gn c #0b0606", +"ax6 c #0b0609", +"ak5 c #0b060a", +"al8 c #0b060d", +"#MY c #0b0617", +"ahL c #0b0618", +"#Lp c #0b061c", +".yR c #0b0622", +".nf c #0b0624", +".lH c #0b062a", +"#bM c #0b062b", +"#VA c #0b062c", +"#t. c #0b0634", +".Gr c #0b0706", +"aq9 c #0b070a", +"af5 c #0b070b", +"ajv c #0b070c", +"asr c #0b070d", +".F3 c #0b0714", +"#bs c #0b0724", +"#J8 c #0b072f", +".nA c #0b0742", +".ge c #0b0743", +"#ti c #0b0745", +".CI c #0b0808", +"alF c #0b080c", +"a.C c #0b080d", +"aoT c #0b080e", +"aeh c #0b080f", +"aEZ c #0b0812", +"axL c #0b0815", +"alO c #0b0817", +"ao# c #0b0818", +"#LB c #0b081f", +"#VD c #0b0822", +"#U# c #0b0823", +"#k0 c #0b0831", +".HZ c #0b090b", +"#2u c #0b090c", +"ai0 c #0b090d", +"aoS c #0b090e", +"ahV c #0b090f", +"atQ c #0b0910", +"au2 c #0b0911", +"avP c #0b0912", +"auG c #0b0913", +"an1 c #0b0914", +"an0 c #0b0915", +"at7 c #0b0916", +"ao. c #0b0919", +"#uX c #0b092f", +".p8 c #0b0933", +"#ya c #0b0934", +".Zd c #0b0938", +".Uf c #0b093d", +".lU c #0b0948", +"aCH c #0b0a0b", +"abW c #0b0a0c", +".H8 c #0b0a0f", +"avg c #0b0a10", +"auF c #0b0a11", +".HG c #0b0a12", +"anS c #0b0a13", +"anT c #0b0a14", +"anU c #0b0a15", +"aDC c #0b0a17", +"alP c #0b0a19", +"ab3 c #0b0a1e", +".Kb c #0b0a35", +"#kS c #0b0a3b", +"#jr c #0b0a3f", +".kc c #0b0a42", +"#f6 c #0b0a47", +".l4 c #0b0a49", +"anQ c #0b0b0f", +"anR c #0b0b10", +"aj8 c #0b0b11", +"aP1 c #0b0b12", +".GA c #0b0b14", +"aEO c #0b0b19", +"alK c #0b0b1a", +"ajz c #0b0b1b", +"ab4 c #0b0b21", +".Ke c #0b0b22", +".5H c #0b0b31", +"#kN c #0b0b36", +".V9 c #0b0b3a", +"#jo c #0b0b3b", +".Wa c #0b0b43", +".f6 c #0b0b49", +"asy c #0b0c0d", +"azN c #0b0c0e", +"aA0 c #0b0c10", +"amh c #0b0c11", +"awf c #0b0c12", +"aKg c #0b0c13", +"akA c #0b0c16", +"ajx c #0b0c17", +"alJ c #0b0c18", +"ahm c #0b0c19", +"ajy c #0b0c1a", +"#MV c #0b0c26", +"#ma c #0b0c30", +"#jm c #0b0c33", +"#hy c #0b0c34", +"#kG c #0b0c35", +".cX c #0b0c3e", +".Rf c #0b0c42", +".ez c #0b0c46", +".ML c #0b0c47", +".eC c #0b0c48", +".#4 c #0b0c49", +".hA c #0b0c4b", +".Hx c #0b0d0b", +"as3 c #0b0d0e", +"aKh c #0b0d14", +"aQn c #0b0d15", +"aCd c #0b0d18", +"#D1 c #0b0d2a", +".Li c #0b0d3a", +"#mk c #0b0d3b", +".PB c #0b0d40", +".f3 c #0b0d44", +".7a c #0b0d4a", +"aLp c #0b0e15", +".0B c #0b0e16", +"ae3 c #0b0e28", +".iO c #0b0e34", +".hs c #0b0e35", +".JZ c #0b0e3a", +".Io c #0b0e3b", +".ga c #0b0e4b", +"aMn c #0b0f15", +"aat c #0b0f29", +".Ih c #0b0f3b", +".eI c #0b0f4c", +"azO c #0b1012", +"aLs c #0b1017", +"#ww c #0b1019", +".E# c #0b1024", +"#Ue c #0b102c", +"#k2 c #0b1033", +"#Fv c #0b1035", +"#jv c #0b1038", +".uw c #0b1043", +".s7 c #0b1044", +".V2 c #0b104c", +".de c #0b1053", +"aQ# c #0b1110", +"#hO c #0b1139", +"aD1 c #0b120a", +"auO c #0b122a", +"#jz c #0b1237", +"aL6 c #0b183a", +".Qx c #0c0000", +"a#x c #0c0001", +".R7 c #0c0004", +"ad0 c #0c0005", +"aH6 c #0c0009", +"#1V c #0c0011", +"#nO c #0c0026", +"aiU c #0c0100", +".Rt c #0c0106", +"#Kc c #0c010c", +".Dd c #0c0200", +"abZ c #0c020a", +"ayV c #0c0211", +".FS c #0c0214", +"aHw c #0c0215", +"amc c #0c0301", +".PY c #0c0307", +".LJ c #0c030b", +"akM c #0c030d", +"#9V c #0c030e", +"#zr c #0c031c", +"#bF c #0c0320", +".z# c #0c032f", +".YA c #0c0400", +"agI c #0c0403", +".KN c #0c0404", +".XS c #0c040a", +".Rq c #0c040c", +"#Os c #0c0410", +"#MZ c #0c0411", +"#J1 c #0c0413", +".7n c #0c0414", +"#eG c #0c0427", +"adW c #0c042a", +"#uV c #0c042e", +".an c #0c0435", +"aC2 c #0c0507", +"aqf c #0c0509", +"apw c #0c050a", +"aBk c #0c050d", +"aHv c #0c0517", +"#6a c #0c0522", +".B9 c #0c0533", +"a#B c #0c0605", +".B. c #0c0606", +"#6K c #0c0607", +".Ep c #0c0608", +"aAA c #0c0609", +".Ma c #0c060a", +"aBC c #0c060b", +"aK3 c #0c060c", +"aA3 c #0c060e", +"aKf c #0c0610", +"aJv c #0c0611", +".Ca c #0c0629", +".sI c #0c0635", +".Gt c #0c0706", +"agJ c #0c0707", +"ae. c #0c0709", +"azj c #0c070a", +".G. c #0c070b", +"am5 c #0c0710", +"aiR c #0c0715", +"#eX c #0c0723", +".A3 c #0c0726", +"#dm c #0c072c", +"#Yw c #0c072d", +".Gp c #0c0807", +"#8r c #0c080a", +"aNa c #0c080c", +"amI c #0c080d", +"ap5 c #0c080e", +"aBn c #0c080f", +"aIT c #0c0811", +"QtO c #0c081b", +"#Rg c #0c082b", +"#VB c #0c082c", +"#pc c #0c082d", +".0H c #0c082f", +".p2 c #0c083a", +"ax3 c #0c090a", +"aN6 c #0c090d", +"aqp c #0c090f", +"afw c #0c0910", +"aO1 c #0c0912", +".FC c #0c0916", +"an9 c #0c0919", +"#4v c #0c0921", +"#Ri c #0c0923", +"#7P c #0c0927", +"#ZY c #0c0928", +"ax1 c #0c0a0b", +"aIl c #0c0a0c", +"aPQ c #0c0a0d", +"ala c #0c0a0e", +".F6 c #0c0a0f", +"ai5 c #0c0a11", +"aPF c #0c0a12", +"aoZ c #0c0a13", +"ao0 c #0c0a14", +"anZ c #0c0a15", +"apI c #0c0a16", +"at4 c #0c0a17", +"ao2 c #0c0a19", +"an8 c #0c0a1a", +"ahv c #0c0a1f", +"#zE c #0c0a2d", +".Pw c #0c0a39", +".oU c #0c0a3c", +".V5 c #0c0a3d", +".nj c #0c0a40", +".LK c #0c0b0d", +"aoV c #0c0b0f", +"aoW c #0c0b10", +"aoX c #0c0b11", +"aoY c #0c0b12", +"apH c #0c0b13", +"azG c #0c0b15", +"aqD c #0c0b16", +"aNV c #0c0b17", +"aaq c #0c0b19", +"aF7 c #0c0b1a", +"#wJ c #0c0b26", +"#qD c #0c0b2a", +".rv c #0c0b2d", +".N1 c #0c0b39", +"#nx c #0c0b3a", +".XE c #0c0b3c", +"#ny c #0c0b3e", +"#l9 c #0c0b3f", +"aN7 c #0c0c0f", +"auE c #0c0c10", +"avO c #0c0c11", +"atS c #0c0c12", +"aGg c #0c0c14", +"ayE c #0c0c17", +"aga c #0c0c1a", +"amS c #0c0c1b", +"#zx c #0c0c2d", +"#D3 c #0c0c2e", +"#hz c #0c0c39", +".MG c #0c0c3a", +"#kT c #0c0c3b", +"#hI c #0c0c3c", +"#kH c #0c0c3f", +".N8 c #0c0c48", +".Iu c #0c0c4c", +"aA1 c #0c0d10", +"azP c #0c0d11", +"avf c #0c0d12", +"auC c #0c0d13", +"aEY c #0c0d14", +"amO c #0c0d16", +"akB c #0c0d18", +"aeU c #0c0d19", +"aeV c #0c0d1b", +"aiq c #0c0d1c", +"agj c #0c0d24", +"#hG c #0c0d34", +"#kM c #0c0d35", +".MB c #0c0d3a", +"#f5 c #0c0d40", +".PM c #0c0d43", +".Lm c #0c0d45", +".Ln c #0c0d49", +"Qti c #0c0d4b", +".kq c #0c0d52", +"amN c #0c0e16", +"aCc c #0c0e19", +"#kW c #0c0e3c", +"Qtm c #0c0e42", +".SJ c #0c0e47", +".SK c #0c0e4b", +".VZ c #0c0e50", +"aOZ c #0c0f11", +".fY c #0c0f35", +".2w c #0c0f3a", +".N4 c #0c0f3b", +".dq c #0c0f3e", +".dc c #0c0f4c", +"aPU c #0c1011", +"#DX c #0c101d", +"a.K c #0c1026", +".go c #0c103f", +".bE c #0c104d", +".Ub c #0c105d", +".5E c #0c1141", +".rK c #0c1147", +".oV c #0c1244", +"ab9 c #0c1633", +"aaw c #0c1635", +"a.P c #0c183a", +"ahy c #0c183d", +".L8 c #0d0000", +".Nt c #0d0003", +".Qy c #0d0004", +"azX c #0d000c", +".FK c #0d0011", +"aJJ c #0d0100", +"afk c #0d0107", +"aze c #0d0201", +".xQ c #0d0204", +"alT c #0d0208", +"abY c #0d020b", +".M7 c #0d0300", +".O4 c #0d0302", +"az7 c #0d0310", +"acB c #0d0400", +"al. c #0d0403", +".2H c #0d0406", +".EA c #0d0407", +".O5 c #0d0408", +"ahN c #0d0409", +"aph c #0d040a", +".Rs c #0d040b", +".ST c #0d040c", +"aIR c #0d040e", +".H# c #0d0434", +"#6L c #0d0504", +"#97 c #0d0506", +"aK9 c #0d050b", +".Kj c #0d050d", +"ayX c #0d050f", +".Gf c #0d0510", +"ajY c #0d0511", +"#dn c #0d0515", +"#hY c #0d0519", +"aAB c #0d060a", +"aqh c #0d060b", +".En c #0d060d", +".HQ c #0d0613", +"#PX c #0d0614", +"#bP c #0d0615", +"ayL c #0d0618", +".MW c #0d0619", +".R8 c #0d0707", +".5R c #0d0709", +"aAm c #0d070b", +"arc c #0d070c", +"akG c #0d0714", +"#bE c #0d0732", +"#wF c #0d0738", +"aIj c #0d0808", +"ajE c #0d0817", +"agz c #0d081e", +"afj c #0d0820", +".lN c #0d082c", +"#bN c #0d082d", +".j9 c #0d082f", +".VQ c #0d083c", +"#tj c #0d0847", +"apz c #0d090d", +"aq1 c #0d090e", +"ak3 c #0d0911", +"aiy c #0d0919", +"#Yx c #0d0928", +"#VC c #0d0929", +"#ZX c #0d092c", +".rn c #0d0931", +".VU c #0d0932", +".Sv c #0d0938", +".Sr c #0d0939", +".Fo c #0d093b", +".oX c #0d0940", +".CD c #0d0a0a", +"atG c #0d0a0c", +"aO9 c #0d0a0d", +"are c #0d0a0e", +"azE c #0d0a14", +"alN c #0d0a17", +"an3 c #0d0a1a", +"#Rh c #0d0a29", +"#c0 c #0d0a35", +".Q6 c #0d0a38", +".Q1 c #0d0a39", +"#wC c #0d0a3e", +"#u5 c #0d0a42", +"aN4 c #0d0b0d", +".EU c #0d0b0f", +"aoU c #0d0b10", +"aqw c #0d0b13", +"aqx c #0d0b14", +"aqy c #0d0b15", +".Kf c #0d0b16", +"arp c #0d0b17", +"at3 c #0d0b18", +"amU c #0d0b19", +"ao3 c #0d0b1a", +"an7 c #0d0b1b", +"#A6 c #0d0b2c", +"#nQ c #0d0b32", +".q# c #0d0b34", +".uo c #0d0b36", +".Pr c #0d0b39", +".G1 c #0d0b3c", +".oQ c #0d0b3d", +".nh c #0d0b40", +".lZ c #0d0b4a", +".Hc c #0d0c0a", +".LO c #0d0c0e", +"aqt c #0d0c10", +"aqu c #0d0c11", +"aqv c #0d0c12", +"arm c #0d0c13", +"arn c #0d0c14", +"aro c #0d0c15", +"awh c #0d0c16", +"ao1 c #0d0c17", +"aGf c #0d0c18", +"aEP c #0d0c1a", +"akK c #0d0c1c", +"#Oq c #0d0c21", +"#Cz c #0d0c2a", +"#A3 c #0d0c34", +"#u1 c #0d0c35", +"#eK c #0d0c3c", +"#ql c #0d0c3e", +"#hA c #0d0c3f", +"#kR c #0d0c40", +".kl c #0d0c4e", +"aOB c #0d0d07", +"atU c #0d0d13", +"aEX c #0d0d17", +"aGe c #0d0d1a", +"aeW c #0d0d1c", +"#wy c #0d0d31", +"#rT c #0d0d3c", +"#kO c #0d0d3d", +"#mg c #0d0d3e", +".bm c #0d0d40", +".SL c #0d0d4b", +".Lo c #0d0d4c", +".iT c #0d0d4d", +"aCh c #0d0e12", +"atW c #0d0e13", +"auD c #0d0e14", +"aIU c #0d0e15", +"aDH c #0d0e16", +"aDz c #0d0e1a", +"agb c #0d0e1c", +"air c #0d0e1d", +"akP c #0d0e1f", +".zo c #0d0e30", +"#jj c #0d0e36", +"#rN c #0d0e37", +"#hD c #0d0e38", +".qe c #0d0e40", +".c8 c #0d0e47", +".ab c #0d0e50", +"aFm c #0d0f0b", +"as8 c #0d0f10", +"aNk c #0d0f16", +"aQk c #0d0f17", +"aEN c #0d0f1c", +"adC c #0d0f26", +"#zv c #0d0f29", +"#A0 c #0d0f2a", +".eT c #0d0f35", +".ev c #0d0f36", +"#f4 c #0d0f3b", +".ux c #0d0f3d", +".2q c #0d0f3e", +".#7 c #0d0f44", +".XJ c #0d0f4c", +".l6 c #0d0f51", +"a.J c #0d1023", +"aiB c #0d1028", +".s9 c #0d103f", +".PH c #0d1042", +".0S c #0d1045", +".a. c #0d104d", +"Qtu c #0d104e", +"aQb c #0d110d", +"aLq c #0d1117", +"#DY c #0d1121", +".4d c #0d1141", +".qn c #0d114a", +"#Lz c #0d1228", +"adD c #0d122a", +".A2 c #0d1232", +".36 c #0d1243", +".bG c #0d1255", +"aQ. c #0d1315", +"Qtw c #0d1355", +"aMq c #0d141a", +"Qtv c #0d1657", +".dp c #0d173f", +".Hs c #0e0000", +"aDL c #0e0008", +"azW c #0e000e", +".L7 c #0e0100", +"#nU c #0e0105", +"#0A c #0e010a", +"aC1 c #0e0202", +".KL c #0e0301", +"au1 c #0e0305", +"aGK c #0e030d", +"amb c #0e0401", +".KM c #0e0403", +"a#w c #0e0404", +".xO c #0e0406", +"aGY c #0e0408", +"az8 c #0e040f", +"aiP c #0e0415", +"#pb c #0e042a", +"#8t c #0e0506", +".Qz c #0e0508", +"apv c #0e0509", +"acV c #0e050a", +"#eZ c #0e050c", +"#Z2 c #0e0516", +"#mo c #0e052c", +".Rk c #0e0531", +".SN c #0e0532", +".CQ c #0e0600", +"#46 c #0e0604", +".Ex c #0e0606", +".zx c #0e0607", +"arb c #0e060c", +"#qE c #0e060d", +".IM c #0e060e", +"#gs c #0e0616", +"afh c #0e0629", +".TC c #0e0707", +"aAz c #0e070b", +"aal c #0e0712", +".Wd c #0e0716", +"#yd c #0e0720", +".PP c #0e072f", +".qg c #0e0734", +".W5 c #0e0805", +"afs c #0e0808", +"#8s c #0e0809", +".Or c #0e080b", +"asD c #0e080d", +"ahM c #0e0814", +"ahq c #0e0819", +"#gj c #0e0833", +".t9 c #0e0836", +"#rU c #0e083f", +".Vg c #0e090a", +"aBV c #0e090e", +"#2t c #0e0913", +"ajZ c #0e0915", +"ajD c #0e0917", +".hT c #0e0922", +"#4t c #0e0928", +".b1 c #0e0935", +"#eJ c #0e0942", +"aq6 c #0e0a0d", +"amL c #0e0a0e", +"aP2 c #0e0a13", +".5Q c #0e0a17", +"#6b c #0e0a28", +"#th c #0e0a44", +".kg c #0e0a50", +".kh c #0e0a52", +"ar. c #0e0b0d", +"alE c #0e0b0f", +"arj c #0e0b11", +"ahW c #0e0b12", +"aLt c #0e0b13", +"auJ c #0e0b18", +"an4 c #0e0b1b", +"adA c #0e0b1c", +"agf c #0e0b1f", +"ahu c #0e0b20", +".oI c #0e0b3c", +".Rj c #0e0b40", +".nn c #0e0b42", +".YB c #0e0c08", +"apG c #0e0c11", +"awe c #0e0c12", +"atP c #0e0c13", +"ar5 c #0e0c14", +"ar6 c #0e0c15", +"ar7 c #0e0c16", +"anY c #0e0c17", +".HE c #0e0c18", +"at8 c #0e0c19", +"an2 c #0e0c1b", +"apJ c #0e0c1c", +".uk c #0e0c25", +".oM c #0e0c36", +".T8 c #0e0c40", +".ns c #0e0c46", +"ar2 c #0e0d11", +"ar3 c #0e0d12", +"ar4 c #0e0d13", +"asJ c #0e0d14", +"asK c #0e0d15", +"aBX c #0e0d16", +"atg c #0e0d17", +"anX c #0e0d18", +"aEW c #0e0d19", +"aDE c #0e0d1b", +"amV c #0e0d1c", +"amW c #0e0d1d", +"#X. c #0e0d21", +"agi c #0e0d24", +".ui c #0e0d25", +".LD c #0e0d27", +".sS c #0e0d29", +"#te c #0e0d3b", +"#md c #0e0d3d", +"#nG c #0e0d3e", +"#oZ c #0e0d40", +"#hL c #0e0d41", +".lQ c #0e0d42", +".e3 c #0e0d46", +".Eh c #0e0e0d", +"atf c #0e0e12", +"atX c #0e0e13", +"atV c #0e0e14", +"aCg c #0e0e15", +"azK c #0e0e16", +"aAZ c #0e0e17", +"aAY c #0e0e18", +"aCf c #0e0e19", +"aDG c #0e0e1a", +"agc c #0e0e1e", +"#D6 c #0e0e2b", +"#IF c #0e0e31", +"#qm c #0e0e38", +"#nH c #0e0e3c", +"#mh c #0e0e3d", +".#X c #0e0e41", +".Un c #0e0e48", +".SC c #0e0e4f", +"awg c #0e0f15", +"ayt c #0e0f16", +"aAV c #0e0f19", +"alQ c #0e0f20", +".38 c #0e0f3c", +"Qt. c #0e0f41", +".GX c #0e0f44", +".by c #0e0f46", +".MK c #0e0f47", +"#eN c #0e0f49", +".Rh c #0e0f4b", +".iZ c #0e0f51", +"azR c #0e1016", +".c1 c #0e1037", +".5G c #0e103c", +"#hN c #0e103e", +".XI c #0e104a", +"aIW c #0e1119", +".bp c #0e1138", +".Q9 c #0e113d", +".Pz c #0e113e", +".Ob c #0e1143", +".Iy c #0e1144", +".0T c #0e1148", +".l5 c #0e1151", +"aMo c #0e1219", +".N3 c #0e123d", +".Za c #0e124a", +".XB c #0e124d", +".o5 c #0e124e", +".Uc c #0e1250", +".2o c #0e1345", +".0L c #0e1348", +"#Ud c #0e142b", +"awp c #0e1a37", +".FT c #0f0000", +".Ru c #0f0001", +"a#A c #0f0002", +"#Cm c #0f0017", +"#rZ c #0f0022", +"au0 c #0f0101", +"#8i c #0f0102", +".L6 c #0f0200", +"#gm c #0f0201", +"acA c #0f0300", +"axZ c #0f0303", +"aCE c #0f0305", +"aHC c #0f0308", +"adr c #0f030b", +"ayM c #0f030d", +"ayW c #0f0310", +"#r0 c #0f0327", +"aj4 c #0f0401", +".CL c #0f0402", +".CK c #0f0404", +"atz c #0f0406", +".01 c #0f0407", +"ap4 c #0f0408", +"agB c #0f0409", +".Hr c #0f0414", +"agw c #0f0423", +"#qB c #0f0429", +".f# c #0f050b", +"ab0 c #0f050d", +"aPv c #0f050e", +".EQ c #0f0600", +"aj1 c #0f0605", +".zv c #0f0608", +"ady c #0f0609", +"aMe c #0f060c", +"#PY c #0f0612", +"#Fk c #0f0613", +"#M6 c #0f061a", +".Oj c #0f061e", +"#6# c #0f0620", +"#eP c #0f0623", +".AB c #0f062a", +".DV c #0f0635", +"ak6 c #0f0707", +".Ey c #0f0709", +"al7 c #0f070d", +"aBm c #0f0710", +"aE0 c #0f0711", +"#4s c #0f0724", +"agx c #0f0725", +"#bp c #0f073e", +".02 c #0f080b", +".Gi c #0f080d", +".PX c #0f080e", +".LF c #0f080f", +"aKe c #0f0812", +"#SV c #0f0813", +".XN c #0f0815", +".Ho c #0f0817", +"ayI c #0f081a", +".A6 c #0f0909", +".A7 c #0f090a", +"aq. c #0f090c", +".0X c #0f0910", +"azD c #0f0914", +"akF c #0f0915", +"#Lr c #0f091b", +"#7O c #0f0922", +"#a. c #0f0925", +"#Uf c #0f0927", +"#2K c #0f0928", +"#J7 c #0f092f", +".s0 c #0f0933", +"#qt c #0f0940", +".Gm c #0f0a06", +"ax5 c #0f0a0d", +".G# c #0f0a0e", +"aNd c #0f0a0f", +"aQj c #0f0a15", +"akH c #0f0a18", +"aHu c #0f0a1b", +".xv c #0f0a22", +"#a# c #0f0a2e", +"#tm c #0f0a36", +"#o8 c #0f0a40", +".l8 c #0f0a48", +"aAC c #0f0b0f", +"arO c #0f0b10", +"arP c #0f0b11", +"aO2 c #0f0b14", +"aan c #0f0b16", +".4h c #0f0b19", +".2B c #0f0b1a", +"aiz c #0f0b1c", +".zr c #0f0b2f", +".VV c #0f0b36", +"amH c #0f0c10", +"aqs c #0f0c12", +"auA c #0f0c13", +".F4 c #0f0c17", +"alM c #0f0c19", +"amT c #0f0c1a", +"ajF c #0f0c1b", +"an6 c #0f0c1c", +"#rV c #0f0c40", +"#tg c #0f0c42", +"ax7 c #0f0d11", +"anP c #0f0d12", +"axc c #0f0d17", +"anW c #0f0d18", +"anV c #0f0d19", +"aqG c #0f0d1c", +"an5 c #0f0d1d", +".7c c #0f0d42", +".nl c #0f0d43", +".nq c #0f0d47", +".ki c #0f0d50", +"aN8 c #0f0e11", +"atc c #0f0e12", +"atY c #0f0e14", +"atZ c #0f0e15", +"at0 c #0f0e16", +"at1 c #0f0e17", +"aAT c #0f0e18", +"ati c #0f0e19", +"aCe c #0f0e1a", +"aDF c #0f0e1b", +"aGb c #0f0e1d", +"aHA c #0f0e1e", +"#nF c #0f0e42", +"#m. c #0f0e43", +".Ue c #0f0e49", +".l0 c #0f0e4d", +"awJ c #0f0f15", +"azL c #0f0f16", +"azJ c #0f0f18", +"aEV c #0f0f1c", +"ahn c #0f0f1e", +"#o0 c #0f0f3a", +".DF c #0f0f3d", +".MS c #0f0f40", +".f5 c #0f0f4c", +".MM c #0f0f4e", +"aPc c #0f1014", +"axa c #0f1015", +"ayu c #0f1016", +"aAW c #0f101a", +".BK c #0f101c", +"agk c #0f1028", +"#Ct c #0f102b", +".gm c #0f1036", +"Qtb c #0f103d", +".0M c #0f1042", +".8Y c #0f104a", +".eB c #0f104b", +".hz c #0f104d", +"az1 c #0f1119", +".hr c #0f113b", +".#Z c #0f113d", +".0R c #0f113e", +".rM c #0f1142", +"#eM c #0f114f", +"ayz c #0f1214", +"#MT c #0f1230", +".#0 c #0f1238", +"Qtd c #0f1239", +".c0 c #0f123b", +".5F c #0f1241", +".37 c #0f1243", +".SF c #0f1245", +".V3 c #0f124f", +"#K# c #0f132a", +".nH c #0f1351", +".V1 c #0f135b", +".f9 c #0f1449", +"aPb c #0f1719", +"ayC c #0f171e", +"am9 c #0f192e", +"aMp c #0f1b21", +".N# c #100000", +".Wk c #100001", +"a#y c #100002", +"aGL c #10000e", +"#P4 c #100010", +"#Ye c #100100", +"azV c #100110", +"#gn c #100200", +".L5 c #100201", +"avz c #100202", +".Ec c #100205", +"aQr c #10020f", +"#OB c #100214", +"#DU c #100217", +".SO c #100224", +"aM7 c #100300", +"aot c #100306", +".CC c #10030b", +"#CA c #10031c", +"#2s c #100402", +".Zs c #100409", +"aJu c #10040c", +"#mu c #10040d", +"ajX c #100410", +"#gl c #100411", +"ahI c #10041d", +".xP c #100507", +"aIQ c #100511", +".A4 c #100512", +"#LC c #100516", +"#zq c #100520", +".CN c #100600", +"#JZ c #100617", +"ahJ c #10061e", +"#X# c #100620", +"afg c #10062a", +".i0 c #100635", +".EN c #100702", +".De c #100704", +"apu c #10070b", +"aMi c #10070d", +"aA2 c #100711", +"#k4 c #100715", +"aG. c #100719", +"#jB c #10071a", +"#.z c #100723", +"#3l c #100806", +"amd c #100807", +"#.H c #10080f", +"aOA c #100907", +"aP. c #10090b", +"aDZ c #10090d", +"a#d c #10090e", +".XQ c #100910", +"aPq c #100915", +"#.G c #100918", +"#s9 c #100937", +"#u9 c #100939", +"aMZ c #100a0a", +".B# c #100a0b", +".4i c #100a0d", +".2C c #100a0e", +"aix c #100a1a", +".vI c #100a25", +".yY c #100a26", +".Y5 c #100a29", +"#Fp c #100a30", +"##3 c #100a35", +"#nI c #100a41", +".Gc c #100b0e", +"aN. c #100b10", +"#08 c #100b18", +"aES c #100b1a", +"aF8 c #100b1c", +".bI c #100b47", +"agK c #100c0e", +"alD c #100c10", +"aPr c #100c14", +"alL c #100c1a", +"ais c #100c1b", +"#9t c #100c26", +".88 c #100c30", +"#M2 c #100c34", +".oF c #100c43", +".ac c #100c48", +".IJ c #100d0e", +"au6 c #100d0f", +"aik c #100d11", +"avc c #100d14", +"aOb c #100d15", +"#YC c #100d1d", +".MV c #100d2c", +"#bB c #100d35", +".Lz c #100d38", +"#qu c #100d40", +".kC c #100d47", +"anM c #100e13", +"ax# c #100e15", +"ar9 c #100e19", +"aqC c #100e1a", +"aqF c #100e1d", +"aqE c #100e1e", +".xK c #100e35", +".B7 c #100e36", +".Y8 c #100e3f", +"#rS c #100e44", +".mg c #100e46", +".kr c #100e53", +"aJQ c #100f11", +"asG c #100f13", +"axb c #100f14", +"azt c #100f18", +"axK c #100f19", +"ar8 c #100f1a", +"aEU c #100f1d", +"#x7 c #100f36", +"#td c #100f38", +".DH c #100f3d", +"#kI c #100f44", +"#jh c #100f45", +".MD c #100f4a", +"axE c #101016", +"ays c #101018", +"aPl c #101019", +"aAX c #10101b", +"aGd c #10101e", +"#db c #101038", +"#nz c #10103d", +"#o7 c #10103e", +"#qs c #10103f", +"#o6 c #101041", +".bZ c #101042", +".PL c #101043", +".Le c #10104a", +".iS c #10104e", +"aCb c #10111c", +".Kc c #10113b", +"Qtl c #101148", +"Qtk c #10114a", +".bw c #10114b", +"#Op c #10122c", +"Qtc c #10123b", +".bo c #10123e", +".qp c #101246", +".c7 c #10124b", +".Ud c #10124f", +".Xz c #101253", +"aPn c #10131b", +".bS c #101342", +".J7 c #101345", +".2p c #101346", +".SD c #101353", +".md c #101354", +".hC c #101451", +".d# c #10154a", +".Cz c #10172f", +".rz c #101839", +"asd c #101f42", +".Na c #110000", +"a#z c #110002", +".Ot c #110200", +"#pa c #110227", +"aa7 c #110300", +".5V c #110302", +".L4 c #110303", +"aA5 c #11030b", +"#jC c #11030f", +"#zG c #110319", +"ahO c #110402", +"aL2 c #110404", +".TB c #110407", +".gE c #110409", +"aLk c #11040b", +"aGi c #11040d", +"#G3 c #110410", +"azT c #110413", +"#.l c #110428", +".O3 c #110500", +"aPy c #11050c", +"#yf c #11050f", +"adu c #11060c", +"#2I c #110720", +"#u8 c #11073b", +"#ad c #11080f", +"#gt c #110810", +".zs c #11081a", +"#4r c #110821", +".80 c #110825", +"adV c #11082f", +".EF c #110906", +"ani c #11090f", +"#PZ c #110916", +".ku c #110929", +"#bq c #11093f", +".Ew c #110a09", +"arT c #110a0f", +"apx c #110a10", +"aIX c #110a11", +".Em c #110a13", +".Zn c #110a15", +"#eY c #110a1a", +"#Ou c #110a1d", +"#Ov c #110a28", +".Ha c #110a29", +".Ba c #110b0c", +"aam c #110b16", +"aET c #110b1b", +"ayF c #110b1c", +".rD c #110b36", +"aNg c #110c11", +"ahr c #110c1e", +"#eV c #110c31", +"#mi c #110c42", +".Q3 c #110c48", +".eL c #110c49", +"aft c #110d10", +"akx c #110d11", +"amK c #110d12", +"apm c #110d13", +"aOs c #110d17", +".pS c #110d1b", +".LE c #110d1c", +".DX c #110d1d", +"age c #110d20", +".ox c #110d23", +".Ps c #110d49", +".CF c #110e0d", +".CG c #110e0e", +"atK c #110e10", +".H3 c #110e11", +"aqr c #110e14", +"akI c #110e1c", +"aeX c #110e23", +".DN c #110e32", +".G0 c #110e41", +"#u4 c #110e42", +".no c #110e45", +".NX c #110e49", +"anL c #110f14", +"axA c #110f16", +"axJ c #110f18", +"ars c #110f1a", +"at2 c #110f1b", +"akJ c #110f1e", +"agg c #110f24", +"aeY c #110f25", +".B2 c #110f37", +".vX c #110f38", +".o8 c #110f43", +"#.x c #110f44", +"#hB c #110f46", +"av8 c #111018", +"ayb c #111019", +"aqB c #11101b", +"aGc c #11101f", +".Od c #11103f", +".ka c #111043", +"#jp c #111044", +"#jq c #111045", +"#o5 c #111046", +".np c #111049", +".dy c #11104a", +"axF c #111117", +"aI# c #11111a", +"aC. c #11111c", +".kI c #111132", +"#m# c #111140", +".Fi c #111144", +".f7 c #11114f", +"azH c #11121b", +"aC# c #11121d", +".Zc c #111247", +".#6 c #111249", +".bx c #11124a", +".PN c #11124b", +".Y1 c #111327", +".cZ c #11133f", +".iP c #111346", +".Zi c #11134b", +".kA c #111355", +".Lt c #111446", +".f8 c #111451", +".Lq c #111454", +".cb c #111539", +".In c #11153f", +".eE c #111552", +".MO c #111555", +".#9 c #11164b", +"Qtq c #11164c", +".aa c #111659", +".zq c #11183c", +".bF c #11195b", +".vW c #111a44", +"adJ c #112650", +".NB c #112752", +"#41 c #120000", +".Ns c #120105", +"aKb c #12020a", +"#Z3 c #120217", +".Bc c #120300", +".Dc c #120400", +".L3 c #120405", +".L2 c #120406", +".eX c #120423", +".r2 c #120500", +"#42 c #120505", +"aHy c #120519", +"aOS c #120602", +"ak9 c #120806", +"#6H c #120808", +"adv c #12080c", +".dL c #12081c", +".CS c #120900", +"aOk c #120907", +".ED c #12090b", +".Zr c #12090e", +"#go c #120910", +"aKd c #120913", +"aQe c #120915", +".8W c #12092d", +".AL c #120936", +"Qtz c #120937", +"#J6 c #120a28", +".C. c #120a37", +".Ev c #120b09", +"aEA c #120b10", +".Gg c #120b14", +"aP3 c #120b15", +"akE c #120b17", +"ajC c #120b18", +"agA c #120b19", +"aiw c #120b1a", +"#IC c #120b28", +"ab2 c #120c13", +"aO3 c #120c15", +".up c #120c36", +"#.y c #120c37", +"#kU c #120c43", +".Gd c #120d0f", +".jb c #120d20", +".XM c #120d24", +".Y6 c #120d32", +"aiZ c #120e11", +"as1 c #120e14", +"aPf c #120e17", +"aQh c #120e19", +".0W c #120e20", +"#Lw c #120e36", +"#c1 c #120e44", +".lW c #120e50", +"aq7 c #120f11", +"ate c #120f15", +"amj c #120f16", +"aAS c #120f1a", +"aht c #120f23", +".T7 c #120f3e", +"#nJ c #120f43", +".ni c #120f45", +"#ey c #120f4a", +"azo c #121013", +"aPT c #121014", +"aoQ c #121015", +"axI c #121018", +"arr c #12101b", +"aqA c #12101c", +"agh c #121026", +".qb c #121039", +".qq c #121041", +"#dd c #121044", +"axH c #121117", +"av7 c #121119", +"aFX c #12111a", +"ath c #12111c", +"aar c #12111f", +"aHB c #121120", +".A0 c #12112f", +".rN c #121140", +"#qr c #121143", +"#kP c #121145", +"#me c #121146", +"#kQ c #121147", +"azI c #12121b", +"ae0 c #121229", +".Og c #121247", +".XD c #121249", +".e2 c #12124a", +"##2 c #12124d", +".bs c #121250", +".hB c #121252", +".o7 c #12134a", +".N7 c #12134b", +".eD c #12134e", +".c3 c #12134f", +".V4 c #121350", +".eu c #121440", +".Zh c #121444", +"Qtn c #121447", +".Iq c #121448", +".Zj c #12144e", +".jc c #121537", +".oW c #12154a", +".d. c #121552", +".Rc c #121555", +"aQc c #121611", +".eV c #121645", +".bA c #121653", +".J5 c #121656", +"aQm c #12171e", +"aIV c #12171f", +".xJ c #121a42", +".A1 c #121b37", +".gn c #121b44", +".zp c #121c3e", +".xI c #121e42", +".vV c #121f45", +"agm c #121f46", +".YC c #122549", +".Ow c #130000", +"aQy c #13000b", +"aH7 c #13000f", +"arJ c #130100", +"#DS c #130114", +".Vf c #130200", +"aIH c #13020b", +"#Fy c #13030f", +"QtK c #130424", +"azU c #130514", +"#AU c #13051d", +".pk c #130600", +"aqX c #130608", +"acz c #130700", +"aPN c #130702", +"aP6 c #130712", +".PQ c #130723", +".xS c #13080a", +".CU c #130903", +".gD c #130910", +".Az c #130936", +".eM c #130938", +".CR c #130a00", +"am4 c #130a0f", +".7o c #130a11", +".9# c #130a12", +".MX c #130a16", +".rF c #130a1f", +"#2J c #130a26", +".s1 c #130a2c", +".gy c #130a2f", +".gf c #130a38", +"afr c #130b09", +"#bQ c #130b12", +"aOq c #130b16", +"ajB c #130b18", +"aiv c #130b19", +".Uq c #130b1b", +"#df c #130b27", +"#G8 c #130b29", +".gp c #130b3b", +".Gj c #130c0e", +"aoJ c #130c12", +"aPs c #130c15", +"aO4 c #130c16", +"aQs c #130c18", +"#Lt c #130c1a", +"ahp c #130c1c", +"#Fo c #130c2a", +"#ge c #130c4f", +"asC c #130d12", +"aDk c #130d13", +".FP c #130d1d", +".zb c #130d29", +"#jt c #130d44", +".Ge c #130e10", +"aN# c #130e13", +"aQo c #130e16", +"#wt c #130e32", +".p1 c #130e44", +".dg c #130e4a", +"atH c #130f12", +"aeO c #130f13", +"ayp c #130f19", +"aiA c #130f21", +"#x2 c #130f29", +"#gr c #130f33", +".j6 c #130f36", +"ax2 c #131011", +"atF c #131012", +"ajG c #131020", +".rC c #13103f", +".oG c #131045", +"#eA c #13104c", +".lV c #131051", +"apF c #131116", +"atR c #131117", +"axD c #131118", +"atC c #131119", +"aya c #13111b", +"aqz c #13111c", +".q. c #13113b", +".MR c #131140", +"#mj c #131144", +"#gi c #131146", +"#mf c #131147", +".nv c #13114b", +"axG c #131217", +"awy c #13121a", +".t. c #13123e", +"#kJ c #131243", +"#hJ c #131246", +"#hK c #131248", +".Ek c #131312", +"ayr c #13131c", +"aCa c #13131e", +"#wz c #13133a", +".uy c #13133e", +".Oe c #131345", +".Z. c #13134a", +"#bC c #13134e", +".#2 c #131353", +".iU c #131354", +".Ld c #131447", +".Xy c #131453", +".fX c #131541", +".JW c #131548", +".hv c #131549", +".PC c #13154c", +".Zb c #13154d", +".XC c #13154f", +"#Cr c #131629", +".am c #131645", +".Ii c #131648", +".PG c #13164e", +".Oa c #13164f", +"Qto c #131653", +".O. c #131656", +".PF c #131657", +".SE c #13174f", +".Rd c #131754", +".Ua c #131760", +".eK c #13185b", +"aBj c #14000e", +"axo c #140100", +".Nb c #140200", +"#8h c #140201", +"aIO c #14030c", +"#DT c #14041a", +"#6G c #140500", +"aHz c #140519", +".Bd c #140600", +"aLu c #14060f", +"aQz c #140610", +"#Fj c #140611", +".AV c #140618", +".ds c #140625", +"#eR c #140706", +".2G c #140708", +"ap3 c #14070a", +"#1m c #140719", +"#Ug c #14071e", +"ads c #140810", +"aIP c #140813", +"#eQ c #140815", +"aPh c #140816", +"aHx c #14081b", +"#tk c #14083d", +"aH5 c #14090d", +"aCm c #140912", +"aP5 c #140914", +"aA4 c #140a11", +".zz c #140b0d", +"aou c #140b11", +"ab1 c #140b13", +"aP4 c #140b15", +"aO5 c #140b16", +"ajA c #140b17", +"#YD c #140b1f", +"#gk c #140b27", +"##N c #140b2e", +".vF c #140b36", +".FA c #140b3b", +".Gh c #140c14", +".oZ c #140c2c", +".dw c #140c35", +"aqe c #140d11", +".vl c #140d22", +".DW c #140d2f", +".rk c #140d47", +"ayo c #140e18", +"#Iy c #140e1c", +"#gq c #140e2a", +".dz c #140e40", +"azk c #140f12", +".z9 c #140f15", +"aQf c #140f1a", +"#nT c #140f1e", +"Qty c #140f4b", +"aBW c #141014", +"#Lo c #141027", +".Ax c #141032", +".j5 c #141036", +"#gf c #14104e", +"ar1 c #141116", +"ak. c #141118", +"ajH c #141122", +"au3 c #14121a", +"arq c #14121d", +"aeZ c #141229", +".NW c #141246", +"ayq c #14131c", +"ajI c #141325", +"#ji c #141345", +"#hC c #141346", +".Y9 c #141348", +"aB9 c #14141f", +"aDA c #141420", +".DC c #141442", +".MC c #141447", +".nJ c #14144e", +".7b c #14144f", +".N9 c #141452", +".J4 c #141454", +".bQ c #14153b", +".GU c #14154a", +".Uk c #14154b", +".J2 c #14154d", +".c9 c #14154e", +".c4 c #141550", +".bt c #141552", +".MN c #141555", +".hq c #141642", +".J1 c #141649", +".#8 c #14164a", +".f1 c #14164c", +".ny c #141653", +".Ix c #141750", +".Lr c #141754", +".O# c #141755", +".Iv c #141757", +".U# c #14175d", +".J6 c #141855", +"aQg c #141c23", +"aub c #141c35", +".dd c #141c5e", +".P0 c #150000", +"aC0 c #150100", +"aQv c #150110", +".N. c #150200", +"aQw c #150210", +".Nc c #150300", +"#Vh c #150303", +"#mv c #150407", +"anh c #150505", +"aPB c #15050e", +"aMr c #15050f", +"azY c #150514", +"#qA c #150529", +".r1 c #150600", +"#ZF c #150706", +"apf c #150708", +".PR c #15071c", +"aFh c #150806", +"aLd c #15080f", +"aNn c #150811", +"aiX c #150905", +"adt c #150910", +"aPt c #150a14", +"#JY c #150a1b", +"aG# c #150a1d", +"aP# c #150b0b", +"az5 c #150b1d", +"adx c #150c0f", +"#G4 c #150c19", +"#uU c #150c2c", +".uq c #150c2e", +"#ac c #150d1d", +".xL c #150d22", +".5C c #150d26", +".rE c #150d2e", +"#gc c #150d34", +"#6f c #150e0d", +"aF9 c #150f20", +"#Lq c #150f23", +".yW c #150f2b", +"at# c #151015", +"aPd c #151017", +"adz c #151021", +".zc c #151025", +".Xw c #151039", +".DK c #15103f", +".DJ c #151041", +".Ss c #151045", +"ahs c #151123", +".Q2 c #151145", +"azq c #151216", +".Aw c #151233", +"#Fq c #151239", +"#kV c #151246", +"#ez c #151252", +"arZ c #151318", +".II c #15131c", +"aHk c #15131d", +"#wB c #151343", +"#bD c #151348", +".nr c #15134d", +"au4 c #15141c", +"aED c #15141d", +".ug c #15142d", +"#f8 c #151450", +"asH c #151518", +".mf c #151551", +".#3 c #151555", +"Qtg c #151556", +".iN c #151643", +"#f9 c #151644", +".hw c #15164b", +".bz c #15164c", +".R# c #15164e", +".ey c #151750", +".5L c #15183a", +".Ls c #151850", +".Iw c #151856", +".nx c #151953", +".gc c #151b5d", +".hN c #151f47", +".Uy c #160000", +"#Xa c #16001b", +".Rv c #160100", +".Ut c #160300", +".L9 c #160303", +"aDM c #16030b", +".rZ c #160400", +".R6 c #160404", +"#Hf c #16040e", +".SP c #16041e", +"azZ c #160515", +"aKc c #16060f", +"aPC c #160610", +".Ux c #160709", +".qE c #160800", +"aDJ c #160814", +".4l c #160908", +"aCl c #160914", +".Ct c #16091a", +".vv c #160924", +"aIY c #160a0f", +"aGa c #160a1d", +"agH c #160b09", +".EB c #160c12", +"#wp c #160c22", +".zw c #160d0f", +"aiu c #160d1a", +".qi c #160d21", +"##4 c #160d2a", +".Cj c #160d3c", +".t7 c #160d49", +"aOj c #160e09", +".Ez c #160e10", +"aqg c #160e14", +"aGh c #160e15", +".8V c #160e25", +".m. c #160e2e", +".qh c #160e2f", +"#c9 c #160e35", +".eW c #160e3f", +"aqa c #160f13", +".Xu c #160f31", +"#.w c #160f34", +"aqc c #161014", +"at. c #161015", +".C# c #161038", +"#eO c #16103b", +".gx c #16103c", +"aOu c #16111a", +"aPg c #16111c", +".E. c #161125", +".Zm c #161126", +".T2 c #16114d", +"ara c #161215", +"aPk c #16121c", +".p3 c #16123e", +"au5 c #161315", +"axB c #16131a", +".Cy c #16132c", +".Xx c #161341", +".oJ c #161342", +".qf c #161346", +"#ju c #161347", +"aqq c #161419", +"awH c #16141b", +"axs c #16141c", +"azF c #16141d", +".je c #161430", +".oN c #161446", +"#hM c #161447", +"ayc c #16151e", +".rx c #161536", +"#wA c #161540", +".kb c #16154a", +".VX c #16154b", +".Fj c #161649", +".kB c #161652", +".It c #161655", +".i6 c #16173d", +".au c #161741", +".f2 c #16174e", +".me c #161751", +".Ij c #161756", +"#DZ c #16182d", +".hD c #161a54", +"aCS c #161c3c", +".P1 c #170000", +".Ng c #170100", +".Nh c #170200", +"aGj c #17020e", +"#A7 c #170217", +"#Uh c #170311", +"aBB c #170400", +"#It c #170511", +"aos c #170605", +"aKk c #17060d", +"ap2 c #170706", +"#k5 c #170810", +".i5 c #170911", +".uv c #170a17", +".s6 c #170a18", +".hI c #170a26", +".SX c #170b11", +"aQq c #170b16", +"aCk c #170b18", +".r4 c #170c02", +".1O c #170c0a", +".jk c #170c11", +"#Iw c #170c19", +".H. c #170c46", +"adw c #170d11", +"#wq c #170d28", +"##Q c #170e33", +"aCj c #170f1c", +".e1 c #170f38", +".xs c #170f3a", +".Eu c #17100d", +"anF c #171015", +".x# c #171028", +".34 c #17102d", +"azS c #17111b", +".x. c #171128", +".7k c #17112d", +".rm c #171141", +"aFl c #17120b", +".Ga c #171215", +".as c #17122b", +".ne c #171230", +"#de c #17123c", +".Kg c #171316", +"aOr c #17131d", +"aqk c #171418", +"aEQ c #171423", +".ro c #171432", +".Y7 c #17143f", +"#c3 c #171442", +"axC c #17151c", +"axr c #17151d", +".B6 c #17153d", +"#tf c #171547", +".lX c #171554", +".ME c #171555", +".uh c #17162e", +".Lg c #171654", +".Lf c #171655", +"am6 c #171724", +"#wO c #171728", +".p7 c #171731", +".Ik c #171755", +".JX c #171756", +"Qth c #171757", +"#A1 c #171838", +".nI c #171850", +".PE c #171856", +".o6 c #17194e", +".SA c #171950", +".eF c #171b55", +".eU c #172049", +"#40 c #180000", +"#LD c #180008", +".tj c #180200", +"aQx c #180211", +"aQu c #180212", +"aOR c #180300", +"#VK c #18031f", +".Ov c #180400", +"#zH c #180414", +".Wg c #180500", +"aCD c #18050b", +"#8g c #180600", +"#3h c #180602", +"aE2 c #180713", +".eO c #180912", +".k7 c #180a11", +".vT c #180a16", +"#hZ c #180a18", +".bU c #180a29", +"aOi c #180b07", +"aPz c #180b12", +".Cs c #180b1a", +".to c #180c03", +".Ok c #180c1c", +"#JX c #180c1e", +"#AV c #180c23", +".yZ c #180c36", +".M8 c #180d0a", +".xR c #180d0f", +"apg c #180d11", +".7# c #180e31", +"ahS c #180f0d", +".dh c #180f3d", +".m# c #18101f", +"alU c #18111a", +".vY c #181128", +".nB c #181141", +"aPj c #18121d", +".p0 c #18124b", +".St c #181252", +".Q4 c #181253", +"aNf c #181318", +"agd c #181326", +".Q5 c #181352", +".Pu c #181353", +".Pt c #181354", +"azf c #181415", +"aox c #18141a", +".hW c #181437", +".Fp c #181445", +".NZ c #181453", +".NY c #181454", +"akO c #181523", +".0J c #181542", +".DY c #18161a", +".c. c #181623", +".G5 c #181642", +".lY c #181656", +".oP c #181749", +"aPo c #181821", +"aAU c #181822", +".b0 c #18184b", +".Lp c #181858", +".rr c #181924", +".Xs c #181a3b", +"#AZ c #181b32", +".qo c #181b4d", +".bB c #181c56", +"ac. c #182d51", +"aiG c #182d55", +"a#v c #190000", +".Om c #190100", +"#1U c #190108", +".Nf c #190300", +".Nr c #190407", +"aCz c #190411", +"as0 c #190502", +".zA c #190600", +"asq c #190603", +"aqW c #190604", +".Ou c #190702", +"aIZ c #19080d", +"aHs c #19080f", +"aE3 c #190813", +".Bo c #19090c", +"aOe c #190910", +".03 c #190a0d", +"agC c #190b08", +"am2 c #190b0c", +".gh c #190b14", +".rJ c #190b1b", +".nX c #190c03", +"am3 c #190c0f", +".AU c #190c1b", +".5W c #190d0d", +".CW c #190d0e", +".v3 c #190d10", +"aPa c #190e0e", +".dK c #190f23", +".VO c #190f32", +"ait c #19101d", +".s2 c #191026", +".EI c #191108", +".G7 c #19113a", +".i8 c #191142", +"#eH c #191145", +".sG c #19114c", +"aC3 c #191214", +".dI c #19131c", +".8Z c #19133e", +".e4 c #191346", +".7d c #19143e", +".DL c #191440", +"#d# c #191444", +"avD c #191518", +".DM c #19153e", +"atJ c #191619", +"azQ c #19171d", +"aDI c #191723", +"aAH c #191821", +".G6 c #191843", +".LA c #191846", +"#x5 c #191a37", +".Fh c #191a4c", +".jd c #191b3f", +"ae4 c #191c37", +".4c c #191c44", +".rL c #191c4c", +"Qtp c #191d57", +".0c c #192a4d", +".Mj c #192f5c", +"#XI c #1a0000", +"aOy c #1a0008", +"aKl c #1a0109", +".M0 c #1a0200", +"aFg c #1a0309", +".Ne c #1a0400", +"#IM c #1a040b", +"ap1 c #1a0501", +"#YE c #1a051f", +"aFA c #1a0600", +"aE4 c #1a0712", +"aPi c #1a0718", +".kD c #1a0923", +"aJ7 c #1a0a12", +".mh c #1a0a23", +".xG c #1a0b16", +".h3 c #1a0c0f", +".dn c #1a0c14", +".D5 c #1a0c1e", +".qm c #1a0c1f", +".ao c #1a0c2b", +".xg c #1a0c36", +".C1 c #1a0e0a", +".v2 c #1a0e10", +"aOv c #1a0e18", +".CJ c #1a0f10", +".xM c #1a0f11", +".T0 c #1a0f3a", +"##P c #1a0f3c", +".G9 c #1a0f47", +"aiY c #1a100d", +"apr c #1a1015", +"#tl c #1a1042", +".BI c #1a1111", +"#s8 c #1a113b", +"ayn c #1a121d", +".kv c #1a1220", +"#x1 c #1a1232", +".t8 c #1a1249", +".gu c #1a1336", +".xr c #1a1337", +"ad9 c #1a1416", +"aqd c #1a1417", +".yX c #1a1430", +".rl c #1a144a", +".Es c #1a1510", +"apy c #1a151a", +"aPe c #1a151d", +"ass c #1a161c", +".lL c #1a163a", +".kf c #1a175a", +"ata c #1a181b", +"aBY c #1a1822", +".B3 c #1a1840", +".oO c #1a184a", +"azu c #1a1922", +".Rb c #1a1a59", +"QtP c #1a1d3f", +".s8 c #1a1d4a", +".hO c #1a1e4d", +".Np c #1b0000", +".ti c #1b0400", +".Zq c #1b0600", +"aD2 c #1b0702", +"aGW c #1b0801", +"auZ c #1b0804", +".M9 c #1b0900", +"aOz c #1b090d", +".nK c #1b0b22", +".Rm c #1b0b23", +".Db c #1b0d00", +".hJ c #1b0d16", +".zj c #1b0d1f", +".Hk c #1b0e21", +".v4 c #1b1012", +"aoI c #1b1015", +".Fy c #1b1145", +".CP c #1b1206", +".zt c #1b1314", +"#J5 c #1b1327", +".vG c #1b133c", +".hP c #1b1344", +"aj5 c #1b1413", +"aqb c #1b1418", +".vE c #1b1436", +".l9 c #1b1446", +"ard c #1b151a", +".0G c #1b1536", +".2c c #1b1625", +"#c2 c #1b1650", +"arK c #1b181d", +"atM c #1b181f", +".Fr c #1b1846", +"aJR c #1b191b", +".Fv c #1b193f", +".lP c #1b1a4e", +".SB c #1b1b5a", +".J3 c #1b1c58", +".sY c #1b1d46", +".Il c #1b1d53", +".c# c #1b1f43", +".dU c #1b264a", +"apR c #1b265d", +".yt c #1b2c49", +".tg c #1c0000", +".Nq c #1c0304", +"aLv c #1c030d", +"#M7 c #1c0314", +".LI c #1c0400", +".2F c #1c0500", +"aOC c #1c0506", +".00 c #1c0600", +".Nd c #1c0601", +".uE c #1c0700", +"aI0 c #1c070b", +".rY c #1c0902", +".zn c #1c0c14", +".o9 c #1c0c20", +".vt c #1c0d35", +".qD c #1c0e05", +".o4 c #1c0e24", +".gg c #1c0f2a", +".0a c #1c1006", +".CY c #1c1014", +"aDK c #1c1019", +".uD c #1c1100", +".C4 c #1c1104", +".CT c #1c1209", +".CM c #1c120d", +"#bu c #1c1212", +"aMf c #1c1219", +"aOp c #1c121e", +"#.n c #1c1224", +".ad c #1c1241", +".CO c #1c1309", +".EO c #1c130d", +"apt c #1c1318", +"aNC c #1c131f", +".2j c #1c132b", +".AK c #1c133e", +".EM c #1c140e", +"aov c #1c151c", +"aQp c #1c151e", +"aho c #1c1525", +".DR c #1c1633", +".ng c #1c1835", +"aPp c #1c1923", +"arW c #1c1a1e", +".N0 c #1c1a52", +".p9 c #1c1b44", +".MF c #1c1b52", +".T3 c #1c1b56", +".Lh c #1c1c53", +".Fl c #1c1d4f", +".GV c #1c1d52", +"QtI c #1c204f", +"aQl c #1c2128", +".Ni c #1d0000", +"#CB c #1d0316", +"#0z c #1d070a", +"#3g c #1d0800", +".Cx c #1d0907", +".rX c #1d0a03", +"#Fi c #1d0a14", +".AZ c #1d0b0e", +"#Ck c #1d0b17", +".Br c #1d0d04", +".qr c #1d0d1f", +".pl c #1d0f06", +".D6 c #1d0f23", +".qG c #1d1007", +".C0 c #1d110f", +".h2 c #1d1218", +"aOt c #1d121f", +"#J0 c #1d1323", +"##O c #1d133f", +"#.o c #1d141e", +".EH c #1d150d", +".nC c #1d1525", +".0F c #1d1530", +".sH c #1d154c", +"#gd c #1d154f", +"#Fn c #1d1629", +"#.v c #1d1631", +"#eI c #1d1652", +"aBD c #1d1719", +"#br c #1d1742", +".Su c #1d1851", +".As c #1d193b", +".Pv c #1d1951", +"asI c #1d1b20", +".2d c #1d1b26", +".sK c #1d1b33", +".rs c #1d1b3d", +".Fs c #1d1b46", +".hV c #1d1e48", +".GS c #1d1e53", +".VS c #1d1f4d", +".cd c #1d2245", +"aKT c #1d2b4d", +".Ab c #1d2e4b", +"#A8 c #1e000f", +"#VL c #1e0013", +".Nj c #1e0100", +".Rw c #1e0300", +"aOD c #1e0608", +"aJt c #1e0708", +"aOE c #1e070a", +"aI1 c #1e070b", +".D9 c #1e0902", +"aOw c #1e0914", +"#DR c #1e0b14", +"aQi c #1e0d1d", +".Bb c #1e0f07", +".gF c #1e0f12", +".i1 c #1e0f18", +".rO c #1e0f1d", +".nG c #1e0f28", +"aPA c #1e1018", +".i9 c #1e1030", +".tn c #1e1108", +"#zp c #1e1129", +".mu c #1e1208", +".v5 c #1e1214", +".C5 c #1e1304", +"aoH c #1e1318", +".vM c #1e1319", +".EE c #1e1515", +"aJ6 c #1e151b", +"#gp c #1e1726", +".xu c #1e1737", +".Fw c #1e173c", +".Gk c #1e1817", +".na c #1e1937", +"azh c #1e1a1c", +".pT c #1e1a28", +"asE c #1e1b1f", +"agQ c #1e1b22", +".0I c #1e1b46", +".lT c #1e1c58", +".DG c #1e1e4c", +".aE c #1e1f2e", +"#AX c #1e2134", +"#WM c #1e2234", +".ce c #1e2246", +".fn c #1e2345", +"#3U c #1e283d", +".O1 c #1f0000", +".O2 c #1f0100", +"aOf c #1f060e", +"aE5 c #1f0613", +".Rp c #1f0700", +"asZ c #1f0701", +"arI c #1f0a06", +"aHD c #1f0c14", +".pA c #1f0d0c", +".SY c #1f0e10", +".TA c #1f0e12", +".r0 c #1f0f07", +"#Cl c #1f0f23", +"#pg c #1f100f", +"aCn c #1f1017", +".t# c #1f101c", +".mc c #1f102b", +".kR c #1f1109", +"aLe c #1f1219", +".bP c #1f121a", +".Hj c #1f1224", +"#.m c #1f1230", +".Xo c #1f152a", +".bJ c #1f1544", +"#7T c #1f1613", +".o0 c #1f1627", +".ur c #1f162d", +"#M1 c #1f172b", +".z. c #1f173e", +"QtJ c #1f1747", +"aL. c #1f181d", +".3V c #1f1829", +"#d. c #1f1848", +".Xv c #1f193d", +"#ga c #1f1a1d", +".lI c #1f1a3e", +"aq2 c #1f1b21", +".p4 c #1f1c42", +"#cZ c #1f1d40", +".oL c #1f1d47", +".nm c #1f1d54", +".ke c #1f1d5c", +"#t# c #1f1e46", +".GW c #1f2055", +".Ir c #1f2058", +".ca c #1f2346", +"aKm c #200109", +".Nk c #200400", +".yn c #200800", +"#Ui c #200810", +"aBd c #200817", +"#1n c #200b21", +".kz c #20102c", +"aE1 c #20121e", +".eS c #20131b", +"aPu c #20131d", +".C2 c #20140d", +"ak2 c #20141b", +".kH c #201630", +".e5 c #201641", +".EG c #201812", +".VP c #201845", +".dr c #201849", +".yS c #201a36", +"#uW c #201a45", +".5t c #201b2b", +".xq c #201c2f", +".kj c #201f61", +"#9. c #203057", +".No c #210100", +"aA7 c #21020e", +"#D8 c #210416", +".SS c #210900", +".FO c #210a00", +"aKZ c #210b03", +".pB c #210d17", +"aum c #210e09", +".Bq c #211109", +"afl c #21110d", +".Bn c #211111", +"#AT c #211122", +".uL c #21120a", +".Be c #211305", +".CZ c #211413", +".62 c #21141b", +"#9y c #211610", +".dB c #21161c", +".dA c #211642", +".2i c #211728", +"#.D c #211929", +".AC c #211935", +".rc c #211d23", +".j8 c #211d44", +"#Kd c #220107", +".Ve c #220300", +"aOg c #22040b", +"#zI c #220915", +".5U c #220a00", +"asp c #220b06", +"aAl c #220f08", +".gq c #221433", +".CX c #221619", +"#wr c #22183b", +".AA c #221842", +".f. c #221920", +"azC c #221a26", +".Et c #221b18", +".oy c #221d33", +".DD c #22214f", +".Fk c #222255", +"#1# c #22364e", +"aFk c #230000", +"aB. c #23000d", +".Nl c #230600", +"ang c #230a02", +".Hn c #230b00", +".BD c #230f00", +".ja c #231108", +".2I c #231112", +"az0 c #23121e", +".kS c #23130b", +".FL c #231529", +".Bg c #231602", +".Bl c #231606", +".D4 c #231624", +"afq c #231814", +".G8 c #231949", +"aIG c #231a20", +".DS c #231c40", +"atN c #232027", +".K0 c #233867", +"#Rv c #24000b", +"a#u c #240100", +"#6F c #240200", +"#0y c #240300", +".P2 c #240600", +"aMs c #240612", +"aOo c #240615", +"aNo c #240a14", +"aty c #24110d", +".mw c #24140c", +".fi c #24141b", +"aNH c #241423", +".tm c #24150d", +".Bm c #241510", +".vu c #241539", +"aNG c #241624", +".qF c #24170e", +"aLi c #24171e", +".Bh c #241802", +".r3 c #24180e", +"a#e c #24180f", +".jC c #24181a", +"aoG c #24191e", +".fa c #24191f", +".TZ c #241937", +"aHi c #241b21", +".7. c #241b30", +".b2 c #241b40", +".hX c #241c38", +"aNe c #241f24", +".u. c #241f41", +".Cb c #24203c", +"atL c #242123", +".G3 c #242250", +".kJ c #242642", +".dT c #242a42", +".cg c #242c4d", +"aa6 c #250000", +"aB# c #25000f", +"aBc c #250013", +"#YF c #25001b", +"#1T c #250100", +"aOh c #25020a", +".7s c #250500", +"aA6 c #250613", +".Nn c #250900", +".Nm c #250901", +".tK c #250e00", +".mM c #251524", +"#eS c #25170e", +".xC c #251729", +".BH c #251814", +".kQ c #251a10", +"##8 c #251c24", +"aL# c #251e24", +"aJS c #251e25", +".xf c #251e36", +"aw2 c #25232b", +".dS c #252536", +".cf c #25294d", +"#9U c #260000", +"#Xb c #260019", +"#OC c #260112", +".9m c #260200", +".uF c #260300", +"aKn c #26040c", +"aA9 c #260412", +"aOl c #260610", +"aA8 c #260613", +"aGk c #260f1c", +".e0 c #26111e", +"ad1 c #261611", +".k9 c #261628", +"#.k c #26193a", +".Bi c #261a02", +".Hg c #261a21", +".CV c #261b18", +".VN c #261b30", +".y0 c #261b41", +".Fz c #261c53", +".T1 c #261d54", +"#c6 c #261e1f", +".gC c #261e27", +"#bo c #261f4d", +"aNE c #26202b", +".rj c #262128", +".2m c #262145", +".0z c #262333", +".dR c #262430", +".aD c #262634", +"ajN c #26395c", +".O0 c #270503", +".3t c #27151e", +".Bp c #27161c", +".nY c #271810", +".AW c #27192d", +"agG c #271a16", +".gl c #271a22", +".Bj c #271b05", +"#Lv c #271f33", +".gT c #272034", +".y9 c #27223b", +"aEE c #27262f", +"aBt c #272d4e", +".sW c #27304c", +".EZ c #273f6d", +"#VM c #280009", +"aBb c #280211", +".9k c #280300", +"#Z4 c #280923", +".z0 c #280f00", +".Da c #281a0d", +".mv c #281a11", +".xD c #281a2e", +"#yg c #281b2e", +".eN c #281b37", +"#bx c #281f37", +".bT c #282050", +".AM c #282146", +"aAy c #282226", +"aoK c #282429", +".nd c #282441", +"apE c #28262b", +".DQ c #282643", +".hY c #282939", +".GC c #283e69", +".Ox c #290000", +"#8f c #290700", +"aJI c #29140c", +".mN c #291929", +".Bt c #291a0c", +".qC c #291a11", +".Cu c #291c2f", +".C3 c #291d13", +"#.j c #291e33", +".Fx c #29204c", +".5B c #292138", +"aND c #29222d", +"apA c #29262a", +"atO c #29262d", +".u# c #29273c", +".fm c #292b40", +".cc c #292d51", +".fo c #29315f", +".Ia c #293d66", +"aOn c #2a0616", +".v. c #2a0d00", +".u7 c #2a1200", +".wh c #2a1408", +".qU c #2a141a", +".BC c #2a1601", +".zB c #2a1705", +"#2P c #2a1719", +".Yz c #2a1809", +".fb c #2a1a21", +".dj c #2a1b24", +"aaT c #2a1d12", +".tp c #2a1f15", +"aEf c #2a2124", +".e9 c #2a222a", +"QtZ c #2a2b3b", +"avX c #2a3857", +".1P c #2a395a", +"#2z c #2a4a6c", +"#0T c #2b0000", +".6A c #2b0600", +".nN c #2b1508", +".XT c #2b1718", +".Bk c #2b1f0a", +"#xY c #2b1f2f", +".C6 c #2b2111", +"#M0 c #2b2330", +".gU c #2b2543", +"axt c #2b2931", +".rA c #2b3158", +".ul c #2b354d", +".ys c #2b364d", +"aJC c #2b385a", +".Jv c #2b4070", +"#0U c #2c0000", +"#M8 c #2c000b", +"#P5 c #2c0011", +"#jF c #2c0100", +".th c #2c0300", +"aFi c #2c0502", +"#CC c #2c0513", +"aOm c #2c0514", +"aBa c #2c0615", +"aLw c #2c0813", +".sj c #2c1100", +".u4 c #2c1212", +".kG c #2c1319", +".x8 c #2c1519", +".uJ c #2c1710", +".4m c #2c1717", +"#nV c #2c1915", +"acp c #2c1e12", +".uO c #2c2218", +"#4y c #2c231d", +"aJT c #2c252c", +".Ck c #2c2548", +".e6 c #2c262f", +"aDx c #2c2e3a", +"#7n c #2c3f69", +"#9T c #2d0000", +"aOx c #2d111d", +".qV c #2d171e", +"##T c #2d201f", +"##Z c #2d2748", +".gz c #2d2b38", +".IH c #2d2d43", +"ahz c #2d3f66", +"#2b c #2e0303", +"#4Z c #2e0d00", +".SZ c #2e1613", +".sh c #2e161a", +".zF c #2e1d00", +".ob c #2e1e20", +".nW c #2e2218", +".ii c #2e2232", +".dJ c #2e2438", +".EJ c #2e2620", +".Is c #2e2f6a", +".5M c #2e3158", +"aax c #2e3a5b", +"aFj c #2f0000", +"#LE c #2f0005", +"#0S c #2f0100", +".tF c #2f1617", +".mk c #2f1715", +"aIi c #2f1911", +".gt c #2f1a21", +".qT c #2f1b17", +".R5 c #2f1c17", +"akw c #2f2b2f", +"ato c #2f4465", +".Dl c #2f4a7c", +"aa5 c #300002", +"aNJ c #300314", +".Oy c #300400", +".9l c #300e00", +".tI c #301600", +".sk c #301707", +".sf c #301a13", +".wg c #301c06", +".hS c #301d1b", +".k8 c #302131", +".pm c #302219", +".qH c #30231a", +"ajW c #30232d", +".Xp c #302848", +"#eE c #302a2c", +".gV c #302a4f", +"aAR c #302b37", +"awz c #302d30", +".al c #303a62", +".ch c #303b60", +".aJ c #304475", +"#HA c #310000", +"#1S c #310400", +"aI2 c #310a00", +"#Z. c #310e00", +".tG c #311600", +".z1 c #311800", +"ak8 c #312623", +"aLa c #312a2f", +".8U c #312b2e", +"#2a c #320604", +"#2c c #320909", +".7t c #321700", +"aNI c #321827", +".wk c #321921", +".Zt c #321a1a", +".1N c #32221c", +".zk c #322438", +".Cr c #322630", +".EL c #322923", +"aIm c #323033", +"ari c #323035", +".B4 c #323058", +"#da c #32305c", +"aql c #323134", +".Wl c #331b0d", +".3s c #331d21", +"azd c #331f18", +"aIN c #33222b", +".xT c #33282a", +".vm c #332b40", +"anj c #332d34", +".vD c #332f40", +"Qt9 c #335e9d", +".#g c #3365a8", +".#f c #3367a8", +".#e c #3368a8", +"#2d c #340806", +"aNp c #340d19", +".7z c #341304", +".v# c #341608", +".wl c #341f08", +"#.A c #342835", +"Qt0 c #343748", +"aQF c #344d7b", +".#h c #3463a8", +"#8e c #350000", +"#Zo c #350100", +"a#t c #350103", +"aDY c #350a1e", +"#h2 c #350b00", +".7r c #350c00", +"#XH c #350d00", +"aMY c #351717", +".si c #351806", +".vP c #352739", +".xh c #35284c", +"anE c #352e33", +"#Vi c #35374b", +".d6 c #355d9e", +".aW c #3565aa", +"#Zn c #360000", +"#9S c #360005", +"#Xc c #360011", +"#SW c #360213", +"#0R c #360703", +".Rx c #361609", +"#3f c #361c0c", +".Bu c #362716", +".zi c #362938", +".0E c #362c41", +"aLb c #362f35", +".Ly c #36325a", +"#Zt c #370000", +"#Zp c #370500", +"#0V c #370600", +".9c c #370c00", +".wj c #371e22", +".yo c #37231c", +".Bv c #372916", +".aj c #372931", +".7h c #372a20", +"al6 c #372b2f", +"aoF c #372c31", +"#Fm c #372f3c", +"aAx c #373134", +"aJU c #373137", +"afA c #37343b", +".DE c #373664", +"ac# c #374d71", +".#i c #3763ac", +".aX c #3766ab", +"#9R c #38040a", +"#Zq c #380700", +".OM c #380800", +"#9Q c #38080c", +"#Wf c #380900", +"#h3 c #380b00", +"aL1 c #380e0e", +".04 c #381b1a", +".48 c #381d2d", +".tD c #382017", +".pz c #382a14", +".mL c #382a2f", +".ih c #382b37", +".us c #382e3e", +".dQ c #382e42", +".dH c #38313a", +".VR c #38376a", +"#YG c #390018", +"#Zs c #390300", +"#Zr c #390400", +"aa4 c #390608", +"#HB c #39100c", +".OZ c #39130f", +"aHE c #39202b", +".49 c #392236", +"#TV c #392626", +".z7 c #392822", +".Bs c #392a1f", +".FJ c #392c3b", +".jD c #392f31", +".Ci c #393060", +"#ws c #393157", +"#80 c #39353b", +"aAd c #393e60", +"#5H c #394b71", +".aK c #394e7f", +".#a c #395ea5", +".## c #3960a4", +".yy c #3966b3", +".wL c #3966b4", +".Oz c #3a0e02", +".P3 c #3a1a0c", +".tE c #3a2121", +".tJ c #3a220e", +".uI c #3a231d", +".wi c #3a2320", +".7g c #3a2d2c", +".vN c #3a2d38", +"aMh c #3a3137", +"alX c #3a465d", +"Qt3 c #3a5a93", +".lk c #3a5fab", +".aT c #3a62ad", +".m2 c #3a64b8", +".aV c #3a6bb0", +"#e2 c #3b0200", +"#0Q c #3b0a03", +".OK c #3b0b03", +"#D9 c #3b101d", +".nZ c #3b2b23", +".xe c #3b344b", +".cq c #3b62ad", +".a1 c #3b63a9", +".su c #3b64a9", +".cm c #3b64ac", +".oq c #3b67bc", +"#dq c #3c0400", +"aNR c #3c0408", +".OL c #3c0c04", +"#2e c #3c0d0a", +"#2# c #3c0e0b", +"#.K c #3c0f00", +"aMt c #3c121f", +".sg c #3c2427", +"#Cj c #3c2a28", +".od c #3c2a37", +".oc c #3c2b37", +"anG c #3c363b", +"#bn c #3c3759", +".At c #3c385a", +"adK c #3c517e", +"Qt2 c #3c5b95", +".ct c #3c64a6", +".cs c #3c64a9", +".cr c #3c64ac", +".#j c #3c65b0", +".#B c #3c66b0", +".cJ c #3c66b1", +"##j c #3d0000", +"#Rw c #3d0113", +".58 c #3d0900", +".OJ c #3d0d04", +"#VN c #3d0d12", +"#Wg c #3d180b", +".u2 c #3d2419", +".zO c #3d292c", +".zE c #3d2c12", +".b3 c #3d2d30", +".z8 c #3d3130", +".8O c #3d3336", +"aFB c #3d3437", +".xd c #3d364e", +".Av c #3d395b", +".aS c #3d62aa", +".#A c #3d65b2", +".#C c #3d66b1", +".vj c #3d67ae", +".#F c #3d67b1", +".a9 c #3d67b2", +".r# c #3d69b8", +"#Zu c #3e0000", +"aNO c #3e0001", +"aNK c #3e0012", +"#gw c #3e0300", +"#Zm c #3e0600", +"#Z5 c #3e0b28", +"aNS c #3e181b", +"#FW c #3e1d1d", +"#dg c #3e3340", +"#gb c #3e3749", +".t6 c #3e3936", +"ahg c #3e3b3f", +"aIc c #3e507a", +".dV c #3e507f", +".BO c #3e5d93", +".oo c #3e64af", +".a8 c #3e66b2", +".#z c #3e66b3", +".a0 c #3e67ad", +".#G c #3e67b2", +".lx c #3e68af", +".lw c #3e68b0", +".m9 c #3e68b1", +".#D c #3e68b2", +".#E c #3e68b3", +".ly c #3e69b0", +".ln c #3e69c1", +".Af c #3e6ab4", +".Dp c #3e6cab", +"#CZ c #3f0200", +"aa3 c #3f0b0d", +"#ag c #3f0f01", +"#A9 c #3f1823", +"axY c #3f2b25", +".8K c #3f3147", +".63 c #3f3333", +"#G7 c #3f3744", +".Ka c #3f3b64", +".un c #3f4268", +".g3 c #3f63af", +".jX c #3f64b1", +".jY c #3f65b0", +".a2 c #3f66ad", +".#o c #3f66ae", +".cp c #3f66b3", +".#n c #3f67ad", +".#y c #3f67b3", +".#x c #3f67b4", +".#H c #3f68b3", +".lv c #3f69b0", +".m6 c #3f69b1", +".lq c #3f69b2", +".#I c #3f69b3", +".lu c #3f6ab1", +".wN c #3f6bae", +".E4 c #3f6dab", +".Uz c #401615", +"#HC c #401a14", +"aym c #403541", +".5s c #40374b", +".dY c #4061a7", +".d2 c #4061ae", +".#d c #4062b0", +".fJ c #4065b3", +".a4 c #4067ae", +".cy c #4067af", +".#p c #4067b0", +".#k c #4067b4", +".#m c #4068ae", +".cI c #4068b3", +".a7 c #4068b4", +".#w c #4068b5", +".cu c #4069a9", +".jS c #4069af", +".wU c #4069b0", +".eg c #4069b3", +".cH c #4069b4", +".jT c #406aaf", +".iy c #406ab0", +".os c #406ab1", +".m5 c #406ab2", +".ls c #406ab3", +".eh c #406ab4", +".fI c #406ab5", +".or c #406bb2", +".lp c #406bb3", +".yA c #406caf", +".pO c #406cbe", +"aNQ c #410003", +"#UN c #410900", +"#bT c #410d01", +".6C c #411912", +".wB c #41281c", +".wm c #412b13", +"aNA c #41313f", +"#Co c #413647", +".3u c #414e6d", +".#b c #4165af", +".#L c #4166b2", +".ba c #4166b3", +".#K c #4166b4", +".#t c #4167b5", +".a3 c #4168ae", +".cx c #4168af", +".cz c #4168b1", +".#q c #4168b3", +".#v c #4168b5", +".d9 c #4169b0", +".ef c #4169b3", +".cG c #4169b4", +".a6 c #4169b5", +".#u c #4169b6", +".#. c #416aab", +".jU c #416aaf", +".iz c #416ab0", +".yD c #416ab1", +".ha c #416ab2", +".fH c #416ab3", +".ee c #416ab4", +".cF c #416ab5", +".aU c #416ab7", +".lz c #416bb2", +".pP c #416bb3", +".lr c #416bb4", +".hb c #416bb5", +".lC c #416bb6", +"Qt8 c #416caa", +".m7 c #416cb3", +".ou c #416cb4", +".aY c #416eb3", +".Do c #416fb0", +"aNN c #420004", +"#Hg c #420c17", +"#0W c #420d05", +"#Fz c #420d1a", +".59 c #420e00", +".7D c #420e02", +".ON c #42130a", +"aNq c #421320", +".OA c #42160a", +"aKQ c #421714", +".ym c #422604", +".x9 c #422b32", +".qB c #42332b", +".pj c #42352c", +"##5 c #423643", +"arY c #424245", +"#AY c #424559", +".d1 c #4261b1", +".jZ c #4267b1", +".cM c #4267b2", +".cL c #4267b3", +".fK c #4267b4", +".b# c #4267b5", +".a5 c #4268b3", +".#s c #4268b5", +".#l c #4268b6", +".cw c #4269b0", +".e. c #4269b2", +".cA c #4269b4", +".#r c #4269b5", +".cC c #4269b6", +".d8 c #426ab0", +".wW c #426ab2", +".fG c #426ab3", +".ed c #426ab4", +".cE c #426ab5", +".cD c #426ab6", +".wS c #426bb1", +".wV c #426bb2", +".fF c #426bb3", +".m4 c #426bb4", +".ec c #426bb5", +".lD c #426bb6", +".yE c #426cb2", +".lA c #426cb3", +".m8 c #426cb4", +".lt c #426cb5", +".hc c #426cb6", +".ov c #426cb7", +".lm c #426cc2", +".Dq c #426daf", +".wX c #426db2", +".ot c #426db4", +".sw c #426db5", +".E3 c #426fae", +"#9P c #430103", +"#OD c #430513", +"aLx c #431622", +".6B c #431d14", +".rW c #432215", +".eR c #432409", +".7A c #432418", +"ape c #432c26", +".bX c #432e35", +".tf c #433121", +".Bf c #433624", +"aLg c #43363d", +"aMg c #433940", +"#r4 c #433a3f", +".qj c #433a44", +"aGJ c #433b39", +"ado c #433f48", +"awd c #434047", +".ej c #4368b2", +".ei c #4368b3", +".hd c #4368b4", +".cK c #4368b5", +".#J c #4368b6", +".yw c #4369ae", +".iA c #4369b2", +".eb c #4369b6", +".fA c #436ab2", +".fB c #436ab3", +".e# c #436ab5", +".cB c #436ab6", +".h# c #436ab7", +".d5 c #436bac", +".d7 c #436bb1", +".yF c #436bb3", +".lo c #436bb5", +".yB c #436cb0", +".wR c #436cb2", +".wT c #436cb3", +".yG c #436cb4", +".jV c #436cb7", +".lB c #436db6", +".lE c #436db7", +".vk c #436db8", +".wY c #436eb4", +".E5 c #436fb0", +".BS c #4370b1", +".Ah c #4370b2", +".tV c #4370ba", +".wM c #4372b9", +"#Zl c #440a00", +"#IN c #440a12", +".OI c #44140c", +".9n c #44180a", +".44 c #441c0f", +".qW c #443124", +"aLh c #44373f", +"#bG c #443946", +".rG c #443a47", +".s3 c #443a49", +"ast c #444046", +"ay7 c #44496c", +".aP c #44629b", +".aQ c #4464a2", +".Dn c #4468ab", +".yC c #4469b1", +".cN c #4469b3", +".#M c #4469b4", +".fL c #4469b5", +".b. c #4469b7", +".j0 c #446ab1", +".iB c #446ab2", +".he c #446ab3", +".ea c #446ab6", +".fE c #446ab7", +".jR c #446ab8", +".fz c #446bb2", +".g6 c #446bb3", +".g7 c #446bb4", +".fC c #446bb6", +".h. c #446bb8", +".yH c #446cb4", +".tU c #446daf", +".wQ c #446db3", +".Aj c #446db4", +".BX c #446db5", +".ra c #446db8", +".tW c #446eb6", +".pQ c #446eb7", +".lF c #446eb8", +".n. c #446eb9", +".yx c #446eba", +".aZ c #446fb4", +".yI c #446fb5", +".vi c #4471b9", +".yz c #4472b9", +"#ay c #450000", +"aNP c #450003", +"#M9 c #450109", +"#I9 c #451200", +".OO c #45150d", +"aFf c #451528", +".9Z c #451809", +"#HD c #451a09", +".41 c #451b02", +"#6O c #451c01", +"#FX c #451e0c", +"aK# c #45353d", +".vQ c #45374b", +".Bw c #453822", +"aNB c #453845", +".d0 c #4562b5", +"Qt4 c #45649e", +"Qt6 c #45659e", +".jW c #4569b7", +".iE c #456baf", +".iD c #456bb1", +".iC c #456bb2", +".fM c #456bb3", +".fD c #456bb7", +".ix c #456bb8", +".j1 c #456caf", +".Jz c #456cb2", +".fy c #456cb3", +".it c #456cb4", +".iu c #456cb5", +".g8 c #456cb7", +".g9 c #456cb8", +".jQ c #456cb9", +".co c #456cba", +".E2 c #456db0", +".wO c #456db1", +".g5 c #456db3", +".Dr c #456db4", +".Ai c #456eb2", +".BW c #456eb4", +".Ak c #456eb5", +".Al c #456eb6", +".BT c #456fb2", +".wZ c #456fb5", +".lG c #456fb9", +".w0 c #4570b5", +".m3 c #4571c8", +".GH c #4573af", +".9O c #460500", +".6. c #461200", +"#3D c #461803", +"#zJ c #462b34", +".zM c #46342b", +".BG c #463730", +".nV c #463b31", +"#ZK c #465470", +".ci c #465580", +".aL c #465b8c", +".dZ c #4662b7", +".E1 c #4667a7", +".aR c #4669ac", +".fw c #4669b2", +".#c c #4669b5", +".hf c #466cb3", +".ek c #466cb4", +".bb c #466cb5", +".hh c #466db0", +".BU c #466db4", +".jN c #466db5", +".jO c #466db6", +".iv c #466db7", +".jP c #466db8", +".iw c #466db9", +".m1 c #466dbc", +".g4 c #466eb4", +".Am c #466eb6", +".BV c #466fb5", +".BY c #466fb6", +".BZ c #466fb7", +".r. c #466fb8", +".yJ c #4670b6", +".w6 c #4670b8", +".ow c #4670ba", +".wK c #4670be", +".w1 c #4671b6", +".w5 c #4671b8", +".sv c #4673bf", +".BR c #4674b7", +".If c #4675b1", +"#Hz c #470b00", +".OH c #47170f", +".40 c #471901", +".90 c #47190a", +".8a c #47231c", +".5X c #473131", +".di c #473a56", +"aJV c #474047", +"#bm c #47435c", +"ao6 c #47518e", +"arx c #475680", +".aI c #475b8c", +".aF c #475b8d", +".ck c #47659f", +".fv c #4766b1", +".Ac c #4769a3", +".q9 c #476aa9", +".d3 c #476ab3", +".jJ c #476bb0", +".wP c #476bb4", +".fx c #476cb5", +".iF c #476db1", +".hg c #476db3", +".BQ c #476db4", +".ir c #476dba", +".j2 c #476eb2", +".jM c #476eb5", +".is c #476fb5", +".Ae c #476fb9", +".cv c #4770af", +".Du c #4770b6", +".Dv c #4770b7", +".Dx c #4770b8", +".tX c #4770bb", +".yL c #4771b7", +".w4 c #4771b8", +".pR c #4771bb", +".yK c #4772b7", +".Dy c #4772b8", +".w3 c #4772b9", +".cn c #4772bd", +".GG c #4773b1", +".GI c #4774b4", +".Ag c #4775ba", +"a#s c #480209", +".57 c #480400", +"#KC c #480700", +"#Fl c #484453", +".li c #4866a7", +"Qt5 c #4867a1", +".g2 c #4868b0", +".st c #486aa4", +".iq c #486bb5", +".yv c #486ca9", +".wJ c #486eac", +".hi c #486eb2", +".fN c #486eb5", +".cO c #486eb6", +".iG c #486fb4", +".jL c #4870b6", +".Dw c #4870b8", +".Ds c #4871b7", +".Dt c #4871b8", +".GN c #4871b9", +".w2 c #4872b8", +".yO c #4872ba", +".rb c #4872bc", +".tY c #4872bd", +".yM c #4873b8", +".An c #4873b9", +"aNL c #490010", +"#E. c #49131d", +".OG c #491910", +".6H c #492f4b", +"#xX c #493d47", +".vJ c #493f3c", +"aPI c #496190", +".Ad c #496daf", +".#N c #496eb8", +".j3 c #496fb5", +".iH c #496fb6", +".K4 c #4970b4", +".hj c #4970b5", +".Fa c #4971b9", +".E9 c #4972b8", +".E8 c #4972b9", +".F# c #4972ba", +".Dz c #4973b9", +".w7 c #4973ba", +".Ap c #4973bb", +".sx c #4973bd", +".Fb c #4974b9", +".yN c #4974ba", +".yP c #4974bb", +".Ie c #4975b2", +"#Ke c #4a0a0f", +".6# c #4a1500", +"#J# c #4a1603", +"#0P c #4a160e", +".OB c #4a1e12", +".xW c #4a3519", +".dv c #4a3542", +".Y3 c #4a415a", +"#tw c #4a4348", +"aAI c #4a4852", +".yu c #4a5e7f", +".tS c #4a6085", +".dW c #4a639d", +".Ic c #4a69a5", +".vg c #4a6a9d", +".GE c #4a6aa7", +".hk c #4a70b6", +".iI c #4a70b7", +".hl c #4a70b8", +".hm c #4a70b9", +".JS c #4a71b8", +".K6 c #4a71b9", +".Lc c #4a72b8", +".MA c #4a72b9", +".GM c #4a72ba", +".E6 c #4a73b9", +".F. c #4a73bb", +".JK c #4a74b8", +".Ao c #4a74ba", +".Aq c #4a74bb", +".tZ c #4a74be", +".Fc c #4a75ba", +".Fe c #4a75bb", +".w8 c #4a75bc", +"aNM c #4b020d", +"#SX c #4b0617", +"#.0 c #4b0c00", +"#3C c #4b1804", +"#CD c #4b1b25", +".OP c #4b1c12", +"#1o c #4b2741", +".gk c #4b2c11", +"#G2 c #4b3a44", +".uM c #4b3e35", +".o1 c #4b424a", +"aNF c #4b424e", +"aAw c #4b4549", +"ax. c #4b494f", +".Dm c #4b69a3", +".m0 c #4b6eb7", +".iJ c #4b70ba", +".fP c #4b71b5", +".fO c #4b71b8", +".bc c #4b71b9", +".JB c #4b71ba", +".Mp c #4b72b8", +".Mn c #4b73b5", +".JR c #4b73ba", +".GL c #4b73bb", +".vh c #4b74b5", +".JL c #4b74b9", +".E7 c #4b74ba", +".GJ c #4b74bb", +".JJ c #4b75b8", +".My c #4b75b9", +".Ff c #4b75bb", +".B0 c #4b75bc", +".yQ c #4b75bd", +".Fd c #4b76bb", +".B1 c #4b76bd", +"#.2 c #4c0a00", +"#I8 c #4c1100", +"#XY c #4c1200", +"aNr c #4c1826", +"#2f c #4c1913", +"#.R c #4c1c08", +".9d c #4c2a1d", +"#FV c #4c2a2e", +".W4 c #4c2e1f", +".u3 c #4c3231", +".pa c #4c3720", +".zC c #4c3a25", +".bM c #4c3d3a", +".8J c #4c414a", +".nD c #4c4449", +".pZ c #4c4856", +"aej c #4c4a51", +"a.Q c #4c5a7e", +".aG c #4c6192", +".aN c #4c679b", +".fu c #4c67b3", +".q8 c #4c689a", +".BP c #4c6dac", +".Jy c #4c6fb5", +".d4 c #4c71b6", +".el c #4c71b9", +".hn c #4c71bc", +".jK c #4c71bd", +".GF c #4c72b3", +".fQ c #4c72b6", +".j4 c #4c72bb", +".NF c #4c73b3", +".JT c #4c73ba", +".NT c #4c74ba", +".JV c #4c74bb", +".JI c #4c75b8", +".JM c #4c75b9", +".JN c #4c75ba", +".GK c #4c75bb", +".JF c #4c76b7", +".JE c #4c76b8", +".JH c #4c76b9", +".JO c #4c76ba", +".GO c #4c76bc", +".w9 c #4c76bd", +".DA c #4c77be", +"#ax c #4d0700", +"#Bs c #4d0d00", +"#KB c #4d0e00", +".4T c #4d0f00", +"#J. c #4d1c0c", +"#0x c #4d2004", +".Qw c #4d2113", +".ma c #4d4549", +".AD c #4d475b", +".fl c #4d4c55", +".jq c #4d4e45", +".gZ c #4d5e9a", +".ip c #4d6dae", +".fT c #4d72ba", +".#V c #4d72bc", +".Id c #4d73b3", +".fR c #4d73b9", +".fS c #4d73ba", +".#W c #4d73be", +".Mz c #4d74bb", +".NH c #4d75b8", +".JU c #4d75bb", +".JQ c #4d75bc", +".ll c #4d75c6", +".L# c #4d76b8", +".JG c #4d76b9", +".JP c #4d76ba", +".Mx c #4d76bb", +".JD c #4d77b8", +".L. c #4d77b9", +".Lb c #4d77ba", +".NS c #4d77bb", +".Fg c #4d77be", +"#Xd c #4e0912", +"aNz c #4e1721", +".OF c #4e1e16", +"QtL c #4e2400", +".7C c #4e2419", +".OY c #4e241f", +".wA c #4e2f0b", +".jl c #4e3f41", +"aBU c #4e4a4e", +".av c #4e4a6d", +".sR c #4e4c68", +".mm c #4e4e65", +".fp c #4e588f", +"avp c #4e5c7e", +".fr c #4e60af", +".pM c #4e6ca7", +".pN c #4e73b8", +".#O c #4e73bc", +".fU c #4e73be", +".#U c #4e74bc", +".iK c #4e74be", +".NU c #4e75bc", +".Pd c #4e76b3", +".NV c #4e76bc", +".K9 c #4e77b9", +".La c #4e77ba", +".Mw c #4e77bc", +".K8 c #4e78b9", +".Mr c #4e78ba", +".Mu c #4e78bb", +".Mv c #4e78bc", +".GP c #4e78bf", +".GQ c #4e79c0", +"#Z6 c #4f031d", +"#Uj c #4f0b1c", +"#aq c #4f1f07", +"a.# c #4f2513", +"#6E c #4f2615", +".ky c #4f2813", +"#.T c #4f2814", +".wy c #4f300c", +".6G c #4f3148", +".TY c #4f4359", +"aoE c #4f444a", +".dP c #4f4458", +".yT c #4f4965", +"aGR c #4f608b", +".E0 c #4f6aa1", +".aO c #4f6ba1", +".dX c #4f6daf", +"Qt1 c #4f6fa8", +".on c #4f70b3", +".bj c #4f75be", +".bk c #4f75bf", +".QY c #4f76bd", +".Pp c #4f77bd", +".Mt c #4f78bb", +".NR c #4f78bc", +".NQ c #4f78bd", +".Mq c #4f79ba", +".NM c #4f79bb", +".Ms c #4f79bc", +".Pm c #4f79bd", +".op c #4f79ca", +"#9O c #500409", +"#.Z c #501200", +"#3E c #501500", +"#.L c #50291e", +".mb c #502a14", +".7B c #502e23", +"#DQ c #503d36", +"aHl c #503f46", +".oa c #504330", +".81 c #504451", +"#x0 c #504665", +"aEz c #50494e", +"ap6 c #504c52", +"ai7 c #504d54", +"#Yi c #505b79", +".gY c #505e96", +".aH c #506596", +".cj c #506699", +".Jx c #506dae", +".ep c #5075bf", +".bl c #5075c0", +".K7 c #5075c1", +".bd c #5076bd", +".#P c #5076be", +".Pf c #5077b8", +".em c #5077ba", +".QX c #5077be", +".Pq c #5078be", +".NG c #5079b9", +".NP c #5079bc", +".QR c #5079bd", +".Pn c #5079be", +".NL c #507abb", +".NK c #507abc", +".NO c #507abd", +".Po c #507abe", +".Ig c #507ac1", +".5d c #507dbb", +"#XQ c #510900", +"#.1 c #511000", +".9v c #511305", +"acy c #512320", +".OC c #512519", +".dm c #513217", +"aPM c #513327", +".BB c #513d28", +".Bx c #51442d", +"#DV c #514456", +".5. c #515d7b", +".aM c #516596", +".fs c #5165b3", +".ft c #5167b5", +"Qt7 c #5171aa", +".K3 c #5174b8", +".eq c #5176c0", +".#T c #5177bd", +".#Q c #5177be", +".cU c #5177c0", +".cV c #5177c1", +".#R c #5178bb", +".en c #5178bc", +".QZ c #5178bf", +".QK c #5179b7", +".So c #5179bf", +".TV c #5179c0", +".Pe c #517ab7", +".VF c #517aba", +".NJ c #517abc", +".NN c #517abd", +".QS c #517abe", +".QT c #517abf", +".Pj c #517bbc", +".Pi c #517bbd", +".Pl c #517bbe", +".Sm c #517bbf", +"#L4 c #520300", +".73 c #52130a", +"#.Q c #521d09", +".6a c #521e07", +"#jG c #522512", +".6D c #522928", +".ai c #523318", +".jA c #524140", +"aK. c #52424a", +".uN c #52473d", +".vw c #524756", +"aGZ c #52484c", +"#c8 c #524a64", +".85 c #524b5b", +".sO c #52506c", +"#3V c #525f79", +"#9# c #52648b", +".mX c #526ba1", +".io c #526ca3", +".K2 c #526fb0", +".mZ c #5272b4", +".Vl c #5275b6", +".cl c #5276b8", +".er c #5277c2", +".#S c #5278bd", +".eo c #5278be", +".be c #5278bf", +".cT c #5278c0", +".cW c #5278c2", +".JA c #5279bf", +".Sn c #5279c0", +".VE c #527abb", +".Mo c #527abd", +".K5 c #527abf", +".Q0 c #527ac0", +".Sp c #527ac1", +".VD c #527bbb", +".Pk c #527bbe", +".QU c #527bbf", +".QV c #527bc0", +".QJ c #527cb7", +".Ph c #527cbd", +".QP c #527cbe", +".QQ c #527cbf", +".QW c #527cc0", +"#P6 c #530a1a", +"#Et c #531705", +"#0X c #53180d", +"#0O c #531d13", +".nF c #532d15", +".i4 c #533419", +"axn c #533a30", +".xw c #534846", +".7f c #534855", +"arg c #535256", +"#Cq c #535666", +".mY c #536eaa", +".lj c #5375bb", +".JC c #5377c4", +".bf c #5379bd", +".bi c #5379bf", +".cP c #537abd", +".TT c #537ac1", +".VC c #537bbc", +".TU c #537bc2", +".TK c #537cb3", +".QI c #537cb6", +".Sg c #537cb8", +".Vw c #537cbb", +".TS c #537cc0", +".TR c #537cc1", +".TL c #537db4", +".Sf c #537db6", +".QO c #537dbe", +".QN c #537dbf", +".TQ c #537dc1", +".6O c #5380bf", +".5e c #5383c1", +"#8d c #540007", +".OE c #54271c", +".OD c #54281c", +".Zu c #543424", +".Tz c #544040", +".zQ c #544233", +".xa c #544d65", +".ak c #54567c", +"axR c #54668b", +".in c #546995", +".pL c #546c9b", +".ol c #546c9d", +".lh c #5470ac", +".W9 c #5477b8", +".Mm c #5477ba", +".X# c #5478b3", +".bg c #547abe", +".bh c #547abf", +".cS c #547ac0", +".QL c #547bbd", +".cQ c #547bbf", +".TW c #547bc2", +".Xh c #547cbb", +".VB c #547cbc", +".Sq c #547cc3", +".Se c #547db6", +".Vv c #547dbc", +".VA c #547dbd", +".Sl c #547dbf", +".QM c #547ebf", +".Sk c #547ec0", +"#X3 c #551506", +"#XX c #551904", +".9t c #551b0c", +"aLy c #552330", +".OQ c #55261b", +"#ah c #55281f", +"aLN c #553d4e", +"aIL c #55434c", +"ahR c #554843", +"aLf c #55484f", +".Hf c #554a4c", +".dM c #554b5f", +"#dk c #554e5e", +".sN c #555758", +".lg c #5570aa", +".Ml c #5572b0", +".TI c #5574a7", +".NE c #5578b8", +".Vn c #557ab4", +".NI c #557ac2", +".cR c #557bc0", +".Sh c #557cbc", +".Vz c #557dbe", +".VH c #557dbf", +".Vs c #557ebb", +".Xg c #557ebc", +".Vu c #557ebd", +".Vy c #557ebe", +".VG c #557ebf", +".Sj c #557ec0", +".Xd c #557fbc", +".Si c #557fc0", +".TP c #557fc1", +".8o c #5587bc", +"aNw c #560a13", +"#LF c #560b0f", +"aNy c #560b1b", +".74 c #56140b", +".9u c #561a0b", +".55 c #561d0c", +"#5l c #56200c", +"#.S c #562d18", +"aeo c #563726", +"aNu c #56392a", +".XU c #563b2c", +".ar c #564341", +"QtN c #56443c", +".zX c #564628", +".fe c #56464d", +".DU c #564c80", +"aAv c #564f53", +".Cl c #565165", +"aB8 c #565561", +"agn c #566790", +".wI c #566b8e", +".g0 c #566cac", +".GD c #5670a3", +".g1 c #5671b6", +".ND c #5674af", +".TJ c #567bb2", +".0h c #567cb9", +".Pg c #567cc0", +".TX c #567dc4", +".Xb c #567eb5", +".0o c #567ebd", +".Xj c #567ebe", +".Xi c #567ebf", +".VI c #567ec0", +".TM c #567fb9", +".Vr c #567fbc", +".Vt c #567fbd", +".Vx c #567fbe", +".TO c #567fc1", +".0j c #5681ba", +".8n c #5689bb", +"##k c #571002", +".9Q c #571105", +"#X4 c #571401", +"#XZ c #571f0d", +".dt c #572806", +"#FU c #572b27", +".o3 c #573116", +".8# c #57342c", +".zP c #574349", +".zL c #574636", +"aoD c #574c51", +"amk c #574c58", +"#7g c #575359", +".oC c #575369", +".Pb c #5775ae", +".Sc c #5776aa", +".tT c #5778ad", +".0f c #577aba", +".Pc c #577bb8", +".Vm c #577bba", +".X. c #577cbb", +".0g c #577cbc", +".5c c #577dbe", +".Vp c #577eb4", +".YN c #577fbe", +".Xk c #577fc1", +".0i c #5780ba", +".Vq c #5780bd", +".Xc c #5780be", +".Xf c #5780bf", +".VJ c #5780c2", +".0m c #5781be", +".1W c #5784bf", +".8l c #5787bf", +"#YH c #58081a", +"##l c #580d00", +"#WG c #581000", +"#Zv c #581502", +"#3e c #58371d", +"aOQ c #583b2f", +"aF5 c #58484f", +".i2 c #584946", +".0C c #584d5b", +"aFV c #584f55", +".kw c #585053", +".nO c #585151", +"aJW c #585158", +"avb c #58565c", +".q7 c #586b90", +".QG c #5876ad", +".1S c #587bba", +".YH c #587db9", +".1T c #587dbd", +".Xa c #587fb6", +".TN c #587fbe", +".YO c #5880c0", +".YP c #5880c1", +".Xl c #5880c2", +".Xe c #5881be", +".YK c #5881bf", +".YM c #5881c0", +".YQ c #5881c1", +".0r c #5881c3", +"a#r c #59040f", +"#XR c #590e00", +"#av c #591400", +".9M c #591803", +"#gx c #591a16", +".9Y c #592e1e", +".9j c #592f1d", +".0# c #594534", +"aLJ c #594555", +"aCo c #59464d", +".D# c #594b3e", +".gB c #59545e", +"ae5 c #59678f", +".K1 c #5971a8", +".om c #5975af", +".Vk c #597ab4", +".Sd c #597eb6", +".1Z c #5981c0", +".YR c #5981c2", +".YT c #5981c3", +".0k c #5982bf", +".0l c #5982c0", +".YL c #5982c1", +".YS c #5982c2", +".VK c #5982c3", +".0s c #5982c4", +".3B c #5988c4", +"#8# c #5a0009", +".9R c #5a1205", +"#au c #5a1501", +".56 c #5a1b0c", +"#3B c #5a200c", +".6b c #5a260f", +"aMu c #5a2635", +"#2. c #5a2a24", +"#k8 c #5a2f10", +".bO c #5a3b20", +"#Is c #5a4753", +".mt c #5a5147", +".Ib c #5a72a4", +".Mk c #5a72a7", +".Jw c #5a72aa", +".W8 c #5a7ab4", +".5b c #5a7cbb", +".QH c #5a7eb8", +".15 c #5a82c2", +".0p c #5a82c3", +".YU c #5a82c4", +".1X c #5a83c0", +".3F c #5a83c1", +".0n c #5a83c2", +".0q c #5a83c3", +".0t c #5a83c4", +".VL c #5a83c5", +".1V c #5a84bf", +".1Y c #5a84c1", +".6P c #5a8ac9", +"#Wn c #5b1000", +"aI3 c #5b1814", +"#Eu c #5b1e06", +".72 c #5b2611", +"#5m c #5b2915", +".ap c #5b3000", +".7y c #5b3323", +".ql c #5b3618", +"aor c #5b4139", +".x7 c #5b4542", +".lK c #5b577a", +"#vh c #5b5e68", +".lf c #5b6f7b", +".mW c #5b72a6", +".ss c #5b739e", +".NC c #5b74a7", +".YF c #5b7ebe", +".Vo c #5b81b8", +".3y c #5b81c1", +".YI c #5b82bb", +".1U c #5b83c0", +".3G c #5b83c2", +".3M c #5b83c3", +".14 c #5b83c4", +".3N c #5b83c5", +".YJ c #5b84bc", +".3C c #5b84c1", +".10 c #5b84c2", +".3E c #5b84c3", +".13 c #5b84c4", +".3D c #5b85c2", +".3A c #5b87c3", +".8m c #5b8ec1", +"#R0 c #5c0d00", +"aGV c #5c4032", +".zN c #5c4847", +".zR c #5c4a3a", +"#eT c #5c535a", +"amG c #5c595d", +".p6 c #5c5b77", +".jp c #5c5d55", +".Pa c #5c75a5", +".QF c #5c76a3", +".3x c #5c7fbe", +".YG c #5c81c0", +".5h c #5c84c3", +".5k c #5c84c4", +".12 c #5c84c5", +".16 c #5c84c6", +".5f c #5c85c2", +".3H c #5c85c3", +".3J c #5c85c4", +".11 c #5c85c5", +".5l c #5c85c6", +".6V c #5c85c7", +".6N c #5c86c5", +"#OE c #5d0812", +"#24 c #5d0a00", +"#az c #5d1703", +"#.Y c #5d200e", +"#1Z c #5d2700", +"#ao c #5d2c13", +".1M c #5d4539", +".3U c #5d5265", +".DT c #5d5483", +".rt c #5d5c7d", +".gX c #5d69a0", +".wH c #5d708f", +".Sb c #5d77a2", +".8p c #5d85c1", +".3I c #5d85c4", +".3L c #5d85c6", +".17 c #5d85c7", +".6Q c #5d86c3", +".5i c #5d86c4", +".5j c #5d86c5", +".3K c #5d86c6", +".9P c #5e1a10", +".Vd c #5e3325", +"#8w c #5e3822", +".dk c #5e4e4b", +".gi c #5e4f4c", +".vZ c #5e5254", +".vs c #5e576c", +"aAu c #5e595b", +"aay c #5e6c8e", +"aca c #5e749b", +".TH c #5e79a3", +".5g c #5e86c5", +".6T c #5e86c6", +".6U c #5e86c7", +".18 c #5e86c8", +".6S c #5e87c6", +".5m c #5e87c9", +".99 c #5e8abf", +"#ht c #5e91d1", +"aNx c #5f0517", +"#Uk c #5f0c1c", +"#X2 c #5f2115", +".9s c #5f2616", +"aNv c #5f312b", +".rI c #5f3a19", +".2J c #5f3e3c", +".S0 c #5f4139", +".hK c #5f504d", +"acW c #5f545a", +".oE c #5f5b71", +"aIn c #5f5d5f", +"#bd c #5f7fbf", +".8G c #5f85c5", +".8t c #5f87c3", +".3O c #5f87c9", +".3z c #5f88c6", +"#.. c #5f8bc0", +"##m c #601202", +"#XS c #601401", +"##i c #601905", +"#Zk c #602312", +".3k c #603016", +".OR c #603225", +"#49 c #603415", +"awZ c #60463c", +".u5 c #604a2c", +"#qF c #60504b", +".mK c #605545", +".k6 c #605647", +"#WN c #606986", +".fq c #606ca8", +".0e c #607eb7", +".8F c #6085c5", +".8u c #6086c4", +".8E c #6086c5", +"#.f c #6086c6", +"#.d c #6087c4", +".6M c #6087c7", +".8q c #6088c4", +".6R c #6089c7", +".3P c #6089ca", +"#Rx c #61091a", +"aKo c #611d08", +"#3F c #612209", +"#5k c #612411", +".OX c #61342e", +".8c c #613b34", +".tL c #614b3c", +".eP c #61524f", +"#dh c #615453", +".EK c #615953", +".gW c #615b84", +".wG c #616d85", +".YE c #6180b9", +".8k c #6186bf", +".8v c #6186c5", +".8D c #6186c6", +".8w c #6187c5", +"#.e c #6187c6", +".8C c #6187c7", +"#.a c #6188c4", +".8r c #6189c5", +"#hs c #618eca", +"#vR c #621400", +".6E c #623c42", +".s5 c #623d1b", +"aHF c #624554", +".wn c #624d33", +"aH4 c #625251", +".gG c #625254", +".Y0 c #626078", +".W7 c #627baa", +".Vj c #627cab", +"##D c #6282be", +".8x c #6287c6", +".8B c #6287c7", +".8y c #6288c6", +".8A c #6288c7", +".8z c #6288c8", +".8s c #6289c5", +"#.b c #6289c6", +"#.c c #628ac6", +"#rD c #628cc6", +"#X5 c #631d05", +"#X0 c #632b1a", +"#FT c #632c18", +"#ap c #63361c", +".8d c #633c36", +".uu c #633f1b", +".va c #634437", +"aJ8 c #63535c", +".8N c #635763", +"aDj c #635d62", +".AN c #635e76", +".pK c #63759a", +"asP c #63799c", +"##E c #6386bf", +"#bj c #6388c7", +"#.g c #6388c8", +"##J c #6389c7", +"##I c #6389c8", +"##K c #6389c9", +"#nu c #638aca", +"##H c #638bc7", +"#fW c #638bc8", +"#rC c #6391cf", +"#fX c #6391d2", +"#s1 c #6393d2", +"#9N c #640711", +"##n c #641603", +"#Zj c #642715", +"#a8 c #642722", +".45 c #643c34", +"#4Y c #643d1a", +".05 c #643f2e", +"aMK c #645160", +"#Iu c #645360", +".2b c #645b6b", +"#IA c #645d6a", +".2k c #645d7b", +"arN c #646066", +"aDo c #64636c", +".ru c #646384", +"axh c #64769c", +"#ba c #647cb9", +"#em c #6485c3", +".6L c #6486c4", +"#bi c #6489c8", +"#bl c #6489c9", +"#bh c #648ac8", +"#cY c #648ac9", +"#bk c #648aca", +"#rG c #648bc6", +"#be c #648bc7", +"#bf c #648cc8", +".98 c #648ec7", +"#N. c #650c0f", +"#KD c #65210f", +"#.3 c #652212", +"#XW c #652710", +".3i c #652712", +".9X c #653a2a", +".9e c #65462d", +".jn c #65504e", +"aj3 c #655a56", +".y1 c #655b7a", +"#5B c #656168", +".Fu c #65638a", +"#7o c #6579a6", +"aiH c #657da8", +".1R c #6582ba", +"#cU c #658ac9", +"#f1 c #658aca", +"#cV c #658bc9", +"#cX c #658bca", +"#cW c #658bcb", +"#bg c #658cc8", +"#cR c #658dc9", +"#kA c #658dce", +"#GG c #6593c4", +"a#q c #660714", +"#WF c #662209", +"#CY c #662c18", +".vS c #664531", +".6I c #66728f", +".im c #667696", +"aOM c #667fad", +".5a c #6681b7", +"#hq c #668abd", +"##G c #668bc7", +"#jb c #668bc8", +"#jc c #668bc9", +"#jd c #668bca", +"#f2 c #668bcb", +"apV c #668cc4", +"#er c #668cca", +"#et c #668ccb", +"#eu c #668ccc", +"#cS c #668dca", +"#oV c #668dcb", +"aoo c #668ec6", +"#cT c #668eca", +"#s0 c #6690cc", +"#38 c #6691d0", +"#8. c #670209", +"#IO c #670b16", +"#VO c #670f1e", +"#Wm c #671f08", +".75 c #67231a", +"#2g c #672d25", +"aN0 c #67493d", +"aJX c #676067", +".uV c #676250", +"aBT c #676267", +"#G6 c #676271", +"aq5 c #676368", +"aFu c #6778a3", +".0d c #677eaa", +"#ky c #6788c3", +"#Ol c #678ac8", +"#rE c #678bc1", +"#ja c #678bc8", +"#kF c #678bc9", +"#je c #678bca", +"#j# c #678cc9", +"#jf c #678cca", +"#es c #678ccb", +"#ev c #678ccc", +"#hw c #678dcb", +"#f3 c #678dcd", +"#eq c #678eca", +"#qd c #678fca", +"#eo c #678fcb", +"anc c #6790ca", +"and c #6791c8", +"#qc c #6791ce", +"#s2 c #6792cc", +"#.# c #6794cc", +"#Hh c #680d1b", +".3f c #682612", +"#e3 c #682b27", +"afX c #683115", +".3j c #68311a", +"aNs c #683326", +".UB c #68362e", +"#3o c #683a1a", +".3r c #684c48", +"aKa c #685760", +".bL c #685962", +".AT c #685c67", +".YD c #6880ae", +"#cP c #6884c3", +"#fU c #6887bd", +"#2A c #6888bc", +"#iX c #6889c5", +"#MS c #688bc9", +"#rF c #688cc4", +"#j. c #688cc9", +"#kz c #688cca", +"#jg c #688ccb", +"#i5 c #688dc7", +"#kE c #688dca", +"#l6 c #688dcb", +"#hv c #688dcc", +"#hx c #688dcd", +"aom c #688ec6", +"#kC c #688ec8", +"al3 c #688fca", +"#ep c #688fcb", +"#GC c #688fce", +"#fY c #6890cc", +"al4 c #6891c8", +"#GF c #6892c5", +"#Im c #6894c7", +"#23 c #690800", +"#SY c #690b1b", +"#cJ c #692219", +"#62 c #692d19", +".9i c #693a28", +"aeH c #693e29", +".xF c #694832", +".ag c #695957", +".8L c #695a75", +".69 c #696160", +".AJ c #696283", +"au7 c #696668", +".xp c #696768", +"#bb c #6984c0", +"#kx c #6988c3", +"#cQ c #6989cb", +"#l0 c #698ac5", +"#GV c #698bc9", +"#GU c #698cc8", +"#GT c #698cc9", +"#Ca c #698cca", +"#zk c #698dc7", +"#AI c #698dc9", +"#i9 c #698dca", +"#DG c #698dcb", +"#l7 c #698dcc", +"#i2 c #698ec8", +"#i8 c #698ecb", +"#nv c #698ecc", +"al2 c #698ecd", +"#i1 c #698fc8", +"#oW c #698fc9", +"akZ c #698fca", +"#Cb c #698fce", +"ap# c #6990c9", +"#fZ c #6990cc", +"#f0 c #6990cd", +"ak0 c #6991c8", +"#hu c #6991cd", +"#iZ c #6991d4", +"#T5 c #6994c8", +"#SE c #6996c8", +"#FA c #6a0f20", +"#Xe c #6a1d20", +"#X9 c #6a270e", +"#X1 c #6a2d23", +".OS c #6a3c2e", +".bV c #6a3d13", +".jx c #6a4e4b", +"arH c #6a5149", +".tC c #6a5637", +"aMG c #6a5b69", +"#bJ c #6a6269", +"adL c #6a80b0", +".3w c #6a87bd", +"#Ym c #6a87d4", +"#iW c #6a88c3", +"#DM c #6a8bc9", +"#DN c #6a8bca", +"#uH c #6a8cc9", +"#Cg c #6a8cca", +"#xU c #6a8dc8", +"#GS c #6a8dc9", +"#GW c #6a8dca", +"#GY c #6a8dcb", +"#GN c #6a8ec5", +"#ut c #6a8ec6", +"##F c #6a8ec7", +"#wm c #6a8ec8", +"#nt c #6a8eca", +"#i7 c #6a8ecb", +"#kD c #6a8ecc", +"#iY c #6a8ecd", +"#i3 c #6a8fc9", +"#i6 c #6a8fcc", +"#oX c #6a8fcd", +"#qi c #6a8fce", +"#DH c #6a8fcf", +"#kB c #6a90c9", +"#l4 c #6a90ca", +"#AJ c #6a90cd", +"ap. c #6a91c9", +"#uu c #6a91ca", +"#Ii c #6a91cf", +"#l3 c #6a91d2", +"#Il c #6a93c7", +"#SF c #6a98cb", +"#4O c #6b0702", +"#Kf c #6b0c12", +"#WH c #6b2000", +"#XT c #6b270d", +"#3A c #6b2916", +"ac1 c #6b2b16", +"#19 c #6b3831", +".Zv c #6b422e", +".se c #6b593c", +"#by c #6b6483", +".ok c #6b7eaa", +"#1a c #6b86ab", +"#uI c #6b8cc9", +"#AO c #6b8cca", +"#AP c #6b8ccb", +"#fV c #6b8dc6", +"asS c #6b8dc7", +"#uG c #6b8dc9", +"#uL c #6b8dca", +"#zl c #6b8dcb", +"ajT c #6b8dcd", +"aqP c #6b8ec3", +"#nr c #6b8ec9", +"#GR c #6b8eca", +"#Cc c #6b8ecb", +"#GX c #6b8ecc", +"#Io c #6b8fc6", +"#GM c #6b8fc7", +"#wf c #6b8fc8", +"#uE c #6b8fc9", +"ajU c #6b8fca", +"#GQ c #6b8fcb", +"#rI c #6b8fcc", +"#rJ c #6b8fcd", +"#qj c #6b8fce", +"ajV c #6b90c8", +"#xO c #6b90c9", +"#i0 c #6b90ca", +"apW c #6b90cc", +"#rK c #6b90cd", +"#rL c #6b90ce", +"#Fa c #6b90d0", +"#T2 c #6b90d2", +"#hr c #6b91c9", +"#rB c #6b91cb", +"#zg c #6b91cd", +"#wg c #6b92cc", +"#MI c #6b94cc", +"#Ob c #6b95ca", +"#T6 c #6b97cb", +"#Ra c #6b97ce", +"#R# c #6b98cc", +"#Z7 c #6c081a", +"#25 c #6c0a02", +"#8c c #6c0a15", +"#Wo c #6c1f09", +"#Vc c #6c2000", +"#aw c #6c2712", +".4U c #6c2a19", +"#61 c #6c2d18", +"#5o c #6c2e14", +"#1p c #6c314e", +"#0E c #6c3512", +".54 c #6c3925", +".3m c #6c442b", +".6F c #6c4a59", +"aLO c #6c5163", +".C7 c #6c5e51", +"abr c #6c6166", +"aB7 c #6c6468", +"av9 c #6c686b", +"ap9 c #6c686e", +".vf c #6c81a3", +"#cO c #6c84c1", +"#el c #6c88c3", +"#Cd c #6c8cc7", +"#Ce c #6c8dc7", +"#DJ c #6c8dc8", +"#uJ c #6c8dca", +"#xV c #6c8dcb", +"#xW c #6c8dcc", +"aiN c #6c8dce", +"anb c #6c8dd0", +"#uF c #6c8eca", +"#uK c #6c8ecb", +"#uM c #6c8ecc", +"#ns c #6c8fc8", +"#zj c #6c8fca", +"#AK c #6c8fcb", +"#GP c #6c8fcc", +"#DI c #6c8fcd", +"#GL c #6c90c7", +"#GK c #6c90c8", +"aaN c #6c90c9", +"#wl c #6c90ca", +"#uD c #6c90cb", +"#Iq c #6c90cc", +"#rM c #6c90cf", +"#PG c #6c91c3", +"#uv c #6c91c8", +"#4l c #6c91c9", +"#i4 c #6c91cb", +"#oS c #6c91cc", +"aqQ c #6c92ca", +"#xP c #6c92cd", +"#JR c #6c92cf", +"#JT c #6c93ca", +"#qg c #6c93cf", +"#JQ c #6c93d0", +"#Vr c #6c94cb", +"#Lh c #6c94ce", +"#T4 c #6c95c9", +"#JU c #6c95ca", +"#MJ c #6c95cc", +"#Oc c #6c96cc", +"#1i c #6c96cd", +"#37 c #6c96d5", +"#SD c #6c97c8", +"#SG c #6c97cd", +"#PK c #6c98cd", +"#8a c #6d0d18", +"#y1 c #6d0e00", +"#ub c #6d1700", +"aCp c #6d2238", +"abv c #6d3b2c", +"#8x c #6d3f29", +".3l c #6d4226", +"aGl c #6d5564", +".5v c #6d5d57", +".2f c #6d6064", +".uW c #6d695a", +".jr c #6d6e65", +".6K c #6d88bd", +"#qb c #6d8dc4", +"#AL c #6d8dc6", +"#DK c #6d8dc9", +"al1 c #6d8dd0", +"akY c #6d8dd1", +"#AM c #6d8ec7", +"#l1 c #6d8ec9", +"#Fc c #6d8eca", +"#uN c #6d8ecc", +"#uO c #6d8ecd", +"#uw c #6d8fc3", +"#ux c #6d8fc4", +"#JS c #6d8fc9", +"#Cf c #6d8fcb", +"#DL c #6d8fcc", +"#uP c #6d8fcd", +"asi c #6d8fcf", +"aiO c #6d90c9", +"#AN c #6d90ca", +"#uz c #6d90cb", +"#GO c #6d90cc", +"#Ip c #6d90cd", +"#Fb c #6d90ce", +"#qe c #6d91c8", +"#wh c #6d91c9", +"#56 c #6d91ca", +"#oU c #6d91cb", +"#Lj c #6d91cc", +"#JV c #6d91cd", +"#4k c #6d92c9", +"#9q c #6d92ca", +"#l5 c #6d92cc", +"#Li c #6d92cd", +"aaM c #6d93ca", +"#rH c #6d93cd", +"#s5 c #6d93ce", +"#en c #6d93d5", +"aug c #6d93dd", +"#Vq c #6d94cc", +"#Vt c #6d95cb", +"#MK c #6d95cd", +"#Rb c #6d95d0", +"#Vs c #6d96cc", +"#PI c #6d97cb", +"#Od c #6d97ce", +"#PJ c #6d98cc", +"#PL c #6d98cf", +"#R. c #6d99cc", +"#4P c #6e0000", +"#P7 c #6e0f19", +"#1q c #6e1933", +"#vS c #6e2203", +"#KA c #6e2d03", +"#XV c #6e2d15", +"#FS c #6e2f10", +".UA c #6e413e", +".9W c #6e4434", +"aNt c #6e4939", +"aFz c #6e5244", +".sl c #6e5a4b", +".FE c #6e6462", +"#Lu c #6e6773", +".jf c #6e677c", +"aAt c #6e6a6b", +"as2 c #6e6a70", +"#DW c #6e727e", +"auP c #6e7da0", +"akT c #6e7e9b", +".1Q c #6e83ae", +"#fT c #6e84b0", +"#C# c #6e8bc2", +"#DF c #6e8bc4", +"#bc c #6e8bc8", +"#AH c #6e8cc2", +"adU c #6e8ccc", +"agt c #6e8dce", +"ajS c #6e8dd1", +"#PE c #6e8eba", +"#nq c #6e8ec8", +"#Fd c #6e8eca", +"ahG c #6e8ecb", +"aiM c #6e8ed1", +"#wi c #6e8fc5", +"#zh c #6e8fc7", +"ahH c #6e8fc9", +"#Ik c #6e8fca", +"#Ij c #6e8fcb", +"#wn c #6e8fcd", +"#uQ c #6e8fce", +"#wj c #6e90c5", +"#4m c #6e90cb", +"#Fe c #6e90cd", +"#wo c #6e90ce", +"arC c #6e90d1", +"#uy c #6e91c7", +"#oT c #6e91c9", +"#Lk c #6e91cb", +"#uA c #6e91cc", +"#Lm c #6e91cd", +"#Ok c #6e91ce", +"#Ir c #6e91cf", +"#GH c #6e92c9", +"#In c #6e92ca", +"#xQ c #6e92cb", +"#uC c #6e92cc", +"#PR c #6e92ce", +"#l2 c #6e92cf", +"#Vu c #6e93c9", +"a.7 c #6e93ca", +"#qh c #6e93cd", +"#oR c #6e93cf", +"#4j c #6e94ca", +"#55 c #6e94cb", +"#T7 c #6e94cc", +"#SH c #6e94cd", +"#ML c #6e95ce", +"#Q7 c #6e96c2", +"#Q6 c #6e97c6", +"#4d c #6e97cb", +"#5Y c #6e97cd", +"#4e c #6e98cb", +"#5Z c #6e98cd", +"#Oe c #6e98d0", +"#1B c #6f0100", +"a#p c #6f0c19", +"#2T c #6f1719", +"aCq c #6f233a", +"#Y. c #6f290c", +".9S c #6f2918", +"#Hy c #6f2b02", +".46 c #6f4b49", +".zm c #6f4c32", +".yr c #6f7281", +"#ej c #6f7eb0", +"#lZ c #6f8ac1", +"#F# c #6f8cc5", +"#us c #6f8dbf", +"adT c #6f8dcc", +"afd c #6f8dce", +"#Ih c #6f8ebb", +"agu c #6f8ecb", +"adS c #6f8ecc", +"ahF c #6f8ed1", +"afc c #6f8ed2", +"ao9 c #6f8fc7", +"#xR c #6f90c6", +"#xS c #6f90c7", +"#GE c #6f90cb", +"#9r c #6f90cc", +"#uR c #6f90ce", +"#uS c #6f90cf", +"#zi c #6f91ca", +"#Oa c #6f91cc", +"#uT c #6f91cf", +"#wk c #6f92c9", +"#uB c #6f92cd", +"#W5 c #6f92ce", +"#JW c #6f92cf", +"#GJ c #6f93ca", +"#MR c #6f93cb", +"#Ll c #6f93cc", +"#U. c #6f93cf", +"#s3 c #6f94c9", +"#9p c #6f94cb", +"#s6 c #6f94ce", +"#MM c #6f94cf", +"#T3 c #6f94d4", +"#Yu c #6f95c7", +"a.6 c #6f95cb", +"#54 c #6f95cc", +"auT c #6f95de", +"#9l c #6f96ce", +"#PM c #6f96d1", +"#4c c #6f97cc", +"#SB c #6f97ce", +"#9m c #6f98d0", +"#50 c #6f99ce", +"#7C c #6f99d0", +"#Q9 c #6f9acc", +"#6w c #700005", +"#79 c #70030c", +"#L3 c #702202", +"#X6 c #70280c", +"aMv c #703746", +".XW c #704436", +".47 c #705158", +".BE c #705c47", +"ak1 c #706166", +".jB c #706263", +"aIq c #706e70", +"QtG c #707197", +"aoi c #707bba", +"#DD c #7086b3", +"aqN c #7087b8", +"#zf c #708dc2", +"afe c #708dcb", +"#we c #708ec0", +"#JP c #708ec7", +"aci c #708ecd", +"apU c #708fc5", +"agv c #708fc9", +"ach c #708fce", +"#1c c #7090c7", +".97 c #7090c9", +"#GD c #7090cd", +"#57 c #7091cd", +"adP c #7091cf", +"#7J c #7091d0", +"#xT c #7092ca", +"agr c #7092cc", +"#4n c #7092ce", +"avs c #7092d4", +"#MN c #7093cf", +"#Vz c #7093d0", +"#WZ c #7094c7", +"#MQ c #7094cb", +"#qf c #7094cc", +"#W4 c #7094d0", +"#PH c #7095c5", +"#PF c #7095c6", +"#WY c #7095c9", +"adR c #7095cc", +"#7y c #7095ce", +"#WX c #7096cc", +"#9o c #7096cd", +"#WV c #7096cf", +"#5Q c #7096d0", +"af# c #7096d2", +"#1h c #7097cf", +"#Of c #7097d1", +"#7B c #7098d0", +"#OF c #710c10", +"#LG c #710d10", +"#9H c #711215", +"##g c #711f07", +"#Zi c #712911", +"#5j c #712e1a", +".4S c #713013", +".OT c #714233", +"aJs c #714942", +".Yy c #71533e", +".rV c #715849", +".zK c #71614a", +".30 c #71656f", +"aHT c #716973", +"#eU c #716a79", +"aIp c #716f71", +"#Vj c #717692", +"#xN c #718ec2", +"aff c #718ec9", +"al0 c #718ed2", +"akX c #718ed3", +"#7N c #718fce", +"#9s c #718fcf", +"aiL c #718fd3", +"#7L c #7190ce", +"#7M c #7190cf", +"ahE c #7190d3", +"afb c #7190d4", +"#MP c #7191ce", +"ahD c #7192cb", +"#MO c #7192ce", +"ags c #7192cf", +"acg c #7192d0", +"afa c #7192d2", +"#33 c #7193ca", +"#7w c #7193cb", +"ash c #7193cd", +"#53 c #7193d1", +"av0 c #7193d3", +"#W0 c #7194c7", +"#7E c #7194cb", +"#SL c #7194d0", +"awV c #7194d4", +"#Sz c #7194d7", +"#PQ c #7195cc", +"#Vy c #7195cd", +"#7x c #7195ce", +"#WU c #7195d0", +"#WT c #7195d1", +"#WW c #7196ce", +"avt c #7196de", +"#Q5 c #7197c6", +"#7K c #7197cd", +"adQ c #7197ce", +"apa c #7197d1", +"#ZU c #7198cc", +"#4b c #7198ce", +"aon c #7198d0", +"#SA c #7198d4", +"#5X c #7199d0", +"#SC c #719bcc", +"#2H c #719cd5", +"#VP c #720d1c", +"#6C c #721819", +"#To c #72270a", +".3h c #72301c", +"#5n c #72361c", +"#am c #72361f", +".9V c #72371d", +".XV c #72493d", +".Ry c #724d3e", +"aDv c #72666c", +".zd c #726866", +".YX c #726870", +".te c #726a55", +"##M c #726b7f", +"#sZ c #728cbb", +"a.9 c #728fcf", +"aiJ c #7290cb", +"aue c #7290cc", +"a.8 c #7290cf", +"#6. c #7290d0", +"#MH c #7291d2", +"#GB c #7292b8", +"#58 c #7292cf", +"#O# c #7293cb", +"aaK c #7293d0", +"a.5 c #7293d1", +"aaL c #7293d2", +"#Vv c #7294ca", +"#SK c #7294cc", +"aaJ c #7294d0", +"#Og c #7294d1", +"#Rc c #7294d2", +"#Vp c #7294de", +"#s4 c #7295cc", +"#Vx c #7295cd", +"#34 c #7295cf", +"#Yn c #7295d1", +"auS c #7295d9", +"#GI c #7296cd", +"#W3 c #7296ce", +"av1 c #7296db", +"#Yt c #7297ca", +"#Q8 c #7298c1", +"#2G c #7299d3", +"#5R c #7299d4", +"#7A c #729ad2", +"#7D c #729cd3", +"#0f c #730202", +"#1E c #730307", +"#Kh c #730b07", +"a#o c #730f1c", +"#sE c #731d04", +".OW c #73433c", +".91 c #734436", +".OU c #734536", +"aJ# c #735468", +"aww c #735950", +".uP c #73602c", +"#AS c #736368", +"QtA c #736682", +".D3 c #736772", +".kP c #736a60", +"apq c #736a6f", +"aJY c #736c73", +".j7 c #736f96", +"aIo c #737173", +".96 c #737eaa", +".le c #738590", +"#9c c #738ab7", +"asf c #7390bc", +"ajR c #7390d2", +"aiK c #7391ce", +"#59 c #7391d0", +"#Lg c #7391d2", +"#Vn c #7391d9", +"a.V c #7392c2", +"#SI c #7393cf", +"#4o c #7393d0", +"asg c #7394c7", +"#ZO c #7394cf", +"adO c #7394d1", +"#PN c #7394d2", +"#W1 c #7395cd", +"#4g c #7395ce", +"#4h c #7395cf", +"#2F c #7395d0", +"#Yo c #7395d1", +"#52 c #7395d2", +"#4i c #7395d3", +"#ZV c #7396cd", +"#1j c #7396ce", +"aEa c #7396da", +"aCV c #7396db", +"az. c #7396de", +"#Oj c #7397ce", +"#W2 c #7397cf", +"aBw c #7397dd", +"aAg c #7397de", +"#4a c #7398d0", +"aqR c #7398d4", +"#7z c #7399d1", +"#36 c #739bd8", +"#1C c #74000a", +"#LH c #740205", +"#Kg c #74020a", +"#IP c #740210", +"#YI c #74131c", +"#Nx c #741903", +"#RZ c #741f00", +"#t1 c #742408", +"#gz c #742611", +"aCr c #74263d", +"#I7 c #742f00", +"#bU c #744139", +".7x c #744837", +"aGz c #745361", +".uH c #745b56", +".tk c #746059", +"#6g c #746a62", +"#.C c #746b72", +"#bA c #747097", +"QtQ c #74769a", +".sr c #74829d", +"#N9 c #748bb2", +"#C. c #748bbd", +"aok c #748cc7", +"ana c #748ed1", +"ajP c #748fcb", +"#Oi c #748fd0", +"akW c #748fd1", +"ajQ c #7490ce", +"ahB c #7491c3", +"#Oh c #7491d0", +"aaF c #7492c5", +"#2B c #7492c7", +"#4q c #7492d2", +"#1b c #7493c1", +"a.W c #7493c4", +"aol c #7493cd", +"#4p c #7493d2", +"atq c #7494c5", +"agq c #7495cd", +"#T8 c #7495cf", +"#Yp c #7495d0", +"#7I c #7495d2", +"#T1 c #7495da", +"#7v c #7496cd", +"#4f c #7496ce", +"#Yq c #7496cf", +"a.4 c #7496d0", +"#39 c #7496d1", +"#51 c #7496d2", +"a.3 c #7497cf", +"#5P c #7497d0", +"arA c #7497d1", +"arB c #7497d5", +"#ZW c #7498cf", +"#Yv c #7498d0", +"#9k c #749ad1", +"#5W c #749ad2", +"#35 c #749ad5", +"#Na c #750301", +"#4N c #750605", +"#t0 c #752307", +"aCs c #75253d", +"#b8 c #752811", +"#E3 c #753112", +"#3G c #753118", +".3g c #75321f", +"#0Y c #753325", +"#Ja c #753c23", +".52 c #754931", +"ajp c #754f40", +".AY c #755032", +".8b c #75514a", +".wz c #755732", +"#cM c #7582b8", +"ahA c #758bb7", +"#cN c #758bc7", +"#AG c #758cbd", +"#DE c #758cbf", +"#kw c #758cc3", +"#ur c #758dba", +"#ek c #758ec7", +"akU c #758ecb", +"#5K c #758fc3", +"akV c #758fce", +"#E9 c #7590c0", +"asQ c #7591bb", +"auR c #7592cd", +"#WR c #7592df", +"aaG c #7593c8", +"axS c #7593cc", +"#32 c #7594cb", +"atr c #7595d7", +"asR c #7596c7", +"axT c #7596d4", +"a.2 c #7597cf", +"#7F c #7597d0", +"#4. c #7597d1", +"#9n c #7597d2", +"#Yr c #7598cf", +"#4# c #7598d1", +"auf c #7598de", +"#Ys c #7599cd", +"a.0 c #7599cf", +"aFw c #7599db", +"a.1 c #759ad1", +"#5V c #759ad3", +"#0g c #76000b", +"#Hi c #760214", +"#OH c #760400", +"#Ul c #760c1b", +"#N# c #760d0d", +"#xx c #761500", +"#sG c #761902", +"#vZ c #762004", +"#Vb c #762d10", +"ah9 c #763213", +".6p c #763417", +"#XU c #76341a", +"#0N c #763f33", +".4Z c #76402b", +"#Ep c #76461c", +"#N4 c #764737", +"aid c #764a36", +"azB c #766c79", +"avM c #76737a", +".Ce c #767383", +"#b# c #7685be", +"aoj c #7686c4", +"awS c #7689b0", +".5# c #7689b1", +"#iV c #768bc1", +"#5I c #768cb8", +"avq c #768cba", +"#F. c #768cc0", +"an. c #768dca", +"#wd c #768ebb", +"#ze c #768ebd", +"alY c #768eca", +"an# c #768ecd", +"alZ c #768ece", +"#oQ c #768fc2", +".jI c #7691bc", +"#PO c #7692d3", +"arz c #7694c3", +"aqO c #7694c7", +"#Sy c #7694da", +"aaH c #7695cb", +"#WS c #7695e5", +"#Vw c #7696cd", +"#ZP c #7696d1", +"aws c #7696d4", +"#7H c #7697d3", +"#Vo c #7697e1", +"aaI c #7698d0", +"adN c #7698d1", +"#7G c #7698d2", +"#ZT c #7699d0", +"#9i c #769ad0", +"#5S c #769eda", +"#FB c #770317", +"#Q. c #770500", +"#6x c #77050d", +"#9M c #770a18", +"aCx c #77294b", +"#Zh c #772f17", +"#3z c #77301c", +"#as c #773420", +"#6D c #773a30", +"#Eo c #77411b", +".Wo c #77463a", +".uz c #77494a", +"aHL c #775a73", +".z2 c #775e42", +".u1 c #776141", +"aGI c #77635e", +".wf c #776545", +".qS c #77664d", +"##7 c #776a60", +"#.u c #77707c", +"#J3 c #77717f", +"aAQ c #77727e", +"asv c #777379", +".pC c #777469", +"aoP c #77747a", +"aJh c #77757b", +"#TX c #777da3", +".3v c #778ab4", +".8j c #778ab5", +"#WP c #778cc5", +"auQ c #778dbd", +"##C c #778dc7", +"ae8 c #778ebe", +"#xM c #778fbd", +"acf c #7790c3", +"#3Z c #7792c8", +"ae9 c #7793c7", +"#T0 c #7793d8", +"aaE c #7794c5", +"#2E c #7794cf", +"ats c #7795dc", +"#5N c #7796cb", +"axj c #7796d0", +"a.X c #7797c9", +"ahC c #7797ca", +"asj c #7797da", +"#5O c #7798ce", +"#9j c #779bd2", +"#5U c #779bd5", +"#6v c #780007", +"#1A c #780201", +"#LI c #780402", +"#4U c #780c0b", +"#P8 c #780c10", +"#Xf c #780d19", +"#dE c #782309", +"aCu c #78243d", +"#Vd c #782d09", +"ag5 c #782f10", +"#Zz c #78371d", +"#CU c #78421c", +"##t c #784225", +".06 c #784e36", +".Wm c #784f49", +".y. c #78634f", +"#PA c #786667", +"##L c #78727d", +".sE c #787474", +"#N7 c #78767e", +".oK c #7876a2", +"#B9 c #7885ab", +"#TY c #7885b8", +"aqM c #7887b7", +"acb c #788eb8", +"awT c #7892c5", +"awr c #7892c8", +"#Rd c #7892d5", +"#WQ c #7892d7", +"avZ c #7894cc", +"avr c #7894ce", +"#5M c #7895c8", +"#1d c #7896ce", +"#1g c #7896cf", +"awU c #7897d3", +"asT c #7897dc", +"#ZS c #7898d0", +"#9h c #789bd1", +"#YQ c #790304", +"#OG c #790b09", +"#8b c #791421", +"aCt c #79273f", +"#e5 c #792e18", +"#Zg c #79331b", +"#60 c #793620", +"#Tp c #793627", +"#5p c #79381e", +"#.P c #793e1d", +"#63 c #79402d", +"##u c #794125", +".8e c #79504b", +"aML c #796374", +".82 c #796c6a", +"aJZ c #797379", +"apn c #79757b", +"#Le c #7985ad", +"ao7 c #7989c4", +"ary c #798fba", +"#PP c #7990d3", +"#Lf c #7991c9", +"#Vm c #7992d3", +"#hp c #7993bd", +"#Yl c #7993d9", +"#Q4 c #7994bd", +"#MG c #7995d0", +"#SJ c #7995d4", +"aId c #7996ce", +"aGS c #7996cf", +"aFv c #7996d0", +"#31 c #7997cd", +"#ZR c #7997d1", +"#ZQ c #7998d2", +"a.Z c #799cd0", +"aGT c #799ddf", +"#YR c #7a010c", +"#RC c #7a0401", +"#P9 c #7a0805", +"#26 c #7a0907", +"#v0 c #7a1900", +"#t2 c #7a2c0f", +"afP c #7a2d0d", +"#X7 c #7a3011", +"#8J c #7a3620", +".P4 c #7a3b2b", +".9N c #7a3e2a", +"#an c #7a432c", +".hQ c #7a4e1c", +".W3 c #7a503d", +".43 c #7a5343", +"aM6 c #7a5c50", +"aHU c #7a6971", +".Y4 c #7a728c", +".vn c #7a7388", +"#Cp c #7a7e8c", +"#qa c #7a87af", +"#np c #7a8ab8", +"#9a c #7a8db6", +"#rA c #7a8fbc", +"#TZ c #7a8fcd", +"aud c #7a91c1", +"#9d c #7a94c2", +"#7r c #7a94c3", +"#5L c #7a96c9", +"aE# c #7a96d2", +"#O. c #7a98ca", +"#7u c #7a9acf", +"a.Y c #7a9ccf", +"#5T c #7a9dd7", +"#1D c #7b0b13", +"aCv c #7b253f", +"##o c #7b2f19", +"aGF c #7b2f2f", +"a#n c #7b3233", +"#Zw c #7b331d", +".76 c #7b372a", +"#.4 c #7b3828", +".9U c #7b3d25", +"#Pz c #7b4d40", +".Zw c #7b503b", +"#L# c #7b522d", +".3n c #7b533a", +".3o c #7b533c", +"aKC c #7b5f71", +".zD c #7b6a52", +".bK c #7b6e89", +"ama c #7b7270", +"#3R c #7b777e", +".jo c #7b7c74", +"#Vl c #7b8dc4", +"#9b c #7b90bb", +"avY c #7b90bc", +"#Sx c #7b91d4", +"apT c #7b92c8", +"axi c #7b95c6", +"atp c #7b97bf", +"#9f c #7b97c8", +"aCU c #7b97d4", +"#T9 c #7b98d4", +"aNX c #7b9bd0", +"#YU c #7c0102", +"#0e c #7c0202", +"#S3 c #7c0302", +"#22 c #7c0704", +"#0h c #7c0a12", +"#Ry c #7c0b19", +"#1r c #7c0d1f", +"#b9 c #7c2f18", +"#a7 c #7c350f", +".6o c #7c351a", +"#Dx c #7c3819", +"#E# c #7c4149", +".53 c #7c4e37", +".8g c #7c524d", +".Cw c #7c5633", +".jw c #7c605b", +".u8 c #7c624c", +"aKF c #7c6974", +"#3W c #7c8dae", +"aE. c #7c8dba", +"#JO c #7c90bf", +"#Re c #7c91d6", +"#7q c #7c94c3", +"aJD c #7c95c3", +"#30 c #7c98d0", +"#1f c #7c98d2", +"aON c #7c9cd1", +"af. c #7c9cd4", +"#9g c #7c9ed4", +"#Uu c #7d0302", +"#Xm c #7d0305", +"#O4 c #7d1700", +"aCw c #7d2640", +"#Wp c #7d2e19", +"#5i c #7d3621", +"#65 c #7d3a1f", +"#8K c #7d3a26", +".3e c #7d3c28", +".UC c #7d4638", +"#JJ c #7d4c2c", +".Wn c #7d5149", +".4n c #7d5956", +"aJi c #7d5d62", +".tH c #7d624a", +"#N5 c #7d6657", +".x6 c #7d685d", +"#Q1 c #7d6e7a", +"#MC c #7d6f68", +"#Iv c #7d6f7c", +"#GA c #7d8fab", +"#MF c #7d92c1", +"#PD c #7d93b6", +"#3Y c #7d95c5", +"aiI c #7d97c4", +"#ZM c #7d97ce", +"#2D c #7d98d1", +"#7s c #7d99ca", +"aBv c #7d99d7", +"#1e c #7d9ad3", +"aM3 c #7d9cd2", +"aIe c #7da1e2", +"#Uq c #7e0303", +"#Xn c #7e030d", +"#78 c #7e0410", +"#YS c #7e0810", +"#IQ c #7e221d", +".7O c #7e2d08", +"#b7 c #7e3119", +"##p c #7e371d", +"#Ib c #7e4426", +"a#S c #7e4938", +"aKG c #7e4956", +".tl c #7e6c65", +"aIK c #7e6c75", +"#.B c #7e7066", +"aIr c #7e7d7f", +"##B c #7e7faa", +"#lY c #7e86b0", +"#Sw c #7e8cc4", +"awq c #7e92bb", +"#ZL c #7e93bd", +"ao8 c #7e96cf", +"aNW c #7e97c5", +"ace c #7e97c8", +"aaA c #7e99c3", +"aaD c #7e9ac8", +"#2C c #7e9ad1", +"#7t c #7e9cd0", +"#RB c #7f0203", +"#VV c #7f0304", +"#0j c #7f0405", +"#6p c #7f0607", +"#6y c #7f0610", +"#Xg c #7f0b16", +"#Va c #7f3a22", +"#Dy c #7f3a28", +"aGq c #7f3a5b", +"#0M c #7f463a", +".Qv c #7f5142", +"#MA c #7f6043", +"#2Q c #7f6667", +".qA c #7f6f67", +".fh c #7f6f76", +"#bH c #7f7270", +".vO c #7f7281", +"aG5 c #7f7679", +".fj c #7f7a75", +"aAs c #7f7b7c", +"aur c #7f7c7f", +"azv c #7f7e87", +"#Ig c #7f92b5", +"a.U c #7f94bd", +"agp c #7f98c9", +"#9e c #7f9bcb", +"aAf c #7f9bda", +"aJE c #7f9ed4", +"aKV c #7f9fd5", +"#0i c #800e12", +"#EF c #80290f", +"#aC c #802a07", +"ag9 c #803314", +"#h5 c #80331f", +"#X8 c #803413", +"#e4 c #803e31", +"#Gv c #804025", +"#Bn c #804b24", +".OV c #804e46", +".eY c #80522f", +"aGn c #805f72", +".pn c #806a4c", +"alf c #80727f", +".8i c #807c8e", +"#WO c #808eb9", +"auc c #808fb4", +".6J c #8092ba", +"ae7 c #8093c0", +"ajO c #8094b9", +"ay9 c #809cdb", +"aPJ c #809fd5", +"#Q# c #810000", +"#4H c #810200", +"#S2 c #810304", +"#73 c #81030c", +"#Nb c #810403", +"#VW c #81040c", +"#OJ c #810708", +"#Xo c #81070e", +"#YK c #810810", +"#VQ c #810a17", +"#SZ c #810b19", +"#Xr c #810d07", +"#Qb c #811016", +"#EQ c #81240b", +"#aU c #81311d", +"aey c #813212", +"#c. c #81351d", +"#8I c #813c25", +".4V c #813e2d", +"#C0 c #81422a", +".gr c #81542b", +".51 c #81553c", +"#La c #815d3e", +"aDw c #81767b", +"arL c #817d83", +"#PC c #81879d", +"#DC c #818b9c", +"#Vk c #818cb5", +"#sY c #818db0", +"aaz c #8190b2", +"#7p c #8198c6", +"aKU c #8199c8", +"aaB c #819cc6", +"#ZN c #819fdd", +"#4T c #820005", +"#Ur c #820309", +"#VZ c #820707", +"#4Q c #82080c", +"#yI c #822905", +"#t3 c #823719", +"#aT c #823824", +"#1R c #823917", +"afG c #825740", +".7u c #82623d", +".u9 c #826653", +".zY c #82694d", +"#di c #82746b", +".dO c #82778b", +"aju c #827e83", +".sX c #8288aa", +"#ME c #828dac", +"#N8 c #828ea6", +"apS c #8292c8", +"a.R c #8293b8", +"aaC c #829dc9", +"#OI c #830200", +"#9L c #830a1b", +"#Z8 c #830c14", +"#YJ c #83181b", +"#dD c #832a14", +"#dC c #833117", +"#b6 c #83311d", +"ajm c #83442b", +"#dr c #834b45", +".4p c #83573d", +".3p c #835c4a", +"#xZ c #837790", +"aC8 c #837c7e", +".K# c #837da3", +"abV c #837e86", +"aBS c #837f83", +"#ho c #838197", +"#Sv c #8389b6", +"ase c #8399c0", +"#Yk c #8399d4", +"acc c #839ac7", +"aQG c #83a3d8", +"#6u c #84000a", +"#Z9 c #840104", +"#Up c #840305", +"#S4 c #840308", +"#4M c #840609", +"#9I c #840616", +"#Xp c #84080d", +"#Xq c #840909", +"#29 c #84110f", +"#t9 c #843516", +"#vQ c #843518", +"#5h c #843d25", +"#dt c #844027", +"ajj c #844528", +"#mw c #844913", +"aha c #844a2c", +"aHR c #844f70", +".50 c #84573f", +"##6 c #847776", +".Hi c #847786", +"aBR c #847f84", +".yV c #847f9b", +".oB c #848096", +"#Su c #8485aa", +"a.T c #8498c1", +"acd c #849ccc", +"#Xl c #850406", +"#RD c #850408", +"#Qa c #850709", +"#4E c #851318", +"#xy c #852508", +"#A# c #852f09", +"#dF c #853117", +"#b5 c #853a23", +"#WE c #853c13", +"#6Y c #853e24", +"#6Z c #853f28", +"#66 c #854026", +"#64 c #854329", +"#bW c #85492e", +"##v c #854c2f", +"#ar c #854c36", +"#6P c #855339", +"aHP c #855575", +".ta c #85574f", +".D8 c #855d35", +"aJf c #856377", +"#Yd c #856b61", +".mx c #85746c", +".dN c #857a8f", +"aAp c #858082", +"ay8 c #8595c6", +"ago c #859ac7", +"#27 c #860206", +"#RA c #860308", +"#0. c #860309", +"#6z c #860311", +"#1z c #860402", +"#VU c #860406", +"#VX c #86060d", +"#6q c #86070a", +"#9J c #860718", +"#Nc c #861414", +"#F8 c #862807", +"##h c #863b25", +"#US c #863c1d", +"a.l c #863e27", +"#3y c #863e28", +"ai# c #863f24", +"#FR c #864418", +"#b4 c #86462b", +".R4 c #86583b", +"av4 c #866c63", +".zZ c #866d51", +".jm c #867372", +".rU c #867966", +".b9 c #86838f", +"#iU c #8685a9", +"#oP c #8689a9", +"ae6 c #8695bf", +"#74 c #87040f", +"#6A c #870412", +"#VY c #87050b", +"#YL c #87070e", +"#YT c #871115", +"#6B c #87121b", +"aGC c #874349", +"#Wv c #87462a", +".9w c #87473a", +"#Zb c #874d31", +".Vc c #875242", +".9h c #875330", +".XX c #875745", +"ahb c #875a43", +"#3d c #875f39", +"akq c #876357", +"aKD c #87687b", +"#ZE c #876e64", +"#ph c #87736a", +".dF c #877e86", +"#E8 c #8796ab", +"#Yj c #8797c3", +"aAe c #8797c8", +"aCT c #8798c6", +"#3X c #879cc5", +"adM c #879ccd", +"aL7 c #879fce", +"#0d c #880403", +"#S1 c #880409", +"#Rz c #880711", +"#9K c #88091a", +"#Um c #880a17", +"#V0 c #881d14", +"#Au c #882c0d", +"#TR c #883c18", +"a.k c #884228", +"#XP c #88422d", +"#bX c #884325", +"aia c #88452a", +"#2h c #88463b", +".9r c #885140", +"#JI c #885530", +".rP c #885b45", +".uG c #885b5d", +".8f c #885f59", +"aEd c #886c5f", +"aJd c #886d7f", +"#.p c #887977", +".xB c #887b8a", +".Hd c #887e7b", +"#ei c #887e9d", +"#J4 c #88808d", +"ad8 c #888180", +"#fS c #88839c", +".Xq c #8883a9", +".rd c #88848a", +".Cf c #888496", +"aKE c #888993", +"#AF c #8889a4", +"#Q3 c #8893b2", +"#5J c #88a0d2", +"aM2 c #88a1cf", +"#1u c #890104", +"#Xh c #890711", +"#aV c #893520", +"ag6 c #894021", +".9T c #894631", +"#15 c #894723", +".mi c #895531", +"aHJ c #895a75", +"aGB c #895c61", +"aso c #896d65", +"ap0 c #897068", +"#XJ c #89736d", +"#bI c #897b71", +"aBE c #898486", +"#q# c #8986a0", +"#kv c #898bb1", +"#JN c #898daa", +"#77 c #8a0414", +"#4I c #8a0505", +"#Us c #8a050c", +"#YV c #8a0d09", +"#72 c #8a1219", +"#iP c #8a2f17", +"#ES c #8a3116", +"#pG c #8a3210", +"#BA c #8a330d", +"#eg c #8a3e2f", +"#t7 c #8a3f20", +".3c c #8a4328", +"#aA c #8a432f", +"#8G c #8a4428", +".1z c #8a4a32", +".4Y c #8a4d3a", +".kE c #8a5536", +"##s c #8a5537", +"#.U c #8a5847", +"#Y9 c #8a5b31", +".2L c #8a5f45", +".07 c #8a5f46", +".2K c #8a614f", +"aGH c #8a625d", +"aGo c #8a6378", +"aHN c #8a6581", +"#MB c #8a705b", +"aKz c #8a7484", +".we c #8a7952", +".h4 c #8a797a", +"#cL c #8a7ea3", +"aJ0 c #8a8288", +"#MD c #8a8894", +"#rz c #8a90b0", +"aBu c #8a9aca", +"#S0 c #8b0711", +"#6n c #8b0c13", +"aI4 c #8b2d3a", +"#ER c #8b3015", +"#E4 c #8b4836", +".Qh c #8b4939", +"#.X c #8b4e3c", +"#CV c #8b592e", +".4q c #8b5f45", +"#B. c #8b616a", +".qX c #8b796c", +"aG0 c #8b8184", +"#b. c #8b83ac", +".33 c #8b849e", +"#wP c #8b8d9b", +"#TW c #8b8dab", +"#4S c #8c0008", +"#2X c #8c0402", +"#YP c #8c0406", +"#0# c #8c0409", +"#Uo c #8c040a", +"aGD c #8c2c36", +"afQ c #8c3f1f", +"#1P c #8c4120", +"#t6 c #8c4222", +"#8H c #8c462c", +".3d c #8c472b", +"#02 c #8c4c32", +"#Ww c #8c4d33", +"aa2 c #8c5554", +"#Bm c #8c5a39", +"#Mz c #8c5d49", +"a#O c #8c8185", +".ij c #8c8193", +".DZ c #8c827f", +"aqo c #8c898f", +"#28 c #8d0005", +"#S5 c #8d040b", +"#75 c #8d0513", +"#1G c #8d0605", +"#1F c #8d1113", +"#EH c #8d3219", +"#EG c #8d341b", +".7N c #8d3d17", +"#Zx c #8d422a", +"#t4 c #8d4324", +".6c c #8d4827", +"##q c #8d482c", +"#UM c #8d491f", +"#Bt c #8d4b31", +".P5 c #8d4f3f", +"#18 c #8d5950", +"#Eq c #8d5b38", +".6z c #8d644c", +"aKw c #8d6e81", +"asY c #8d7167", +"aJb c #8d7586", +"aFY c #8d7d84", +"#N6 c #8d7e77", +".ae c #8d809b", +"#PB c #8d848d", +"#RE c #8e030a", +"#Xk c #8e0408", +"#VR c #8e0812", +"#2U c #8e141a", +"#71 c #8e2428", +"aGw c #8e315a", +"#Zy c #8e4127", +"#TP c #8e4428", +"#WD c #8e451e", +"#5q c #8e4930", +".4X c #8e4d3c", +".7M c #8e4f44", +".7w c #8e5e3a", +".5Y c #8e6965", +"#2r c #8e766c", +"aKA c #8e7889", +"#St c #8e7a7b", +"aF2 c #8e7e85", +".83 c #8e8077", +"aEK c #8e8086", +"#zd c #8e8394", +"aC4 c #8e878a", +"aAq c #8e898b", +"#Q2 c #8e899c", +"a.S c #8ea0c8", +"#6t c #8f020d", +"#VT c #8f0409", +"#YM c #8f050b", +"#6r c #8f060e", +"#21 c #8f0709", +"#Un c #8f0710", +"#0k c #8f0c0a", +"#vI c #8f3311", +"#u. c #8f3e21", +"ag8 c #8f4325", +"a.m c #8f4430", +"a.j c #8f4a2d", +"ac9 c #8f4c29", +"abE c #8f4c2a", +"ajl c #8f5032", +"aGG c #8f514e", +"#Gw c #8f543b", +"#HE c #8f5b3a", +".FN c #8f653a", +".3q c #8f6d61", +"aL9 c #8f7266", +"#Lb c #8f7361", +"#no c #8f879f", +"#1v c #900406", +"#76 c #900515", +"#4R c #900710", +"#EP c #903118", +"#BW c #903416", +"#ss c #903514", +"aGu c #903961", +"#aD c #903b17", +"#4D c #903d3e", +"a#2 c #90482d", +"#UR c #90492a", +"#aS c #904935", +"a#1 c #904c2c", +"aGp c #904d6d", +".4A c #90553f", +"ah2 c #905642", +"#17 c #905a51", +"#CT c #905e3d", +".qs c #906341", +"atx c #90776d", +".Ty c #907b77", +".C8 c #908275", +"aoC c #90858a", +"aJ5 c #90878d", +".AO c #908c9b", +"aIs c #908e90", +"aGE c #91202e", +"#6m c #912c2e", +"#EM c #912d16", +"#kq c #91361e", +"#su c #913a1b", +"afS c #913f20", +"aKp c #914235", +"a#3 c #91442d", +"#t5 c #914829", +"#Wl c #914c34", +"#0K c #914d2e", +".4B c #915640", +".4o c #916451", +".1K c #916b51", +"#.M c #916c56", +".jz c #917c7a", +".gL c #918482", +"aG6 c #91858b", +"ak7 c #918785", +".jj c #918a94", +"aAr c #918c8e", +".mO c #919898", +".il c #919eb6", +"#RF c #92050b", +"#Xi c #92050d", +"#1H c #921108", +"#S7 c #921817", +"#EI c #92341c", +"#F7 c #923913", +"aGs c #924569", +"#fQ c #924632", +"ai. c #924d2f", +"a.i c #924e2e", +".Qg c #925141", +"#Wx c #92533a", +"aeG c #925737", +"#.O c #925f3b", +".2M c #92674c", +".j. c #92682f", +".42 c #926d5d", +"#WL c #92766d", +"avy c #92786f", +".ff c #928289", +"aEM c #92848b", +".ID c #928cb1", +"aw3 c #928f91", +"#VS c #93050d", +"#1y c #930605", +"#2Y c #930606", +"#4L c #93070d", +"#Ut c #930c12", +"#1s c #930e17", +"#Qv c #932705", +"#Qw c #93281a", +"#EJ c #93331c", +"#5t c #934329", +"afR c #934625", +"#8N c #934a2f", +"#0v c #934b20", +"#0L c #934d2f", +"#TS c #935132", +"#8L c #93523e", +".Qf c #935241", +".Qi c #935544", +"#Es c #935947", +"#b1 c #935b3d", +"aep c #936149", +"#Vg c #93766e", +"aul c #937a70", +".7i c #938a92", +"#.h c #938c87", +"axu c #939199", +".B5 c #9391b9", +".oe c #939b94", +"#YO c #940407", +"#Xj c #94040a", +"#6s c #94040f", +"#0c c #940505", +"#6o c #94050f", +"#0a c #940609", +"#4J c #94070b", +"#sF c #943a22", +"#sv c #944122", +".1x c #944a30", +"#6X c #944e32", +"ah8 c #945031", +"aMO c #945067", +".4W c #945140", +".Qj c #945745", +"aCy c #945c76", +"agX c #945f47", +"afY c #946e5a", +"aGA c #94747b", +".0. c #94755e", +".8h c #94807d", +".zW c #948467", +".v1 c #94888b", +".uC c #948a77", +".aw c #948ca8", +"#Ld c #9492a6", +"#YN c #950409", +"#1t c #950507", +"#UT c #95492b", +"#5g c #954f35", +"#B3 c #955132", +"#2l c #95553b", +"#zY c #956442", +"#4X c #956940", +".1L c #957560", +".tq c #958254", +"aHp c #95848c", +"#eF c #958f9e", +"#EO c #96341c", +"#tX c #963918", +"#aX c #964228", +"#gD c #964826", +"afN c #964a29", +"#1O c #964b1e", +"#hm c #964b34", +"#WC c #964d2b", +"#8O c #964d31", +"#8M c #964d33", +".1y c #964e34", +"#zZ c #96603a", +"#Ic c #966147", +".4r c #966950", +".Hm c #966b3e", +".SR c #966f47", +"a#R c #966f61", +"#iT c #967781", +"auY c #967c72", +"#zK c #967e90", +"#lX c #968495", +"#Lc c #968686", +"#zo c #968897", +"aFI c #968a90", +".Hh c #968a95", +"#E7 c #968e85", +"aBJ c #969192", +"af4 c #969296", +"#4F c #970812", +"#S6 c #970c13", +"#O5 c #973227", +"#EN c #97341c", +"#xe c #973e1a", +"#Hj c #97453f", +"#3J c #97462d", +"#2k c #974735", +"#UU c #97492c", +"#0t c #974c24", +"#tK c #974f27", +"adi c #975328", +"a#0 c #975532", +"ac8 c #975630", +"##y c #975b40", +"#Dz c #975d49", +"#b3 c #976041", +".Wp c #97614f", +".nL c #97663e", +"#En c #976644", +".9f c #977450", +"#4z c #978484", +"#oO c #978899", +"aEL c #978990", +".vL c #978c8e", +".dE c #978e95", +"aIt c #979097", +"#Iz c #9791a0", +"#B8 c #9799a3", +"#0b c #980607", +"#1w c #980708", +"aH0 c #983237", +"#y0 c #98371a", +"#At c #98381b", +"#y2 c #983b1d", +"#aW c #98432b", +"abF c #984830", +"#TQ c #984a28", +"#0s c #984d1b", +"ag4 c #984f2f", +"ag7 c #984f30", +"#WB c #985032", +"#0Z c #98503f", +"#WA c #985239", +"#8F c #985435", +".Qe c #985646", +"abD c #985732", +"#ds c #985b4d", +"ajd c #986456", +".5Z c #986a57", +".IL c #987048", +".4k c #98733e", +".jy c #987f7c", +"aBK c #989094", +"aJ1 c #989095", +".2l c #9893b5", +"#2V c #99010c", +"#4K c #99080f", +"aMP c #99354f", +"#sH c #993b25", +"#Ny c #993d36", +"#EE c #994328", +"#L5 c #994940", +"#01 c #994b36", +"#dQ c #994c25", +"#t8 c #994c2d", +"ag3 c #995031", +"#3H c #995037", +"#67 c #995137", +"#3x c #995139", +"#gy c #995348", +".6q c #995c3e", +"#I3 c #99643a", +"#Bo c #996538", +"#cK c #996b75", +"#Q0 c #996c60", +".kT c #998880", +"aHq c #998890", +".fd c #998990", +".xz c #998d94", +"aEm c #998f94", +"#bw c #99909e", +"aJ2 c #999197", +"aIu c #999299", +".Cm c #99969f", +"#1x c #9a0807", +"#2Z c #9a080b", +"#20 c #9a080d", +"#aE c #9a4823", +"#7. c #9a4c30", +"#lc c #9a4d29", +"afO c #9a4d2c", +".Qk c #9a5d4a", +"#.V c #9a5f4e", +"aic c #9a644c", +"#CE c #9a656c", +"#eh c #9a6a6f", +"aac c #9a6f56", +"#JK c #9a7058", +"apd c #9a7e75", +"#Fh c #9a838a", +".r5 c #9a8560", +"aJ9 c #9a8a92", +".xi c #9a8eaa", +"aD# c #9a9196", +"#LJ c #9b3634", +"aKv c #9b385f", +"#fc c #9b3d25", +"#fd c #9b4024", +"ad# c #9b4a31", +"aex c #9b4c2c", +"#at c #9b513f", +".4R c #9b553a", +"#aB c #9b5541", +"#dx c #9b5638", +"#Wu c #9b583a", +"#0J c #9b593a", +".1A c #9b5a42", +".4z c #9b604a", +"#gu c #9b6634", +".xU c #9b866e", +"aIM c #9b8992", +"aLK c #9b8a99", +".kX c #9b8f69", +"#AE c #9b9294", +"aFH c #9b9295", +".8H c #9b9482", +".h1 c #9b949d", +"aBZ c #9b99a3", +".wF c #9b9eae", +"aMW c #9c3941", +"#jM c #9c4926", +"#3K c #9c4931", +"#jL c #9c4b28", +".3b c #9c5238", +".2X c #9c5a44", +"aji c #9c5d3f", +"#k6 c #9c632c", +"#ae c #9c6433", +"##r c #9c6749", +"#5. c #9c684b", +".2D c #9c6c31", +"#FY c #9c6c44", +".Ro c #9c754c", +"#xL c #9c858d", +".k2 c #9c908f", +"aC9 c #9c9398", +"aJ3 c #9c9499", +"aAP c #9c9699", +"ayd c #9c9aa4", +"aMC c #9d2e3f", +"#Ml c #9d4828", +"aGt c #9d4a70", +"a#4 c #9d4b37", +"aew c #9d4f2e", +"#ca c #9d5139", +"#c# c #9d513a", +"adg c #9d532c", +"#Wq c #9d5330", +"#jI c #9d533e", +"#V# c #9d5626", +".2W c #9d5b45", +"#We c #9d612e", +".71 c #9d634d", +".7E c #9d6356", +"#bR c #9d6635", +"ac0 c #9d6c5e", +".9g c #9d704a", +".Yx c #9d745b", +".Ki c #9d764d", +"abQ c #9d7760", +".2E c #9d7845", +".u6 c #9d866a", +"aDN c #9d868f", +".BF c #9d8974", +"aMH c #9d909e", +"#yh c #9d94a4", +"aEy c #9d969b", +"aDW c #9e315e", +"aKu c #9e3b5d", +"#cb c #9e533b", +"#5e c #9e542c", +"ad. c #9e5536", +"#2i c #9e5647", +"#ZA c #9e593b", +"#Wz c #9e5949", +"#bZ c #9e5b42", +"#CX c #9e674c", +"#0w c #9e6942", +".We c #9e6d3c", +".XO c #9e6e3a", +".92 c #9e6e60", +".2N c #9e7156", +"aHK c #9e849c", +".Xn c #9e949c", +"aD. c #9e9599", +"aFU c #9e959b", +"aBL c #9e969a", +"aIF c #9e969c", +"aIv c #9e969d", +"auz c #9e9ca3", +"#2W c #9f0004", +"aE7 c #9f2953", +"aMA c #9f2b33", +"#Gd c #9f3f2c", +"#rh c #9f432c", +"#sr c #9f4532", +"#fb c #9f482b", +"#h9 c #9f4a27", +"#aR c #9f4e38", +"#lk c #9f5125", +"#ch c #9f522b", +"#2j c #9f5242", +"#Y4 c #9f5422", +"#3v c #9f542d", +"aa# c #9f5430", +"afW c #9f5a36", +"#CW c #9f6b46", +".7q c #9f6b4b", +".Ol c #9f6c3a", +".MY c #9f6c3b", +"#Ea c #9f6f81", +"a.x c #9f7059", +"aHO c #9f7492", +".5T c #9f7a44", +".S1 c #9f7b6d", +"aCZ c #9f8375", +"#07 c #9f867c", +"aKy c #9f8798", +"aG4 c #9f9699", +"#OK c #a0363a", +"#F9 c #a04121", +"aeC c #a04925", +"aev c #a05131", +"#bY c #a05338", +"#Wy c #a05b4c", +"a.h c #a05c3b", +"#al c #a05d3f", +"#h0 c #a06730", +".9b c #a06c4c", +"ajo c #a06f5c", +".0Y c #a07038", +"#4W c #a07144", +".p. c #a07148", +"#Ss c #a08179", +".qz c #a08774", +"aJ4 c #a0989e", +"#dj c #a0989f", +".uf c #a09fb8", +"#4G c #a1010e", +"aMB c #a11e31", +"aDO c #a1274c", +"aLS c #a13149", +"#Gc c #a1402d", +"#q5 c #a14725", +"a#7 c #a14b2f", +"#ua c #a14c2f", +"#sD c #a14f35", +"#XA c #a1541a", +"#69 c #a15438", +"#5s c #a1543a", +"#8P c #a1573b", +"adh c #a15b31", +"#16 c #a15d3a", +".2Y c #a15f49", +"#Hw c #a16339", +"#b0 c #a16348", +"#FQ c #a1653c", +"akl c #a1674a", +"#Hv c #a16d46", +"#Sr c #a16f5b", +".Zx c #a1735c", +"aJ. c #a17f94", +"#TU c #a1827a", +"#ku c #a18693", +"aB6 c #a1999d", +".h7 c #a19b95", +"#0l c #a2261c", +"aE8 c #a22a55", +"#EK c #a24029", +"#oj c #a24e2b", +"#3u c #a25430", +"#00 c #a25642", +"#1N c #a25719", +"#e8 c #a25737", +"#0r c #a25815", +"#Hx c #a25c30", +"#a5 c #a25c36", +"#6W c #a25c3f", +"#5f c #a25c41", +"#3# c #a25e4c", +"ac7 c #a26139", +"#14 c #a2613d", +"#ak c #a26646", +"#do c #a26d3b", +".PS c #a26f3d", +"aMN c #a27c8e", +".Us c #a27f56", +"aKB c #a28a9b", +"aJc c #a28a9c", +".8M c #a294aa", +"aMI c #a295a2", +"aG7 c #a2969b", +".2h c #a296a2", +"aj2 c #a29793", +"#wR c #a2989a", +"#If c #a2a1b4", +"aLZ c #a3282d", +"aKs c #a33c50", +"#KV c #a34b2e", +"afT c #a34f2d", +"#oy c #a35030", +"#9G c #a35050", +"a.p c #a35338", +"a.q c #a35438", +"abN c #a35832", +".9L c #a35b42", +"#Ts c #a35e34", +"#dA c #a36540", +"#Ia c #a36747", +"akn c #a3694c", +".LG c #a3703e", +"#CF c #a3788a", +".zS c #a3917e", +".uK c #a39189", +".fc c #a39299", +".zJ c #a39478", +"aDu c #a3979d", +"aIw c #a39ca3", +"aLE c #a41e35", +"aLD c #a42633", +"aFd c #a4416c", +"#pC c #a4432a", +"aKH c #a44655", +"#ET c #a44c30", +"#yH c #a44d28", +"a#8 c #a44f32", +"afU c #a4502a", +"#oz c #a45131", +"#m7 c #a45338", +"aeA c #a45534", +"#du c #a4563c", +"#6U c #a4572f", +"a.n c #a45846", +"#Y3 c #a4591f", +"#3w c #a45d44", +"ah# c #a4603f", +".2Z c #a4634d", +".P6 c #a46556", +".Ql c #a46753", +"#jH c #a46a5c", +"#Ku c #a46c3f", +".7I c #a46c5f", +"#XG c #a46f3c", +"#iS c #a46f64", +".R3 c #a47356", +".08 c #a4765c", +"#fR c #a47776", +".PT c #a47d54", +".Z9 c #a47d60", +".XP c #a48054", +"aKY c #a4867a", +"#JL c #a4867d", +"anf c #a4877d", +"#nn c #a48890", +"#zn c #a49699", +"aG8 c #a4989e", +".IE c #a4a0c7", +".G4 c #a4a2cf", +"aDQ c #a5274e", +"aI9 c #a5497e", +"#Av c #a54d2d", +"#Mm c #a5512e", +"#dG c #a55137", +"#V9 c #a55619", +"afM c #a55838", +"#5r c #a55b42", +"aLR c #a55d73", +"#8E c #a56040", +"abC c #a5633c", +"a#Z c #a5633e", +".Qd c #a56353", +"#XL c #a56850", +"#L. c #a5755d", +".LH c #a57d55", +"#zc c #a59089", +".tM c #a59183", +"aF3 c #a5959c", +"aIE c #a59ca2", +".js c #a5a59d", +".rq c #a5a5b4", +"#Uv c #a64338", +"#pB c #a64729", +"#Aa c #a64c29", +"#Mh c #a64f32", +"abG c #a6503c", +"aeB c #a65232", +"#5u c #a6543b", +"a.o c #a6553b", +"#aY c #a65639", +"#So c #a65836", +"aeF c #a65b34", +"ag2 c #a65d3d", +"#03 c #a66244", +".20 c #a6644e", +"#Br c #a66852", +".7p c #a66d3d", +".Rn c #a67341", +"aGx c #a6738e", +"##z c #a67975", +"#.N c #a67c5a", +".7v c #a67e56", +".w. c #a6906e", +"aHr c #a6959c", +".95 c #a69aab", +"azA c #a69ca8", +"aID c #a69da3", +"#vi c #a69ea2", +"aBQ c #a69fa3", +"aDP c #a72c52", +"aI5 c #a7485f", +"#Nw c #a74b1e", +"#F6 c #a74f29", +"a#6 c #a74f34", +"#Y# c #a75e3a", +"aGr c #a75e80", +"#dB c #a76040", +"#a4 c #a7633c", +"#.W c #a76455", +"#I4 c #a76539", +".6w c #a76b5a", +"#h4 c #a76b5e", +".4C c #a76c56", +"#jD c #a76e37", +".Kh c #a77442", +".Qu c #a77565", +".Ur c #a77747", +"aGy c #a77c92", +".wu c #a78863", +".yg c #a78a69", +"anD c #a79ba1", +"aDa c #a79ea3", +".uU c #a7a088", +"aDR c #a82850", +"aLF c #a83048", +"aKO c #a8312d", +"#Ge c #a84931", +"aKq c #a84a49", +"#xf c #a84d2b", +"#Mi c #a85035", +"#Mk c #a85334", +"#5d c #a85a34", +"#3I c #a85a42", +"#sC c #a85b3f", +"#68 c #a85e43", +"ah7 c #a86345", +".Zp c #a88456", +"#tx c #a89190", +"afp c #a89b96", +"ahX c #a8a5ac", +".h0 c #a8a5b1", +".jv c #a8a8a0", +"aE9 c #a92e5a", +"aMV c #a92f39", +"aKr c #a9434d", +"#EL c #a94730", +"#xz c #a94d2e", +"#KW c #a95133", +"#Mj c #a95137", +"aez c #a95a39", +"#0n c #a95b3b", +"a.t c #a95e3c", +"#KE c #a96252", +"#Zf c #a9664d", +"#z4 c #a9664e", +".2V c #a96751", +"ajk c #a96a4c", +"#Y8 c #a96d33", +"akg c #a96f52", +".7J c #a96f62", +"ako c #a97059", +".Vb c #a97060", +".9a c #a97140", +"a.a c #a9715d", +".9o c #a97365", +".SQ c #a97644", +"#yt c #a97755", +"#h1 c #a9784a", +".Zo c #a97943", +"#s# c #a98161", +"#7Y c #a98178", +"aKx c #a98d9f", +"aHo c #a9989f", +".gO c #a99c9a", +".tu c #a99e86", +"ad7 c #a9a09e", +"aIx c #a9a2a9", +".7j c #a9a2b1", +".ri c #a9a5ab", +"aF. c #aa2b58", +"#ie c #aa4a24", +"#tW c #aa4e2d", +"abJ c #aa4f33", +"#oi c #aa5532", +".7X c #aa5b2b", +"#vT c #aa5d3e", +"aaa c #aa613b", +".Qc c #aa6858", +".ZZ c #aa6c4f", +".IK c #aa7746", +"#hn c #aa7f7b", +".MZ c #aa835a", +"akf c #aa8b81", +".xV c #aa957b", +"aiV c #aa9c97", +".qQ c #aa9d6e", +"#7U c #aa9f94", +"aHf c #aaa1a7", +".y8 c #aaa7af", +".Xr c #aaaacf", +"#uc c #ab4a2d", +"#aO c #ab4e33", +"abI c #ab4e34", +"#y3 c #ab5333", +"#Bz c #ab572f", +"#aQ c #ab5741", +"#1J c #ab5b3b", +"#UV c #ab5c3f", +"#cG c #ab5e33", +"#Y2 c #ab6118", +"a.g c #ab6744", +".6s c #ab6859", +".77 c #ab6959", +"abw c #ab6b55", +".78 c #ab6e5a", +"#e0 c #ab7644", +"#b2 c #ab7757", +".5S c #ab7b3d", +"#a9 c #ab8594", +".Wf c #ab875d", +"aEn c #aba1a6", +"aEl c #aba3a5", +".oD c #aba6bd", +"awA c #aba7aa", +"alC c #aba7ab", +"#G. c #ac4d2f", +"ada c #ac523e", +"##c c #ac5426", +"#kr c #ac583f", +"a.r c #ac5e40", +"#FC c #ac6159", +"#Y6 c #ac632b", +"#Tt c #ac643b", +"#Wt c #ac6647", +"#TO c #ac664e", +"#R3 c #ac6737", +"#OV c #ac6a36", +".Qb c #ac6a5a", +"#sT c #ac6c46", +"#No c #ac6d3b", +"alu c #ac7659", +"#Id c #ac8373", +".0Z c #ac8757", +"asn c #ac8d80", +"aBA c #ac9083", +"aME c #ac96a7", +".qJ c #ac9983", +"#zL c #ac99a8", +".zT c #ac9a85", +"aG9 c #aca0a6", +"aH. c #aca1a6", +"aHh c #aca4aa", +"aus c #aca9ab", +"#KU c #ad523b", +"abK c #ad5537", +"#C6 c #ad5631", +"a#5 c #ad5947", +"aMD c #ad5964", +"adf c #ad5d39", +"#I6 c #ad622a", +"#8Q c #ad6244", +"abz c #ad6431", +"#6V c #ad6439", +".6n c #ad6449", +"#Kz c #ad652f", +"#B4 c #ad6753", +"#LV c #ad7242", +".4y c #ad725c", +"##w c #ad7357", +"#gv c #ad7657", +".XY c #ad7963", +".4j c #ad7c40", +"akp c #ad7c69", +".Z8 c #ad8161", +"#B6 c #ad8266", +"#lW c #ad8584", +"aPL c #ad897b", +"aE6 c #ad8f9d", +"#GZ c #ad949b", +"#r5 c #ad9d95", +"#DB c #ada194", +".vx c #ada5a6", +"aEw c #ada6ac", +"aDh c #ada7ac", +"aoy c #ada9af", +"#Gz c #ada9b4", +".fk c #adaaaa", +"#O3 c #ae470f", +"#gK c #ae4f33", +"#ow c #ae573f", +"#A. c #ae5a32", +"#3t c #ae5b3a", +"#UE c #ae5d24", +"#.7 c #ae5d38", +"#8S c #ae6142", +".1w c #ae6148", +"a.s c #ae6242", +"#8R c #ae6243", +"a.u c #ae6341", +"#dw c #ae6348", +"abO c #ae663e", +"#a6 c #ae6841", +"#7a c #ae6b4b", +"#Sq c #ae6b4d", +"#0I c #ae6e4e", +"aib c #ae7056", +".9p c #ae7163", +".4D c #ae745d", +"#.I c #ae7645", +"alv c #ae7a64", +"#aj c #ae7b5d", +"#Gx c #ae7e6c", +"#6k c #ae7e79", +"#tF c #ae8266", +"#Z# c #aea09e", +"#JM c #aea0a9", +"aFC c #aea4a7", +"aEg c #aea5a8", +"aDb c #aea5aa", +"aIC c #aea5ab", +"aIB c #aea6ac", +"#yj c #aea9af", +"#bz c #aea9cd", +"awG c #aeabb2", +"aJg c #aebdc2", +"aMS c #af1d30", +"aKI c #af2a39", +"aDS c #af2b54", +"aF# c #af2c5a", +"aKt c #af4a66", +"#st c #af5534", +"##f c #af583c", +"#hj c #af6045", +"#WI c #af6641", +"#Wr c #af6643", +"#8D c #af6738", +"a#X c #af6932", +"ah6 c #af6a4b", +"aMX c #af6d71", +"#3N c #af7048", +"#8U c #af7456", +"#9D c #af9084", +"QtC c #af9f9c", +"aHe c #afa6ac", +"aIy c #afa7ae", +"aDi c #afa9ae", +"aFa c #b02959", +"#pF c #b04e3d", +"#v1 c #b05033", +"#Dq c #b05436", +"#70 c #b05c5b", +"#3L c #b06541", +".4Q c #b0674c", +"ac5 c #b06b30", +".4E c #b06c4c", +"#Ve c #b06f50", +"afH c #b07054", +".Qm c #b0735e", +"akk c #b07659", +"#dp c #b0795a", +"alo c #b0795d", +"#4C c #b07977", +"#wc c #b08f90", +"aeI c #b09081", +"#AD c #b0947b", +"aGm c #b095a5", +".z6 c #b09c93", +"#B7 c #b09d8b", +"#AR c #b0a097", +"aHa c #b0a4aa", +"aBP c #b0a9ad", +"aMR c #b1243c", +"aDU c #b12752", +"aGv c #b1567f", +"aeD c #b15830", +"#iO c #b1593d", +"#.6 c #b15e3a", +"#7# c #b16145", +"#L2 c #b16332", +"#ec c #b1633a", +"aa. c #b16341", +"aKP c #b1635e", +"#Nz c #b16737", +"ah. c #b16746", +"#Sn c #b1674a", +"#ip c #b16c49", +"#UQ c #b16d4c", +"a#Y c #b16e48", +".P7 c #b17263", +"#bS c #b17b5c", +".09 c #b18165", +".Rz c #b18a78", +"aOP c #b18d7f", +"aLQ c #b18d9e", +"arG c #b19387", +"ad2 c #b19d93", +".qy c #b19f8d", +"acq c #b1a08c", +".sm c #b1a193", +"ahP c #b1a29b", +"al5 c #b1a2a4", +".vb c #b1a38a", +"#zm c #b1a39f", +".gS c #b1aab3", +".sy c #b1adad", +"avE c #b1aeb0", +"axz c #b1afb6", +".mV c #b1b9c6", +"aDT c #b22a55", +"#RG c #b23836", +"#pE c #b2503e", +"#pD c #b2513b", +"#G# c #b25237", +"#Gb c #b2523c", +"#QW c #b25937", +"#cw c #b25a40", +"#Mg c #b25c3c", +"#h8 c #b25f3d", +".7P c #b2623d", +"#m6 c #b26448", +"#fp c #b2653e", +"#XE c #b2660f", +"#Xz c #b26627", +"#Qm c #b26d39", +"#XO c #b26e58", +"#a3 c #b27048", +"#Gu c #b27156", +"#nW c #b27740", +"als c #b27b5f", +"#yu c #b27c56", +"#FP c #b27f59", +".p# c #b28e6d", +"avx c #b29181", +"#Ba c #b294a3", +"#Bd c #b2a39b", +"aEJ c #b2a5ab", +"aH# c #b2a6ac", +"#98 c #b2a7a9", +"aFJ c #b2a7ac", +"aHg c #b2a9af", +"#wQ c #b2b2ba", +"#lT c #b35a42", +"#xA c #b35b3b", +"#dv c #b35d46", +"#Mn c #b35e39", +"#sw c #b36447", +".9K c #b36546", +"#id c #b3663b", +"#cF c #b3683c", +"#1Q c #b36949", +"#kn c #b36a44", +"#Kv c #b36b3e", +"#Ws c #b36b4a", +"#f# c #b37047", +"#.J c #b37f5f", +".W2 c #b3806b", +"#uq c #b38d8a", +"auX c #b39283", +"aAk c #b39789", +"aqV c #b3978d", +"afm c #b3a097", +"#zM c #b3a5b0", +"#9z c #b3a698", +"aIz c #b3abb2", +"#yi c #b3adb9", +"aFc c #b4295a", +"#e7 c #b45843", +"abH c #b45948", +"add c #b45a3c", +"#KT c #b45a41", +"#gQ c #b46040", +"#ld c #b46440", +"#vP c #b46448", +"a.d c #b4663f", +"#8C c #b4683d", +"a#V c #b46840", +"aby c #b4693f", +"#YY c #b46949", +"ac4 c #b46c37", +"#Px c #b46d54", +"abA c #b46e35", +".Qa c #b47262", +"#Jb c #b47557", +"ajn c #b47a63", +".7H c #b47e6f", +"ams c #b48064", +".1H c #b48969", +"awv c #b49383", +"aJH c #b4968a", +".z5 c #b49c80", +"#vj c #b49c9a", +"aMM c #b4a1b0", +"a#f c #b4a594", +".61 c #b4a5b6", +"agF c #b4a6a0", +"aiW c #b4a7a3", +".gN c #b4a7a5", +"#zN c #b4aaad", +".31 c #b4aabb", +".t0 c #b4afad", +".hZ c #b4b4c2", +"aFb c #b52b5c", +"aMU c #b52f39", +"#fe c #b55b3f", +"#xw c #b55e43", +"#n8 c #b5633c", +"#Tw c #b56640", +"#oM c #b5684d", +"a.e c #b56a3c", +"#V. c #b56d40", +"#U3 c #b5714f", +"abB c #b5734b", +"#13 c #b57752", +"ajh c #b57759", +"#af c #b58060", +"#bV c #b5806f", +"a.w c #b58267", +"#r8 c #b58366", +"#JH c #b58469", +"#kt c #b5857d", +".2O c #b5866b", +"#my c #b58869", +"aH3 c #b59591", +".wC c #b59f97", +".ph c #b5a99f", +"aEo c #b5aaaf", +"aIA c #b5aeb5", +"#pT c #b65c44", +"#KX c #b65e3e", +".9H c #b66330", +"#5c c #b66342", +"#6T c #b66542", +"a#9 c #b66545", +"#UL c #b66625", +"#UD c #b6662d", +"#V8 c #b66829", +"#fM c #b66847", +".7Y c #b66941", +"#Qy c #b66a40", +"#ll c #b66b3f", +"#cc c #b66b53", +".6d c #b67150", +"#z5 c #b67154", +"#Y7 c #b6732e", +".6t c #b67364", +"#C1 c #b67655", +".P8 c #b67768", +"#uo c #b67d4c", +"#Er c #b68167", +"#qJ c #b68468", +"#jE c #b68557", +"#B# c #b693a5", +"#E6 c #b6947e", +"auk c #b69585", +"awY c #b69586", +"azc c #b69a8c", +"aLH c #b69bad", +"#Be c #b6a290", +"agD c #b6a49c", +".pg c #b6aba1", +".y2 c #b6adc3", +"aEx c #b6aeb4", +"aEv c #b6afb4", +".t5 c #b6b2af", +"aHY c #b72a40", +"adc c #b7593d", +"#KY c #b7603d", +"#Tf c #b76330", +"#cv c #b7634a", +"abM c #b76845", +"#mW c #b76846", +"#Np c #b76936", +"#jS c #b76a3f", +"#lC c #b76c50", +"#Xy c #b76d20", +"a.v c #b76d4a", +"a#W c #b76e3d", +"ag1 c #b76e4f", +".ZY c #b77155", +"abP c #b77249", +"#5w c #b7734f", +"aHW c #b7747e", +"ac6 c #b7754c", +".ZH c #b7785c", +".UD c #b77e67", +"#N3 c #b77e6a", +".9q c #b78070", +"#k7 c #b78457", +".Zy c #b7856a", +"#TT c #b78672", +".Yw c #b7886c", +"atw c #b79687", +"asX c #b79689", +"aHG c #b798a9", +"aJe c #b798ac", +"axX c #b79b8e", +"#Ef c #b7a48d", +"aG1 c #b7adb1", +".dG c #b7b0b9", +"auy c #b7b5bc", +".l. c #b7b8bd", +".jH c #b7cce7", +"aMQ c #b83a54", +"#YW c #b84538", +"#jT c #b86339", +"#e6 c #b8634a", +"#mI c #b8643e", +"#mH c #b86540", +"#5b c #b86548", +"#lU c #b8664d", +"#mV c #b86743", +"#cu c #b86950", +"#I5 c #b86c3f", +"#sg c #b86c43", +"#LW c #b86d3c", +"a.f c #b8703e", +"#5v c #b8704d", +".ZX c #b87055", +"#Sm c #b8715a", +".70 c #b8765c", +".1B c #b8765e", +"#Ev c #b8795a", +".Q# c #b8796a", +"#0H c #b87a59", +"#2S c #b87d7d", +"#e1 c #b88162", +"#8V c #b88165", +"#3p c #b88263", +"alt c #b88266", +".Zz c #b88364", +".4s c #b88a71", +"#vr c #b88b70", +"alw c #b88d7d", +"aNZ c #b89385", +"axm c #b89788", +"#G0 c #b8a0a8", +"#G1 c #b8a3ad", +"#CK c #b8a58f", +"aaU c #b8a894", +"aLP c #b8a9b7", +".zI c #b8aa8b", +".zh c #b8acb7", +".py c #b8ad83", +"aDf c #b8b2b7", +"aAJ c #b8b6c0", +".q6 c #b8c3db", +"aMT c #b92435", +"adb c #b95a49", +"#Ki c #b9605d", +"ade c #b96443", +"#tZ c #b9654a", +"#4V c #b96a5f", +"#Sp c #b96c49", +"#sx c #b96d51", +".3a c #b96d54", +"#Tu c #b96f47", +".Z0 c #b97a5d", +".P9 c #b97a6b", +"#T# c #b97d60", +".W1 c #b9826d", +".Qt c #b98371", +"#w1 c #b98766", +"#k9 c #b98d7a", +".j# c #b99872", +"#yl c #b9a399", +".r6 c #b9a584", +"#Ci c #b9a796", +"#CJ c #b9a99e", +".af c #b9aab3", +"#zO c #b9aca7", +"#Za c #b9acaa", +".v6 c #b9aeb0", +"#KS c #ba6045", +"#aP c #ba6148", +"#LX c #ba6432", +"#RQ c #ba6435", +"#.5 c #ba6743", +"#gC c #ba6749", +"#Kw c #ba6839", +"#gV c #ba6843", +"#OW c #ba6934", +"#pu c #ba6a43", +"#n7 c #ba6a44", +"#nl c #ba6a51", +"aeu c #ba6b4a", +"#qT c #ba6d44", +"afK c #ba6d4d", +"#8T c #ba6d4e", +"#ls c #ba6e4b", +"agY c #ba7158", +"#un c #ba723f", +"aab c #ba734c", +"#l# c #ba755e", +".1f c #ba775f", +"#Dw c #ba794b", +".ZI c #ba7a5e", +".Q. c #ba7b6b", +".Qn c #ba7d66", +".Qr c #ba7e6a", +".4x c #ba7f69", +"aln c #ba8467", +"alr c #ba8468", +"amA c #ba9385", +".qt c #ba9778", +"#7X c #ba9d94", +"a#i c #baa695", +".Cq c #baaeb5", +"#yk c #baafad", +"aEs c #bab0b4", +"aHd c #bab1b7", +"aBM c #bab2b6", +".p5 c #bab8d8", +".sP c #bab9d4", +"aLY c #bb1c26", +"#Ga c #bb5b43", +"#ri c #bb5e48", +"#F5 c #bb653f", +"#Th c #bb681e", +"#ND c #bb693b", +".9J c #bb6943", +"#UG c #bb6b1e", +"#p8 c #bb6b4f", +"aet c #bb6c4b", +"#fa c #bb6f4c", +"#tL c #bb6f4e", +"#V7 c #bb7024", +"#L6 c #bb723e", +"#Gm c #bb723f", +"#R4 c #bb7344", +".Yl c #bb7b5e", +".Qs c #bb816e", +".1. c #bb8769", +"#ai c #bb8f7b", +"aHM c #bb9ab5", +"##A c #bba1b2", +"a#j c #bba493", +"#6h c #bba7a4", +"aIJ c #bba9b2", +"aaY c #bbaa97", +"aDg c #bbb5ba", +".yq c #bbb5bc", +"aHS c #bbb5c2", +"aLT c #bc2641", +"aDV c #bc305c", +"#cx c #bc6246", +"#ox c #bc634b", +"aeE c #bc663b", +"#Da c #bc674d", +"afI c #bc684b", +"#xo c #bc684d", +"#ov c #bc684f", +"afV c #bc6c45", +"#aZ c #bc6d4e", +"#UC c #bc6e2b", +"#qU c #bc6e45", +"#mE c #bc744d", +"#Mx c #bc7454", +"#N2 c #bc7458", +"#QY c #bc755d", +"#sR c #bc7a50", +"#a1 c #bc7c53", +".ZG c #bc7c61", +".Qq c #bc7e6a", +"akm c #bc8265", +"#My c #bc836a", +"#E5 c #bc8371", +"#tC c #bc8a5d", +".93 c #bc8b7d", +".1J c #bc9274", +"aoq c #bc9e93", +"a#g c #bca493", +"afn c #bcaca5", +"ad6 c #bcb0ad", +"aHc c #bcb3b9", +"aBN c #bcb5b9", +".ik c #bcc6da", +"#mN c #bd6e44", +"#gH c #bd6e48", +"#pw c #bd7045", +"##. c #bd704a", +"#U4 c #bd705e", +"#XC c #bd732f", +"#U1 c #bd7552", +"ac2 c #bd7555", +"#gE c #bd764e", +"#U2 c #bd7755", +".2U c #bd7b65", +"#Zd c #bd8065", +"##x c #bd8166", +"#12 c #bd825c", +"#QZ c #bd8574", +".1G c #bd8e70", +"aIg c #bd998a", +"aM5 c #bd998b", +"#6j c #bd9d98", +"aIh c #bd9f93", +"#Gy c #bda19c", +".uX c #bda594", +"#9C c #bda597", +"#zP c #bda89a", +"#Bb c #bda8b2", +"#0D c #bdb0aa", +"aEq c #bdb3b8", +"aDd c #bdb5b9", +"aEu c #bdb5bb", +"#lf c #be6743", +"#C5 c #be6a42", +".9z c #be6d48", +"aL0 c #be6e6f", +"#sh c #be7147", +"afL c #be7150", +"#cE c #be7347", +"#0u c #be744d", +".4P c #be745a", +"#TN c #be7843", +"#gG c #be794d", +"#p4 c #be7950", +"ah5 c #be7a5b", +"#Uy c #be7e61", +"#Ze c #be7e63", +".4u c #be8671", +"#Py c #be8674", +"#sa c #be895c", +".Yv c #be8a6e", +"#vo c #be8d60", +"#I# c #be8d6f", +".Z7 c #be8f6e", +"#qM c #be9374", +"aad c #be9784", +"aBz c #be9a86", +"aAj c #be9a87", +"#DP c #beac95", +"aLL c #beacbb", +"aaX c #bead99", +"aHb c #beb2b7", +"aDc c #beb5b9", +"aFT c #beb6bc", +".DP c #bebcd9", +"aKN c #bf1f1f", +"aes c #bf5b3a", +"aLz c #bf614a", +"#Qo c #bf662d", +".9I c #bf6b3e", +"abL c #bf6c4b", +"#Qn c #bf6e37", +"#tN c #bf6f4a", +"#pv c #bf7047", +"#8B c #bf704b", +"#8A c #bf7051", +"#O8 c #bf7145", +"#Qz c #bf7148", +"#eb c #bf7249", +"#W# c #bf7327", +"#ct c #bf735a", +"#XB c #bf7436", +"aeq c #bf785b", +"#R1 c #bf7e4c", +"ajg c #bf8062", +"#7b c #bf8160", +".Qo c #bf836b", +"#RK c #bf8468", +".Hl c #bf8553", +"#tG c #bf8d6c", +"#vs c #bf8e6c", +"#pk c #bf8e71", +"#Eb c #bf97a5", +"asW c #bf9988", +"aJG c #bf9a8c", +"aCY c #bf9b88", +"apZ c #bfa196", +"#FH c #bfa89d", +"#Ie c #bfa8a7", +"#FF c #bfaaa4", +".x0 c #bfac86", +"aEF c #bfb1b7", +"QtF c #bfb2ba", +"aEr c #bfb5ba", +".6W c #bfb89d", +".0y c #bfb8c9", +".oj c #bfd1f9", +"#Wb c #c06701", +"#cr c #c0684f", +"#cm c #c06942", +"#RS c #c06b24", +"#W. c #c0722e", +"#tM c #c07251", +"#O7 c #c07447", +"#qV c #c07449", +"#sk c #c07548", +"ag0 c #c07757", +"#04 c #c07955", +"#e9 c #c07c56", +"#rs c #c07d53", +"#Bu c #c07e5b", +"#WJ c #c08060", +"#5x c #c08560", +"#FZ c #c08952", +"alq c #c08a6e", +"aCX c #c0967d", +"aEc c #c0967e", +"aKX c #c09c8e", +"#Ee c #c0afa3", +".zG c #c0b091", +".AS c #c0b4bb", +"aDp c #c0b5ba", +".o. c #c0b78f", +"aBO c #c0b9bd", +"#vJ c #c16443", +"#Dc c #c1684e", +"#vY c #c16b4f", +"#xB c #c16d4c", +"#F4 c #c16e46", +"#vz c #c1724d", +"#aG c #c1734d", +"#O6 c #c17649", +"a#U c #c17657", +"#lQ c #c17a54", +"#Tr c #c17f54", +"#oI c #c18057", +"#XN c #c18069", +".Yn c #c18362", +".Qp c #c1856c", +".FM c #c18858", +".6x c #c18c78", +".Tx c #c1936c", +"#Bl c #c19479", +"aBy c #c1977f", +".nM c #c19a7d", +"azb c #c19d89", +"aFy c #c19d8a", +"QtE c #c1a387", +"#CH c #c1a6ae", +"#Hn c #c1a89c", +".xX c #c1ad8f", +"#Hm c #c1ada5", +"acu c #c1b4a0", +".v0 c #c1b5b8", +".zg c #c1b5bb", +"aEp c #c1b7bc", +"aFS c #c1b9be", +".84 c #c1b9c0", +".Cc c #c1bdd4", +"#Nq c #c26935", +"#Aw c #c26e4c", +"#oA c #c2704f", +"#ih c #c2714e", +"#6S c #c27153", +"#o. c #c2754a", +"#lP c #c2754e", +"a.c c #c27557", +"#5a c #c27559", +"##a c #c2764f", +"#nm c #c27a5f", +"#2m c #c27f60", +".1g c #c27f67", +".6v c #c28071", +"#dy c #c28361", +".7L c #c28478", +".7K c #c28579", +"#0G c #c28866", +".6r c #c28868", +"#K9 c #c2886c", +"#FD c #c28880", +"#11 c #c28a63", +"#Nl c #c28c4f", +"#7c c #c28c6c", +".Z6 c #c29271", +"#w0 c #c2967a", +".1I c #c29777", +".mj c #c29983", +"av3 c #c29a85", +"aM4 c #c29a8b", +"#2R c #c29d9d", +"aqT c #c29e8e", +"#Ec c #c2a4ac", +"#IU c #c2aaa2", +"#r6 c #c2ab9c", +"#7V c #c2aca5", +".By c #c2ae99", +"#FG c #c2afa8", +"#CI c #c2b0af", +"aII c #c2b0b9", +"ad3 c #c2b1aa", +"anC c #c2b5bb", +"aEt c #c2b7bc", +".D2 c #c2b7bd", +"aDe c #c2b9bd", +".5A c #c2b9cb", +"aBF c #c2bcbe", +"#EU c #c36245", +"#gM c #c3674a", +"#KR c #c36a4c", +"#xd c #c36c46", +"#Db c #c36d52", +"#oh c #c36e59", +"#3s c #c36f52", +"aH1 c #c36f70", +"#Te c #c37040", +"#n9 c #c3734a", +"#3r c #c37559", +"#Y5 c #c37946", +"#ng c #c37951", +"#U8 c #c37956", +"#ZB c #c37c56", +".1e c #c38068", +".ZF c #c38367", +"#Yb c #c38565", +"#sS c #c3875d", +".Va c #c38778", +".XZ c #c38c70", +"#wX c #c39164", +"#zX c #c3967b", +"#CS c #c3977b", +"#ZD c #c39781", +".kF c #c39989", +"awX c #c39b86", +"avw c #c39b87", +"aL8 c #c39b8b", +"axl c #c39c87", +"aNY c #c39c8c", +"axW c #c39f8c", +"#Hl c #c3aba5", +"#4A c #c3abaa", +"#7W c #c3aca4", +"ahQ c #c3b5af", +"ayl c #c3b7c4", +".VM c #c3b8c5", +"aEh c #c3bbbe", +"azw c #c3c2cb", +"aHX c #c45b6b", +"#gJ c #c4624a", +"#h# c #c46942", +"#OX c #c46b34", +"#cy c #c46c4d", +"#R7 c #c47548", +"#xp c #c47556", +".ZW c #c47960", +"#R5 c #c47a4c", +"#fu c #c47b56", +"#yA c #c47b5c", +"#6l c #c47b79", +"#U9 c #c47c53", +"#2n c #c47d59", +".6u c #c48071", +"#Wk c #c48168", +"a#T c #c4826b", +".Ym c #c48867", +"#8y c #c48871", +"#2p c #c48968", +"#HF c #c48a5d", +"akj c #c48a6d", +".Wq c #c48b72", +".D7 c #c48c5f", +"#qN c #c48c61", +"#Ej c #c49366", +"#5y c #c49574", +"aAi c #c49a82", +".S2 c #c49b8a", +"arE c #c49e8c", +".94 c #c4a6a3", +"#IV c #c4a99c", +"#wS c #c4ada7", +"#Ed c #c4afae", +"aF1 c #c4b4bb", +"#.i c #c4bcc1", +".8T c #c4bdaf", +".oz c #c4c0d6", +"QtY c #c4c2cf", +"#gI c #c56b4d", +"#KK c #c57141", +"#N1 c #c5714e", +"#D# c #c57156", +"#pt c #c57850", +"#Tv c #c57851", +"ac3 c #c57a4f", +"#sB c #c57b5e", +"#lV c #c57b61", +"#oH c #c57e55", +"#Xu c #c57e5f", +"ah3 c #c57f6c", +"#g2 c #c5825c", +".4w c #c58372", +"#6Q c #c5876d", +".4v c #c58774", +"#LS c #c59057", +".Cv c #c59068", +".R2 c #c59274", +"#CP c #c59466", +"#3O c #c5946f", +"#AC c #c59472", +"#nY c #c59679", +"aKW c #c59d8d", +"aOO c #c59e8e", +"acx c #c59e98", +".eZ c #c5a191", +"#4B c #c5a29f", +"#CM c #c5a884", +"aJa c #c5aabc", +".z4 c #c5ac90", +"acs c #c5b09b", +".Bz c #c5b19d", +".ws c #c5b28c", +"#Bc c #c5b6b7", +"aFK c #c5b9bf", +"aFO c #c5babf", +".vr c #c5bed3", +".xc c #c5bed6", +".kK c #c5c4d4", +"#Tj c #c66002", +"#q4 c #c66554", +"#Nd c #c6686a", +"#jN c #c66f4c", +"#gP c #c67051", +"#Mo c #c6734b", +"#cA c #c6734f", +"#QA c #c6754c", +"#lj c #c6794e", +"#hi c #c6795e", +"#w8 c #c67a58", +"#ii c #c67c5b", +"#sy c #c67d63", +"#ij c #c68363", +".Yk c #c68367", +".1C c #c6846c", +"#Wi c #c6866c", +"ajf c #c68769", +"#rt c #c6895f", +".2Q c #c68e74", +"#OS c #c68f50", +"#10 c #c69068", +"alp c #c69074", +"#FM c #c69164", +".Yu c #c69175", +"#Hs c #c69263", +"aHQ c #c693b3", +"#yq c #c69467", +"#Bi c #c69567", +"#Gt c #c69576", +"#ys c #c6997e", +"#Yc c #c69984", +"aza c #c69c84", +"auW c #c69e89", +"asl c #c69e8b", +"ajc c #c69e8f", +"asm c #c6a292", +"apY c #c6a496", +"#Kl c #c6a79f", +"#Eg c #c6ae8e", +"ad4 c #c6b6af", +".FH c #c6bbc1", +".pY c #c6c2d0", +"aye c #c6c4ce", +"#Di c #c7674e", +"#vH c #c76d4a", +"#ha c #c76e44", +"#jO c #c76e4a", +"#ig c #c76f4b", +"#BX c #c76f4f", +"#KZ c #c7704a", +"#iQ c #c7715a", +"#Tn c #c7723e", +"#QV c #c77250", +"#oF c #c77750", +"#oG c #c77751", +"#K4 c #c7794d", +"#cH c #c7794f", +"#si c #c77b50", +"### c #c77b54", +"#px c #c77c50", +"#U7 c #c77c5e", +"#sf c #c77d55", +"#K8 c #c77e5b", +"#2o c #c7825c", +"#E2 c #c78558", +"#XF c #c7863f", +".ZE c #c7886c", +"#B5 c #c78973", +"akh c #c78d70", +".V# c #c78f68", +".79 c #c79078", +".AX c #c79471", +".2P c #c79478", +".4t c #c7947d", +"#zU c #c79568", +".Z5 c #c79674", +"#WK c #c79984", +"axk c #c79a81", +"#Kt c #c79b6e", +"#Em c #c79b7f", +"axV c #c79d85", +"aHI c #c79eb6", +"aPK c #c79f8f", +".aq c #c7a585", +"apb c #c7a698", +"#zQ c #c7a893", +"aaV c #c7ae9b", +".wo c #c7b396", +".yp c #c7b9b8", +"#0C c #c7bcbc", +"aB0 c #c7bec3", +"aFR c #c7bec4", +".DO c #c7c4e5", +"aLU c #c81831", +"#Tm c #c8681e", +"#pA c #c86947", +"#Gf c #c86a51", +"#g9 c #c86f4c", +"#EB c #c8714c", +"#cd c #c8714e", +"#gR c #c87554", +".9y c #c87651", +"#NU c #c8774b", +"#NT c #c8774d", +"#p2 c #c87851", +"#Tx c #c87852", +".9A c #c87853", +"#H5 c #c87946", +"#JB c #c87949", +"#QU c #c87b5a", +".3# c #c87d63", +"#KF c #c87f4c", +"#nh c #c8845d", +"#Az c #c88464", +"#a2 c #c8865e", +"#v7 c #c88a5f", +"#p5 c #c88a60", +"#XM c #c88a72", +".2R c #c88b71", +".Z4 c #c89272", +"#w2 c #c8936c", +"#I0 c #c89462", +"#3c c #c89a6a", +"#up c #c89b81", +"#I2 c #c89d73", +"#06 c #c89e87", +"asV c #c89f8b", +"auj c #c8a08c", +"aJF c #c8a090", +".bW c #c8a48e", +".hR c #c8a686", +"#xK c #c8a898", +"#Km c #c8a89a", +"#9A c #c8b1a5", +".v9 c #c8b293", +"ak# c #c8b8c5", +"aFQ c #c8c0c6", +"##Y c #c8c2da", +".ld c #c8d8e2", +"#Xs c #c96253", +"#ED c #c96c4b", +"#ob c #c96f48", +"aer c #c96f50", +"#LZ c #c97024", +"#HN c #c97048", +"#3. c #c97166", +"#Mf c #c97350", +"#kp c #c97357", +"#mD c #c97547", +"#yG c #c9754d", +"#mJ c #c9774f", +"#UF c #c97834", +"#aF c #c97853", +"#Td c #c9793f", +".7W c #c97a44", +"#NB c #c97c4c", +"#w9 c #c97c52", +"#Jc c #c97f4e", +"#sW c #c98265", +"#QT c #c98364", +"#tJ c #c98553", +".RO c #c98569", +"#ix c #c98666", +"#V3 c #c98668", +"#R2 c #c98755", +"#ry c #c9896b", +".ZD c #c9896d", +"#y8 c #c98a5e", +"#JG c #c98e6e", +".W0 c #c9907b", +".ZA c #c9916e", +"#Bp c #c9926c", +"#Kr c #c9955f", +"atu c #c99c83", +"#CG c #c9a4b3", +".FI c #c9bdc8", +"#8u c #c9bfbf", +"aah c #c9c2c7", +".Cg c #c9c3df", +"aw. c #c9c5c8", +".rp c #c9c8de", +".tR c #c9d4e7", +"aKM c #ca1115", +"#gL c #ca6c50", +"#if c #ca6d48", +"#S8 c #ca6e61", +"#BB c #ca704d", +"##b c #ca7342", +"#lg c #ca744f", +"#Jh c #ca7548", +"#nf c #ca7752", +"#QX c #ca7758", +"#ef c #ca7952", +"#NC c #ca7b4c", +"#um c #ca7b60", +"#o# c #ca7f53", +"#qW c #ca8054", +"abx c #ca8162", +"#cB c #ca8255", +"#3M c #ca835d", +"#q. c #ca886a", +".Yq c #ca8969", +".9x c #ca8a7d", +"#Hk c #ca8a83", +"aje c #ca8b6d", +".ZJ c #ca8b6f", +"#Zc c #ca8f73", +".WZ c #ca936d", +".Yt c #ca9571", +"amt c #ca9579", +"#Qg c #ca9a7c", +"#Vf c #ca9a85", +"awW c #ca9d84", +"atv c #caa28d", +"aIf c #caa292", +"#zb c #caa483", +"apc c #caab9e", +"#9B c #cab3a6", +"aHn c #cab9c0", +"aF4 c #cabac1", +".ig c #cabcc3", +".dC c #cabfc5", +".YY c #cac2d5", +"aux c #cac7ce", +"#O2 c #cb6211", +"#BV c #cb6b4e", +"#v2 c #cb6e50", +"##e c #cb714e", +"#i. c #cb7350", +"#HL c #cb754c", +"#EA c #cb774f", +"#NV c #cb7b4c", +"#UW c #cb7b50", +"#Ky c #cb7c3d", +"#vD c #cb7c50", +"#tQ c #cb7d51", +"#KG c #cb804d", +"#qS c #cb8058", +"#IR c #cb807b", +"#L7 c #cb814e", +"#he c #cb8265", +"#cC c #cb8356", +"#sz c #cb8369", +"#05 c #cb845f", +"#tI c #cb8850", +"#gF c #cb885c", +".21 c #cb8968", +"#9F c #cb8a86", +"#B2 c #cb8b5e", +"#a0 c #cb8b62", +"#dz c #cb906b", +"#wa c #cb9567", +".zl c #cb9a7b", +".Tw c #cb9b74", +".hL c #cb9d7c", +"aEb c #cb9d82", +"aui c #cb9e85", +".kx c #cba085", +".nE c #cba183", +".o2 c #cba281", +"#IX c #cba68e", +".du c #cba797", +"#LN c #cba798", +"apX c #cba899", +"#ym c #cbaa99", +"#Hp c #cbac94", +"#FJ c #cbb098", +"aLI c #cbb3c4", +"act c #cbbca6", +".AE c #cbc6d2", +"aq3 c #cbc7cd", +"aut c #cbc8ca", +"aij c #cbc8cc", +"#Qu c #cc5e1e", +"aLG c #cc677c", +"#Nv c #cc6f2c", +"#BC c #cc704e", +"#oc c #cc724f", +"#Pv c #cc7450", +"#gA c #cc745c", +"#ib c #cc7750", +"#xu c #cc775a", +"#NK c #cc7954", +".9B c #cc7c57", +"#vA c #cc7d50", +"#vU c #cc7e5f", +"#L8 c #cc7f4d", +"#y6 c #cc7f5b", +"#fL c #cc805e", +"#hh c #cc8064", +"#Qx c #cc8156", +"#UZ c #cc8159", +"#sA c #cc8366", +"#Ya c #cc845f", +"#oN c #cc876b", +".4F c #cc8867", +".Yo c #cc8b6b", +".2S c #cc8d73", +"#uk c #cc8e63", +"#Gs c #cc916d", +"#8W c #cc9d85", +".eQ c #cc9f7d", +"aFx c #cc9f84", +".S3 c #cca18e", +".rH c #cca37d", +".qk c #cca37f", +".s4 c #cca47c", +"QtM c #ccab85", +"#IW c #ccab98", +"#IT c #ccaca7", +"#Ho c #ccb09d", +".qI c #ccb698", +"#qG c #ccb7aa", +"ad5 c #ccbeb8", +".AR c #ccc1c3", +".FG c #ccc1c4", +"aFF c #ccc3c6", +"aC5 c #ccc5c7", +".Ft c #cccaf2", +"aKL c #cd0a13", +"aKJ c #cd2935", +"aJm c #cd2e2a", +"#Qp c #cd6820", +"#RT c #cd6917", +"afJ c #cd6e50", +"#fl c #cd7250", +"#KP c #cd7452", +"#KQ c #cd7454", +"#ff c #cd7458", +"agZ c #cd775e", +"#cz c #cd7855", +"#xn c #cd795e", +"#O9 c #cd7c51", +"#fy c #cd7d5a", +"#dK c #cd7e62", +"#mK c #cd7f54", +"#U5 c #cd806c", +"#RN c #cd813e", +"#sj c #cd8256", +"#U0 c #cd845e", +".4O c #cd866b", +"#Uz c #cd8823", +"#3q c #cd8a6d", +".1h c #cd8a72", +".2T c #cd8b75", +"#Ay c #cd8d60", +"#C2 c #cd8d67", +".Yr c #cd906f", +".Ys c #cd9673", +"#OP c #cd9c7f", +".ah c #cda07e", +"aCW c #cda085", +"awu c #cda087", +"#Ko c #cda28a", +".ut c #cda47b", +"#yn c #cda490", +"#LM c #cda49d", +"#ty c #cda59f", +".gs c #cda993", +"#FE c #cdaaa3", +"aop c #cdaea1", +".wx c #cdaf8a", +"a#h c #cdb7a6", +"aaZ c #cdb7a7", +".BA c #cdbaa5", +"aMF c #cdbac9", +"#Ch c #cdbca1", +".qY c #cdbdb2", +".sc c #cdbe8c", +"aEG c #cdbfc5", +"aoL c #cdcace", +".sQ c #cdcce8", +"aLX c #ce1c28", +"aJo c #ce1f1a", +"#OZ c #ce6915", +"#fE c #ce744c", +"#y4 c #ce7a59", +"#ne c #ce7f57", +"#QF c #ce8053", +"#p3 c #ce8059", +"#iN c #ce805f", +"#B1 c #ce825e", +"#Tc c #ce833a", +"#UB c #ce8431", +"#V6 c #ce852a", +"a.b c #ce8871", +"#Qj c #ce9655", +".1# c #ce9676", +"#Qe c #ce9b8c", +"#ON c #ce9e8f", +"#LU c #ce9f6f", +"axU c #cea085", +"aGU c #cea186", +"auV c #cea188", +"#Ng c #cea394", +"#vk c #cea79f", +"aqU c #ceada0", +"#Eh c #ceb28d", +"#6i c #ceb6b2", +".uY c #ceb995", +"afo c #cebfb8", +".uS c #cec29c", +"aFP c #cec2c8", +".xA c #cec2cc", +"aFN c #cec3c8", +"#bv c #cec4c9", +".pU c #cec9d7", +".lJ c #cec9ed", +".aC c #cecbd7", +".ua c #cecdd6", +".pJ c #cedaf8", +"aLV c #cf0f26", +"#OY c #cf6a1f", +"#Ns c #cf6f1d", +"#cq c #cf745a", +"#Dd c #cf745b", +"#i# c #cf7552", +"#KO c #cf7651", +"#C7 c #cf7652", +"aMw c #cf7662", +"#M# c #cf7a4a", +"#cs c #cf7a61", +"#jU c #cf7c53", +"#NJ c #cf7c55", +"#oL c #cf7c61", +"#dH c #cf7c62", +"#XD c #cf7e1e", +"#yF c #cf7e54", +"#NS c #cf7e57", +"#.8 c #cf7f59", +".9F c #cf825b", +"#mL c #cf8358", +"#Pt c #cf8360", +"#rr c #cf845c", +"#iM c #cf8560", +"#j3 c #cf8561", +"#yB c #cf865e", +"#hf c #cf8669", +"#Wd c #cf873f", +".6m c #cf886d", +"#z7 c #cf895e", +".RA c #cf8d77", +"#xE c #cf9165", +"#RI c #cf9178", +"#ZC c #cf9372", +".Z3 c #cf9476", +".1E c #cf967b", +"#Ni c #cf9f83", +"#LP c #cfa087", +".bN c #cfa180", +".i3 c #cfa280", +"ask c #cfa691", +"#wb c #cfa791", +"#zR c #cfaa90", +"#Kn c #cfaa96", +"arF c #cfac9d", +"#FI c #cfb5a2", +"acr c #cfb6a1", +"aaW c #cfbaa6", +".xZ c #cfbc98", +".uQ c #cfbe8d", +"aEk c #cfc7c9", +".k1 c #cfcbbc", +"axv c #cfccce", +"QtR c #cfcde9", +"aKK c #d01721", +"#Nt c #d0711c", +"#ud c #d07154", +"#Gl c #d0744d", +"#Jw c #d07653", +"#dZ c #d0785a", +"#RR c #d07b3f", +"#qX c #d07b51", +"#Tg c #d07c3d", +"#hb c #d07c4d", +"#Mr c #d07d50", +"#NH c #d07d53", +"#u# c #d07d60", +"#Wc c #d07e24", +"#fo c #d07e5a", +"#vW c #d07e61", +"#D. c #d07e62", +"#tO c #d07f51", +"#TB c #d07f52", +"#xr c #d07f61", +"#ic c #d08056", +"#xC c #d0805e", +"#UY c #d08259", +"#ul c #d08a6a", +".1d c #d08c74", +"#vv c #d08d5c", +"aJr c #d08d80", +".RZ c #d09270", +"#Ql c #d09561", +"aH2 c #d09695", +"#0F c #d09775", +"#z0 c #d09969", +"#RJ c #d0997c", +"#n1 c #d0997e", +"#pn c #d0a083", +"avv c #d0a38a", +"arD c #d0a895", +".my c #d0bc8f", +".vq c #d0c8dd", +".kZ c #d0c9b2", +"auv c #d0cdd0", +".um c #d0d7f5", +"#RY c #d17138", +"#UJ c #d17211", +"#d6 c #d17654", +"#Dl c #d1775c", +"#Qc c #d1777b", +"#Jx c #d17852", +"#pH c #d17b59", +"#le c #d17d59", +"#v4 c #d17d5c", +"#Pw c #d17d5d", +"#M. c #d17f4f", +"#mM c #d18055", +"#Gn c #d1814d", +"#ed c #d18159", +"#y5 c #d1815e", +"#km c #d1825d", +"#R6 c #d18456", +"#rv c #d18666", +"#hg c #d1866a", +"#U6 c #d1866d", +"#sQ c #d1875f", +"#TM c #d18a58", +"#iF c #d18a64", +"#V4 c #d18c1f", +".RM c #d18d71", +".Z1 c #d18f73", +"#sX c #d19274", +"#po c #d1956b", +".xE c #d1a085", +"az# c #d1a489", +"#wU c #d1a495", +"#Hu c #d1a57e", +"#DA c #d1ab93", +"#wT c #d1aca0", +"#Bf c #d1b59b", +"aHm c #d1c0c8", +".b4 c #d1c3c6", +"aFM c #d1c6cb", +".Cn c #d1c7c4", +"#c7 c #d1c9d3", +".Ch c #d1c9f1", +".Au c #d1cdef", +"auw c #d1cfd5", +"aHZ c #d2304a", +"#EV c #d27255", +"#Nu c #d27423", +"#LY c #d27628", +"##d c #d2784f", +"#rg c #d27961", +"#V1 c #d27966", +"#HM c #d27a51", +"#v3 c #d27a5a", +"#Mw c #d27d57", +"#rf c #d27d64", +"#NI c #d27f56", +"#fk c #d28062", +"#TG c #d2806b", +"#L1 c #d28143", +"aMz c #d28177", +"#R8 c #d28255", +"#UX c #d28257", +".7Q c #d2825d", +"#xa c #d28357", +"#.9 c #d2845e", +"#NA c #d28757", +"#HG c #d2875a", +"#V2 c #d2886e", +".RN c #d28d72", +"#S9 c #d28f77", +"#Wj c #d29177", +"#Ew c #d2936e", +".ZC c #d29870", +".UE c #d29879", +"#mx c #d29d71", +".7G c #d29e8f", +"#UO c #d2a098", +"#Qf c #d2a38a", +"aBx c #d2a58a", +"aqS c #d2ad9b", +"#3P c #d2b096", +"#Bg c #d2b192", +"a#k c #d2b1a4", +".yj c #d2b594", +".v8 c #d2bb9e", +".ty c #d2bbab", +".64 c #d2c0bd", +"aFZ c #d2c2c9", +"##U c #d2c6c6", +"#1X c #d2c6c7", +"au8 c #d2ced1", +"aLW c #d30c20", +"#Tk c #d36b0c", +"#O0 c #d36b0f", +"#UI c #d3710a", +"#Dj c #d3745b", +"#sI c #d3765a", +"#h. c #d37853", +"#Dm c #d37a5f", +"#NG c #d37b4f", +"#m8 c #d37f66", +"#TA c #d38051", +"#xt c #d38063", +".9G c #d3814a", +"#NR c #d3815d", +"#NQ c #d3815e", +"#re c #d38267", +"#vV c #d38365", +"#tR c #d38459", +"#dL c #d38468", +"#cI c #d3855a", +"#lN c #d3855d", +"#vy c #d38667", +".1v c #d3866d", +"#Dv c #d38763", +".Yp c #d39071", +"#qP c #d3986e", +"#I. c #d39876", +".R0 c #d39978", +"#nX c #d39c70", +"#vt c #d39d77", +"#Nf c #d39f99", +"#IS c #d3a19c", +"aAh c #d3a68b", +"adj c #d3b09b", +"a.. c #d3b1a0", +".tN c #d3bfb2", +".x5 c #d3c0ac", +".ax c #d3c0c0", +"#XK c #d3c1c0", +".uR c #d3c397", +".6Y c #d3c7c9", +"#6M c #d3c9c7", +".e7 c #d3cdd6", +"axy c #d3d0d7", +"#RX c #d46a1d", +"#RU c #d46c15", +"#C8 c #d47957", +"#Jj c #d47b50", +"#gO c #d47d5e", +"#QC c #d47e57", +"#NZ c #d47f58", +"#BY c #d4805f", +"#Mq c #d48154", +"#P. c #d48157", +"#xb c #d48359", +"#uh c #d48462", +"#vB c #d48553", +"#E0 c #d48764", +"#HH c #d4885b", +"#sl c #d4885d", +".ZV c #d4886f", +"#Jd c #d48959", +"#Ms c #d48d66", +"#Ta c #d48e32", +"#z6 c #d48e69", +"#Ps c #d48e6d", +"#xF c #d48f6f", +".RL c #d48f74", +"#ka c #d49071", +"#xI c #d49467", +".RY c #d49470", +"#pq c #d4956c", +".WY c #d49a75", +"aki c #d49a7d", +"#OU c #d49c68", +".X0 c #d49c79", +"#Nn c #d4a16f", +".Tv c #d4a179", +".1F c #d4a184", +"#Kk c #d4aaa6", +".wt c #d4b590", +"ane c #d4b5a9", +".wp c #d4c0a0", +".kU c #d4c18d", +"#DO c #d4c2a2", +"acv c #d4c3b2", +"##W c #d4cbd2", +"aw9 c #d4d2d8", +"aJn c #d52b26", +"#O1 c #d56d0f", +"#Qq c #d56d1a", +"#HO c #d57856", +"#Dr c #d57c5d", +"#uf c #d57d5d", +"#g8 c #d57e5b", +"#yZ c #d57e62", +"#RP c #d58156", +"#Xt c #d58168", +"#lh c #d5825a", +"#xs c #d58265", +"#fP c #d58464", +"#jR c #d5855b", +"#iL c #d58560", +"#li c #d5865c", +"#Mt c #d5875e", +"#Ax c #d58865", +"#Uw c #d58872", +"#y7 c #d58965", +".1u c #d58970", +"#g7 c #d58a63", +"#E1 c #d58a66", +"#p9 c #d58a6f", +".ZU c #d58b71", +"#8z c #d58d74", +".RQ c #d59175", +".RR c #d59275", +".1i c #d5927a", +".RB c #d5937c", +"#5# c #d59478", +".S5 c #d5967b", +"#OM c #d59993", +"aMy c #d59a82", +"#zT c #d59c60", +"#3a c #d59e62", +".R1 c #d59e7f", +"#tH c #d59f79", +"#vl c #d5a499", +".vR c #d5a58b", +"#OO c #d5a78f", +"#LO c #d5ac96", +".yh c #d5b896", +"agE c #d5c6bf", +"aFL c #d5cacf", +".e8 c #d5cdd6", +".gA c #d5d2de", +"apB c #d5d4d7", +".sM c #d5d5da", +".sL c #d5d5e2", +"#HP c #d67958", +"#Gi c #d67959", +"#Dk c #d67a60", +"#q0 c #d67c5d", +"#L0 c #d68139", +"#Me c #d6815b", +"#NL c #d68260", +"#OL c #d68285", +"#q8 c #d68465", +"#By c #d6855b", +"#x. c #d68958", +"#ui c #d68965", +"#Xx c #d68e31", +".RP c #d69277", +"#Qd c #d6948f", +".S6 c #d6977c", +"#Bq c #d69c7f", +"#CO c #d69d61", +"awt c #d6a68b", +".dl c #d6a887", +"#9E c #d6a89f", +"asU c #d6ab96", +"#Ks c #d6ac7b", +".z3 c #d6bda2", +".8P c #d6c6c3", +"anK c #d6d4d9", +"#gB c #d77864", +"#yJ c #d77b59", +"#Jk c #d77c58", +"#dM c #d77d5b", +"#dY c #d77e5f", +"#vG c #d7805b", +"#Kx c #d7833d", +"#sO c #d7855f", +"#yE c #d7885d", +"#TD c #d78c62", +"#iG c #d78d66", +"#JF c #d78d67", +"#K3 c #d78f64", +"#NX c #d7916d", +"#vu c #d7965f", +"#Nk c #d79753", +"a#m c #d79895", +"#mB c #d79980", +"#yp c #d79e62", +".Tu c #d7a177", +"av2 c #d7a78c", +"#LT c #d7aa76", +"QtD c #d7aa88", +"#Nh c #d7ab94", +".y# c #d7c2ad", +".uZ c #d7c590", +"#47 c #d7ceca", +".n6 c #d7cfcd", +".jg c #d7dbec", +"#Qr c #d86d0d", +"#UH c #d8750c", +"#Dh c #d8765e", +"#aL c #d87e54", +"#ce c #d8815e", +"#Mu c #d88258", +"#jQ c #d8835c", +"#cf c #d8845f", +"#Mp c #d8855a", +"#rp c #d88760", +"#NW c #d88859", +"#rq c #d88860", +"#gW c #d88c65", +"#ks c #d88c72", +"#H9 c #d88e65", +"#H4 c #d88f5e", +"#yC c #d88f61", +".3. c #d89176", +"#vw c #d8926a", +"#j4 c #d8926f", +"#n4 c #d8946c", +"#Tq c #d8976c", +".1j c #d89979", +"#7Z c #d89c97", +".ZB c #d89e79", +"#Ei c #d89f62", +".Wr c #d89f7e", +"avu c #d8a88d", +".gj c #d8ab89", +"#mz c #d8ac99", +".zH c #d8c8a7", +"#AQ c #d8c8b7", +".5r c #d8cbe1", +"#3m c #d8ceca", +".AP c #d8cecb", +"aC7 c #d8d1d4", +".nb c #d8d4f1", +".vC c #d8d7d4", +"#Qt c #d96a12", +"#RV c #d96d11", +"aJk c #d96d70", +"#As c #d9785b", +"#lb c #d97f53", +"#KN c #d9815b", +"#jP c #d9825d", +"#Pu c #d98560", +"#yU c #d98568", +"#ro c #d98661", +"#la c #d98664", +"#Pe c #d98960", +"#xq c #d9896b", +"#lM c #d98c64", +"#v5 c #d98c68", +"#ea c #d98d63", +"#e# c #d98e65", +"#lR c #d98e6c", +"#6R c #d98e74", +"#TF c #d99068", +"#Xv c #d99325", +"#oJ c #d9946f", +"ah4 c #d99476", +"#Sl c #d9955d", +".RS c #d99678", +".1c c #d9967e", +"#sb c #d99965", +"#Hr c #d99a65", +".S4 c #d99b7f", +".1b c #d99c7b", +".V. c #d99e78", +".1a c #d99e7d", +"#wW c #d9a064", +"#pj c #d9a176", +"#tz c #d9a79e", +"auU c #d9a98e", +"#nZ c #d9ae9b", +"#CL c #d9c0a1", +".ve c #d9e2f1", +"#jK c #da7c51", +"#HQ c #da7c5e", +"#tV c #da805d", +"#Jy c #da8159", +"#yV c #da8569", +"#og c #da856f", +"#Tz c #da8655", +"#vO c #da876c", +"#z9 c #da895f", +"#sm c #da8b64", +"#rw c #da8b6f", +"#F0 c #da8f64", +"#Ne c #da9393", +".Yj c #da9478", +"#y9 c #da9576", +".RX c #da9874", +"#OR c #da9a54", +".U9 c #da9c76", +"#T. c #da9f83", +".Tt c #daa075", +"#LL c #daa2a0", +"#FO c #daac88", +"#wZ c #dab096", +"#yr c #dab097", +"#vq c #dab197", +".w# c #dac5a0", +".ye c #dac7a6", +".sd c #daca9a", +".px c #dacfa3", +".68 c #dad4bf", +"aAO c #dad4d8", +"anr c #dad6dc", +"#Qs c #db6d09", +"#EC c #db7f5d", +"#q1 c #db7f64", +"#H2 c #db805a", +"#Jl c #db805d", +"#ia c #db825d", +"#Go c #db834d", +"#QD c #db835d", +"#lO c #db8561", +"#Sa c #db8857", +"#RO c #db8a56", +"#ee c #db8a62", +"#cg c #db8a64", +"#Pd c #db8b60", +"#p1 c #db8b64", +"#fN c #db8b6b", +"#ko c #db8e6c", +"#e. c #db9167", +"#sU c #db9271", +"#ni c #db9370", +".1t c #db9479", +"#v8 c #db9575", +"#se c #db986e", +".RC c #db9882", +"#LR c #db995a", +"#Bv c #db9970", +".WV c #db9976", +"#Ux c #db997e", +"#IZ c #db9a63", +"#f. c #db9b71", +"#FL c #db9c68", +"#vn c #dba265", +"#tB c #dba266", +"#za c #dba27b", +"auh c #dbab90", +"#xJ c #dbac84", +"att c #dbac91", +"#tE c #dbb198", +".ie c #dbcac7", +".pi c #dbcfc5", +"abs c #dbcfd4", +".xy c #dbd0d2", +"aFD c #dbd1d4", +"aFE c #dbd2d5", +".n7 c #dbd5d5", +".mn c #dbdcef", +"#Nr c #dc7b2c", +"#Do c #dc7b5f", +"#aN c #dc7d5d", +"#Mv c #dc8258", +"#QE c #dc835d", +"#sq c #dc836e", +"#xv c #dc866a", +"#xc c #dc8961", +"#C4 c #dc8b61", +"#fH c #dc8e5d", +"#kk c #dc8e66", +"#LK c #dc8e8d", +"#KH c #dc8f5d", +"#n3 c #dc8f5f", +"#Ex c #dc8f62", +"#iR c #dc8f75", +"#v6 c #dc916d", +"#ru c #dc9c76", +"#qQ c #dc9d73", +"#sd c #dc9f74", +"#Qk c #dca56c", +"#Nm c #dcac76", +"#FN c #dcae87", +"#I1 c #dcb184", +"#Ek c #dcb191", +"#zW c #dcb298", +"acw c #dcc1b5", +".0D c #dcd2e2", +".k0 c #dcd7c5", +"aAK c #dcd7da", +"azz c #dcd8db", +"aJq c #dd7467", +"#Tl c #dd761d", +"#Wa c #dd8014", +"#Gk c #dd815c", +"#Jm c #dd8161", +"#ue c #dd8163", +"#Jv c #dd8363", +"#yX c #dd876b", +"#Ty c #dd8857", +"#d9 c #dd8b60", +"#Bx c #dd8f63", +"#fK c #dd916f", +"#TK c #dd926a", +"#mF c #dd926c", +"#RL c #dd9740", +"#Kq c #dd9c60", +"#Kj c #dd9d9a", +".WX c #dd9f7b", +"#ik c #dd9f81", +"#pi c #dda06a", +".rQ c #ddbba4", +".pp c #ddcab4", +".r7 c #ddccaf", +"#1Y c #ddcec6", +"ayk c #ddd0dd", +".8I c #ddd4cd", +".mJ c #ddd5b1", +"auu c #ddd9dc", +"aJp c #de4c43", +"#Ti c #de7a1e", +"#h7 c #de7d54", +"#Gh c #de8063", +"#cp c #de8064", +"#aM c #de815b", +"#nk c #de886e", +"#NE c #de895c", +"#ug c #de8968", +"#tY c #de896e", +"#QB c #de8a62", +"#vX c #de8a6e", +"#vN c #de8a6f", +"#HK c #de8b60", +"#tT c #de8b63", +"#tS c #de8d63", +"#p0 c #de8d67", +"#tP c #de8e5a", +"#QG c #de8f63", +"#vC c #de9064", +"#TC c #de9065", +"#NY c #de916c", +"#fJ c #de9371", +"#fI c #de9471", +"#TL c #de9567", +"#cD c #de9569", +".6e c #de9978", +"#Qh c #de9a4d", +".4G c #de9a79", +".RD c #de9b85", +".RE c #de9c86", +"#UP c #de9d7c", +".UF c #dea57f", +".UG c #dea77c", +"#OT c #deaa72", +"amz c #dead98", +"#Ht c #deb289", +"aHV c #debac1", +".gK c #ded1cf", +"acX c #ded1d8", +".uT c #ded4b6", +".5z c #ded4e0", +"aB5 c #ded5da", +".uc c #dedfda", +"aJl c #df5454", +"#C9 c #df8262", +"#fD c #df845f", +"#h6 c #df8464", +"#H3 c #df855d", +"#UK c #df8631", +"#iK c #df8663", +"#BT c #df876c", +"#xk c #df876d", +"#vM c #df886e", +"#K7 c #df895f", +"#Md c #df8a63", +"#rn c #df8a67", +"#vF c #df8b63", +"#fx c #df8c6a", +"#ok c #df8d6c", +"#hl c #df8f74", +"#hk c #df9075", +"aFe c #df91b3", +"#B0 c #df926e", +"#hd c #df945f", +"#TE c #df956d", +"#YZ c #df982e", +"#Sk c #df9964", +"#iE c #df9974", +"#p6 c #df9c77", +".RT c #df9c7d", +".RF c #df9d87", +"#wV c #dfa15b", +"#r7 c #dfa57a", +".X2 c #dfa67c", +".Wt c #dfa77d", +"a#l c #dfb0a8", +"#Bk c #dfb59b", +"#r9 c #dfb6a2", +"#Fg c #dfc5cb", +"aG3 c #dfd5d8", +"aEi c #dfd6d9", +".k5 c #dfd8b5", +"#.t c #dfd8d6", +".pX c #dfdbe9", +"awB c #dfdcde", +"aek c #dfdce3", +"avL c #dfdde4", +".jt c #dfe0d7", +"#Jn c #e08466", +"#xi c #e0856c", +"#Dn c #e0886d", +"#Ar c #e0896d", +"#Ma c #e08a5b", +"#S# c #e08b59", +"#P# c #e08b61", +"#Jg c #e08d60", +"#sN c #e08d68", +"#BZ c #e08f6d", +"#dJ c #e09074", +".7V c #e09258", +"#mO c #e0926b", +"#io c #e09773", +"#kb c #e0977a", +"#FK c #e09c63", +".RJ c #e09c80", +".U7 c #e09d7a", +".22 c #e09e7e", +".WW c #e09f7c", +"#Qi c #e0a159", +"#vm c #e0a15b", +".1D c #e0a188", +".S7 c #e0a286", +".Ts c #e0a376", +".ZR c #e0a384", +"#qI c #e0a77b", +"#CQ c #e0b494", +".id c #e0cdc6", +"aMJ c #e0d1df", +".tt c #e0d2b3", +".D. c #e0d2c5", +".wE c #e0d9e0", +"aeN c #e0dde1", +"#1I c #e17a64", +"#Dp c #e18164", +"#xg c #e18464", +"#EW c #e18567", +"#K6 c #e18759", +"#gN c #e1876a", +"#RH c #e1887a", +"#Mb c #e1895a", +"#KL c #e18b5c", +"#JE c #e18b5d", +"#yT c #e18c70", +"#Pc c #e19165", +"#QH c #e19167", +".9D c #e1936d", +"#TJ c #e19371", +"#yD c #e19467", +"#xD c #e19571", +"#Kp c #e19657", +"#uj c #e19672", +"#JA c #e1986a", +"#rx c #e1997d", +"#qR c #e19c73", +".25 c #e19f7f", +".RG c #e19f89", +"#w4 c #e1a172", +"#yo c #e1a25c", +"#iw c #e1a281", +"#tA c #e1a35d", +"#CR c #e1b89e", +"ah1 c #e1bba7", +".yi c #e1c5a3", +".qK c #e1d1c2", +"aDt c #e1d6db", +".xj c #e1d7e8", +".o# c #e1d8b1", +".y3 c #e1d9e5", +".nc c #e1dcfa", +"azx c #e1dee1", +"apD c #e1dee4", +"ava c #e1dfe6", +"#RW c #e2741a", +"#BU c #e28164", +"#pz c #e2845f", +"#sL c #e28a6a", +"#An c #e28a6f", +"#kl c #e28b67", +"#K2 c #e28c61", +"#q7 c #e28c6c", +"#xm c #e28c71", +"#pZ c #e28f6c", +"#NP c #e2906f", +"#TH c #e29079", +"#oB c #e2916e", +"#vE c #e29267", +"#sP c #e2926a", +"#mG c #e2926d", +"#EZ c #e2926f", +".9C c #e2936d", +"#q9 c #e29376", +".9E c #e2946e", +"#x# c #e29568", +"#LQ c #e29754", +"#dR c #e29870", +"#z# c #e29c7e", +"#n2 c #e29e77", +".RK c #e29e82", +".4I c #e29f7e", +".RH c #e2a08a", +"#CN c #e2a45e", +"amu c #e2ae92", +"#pl c #e2b8a5", +".v7 c #e2cbaf", +".sa c #e2cdbe", +".n1 c #e2ceac", +".6Z c #e2d4e4", +"#.q c #e2d5cf", +".Cp c #e2d7d9", +"ael c #e2ddde", +"agR c #e2dfe6", +"arh c #e2e2e5", +".ju c #e2e3da", +"aLC c #e37d79", +"#q3 c #e38370", +"#Gj c #e38663", +"#YX c #e3866e", +"#R9 c #e38b57", +"#jJ c #e38b6a", +"#K5 c #e38c5e", +"#fF c #e38c61", +"#yY c #e38d71", +"#d1 c #e39072", +"#L9 c #e39463", +"#jV c #e3956d", +"#w. c #e39571", +"#n# c #e39573", +"#Du c #e39672", +"#lJ c #e39873", +"#rc c #e3997c", +"#g3 c #e39a75", +"#Y1 c #e39b41", +".RW c #e3a07e", +".RU c #e3a180", +"#zS c #e3a55f", +".X9 c #e3a687", +".Ws c #e3aa83", +"#l. c #e3ad9e", +"#wY c #e3b797", +"#vp c #e3b898", +"#El c #e3b99f", +"#qK c #e3baa6", +".u0 c #e3d19d", +".sb c #e3d1b1", +".zU c #e3d2ba", +".5w c #e3d4d0", +".n4 c #e3d6c8", +".qZ c #e3d6cb", +"aG2 c #e3dadd", +".8S c #e3dbc6", +".k4 c #e3ddb8", +"anH c #e3dee3", +"avF c #e3dfe2", +"ap7 c #e3dfe5", +"amm c #e3e2e8", +".ub c #e3e4e4", +"#Jt c #e4896e", +"#od c #e48c6b", +"#S. c #e48d59", +"#KM c #e48d5e", +"#Ji c #e48d61", +"#pS c #e48d74", +"#K0 c #e48e66", +"#yR c #e48e73", +"#Ds c #e4906f", +"#sn c #e49370", +"#BE c #e49377", +"#Sc c #e49668", +"#na c #e49673", +"#F1 c #e4986e", +"aI8 c #e498c4", +"#0o c #e49b38", +"aJj c #e49da2", +"#w# c #e49f6e", +".4H c #e4a080", +".RV c #e4a17f", +".24 c #e4a282", +".WU c #e4a381", +".UI c #e4a583", +"#Bh c #e4a660", +".X1 c #e4ab84", +"#Bj c #e4b898", +"#tD c #e4b998", +"#7d c #e4ba9f", +"#qL c #e4bfaa", +".n2 c #e4d3b6", +"a#P c #e4d8dc", +"aDq c #e4d9de", +"aka c #e4dae2", +"apo c #e4e0e6", +"awc c #e4e1e8", +"ayf c #e4e2e4", +"aqm c #e4e3e7", +"#yO c #e58e74", +"#NO c #e59074", +"#Ac c #e59277", +"#KJ c #e59363", +"#oE c #e5956e", +"#kj c #e59770", +"#aH c #e59972", +"#IY c #e59b60", +"#ps c #e59d75", +"#Hq c #e59e64", +"#OQ c #e59f54", +".4N c #e5a084", +".1s c #e5a386", +".Tr c #e5a577", +".UJ c #e5a584", +".UH c #e5a684", +".Wu c #e5a887", +".X8 c #e5a889", +".Ye c #e5a98a", +".7F c #e5b1a2", +"#zV c #e5ba9a", +"aEI c #e5d8de", +".re c #e5e1e7", +".tQ c #e5e6e8", +"#pU c #e68b73", +"#yL c #e68d74", +"#EX c #e68e6e", +"#vL c #e68e75", +"#NF c #e68f63", +"#yW c #e69074", +"#dW c #e6926f", +"#dP c #e69570", +"#Dt c #e69673", +"#dV c #e69772", +"#fz c #e69874", +"#Nj c #e69e56", +"#qO c #e6a46f", +".Tq c #e6a576", +".Wv c #e6a988", +"#sc c #e6ad81", +"#s. c #e6c2ad", +"aa0 c #e6c4b9", +".wd c #e6d5ab", +"aF0 c #e6d6dd", +"anB c #e6dae0", +".D1 c #e6dbde", +".D0 c #e6dcdb", +".n5 c #e6ddd5", +".h6 c #e6e0da", +".t1 c #e6e2df", +"aeJ c #e6e3e7", +".ue c #e6e4fd", +".y7 c #e6e5e1", +".mU c #e6eefa", +"#Dg c #e7846c", +"#Gg c #e7896e", +"#yK c #e78a69", +"#H1 c #e78c68", +"#xh c #e78c73", +"#fC c #e78d6b", +"#qZ c #e78f6a", +"#sM c #e7916e", +"#NM c #e79373", +"#fj c #e79476", +"aDX c #e794b7", +"#dI c #e7967b", +"#Bw c #e79a6d", +"#lL c #e79a73", +"#1K c #e79c3f", +"#iH c #e79c74", +"#n6 c #e79c75", +"#Gr c #e79d72", +"#pp c #e7a06d", +"#yz c #e7a085", +".23 c #e7a484", +"#pr c #e7a57c", +".ZK c #e7a98a", +".WR c #e7af8f", +".n9 c #e7dbc4", +"#3n c #e7ddd7", +".Co c #e7dddc", +".nU c #e7ded4", +".b8 c #e7e3ed", +".mR c #e7eef3", +".jE c #e7f1eb", +"#0m c #e8846d", +"#Ju c #e88d6f", +"#N0 c #e88f68", +"#d7 c #e88f6a", +"#BS c #e89075", +"#tU c #e8916b", +"#m9 c #e89379", +"#TI c #e8987c", +"#Ey c #e8996d", +"#iJ c #e89a72", +"#n. c #e89b79", +"#p7 c #e89c7c", +"#mX c #e89d7c", +".7Z c #e89f7f", +".Yi c #e8a086", +".29 c #e8a488", +".RI c #e8a489", +"#AB c #e8a68c", +".UK c #e8a988", +"#w3 c #e8aa75", +"#qH c #e8ab75", +".U5 c #e8ab85", +"#3b c #e8b47c", +"#n0 c #e8bba9", +".yl c #e8cba9", +".qu c #e8d5ba", +".5q c #e8d8e8", +".66 c #e8dcc5", +".2a c #e8dce6", +".8R c #e8ddca", +".32 c #e8dff5", +"alg c #e8e0e9", +".YZ c #e8e3fb", +"af3 c #e8e4e8", +".AI c #e8e4f5", +"aeM c #e8e5e9", +"awF c #e8e5ec", +"#HR c #e98b6f", +"#Pb c #e99068", +"#yM c #e99077", +"#Pa c #e99169", +"#Aq c #e99276", +"#K1 c #e99368", +"#qY c #e9936b", +"#fG c #e99768", +"#BG c #e9977b", +"#Sb c #e99869", +"#Jf c #e9996a", +"#rd c #e99d80", +"#rb c #e9a284", +".ZT c #e9a488", +".Ww c #e9ab8a", +".X7 c #e9ad8d", +"#pm c #e9c1ad", +"afF c #e9cfbf", +".n0 c #e9d4b0", +".po c #e9d4b9", +".zV c #e9d8be", +".qR c #e9dbae", +"aEH c #e9dbe1", +".2g c #e9dce3", +".sn c #e9ddd0", +"a.B c #e9dfe1", +"aFG c #e9e0e3", +".0x c #e9e0eb", +"##X c #e9e2f0", +"afB c #e9e7ee", +"#py c #ea8c65", +"#q2 c #ea8c76", +"#Jr c #ea8c77", +"#HX c #ea8d73", +"#oa c #ea8f67", +"#Ao c #ea9277", +"#gU c #ea9370", +"#d8 c #ea956c", +"#z8 c #ea9c6f", +"#sV c #ea9d80", +"#lK c #ea9e78", +"#ci c #ea9f78", +"#r. c #ea9f84", +"#1M c #eaa051", +"#vx c #eaa07f", +"#0q c #eaa14d", +".Yh c #eaa287", +".6l c #eaa589", +"#ft c #eaa780", +"#yx c #eaaa87", +".Z2 c #eaaa8e", +"#z2 c #eaad8e", +"#yv c #eaaf7c", +".WQ c #eaaf90", +"#z1 c #eab087", +"amy c #eab69a", +".wc c #ead6ab", +".tz c #ead6b3", +"ai8 c #ead9e4", +"ahY c #eadae3", +".C9 c #eadccf", +".0u c #eaddc8", +".YW c #eadfd9", +"#48 c #eadfdb", +".zf c #eadfe1", +"aEj c #eae2e5", +".tv c #eae3d2", +"QtS c #eae3f8", +"#De c #eb8e76", +"#d5 c #eb9070", +"#Js c #eb9076", +"#JC c #eb9362", +"#aK c #eb9367", +"#xl c #eb947a", +"#Sf c #eb957e", +"#Mc c #eb966e", +"#Pf c #eb9a74", +"#oC c #eb9a75", +"#hc c #eb9d6a", +"#lD c #eb9d81", +"#Sj c #eba372", +"#kg c #eba37d", +".4J c #eba787", +".U8 c #eba985", +".26 c #eba989", +".1k c #ebab8b", +".1r c #ebad8f", +".X3 c #ebaf8f", +".Yc c #ebb192", +".WJ c #ebb294", +"#mA c #ebbaa9", +"#2q c #ebc1ab", +"ai9 c #ebe0e6", +".He c #ebe1e0", +"abU c #ebe1ea", +".rT c #ebe5cf", +".h8 c #ebe5df", +".sz c #ebe6e7", +"au9 c #ebe8eb", +".sq c #ebf1fc", +".jG c #ebfcff", +"#Ab c #ec8f6e", +"#xj c #ec9279", +"#Jz c #ec936a", +"#pW c #ec9577", +"#NN c #ec977a", +"#C3 c #ec9d71", +"#HI c #ec9e72", +"#ol c #ec9f7f", +"#w7 c #eca285", +"#iq c #ecab89", +".Th c #ecac88", +".S8 c #ecad92", +".WH c #ecb395", +"abu c #ecc8bd", +".mz c #ecd9af", +".8Q c #ecddd3", +".r9 c #ece0d2", +"afC c #ece3e6", +".67 c #ece4c7", +".yU c #ece7ff", +"ans c #ece8ed", +"axw c #ece9ec", +".Cd c #ece9fc", +"#Jo c #ed9075", +"#q6 c #ed9574", +"#Ap c #ed957a", +"#rm c #ed9675", +"aLB c #ed9988", +"#pR c #ed9b80", +"#pJ c #ed9d7d", +".7U c #ed9f79", +"#Pr c #eda06e", +"#QR c #eda06f", +"#iI c #eda078", +"#mC c #eda27d", +"aMx c #eda890", +".Tb c #edad89", +"#z3 c #edad94", +".Wx c #edb08f", +".UW c #edb192", +".WS c #edb28d", +".Y. c #edb293", +".8. c #edb99f", +".pf c #eddccb", +".mA c #edddb7", +"QtB c #eddee7", +"#8Z c #ede1df", +"anz c #ede1e6", +"#6N c #ede2df", +".mH c #ede3cf", +".vK c #ede3e2", +".mI c #ede5bf", +"aml c #ede6f0", +"aii c #ede9ed", +"aw8 c #edebf2", +".xo c #edede2", +".vB c #edeede", +"#HU c #ee8f7a", +"#co c #ee9071", +"#Ag c #ee997e", +"#Ae c #ee9a7f", +"#Sg c #ee9a81", +"#Pq c #eea070", +"#nb c #eea07c", +"#Je c #eea171", +"#pK c #eea284", +"#lI c #eea47f", +"#w5 c #eeaa85", +".U6 c #eead89", +".ZS c #eead90", +".Te c #eeae8a", +".UR c #eeb698", +"aen c #eedcd3", +".2# c #eee1df", +"anA c #eee2e8", +"#.s c #eee6dc", +"avK c #eeebf2", +".ud c #eeedff", +".lc c #eefaff", +"#BD c #ef9271", +"#sK c #ef9576", +"#H6 c #ef9763", +"#yQ c #ef997e", +"#BI c #ef9a7f", +"#mU c #ef9c78", +"#oD c #ef9f79", +"#KI c #efa06f", +"#xG c #efa289", +".UL c #efaf8e", +".1n c #efaf8f", +".U0 c #efaf92", +".X6 c #efb293", +".X4 c #efb393", +".WI c #efb798", +"a.y c #efc8b7", +".xx c #efe5e4", +".b7 c #efe8f0", +".sD c #efeaeb", +"aeL c #efebf0", +"awb c #efecf3", +".q4 c #eff1fa", +"#sJ c #f09477", +"#vK c #f0977d", +"#yP c #f0997f", +"#lS c #f09b7f", +"#ou c #f0a085", +"#F2 c #f0a279", +"#lm c #f0a87f", +"#lt c #f0a886", +"#lB c #f0aa8c", +".Tf c #f0b08c", +".Yf c #f0b193", +".WC c #f0b799", +".UU c #f0b89a", +".wa c #f0dbb4", +"#7f c #f0e1db", +".3Y c #f0e1e1", +"#99 c #f0e5e7", +".aB c #f0e9f2", +".rh c #f0ebf1", +".rg c #f0ecf2", +"#yN c #f1997f", +"#d0 c #f19b7d", +"#fh c #f19c7e", +"aLA c #f19c85", +"#d2 c #f1a083", +"#QM c #f1a27d", +"#QS c #f1a472", +"#g4 c #f1a480", +"#ki c #f1a57e", +"#kh c #f1a780", +"#n5 c #f1aa83", +".Tk c #f1ad89", +".Tj c #f1ad8a", +".Yg c #f1ad91", +"#j5 c #f1af8e", +".1l c #f1b191", +".1m c #f1b192", +"#ir c #f1b393", +".ZL c #f1b495", +".Yd c #f1b697", +".UT c #f1b99b", +"#Ff c #f1d5da", +".5n c #f1decd", +".60 c #f1e2f8", +"agT c #f1e6e7", +".oA c #f1ecff", +".rf c #f1edf3", +"af1 c #f1eef2", +".AH c #f1eff5", +"#H0 c #f29674", +"#HY c #f2967a", +"#BR c #f2987d", +"#dN c #f29a77", +"#fB c #f29b7a", +"#pV c #f29b7d", +"#fg c #f29b7e", +"#yS c #f29d81", +"#F3 c #f2a179", +"#BF c #f2a185", +"aI6 c #f2a5c0", +"#xH c #f2a786", +"#jW c #f2aa84", +"#ra c #f2ab91", +"#iD c #f2ae89", +".1q c #f2b292", +".WP c #f2b295", +".S9 c #f2b498", +".ZO c #f2b596", +".Y# c #f2b798", +".WD c #f2b99b", +".WE c #f2ba9b", +".US c #f2ba9c", +"amx c #f2bea2", +".U3 c #f2c09e", +"aa1 c #f2c3be", +"aaf c #f2dcda", +".x1 c #f2dfb8", +"adm c #f2e3ec", +".3T c #f2e3f0", +".gH c #f2e4e2", +"#8v c #f2e6e6", +".0w c #f2e7e7", +"adn c #f2eaf6", +".vA c #f2edd5", +".y6 c #f2eee4", +"asu c #f2eef4", +".pW c #f2eefb", +"axx c #f2eff6", +".pD c #f2f0e6", +"#HT c #f3947d", +"#Df c #f3967e", +"#H8 c #f39c6c", +"#oK c #f3a486", +"#fq c #f3aa82", +".Tl c #f3af8a", +".Ti c #f3af8d", +".28 c #f3b191", +"#mT c #f3b296", +".Tc c #f3b38f", +"#yw c #f3b68a", +".Wy c #f3b695", +".ZM c #f3b697", +".X5 c #f3b797", +"#g0 c #f3ba92", +"amv c #f3bfa3", +".3Q c #f3e2ce", +"#5A c #f3e3da", +".if c #f3e3e4", +".n3 c #f3e4ce", +".2. c #f3e4d6", +"aag c #f3e5e9", +".b5 c #f3e7eb", +"aDs c #f3e8ed", +".xb c #f3ecff", +".vz c #f3edda", +"ahe c #f3eff3", +".pc c #f3f2e8", +"alh c #f3f2f6", +".og c #f3f9f6", +"#rj c #f4997c", +"#Al c #f49a7f", +"#so c #f4a083", +"#Af c #f4a084", +"#Ad c #f4a185", +"#HJ c #f4a479", +"#Pl c #f4a480", +"#Po c #f4a579", +"#kf c #f4ad88", +".Ta c #f4b48f", +".Tg c #f4b490", +".1o c #f4b495", +".T. c #f4b69a", +".Ya c #f4b99a", +"abR c #f4d3c3", +".ww c #f4d5b0", +"alx c #f4d9d2", +"#3Q c #f4e2d8", +"abT c #f4e2e7", +".3S c #f4e3e5", +".AQ c #f4e9e8", +".kY c #f4eacc", +"aB1 c #f4ebf0", +".xl c #f4ede7", +".h9 c #f4efe8", +".sA c #f4f0f0", +"af0 c #f4f0f4", +"aoA c #f4f0f5", +"aoz c #f4f0f6", +"av# c #f4f1f8", +".vd c #f4f3ef", +".la c #f4f9ff", +".lb c #f4fdff", +"#pY c #f5a17f", +"#nj c #f5a386", +"#Pn c #f5a67d", +"#fv c #f5a684", +"#nd c #f5a780", +"#QQ c #f5a879", +"#r# c #f5ad92", +".4M c #f5b296", +".UM c #f5b594", +"#j6 c #f5b797", +".T# c #f5b79b", +".ZQ c #f5b899", +".tb c #f5d2c6", +"agW c #f5d5c0", +".wv c #f5d6b2", +"#8Y c #f5ddd3", +"akr c #f5ded8", +"aLM c #f5e0f0", +".65 c #f5e6da", +"any c #f5e9ee", +".YV c #f5eadc", +"#.r c #f5eae0", +"QtW c #f5eaef", +"afD c #f5ebea", +".b6 c #f5ebf1", +".6X c #f5ecdd", +".vy c #f5efe4", +".xn c #f5f1de", +".y5 c #f5f1eb", +"ahf c #f5f1f5", +"akb c #f5f3f5", +"awE c #f5f3fa", +".jF c #f5ffff", +"#Am c #f69d82", +"#Gq c #f69f6d", +"#pX c #f6a080", +"#Pp c #f6a87a", +".7T c #f6a882", +"#v9 c #f6a88e", +"#Sd c #f6a97e", +"#mY c #f6af8f", +".ZN c #f6b99a", +".U4 c #f6bb95", +".WG c #f6bd9e", +".UQ c #f6bea0", +"#j0 c #f6c1a1", +".xY c #f6e2c1", +"a.A c #f6e4e1", +".r8 c #f6e7d1", +".ze c #f6ebeb", +"##V c #f6ecee", +"QtX c #f6eff9", +"aAL c #f6f0f3", +".pG c #f6f1ef", +"aeK c #f6f2f6", +"arM c #f6f2f8", +".oi c #f6f3fe", +"apC c #f6f5f9", +".q5 c #f6fbff", +".mT c #f6ffff", +"#HS c #f7997f", +"#HW c #f79a81", +"#HZ c #f79b7c", +"#cn c #f79c79", +"#fm c #f79e7b", +"#Pm c #f7a781", +"#QN c #f7a982", +"#nc c #f7a984", +"#Si c #f7ac81", +"#om c #f7ad8e", +"#pL c #f7ae92", +"#w6 c #f7af91", +"#AA c #f7af9a", +".6h c #f7b291", +".6f c #f7b292", +".UZ c #f7b699", +".Td c #f7b793", +"ajq c #f7dbd0", +".wq c #f7e3c1", +".yd c #f7e4c4", +".n8 c #f7e8e4", +".3Z c #f7eaee", +"agS c #f7eaf0", +".Xm c #f7ecec", +".qx c #f7efdc", +".tP c #f7f0e5", +"aBI c #f7f2f4", +".t2 c #f7f3f0", +"app c #f7f3f9", +"aw5 c #f7f4f7", +"alz c #f7f5f9", +".mP c #f7fefe", +"#HV c #f89985", +"#Jq c #f89a84", +"#BP c #f89c82", +"#d4 c #f8a082", +"#BJ c #f8a287", +"#QI c #f8a883", +"#g6 c #f8ab86", +"#Se c #f8ac81", +"#z. c #f8ae96", +"#RM c #f8af60", +"#aJ c #f8af87", +"#m5 c #f8b092", +".6g c #f8b392", +".Tm c #f8b48e", +".Tp c #f8b58b", +".Wz c #f8ba99", +"#lp c #f8c4a4", +".3R c #f8e7dc", +".ts c #f8e8c2", +".kW c #f8e9bd", +"alm c #f8eae3", +".5y c #f8ebf2", +".FF c #f8eded", +"aDr c #f8edf2", +".vc c #f8eedd", +".nT c #f8f0e6", +".gR c #f8f1f0", +".t4 c #f8f3f0", +".sC c #f8f3f4", +"aAM c #f8f3f6", +".kL c #f8f3fa", +"avI c #f8f4f7", +".AF c #f8f4fa", +"amF c #f8f5f9", +"ap8 c #f8f5fa", +".oh c #f8f7fe", +"aqn c #f8f8fb", +"amp c #f8fbf6", +"amD c #f8fefe", +"amC c #f8ffff", +"#fi c #f9a688", +"#fO c #f9a988", +"#pQ c #f9aa8f", +"#lu c #f9b494", +"#pM c #f9b499", +".WO c #f9b69a", +"#fs c #f9b991", +".UN c #f9b998", +"#m1 c #f9b99d", +".UX c #f9bb9d", +".WT c #f9bc98", +"#il c #f9bda0", +"amw c #f9c5a9", +"afZ c #f9dcce", +".5p c #f9e7eb", +".fg c #f9e8ef", +".aA c #f9eef4", +".td c #f9efd9", +".dD c #f9eff5", +"aB4 c #f9f1f5", +"ahZ c #f9f2ed", +".vo c #f9f2ff", +"aAN c #f9f4f7", +"azy c #f9f5f8", +"af2 c #f9f5f9", +"avJ c #f9f6fd", +"alj c #f9fcf7", +"amE c #f9fcf8", +"amo c #f9fefb", +".mQ c #f9ffff", +"#JD c #fa9f6d", +"#sp c #faa38a", +"#cl c #faa67d", +"#pI c #faa686", +"#Pi c #faa889", +"#in c #faaf89", +"#pP c #fab093", +"#iy c #fab395", +"#V5 c #fab44d", +".To c #fab68d", +"#yy c #fab69b", +".Tn c #fab78f", +".WA c #fabd9c", +".Yb c #fabfa1", +"#it c #fac0a1", +".UP c #fac2a4", +"#5z c #fadac3", +"abS c #fae0dc", +".5x c #faecec", +".0v c #faede0", +".vp c #faf3ff", +"ant c #faf6fc", +".AG c #faf7f9", +"anJ c #faf7fd", +"aoM c #faf9fc", +"aoN c #fafafd", +"alB c #fafcfb", +"amn c #fafeff", +".of c #fafffc", +"#BO c #fb9e84", +"#Jp c #fb9e85", +"#H7 c #fb9f6b", +"#oe c #fba487", +"#of c #fba58c", +"#fA c #fba685", +"#Ah c #fba78c", +"#BH c #fba88d", +".7R c #fbac86", +"#Sh c #fbac88", +"#QP c #fbad81", +"#kc c #fbaf92", +".6k c #fbb89c", +".27 c #fbb999", +".UO c #fbbb9a", +".WL c #fbbd9f", +".WB c #fbbe9d", +".ZP c #fbbe9f", +".WK c #fbbfa0", +"#iu c #fbc19f", +".WF c #fbc2a3", +".UV c #fbc3a5", +"ahc c #fbdbca", +"adk c #fbddd0", +".yk c #fbdebc", +".uB c #fbe6d9", +"anx c #fbeef4", +"aem c #fbf2f0", +".xk c #fbf3f8", +".ia c #fbf6ef", +".t3 c #fbf6f4", +"aq4 c #fbf7fd", +"aw7 c #fbf8fa", +"ayh c #fbf9fb", +".jh c #fbfdff", +".mS c #fbffff", +"#BQ c #fca187", +"#rl c #fca384", +"#dX c #fca484", +"#fw c #fcaa88", +"#Ez c #fcab81", +"#QO c #fcae85", +"#1L c #fcb258", +"#gX c #fcb48c", +"#dS c #fcb58c", +"#os c #fcb597", +"#mS c #fcba9d", +"#op c #fcba9e", +"#jX c #fcbb97", +"#g1 c #fcbf98", +"#j7 c #fcc0a1", +".tA c #fcebb7", +".x2 c #fcecc5", +"QtV c #fcecee", +".so c #fcf3e7", +".nS c #fcf5ea", +"akt c #fcf5f2", +"aC6 c #fcf5f7", +".pu c #fcf5fc", +".nQ c #fcf6f2", +".xm c #fcf7e8", +"awC c #fcf8fb", +"aih c #fcf8fc", +".pV c #fcf8ff", +"avG c #fcf9fb", +"awD c #fcf9fc", +"akv c #fcf9fd", +"ayi c #fcfafc", +"aj# c #fcfbf2", +"anI c #fcfcff", +"akc c #fcfef9", +"ali c #fcffff", +"#rk c #fda385", +"#QK c #fdac8d", +"#Tb c #fdb660", +"#Xw c #fdb74e", +".4L c #fdb999", +".WM c #fdbb9e", +".UY c #fdbc9f", +".1p c #fdbd9e", +"#lz c #fdbe9d", +"#k. c #fdc09f", +"#is c #fdc2a3", +"aie c #fdddcc", +"a.z c #fde0d7", +"adl c #fde5e4", +".tc c #fde8d6", +".19 c #fdeed8", +"afE c #fdeee6", +".az c #fdeff2", +".s. c #fdf5f3", +"aB3 c #fdf5f9", +".mD c #fdf6e5", +".tx c #fdf8ef", +".mq c #fdf9ed", +"aw# c #fdf9fc", +"ajt c #fdf9fd", +"anv c #fdf9ff", +"aw4 c #fdfafc", +"alk c #fdfbf4", +"ayj c #fdfbfd", +"aoO c #fdfbff", +"alA c #fdffff", +"#d3 c #feaa8d", +"#Pj c #feac8e", +"#UA c #feb758", +"#on c #feb89b", +"#ke c #feb995", +"#or c #feb99a", +".4K c #feba9a", +"#mZ c #feba9c", +"#iC c #febb96", +"#ly c #fec09f", +"#lw c #fec0a2", +"#iv c #fec2a0", +".yf c #fee2c0", +"acY c #fee5de", +".wb c #fee9c0", +".yb c #feebd0", +".tB c #feedba", +".k3 c #fef5e1", +".tw c #fef8ec", +".i# c #fef8f1", +".y4 c #fef9fa", +".sB c #fefafa", +"aw6 c #fefafd", +"anu c #fefaff", +"av. c #fefbfd", +"ayg c #fefcfe", +"awa c #fefcff", +".nP c #fefeff", +"#BN c #ffa288", +"#Ak c #ffa68b", +"#Gp c #ffa872", +"#BL c #ffa88e", +"#BM c #ffa88f", +"#gT c #ffaa88", +"#dO c #ffab87", +"#EY c #ffad8c", +"#Aj c #ffad92", +"#lF c #ffad93", +"#fn c #ffae8b", +"#QJ c #ffae8d", +"#Pk c #ffaf8c", +"#gS c #ffaf8d", +"#lE c #ffaf95", +"#lr c #ffb08c", +"#Pg c #ffb08d", +"#Ph c #ffb08f", +"#BK c #ffb096", +"#QL c #ffb395", +".7S c #ffb48e", +"#iA c #ffb499", +"#j1 c #ffb58f", +"#Ai c #ffb59a", +"#aI c #ffb68e", +"#lH c #ffb693", +"#iz c #ffb699", +"#dU c #ffb790", +"#im c #ffb892", +"#mP c #ffb994", +"#g5 c #ffb995", +"#0p c #ffba5c", +"#pO c #ffba9c", +".6j c #ffbb9b", +"#pN c #ffbb9c", +"#ot c #ffbb9e", +"#kd c #ffbba0", +"#ck c #ffbc94", +"#lG c #ffbc99", +".WN c #ffbca0", +"#iB c #ffbca1", +"#Y0 c #ffbd58", +".6i c #ffbd9d", +"#gZ c #ffbe94", +"#cj c #ffbe96", +"#lv c #ffbe9f", +"#m0 c #ffbea1", +"#fr c #ffbf96", +"#lq c #ffbf9a", +"#mQ c #ffbf9d", +"#lA c #ffbf9f", +"#oq c #ffc0a1", +"#dT c #ffc197", +"#mR c #ffc1a2", +"#m4 c #ffc2a3", +"#gY c #ffc39a", +"#j2 c #ffc39e", +"#m3 c #ffc3a3", +"#k# c #ffc4a4", +".U1 c #ffc4a5", +"#oo c #ffc4a7", +"#m2 c #ffc5a5", +"#j9 c #ffc6a4", +"#lo c #ffc7a4", +"#lx c #ffc7aa", +"#jY c #ffc8a6", +"#j8 c #ffc9aa", +"#ln c #ffcaa3", +".U2 c #ffcaaa", +"#jZ c #ffcdac", +"aI7 c #ffd2f3", +".6y c #ffdbc4", +"amr c #ffdcc0", +".uA c #ffddd8", +"#8X c #ffdfcd", +"#Wh c #ffdfdd", +"aae c #ffe0d6", +"#7e c #ffe6d5", +"abt c #ffe7de", +"aHH c #ffe7fb", +"a#Q c #ffe8db", +"ahd c #ffebde", +"acZ c #ffebe1", +".wr c #ffecc8", +".rR c #ffecd4", +"amB c #ffece7", +".tr c #ffedc3", +"agV c #ffeddf", +".x3 c #ffeecb", +".yc c #ffeed1", +"aif c #ffeee1", +".qP c #ffefd2", +".ic c #ffefe5", +".ay c #ffeff0", +"QtU c #fff0ef", +"ake c #fff1e7", +".5o c #fff2e9", +"ajb c #fff3e3", +".wD c #fff3f2", +"aly c #fff3f3", +".kV c #fff4c2", +".pw c #fff4da", +".pq c #fff4e4", +"QtT c #fff4f2", +".nR c #fff5eb", +"ajs c #fff5ec", +".pr c #fff5ed", +".ps c #fff5f4", +".mB c #fff6d7", +".pe c #fff6e8", +".qO c #fff6eb", +".pt c #fff6fa", +"aoB c #fff6fc", +".x4 c #fff7db", +".rS c #fff7df", +"ah0 c #fff7e5", +"all c #fff7ef", +".gJ c #fff7f6", +".mC c #fff8e1", +"ajr c #fff8ef", +".q0 c #fff8f0", +".mG c #fff8f6", +".h5 c #fff8f7", +".mp c #fff8f8", +".tO c #fff9e8", +".ms c #fff9ee", +".pv c #fff9f1", +"aks c #fff9f6", +".gI c #fff9f7", +"aBH c #fff9fb", +".qM c #fff9fd", +"anw c #fff9ff", +".ya c #fffae2", +".qv c #fffae3", +"aja c #fffaed", +".q1 c #fffaf4", +".q2 c #fffaf5", +".qL c #fffaf9", +".pI c #fffafd", +"aB2 c #fffafe", +".kO c #fffbef", +"akd c #fffbf0", +".gQ c #fffbf3", +".ib c #fffbf5", +".gM c #fffbf9", +".s# c #fffbfb", +".pH c #fffbfc", +"aBG c #fffbfd", +".qN c #fffbff", +".qw c #fffce8", +".pb c #fffcee", +".mE c #fffcf0", +".sp c #fffcf6", +"avH c #fffcfe", +".mo c #fffcff", +".kN c #fffdf0", +".gP c #fffdf1", +".pE c #fffdf5", +"aig c #fffdff", +".mr c #fffef3", +".pd c #fffef4", +"amq c #fffef8", +".pF c #fffef9", +"aj. c #fffefc", +".ji c #fffeff", +".kM c #fffff4", +".mF c #fffff7", +"agU c #fffff8", +"aku c #fffffa", +".q3 c #fffffb", +".i. c #fffffc", +".l# c #ffffff", +"Qt.Qt#QtaQtbQtcQtdQteQtfQtgQthQtiQtjQtkQtlQtmQtnQtoQtpQtqQtrQtrQtsQttQtuQtvQtwQtxQtyQtzQtAQtBQtCQtDQtEQtFQtGQtHQtIQtJQtKQtLQtMQtNQtOQtPQtQQtRQtSQtTQtUQtVQtWQtXQtYQtZQt0Qt1Qt2Qt3Qt4Qt5Qt6Qt7Qt5Qt8Qt9.#..##.#a.#b.#c.#d.#e.#f.#g.#h.#i.#j.#k.#l.#m.#n.#o.#p.#q.#r.#s.#t.#u.#v.#w.#x.#y.#z.#A.#A.#B.#C.#D.#E.#E.#D.#C.#B.#D.#D.#F.#F.#F.#G.#H.#I.#J.#K.#L.#M.#N.#O.#P.#Q.#R.#S.#S.#T.#U.#V.#V.#W", +".#XQt#.#Y.#ZQtc.#0.#1Qtf.#2.#3.#4.#5Qtk.#6.#7.#8QtoQtp.#9QtrQtrQtsQtt.a..a#.aa.ab.ac.ad.ae.af.ag.ah.ai.aj.ak.al.am.an.ao.ap.aq.ar.as.at.au.av.aw.ax.ay.az.aA.aB.aC.aD.aE.aF.aG.aH.aI.aJ.aK.aL.aM.aN.aO.aP.aQ.aR.aS.aT.aU.aV.aW.aX.aY.aZ.a0.a1.a2.a3.a4.#o.#p.a5.#r.#s.#t.#u.#u.a6.a7.#x.#y.#z.a8.#D.#G.a9.#F.#F.a9.#G.#D.#E.#D.#F.#F.#F.#G.#E.#I.b..b#.ba.a5.bb.bc.bd.be.bf.bg.bh.bi.#P.bj.bk.bl", +".bmQt#.bn.boQtc.bp.bq.br.bs.bt.bu.bv.bw.bx.by.bz.bA.bB.#9.bC.bCQts.bD.bE.bF.bG.bH.bI.bJ.bK.bL.bM.bN.bO.bP.bQ.bR.bS.bT.bU.bV.bW.bX.bY.bZ.b0.b1.b2.b3.b4.b5.b6.b7.b8.b9.c..c#.ca.c#.cb.cc.cd.ce.cf.cg.ch.ci.cj.ck.cl.cm.cn.co.cp.cq.cr.cs.ct.cu.cv.cw.cx.cy.cz.cA.cB.cC.#v.cD.cE.cF.cG.cH.cI.#H.#y.cH.#I.a9.cJ.cJ.a9.#I.cH.#I.#E.#D.#F.#F.#G.#E.#I.b..cK.cL.cM.cN.cO.#U.bi.cP.cQ.cR.cS.cT.cU.cV.cW", +".cXQt#.cY.cZ.c0.c1.bq.c2.c3.c4.c5.c6.bw.c7.c8.c9.d..bB.d#.da.da.db.bD.dc.dd.de.df.dg.dh.di.dj.dk.dl.dm.dn.do.dp.dq.dr.ds.dt.du.dv.dw.dx.dy.dz.dA.dB.dC.dD.dE.dF.dG.dH.dI.dJ.dK.dL.dM.dN.dO.dP.dQ.dR.dS.dT.dU.dV.dW.dX.dY.dZ.d0.d1.d2.d3.d4.d5.d6.d7.d8.d9.e..e#.ea.eb.#l.ec.ec.ed.ed.ee.ef.ef.eg.eh.#I.#E.#D.#D.#E.#I.eh.eh.#I.#D.a9.#F.#D.#E.#I.b#.cK.cK.ei.ej.ek.el.bd.em.en.#S.eo.#P.ep.eq.er", +".esQt#.et.eu.c0.ev.ew.ex.c9.ey.ez.eA.eB.eB.eC.eD.eE.eF.d#.eG.eG.db.eH.eI.eJ.eK.ab.eL.eM.eN.eO.eP.eQ.eR.eS.eT.eU.eV.eW.eX.eY.eZ.e0.e1.e2.e3.e4.e5.e6.e7.e8.e9.f..f#.fa.dB.fb.fc.fd.fe.ff.fg.fh.fi.fj.fk.fl.fm.fn.fo.fp.fq.fr.fs.ft.fu.fv.fw.fx.cO.fy.fz.fA.fB.fC.fD.fE.eb.fF.fF.fF.fG.fG.fH.fH.fH.#I.#I.eh.fI.fI.eh.#I.#I.fI.eh.#I.#D.a9.#D.#D.#H.fJ.fK.fL.#M.cN.fM.fN.fO.fP.fQ.fR.fS.fT.#V.fU.bk", +".fVQt#.fW.fX.c0.fY.fZ.f0.f1.f2.f3.f4.eB.f5.f6.f7.f8.eF.f9.g..g..g#.eH.ga.gb.gc.gd.ge.gf.gg.gh.gi.gj.gk.gl.gm.gn.go.gp.gq.gr.gs.gt.gu.gv.gw.gx.gy.gz.gA.gB.gC.gD.gE.gF.gG.gH.gI.gJ.gK.gL.gM.gN.gO.gP.gQ.gR.gS.gT.gU.gV.gW.gX.gY.gZ.g0.g1.g2.g3.b#.g4.g5.g6.g7.g8.g9.h..h#.ha.ha.ha.ha.ha.ha.ha.ha.#I.eh.hb.hc.hc.hb.eh.#I.hb.fI.#I.#D.#G.#D.#D.#E.fJ.#K.hd.#M.he.fM.hf.hg.hh.hi.hj.hk.hl.hm.hn.fU", +".hoQt#.hp.hq.hr.hs.ht.hu.hv.hw.hx.hy.eB.hz.hA.hB.hC.hD.f9.g..hE.g#.hF.hGQtvQtw.hH.ge.eM.hI.hJ.hK.hL.gk.dn.hM.hN.hO.hP.eX.hQ.hR.hS.hT.hU.hV.hW.hX.hY.hZ.h0.h1.h2.h3.h4.h5.h6.h7.h8.h9.i..i#.ia.ib.ic.id.ie.if.ig.ih.ii.ij.ik.il.im.in.io.ip.iq.ir.is.g4.it.iu.iv.iw.ix.fE.iy.iy.iz.iz.iz.iz.iz.iz.hb.hb.hb.hb.hb.hb.hb.hb.hc.hb.cH.#E.#D.#D.#D.#E.b#.#K.ba.cM.iA.iB.iC.iD.iE.iF.iG.iH.iI.iJ.#V.iK", +".iLQt#.iM.iN.hr.iO.ht.hu.iP.hv.iQ.iR.eB.iS.iT.iU.hC.hD.f9.hE.hE.iV.iW.hG.iX.iY.iZ.eL.i0.gg.i1.i2.i3.i4.i5.i6.eU.i7.i8.i9.j..j#.ja.jb.jc.jd.je.jf.jg.jh.ji.jj.jk.jl.jm.jn.jo.jp.jq.jr.js.jt.ju.jv.jw.jx.jy.jz.jA.jB.jC.jD.jE.jF.jG.jH.jIQt1.jJ.jK.jL.jM.jN.jO.jP.iw.jQ.jR.jS.jS.jS.jS.jT.jU.iz.iz.jV.hc.hb.eh.eh.hb.hc.jV.hc.hb.eh.#E.#D.#D.#D.#D.jW.fK.jX.jY.jZ.iB.iC.j0.j1.j2.j3.iI.bc.j4.fU.bl", +".j5.j6.j7.j8.j6.j9.k..k#.ka.kb.kc.kd.ke.kf.kg.kh.ki.kj.kk.kl.km.kl.kn.ko.kp.kq.kr.ks.kt.ku.kv.kw.kx.ky.kz.kA.kB.kB.kC.kD.kE.kF.kG.kH.kI.kJ.kK.kL.kM.kN.kO.kP.kQ.kR.kS.kT.kU.kV.kW.kX.kY.kZ.k0.k1.k2.k3.k4.k5.k6.k7.k8.k9.l..l#.la.lb.lc.ld.le.lf.lg.lh.li.lj.lk.ll.lm.ln.lo.lo.lo.lo.lo.lo.lo.lo.lp.lq.lq.lr.lr.ls.ls.lt.lu.lv.lw.lx.ly.lu.lz.lA.lp.lt.lB.lt.ls.lq.ls.lt.hc.lC.hb.hb.lD.lE.lF.lG", +".lH.lI.lJ.lK.lL.lM.lN.lO.lP.lQ.lR.lS.lT.lU.lV.lW.lX.lY.lZ.l0.l1.l2.l3.l4.l5.l6.l7.l8.l9.m..m#.ma.kx.mb.mc.md.me.mf.mg.mh.mi.mj.mk.ml.mm.mn.mo.mp.mq.mr.ms.mt.mu.mv.mw.mx.my.mz.mA.mB.mC.mD.mE.mF.mG.mH.mI.mJ.mK.mL.mM.mN.mO.mP.mQ.mR.mS.mT.mU.mV.mW.mX.mY.mZ.m0.m1.m2.m3.m4.m4.m4.m4.m4.m4.m4.m4.lp.lq.lq.lr.lr.ls.ls.lt.m5.lu.lv.lv.m6.m5.m7.m8.lq.ls.ls.m5.m6.m9.m9.lq.hc.lC.hb.hb.hc.lE.n..lG", +".n#.na.nb.nc.nd.ne.nf.ng.nh.ni.nj.nk.nl.nm.nn.no.np.nq.nr.ns.nt.nu.nv.nw.nx.ny.nz.nA.nB.m..nC.nD.nE.nF.nG.nH.nI.nJ.no.nK.nL.nM.nN.nO.nP.l#.nQ.nR.nS.nT.nU.nV.nW.nX.nY.nZ.n0.n1.n2.n3.n4.n5.n6.n7.n8.n9.o..o#.oa.ob.oc.od.oe.of.og.l#.l#.oh.ji.oi.oj.ok.ol.om.on.oo.op.oq.fH.fH.fH.fH.fH.fH.fH.fH.lp.lq.lq.lr.lr.ls.ls.lt.lz.or.m5.os.m5.lz.lA.ot.lt.ou.lr.lr.lr.lr.lp.ls.hc.lC.lC.lC.ov.lF.lG.ow", +".ox.oy.oz.oA.oB.oC.oD.oE.oF.oG.oH.oI.oJ.oK.oL.oM.oN.oO.oP.oQ.oR.oS.oT.oU.oV.oW.e3.oX.oY.oZ.o0.o1.o2.o3.o4.o5.o6.o7.o8.o9.p..p#.pa.pb.pc.pd.pe.pf.pg.ph.pi.pj.pk.nX.pl.pm.pn.po.pp.pq.pr.ps.pt.pu.pv.pw.px.py.pz.pA.pB.pB.pC.pD.pE.pF.pG.pH.pI.mo.mT.pJ.pK.pL.pM.pN.aU.pO.ef.ef.ef.ef.ef.ef.ef.ef.lp.lq.lq.lr.lr.ls.ls.lt.m7.m7.pP.pP.pP.m7.lA.lA.pQ.lt.lr.lr.lB.lB.lt.ls.hc.hc.lD.hc.lE.n..ow.pR", +".pS.pT.pU.pV.pW.pX.pY.pZ.p0.p1.p2.p3.p4.p5.p6.p7.p8.p9.q..q#.oM.q..qa.qb.qc.qd.qe.qf.qg.qh.qi.qj.qk.ql.qm.qn.qo.qp.qq.qr.qs.qt.qu.qv.qw.qx.qy.qz.qA.qB.qC.qD.qE.qF.qG.qH.qI.po.qJ.qK.pv.qL.qM.qN.qO.qP.qQ.qR.qS.qT.qU.qV.qW.qX.qY.qZ.q0.q1.q2.q3.q4.q5.q6.q7.q8.q9.r..r#.ef.ef.ef.ef.ef.ef.ef.ef.lp.lq.lq.lr.lr.ls.ls.lt.m7.m7.m7.lA.m7.m7.pP.lz.lt.ls.lq.lq.lr.lr.ls.m9.hc.hc.hc.ov.ra.lG.pR.rb", +".rc.rd.re.rf.rg.rh.ri.rj.rk.rl.rm.rn.ro.rp.rq.rr.rs.rs.rt.ru.rv.rw.rx.ry.rz.rA.rB.rC.rD.rE.rF.rG.rH.rI.rJ.rK.rL.rM.rN.rO.rP.rQ.rR.rS.rT.rU.rV.rW.rX.rY.rZ.r0.r1.r2.r3.r4.r5.r6.r7.r8.r9.q0.s..s#.sa.sb.sc.sd.se.sf.sg.sh.si.sj.sk.sl.sm.sn.so.gP.sp.l#.sq.sr.ss.st.su.sv.fH.fH.fH.fH.fH.fH.fH.fH.lp.lq.lq.lr.lr.ls.ls.lt.lz.pP.m7.lA.m7.lz.os.lu.sw.lt.lr.lr.ou.ou.lr.ls.hc.hc.hc.lE.lF.ow.rb.sx", +".sy.sz.sA.sB.sC.sD.sE.sF.sG.sH.sI.sJ.sK.sL.sM.sN.sO.sP.sQ.sR.sS.sT.sU.sV.sW.sX.sY.sZ.s0.s1.s2.s3.s4.s5.s6.s7.s8.s9.t..t#.ta.tb.tc.td.te.tf.tg.th.ti.tj.tk.tl.tm.tn.to.tp.tq.tr.ts.tt.tu.tv.tw.tx.ty.tz.tA.tB.tC.tD.tE.tF.tG.tH.tI.tJ.tK.tL.tM.tN.tO.tP.tQ.tR.tS.tT.tU.tV.m4.m4.m4.m4.m4.m4.m4.m4.lp.lq.lq.lr.lr.ls.ls.lt.os.or.pP.m7.lz.os.lv.lx.lB.pQ.pQ.tW.sw.lt.lt.lB.hc.hc.ov.lE.lG.tX.tY.tZ", +".t0.t1.t2.t2.t3.t4.t5.t6.t7.t8.t9.u..u#.ua.ub.uc.ud.ue.uf.ug.uh.ui.uj.uk.ul.um.un.uo.up.uq.ur.us.ut.uu.uv.uw.s8.ux.uy.t#.uz.uA.uB.uC.uD.uE.uF.uG.uH.uI.uJ.uK.uL.uM.uN.uO.uP.uQ.uR.uS.uT.uU.uV.uW.uX.uY.uZ.u0.u1.u2.u3.u4.u5.u6.u7.u8.u9.v..v#.va.vb.vc.vd.ve.vf.vg.vh.vi.lo.lo.lo.lo.lo.lo.lo.lo.lp.lq.lq.lr.lr.ls.ls.lt.lu.os.lz.lz.or.lu.lx.vj.ls.lt.lB.lt.ls.lq.ls.lt.hc.hc.ov.vk.lG.pR.sx.tZ", +".vl.vm.vn.vo.vp.vq.vr.vs.vt.vu.vv.vw.vx.vy.vz.vA.vB.vC.vD.vE.vF.vG.vH.vI.vJ.vK.vL.vM.vN.vO.vP.vQ.vR.vS.vT.vU.vV.vW.vX.vY.vZ.v0.v1.v2.v3.v4.v5.v6.v7.v8.v9.w..w#.wa.wb.wc.wd.we.wf.wg.wh.wi.wj.wk.wl.wm.wn.wo.wp.wq.wr.ws.wt.wu.wv.ww.wx.wy.wz.wA.wB.wC.wD.wE.wF.wG.wH.wI.wJ.cx.wK.wL.wM.wN.wO.wP.wQ.wR.iz.wS.wR.wT.wS.wU.wV.wV.wV.wV.wW.wW.wW.wW.wX.wY.wZ.w0.wZ.w0.w1.w2.w3.w4.w5.w6.w4.w7.w8.w9", +".x..x#.xa.xb.xc.xd.xe.xf.xg.xh.xi.xj.xk.xl.xm.xn.xo.xp.xq.xr.xs.xt.xu.xv.xw.xx.xy.xz.xA.xB.xC.xD.xE.xF.xG.xH.xI.xJ.xK.xL.xM.xN.xO.xP.xQ.xR.xS.xT.xU.xV.xW.xX.xY.xZ.x0.x1.x2.x3.x4.x5.x6.x7.x8.x9.y..y#.ya.yb.yc.yd.ye.x3.yf.yg.yh.yi.yj.yk.yl.ym.yn.yo.yp.yq.yr.ys.yt.yu.yv.yw.yx.yy.yz.yA.yB.yC.wQ.wS.iz.yD.yE.wR.wS.jS.ha.ha.wW.fF.yF.yG.yG.yH.yI.yJ.yK.yK.yL.yL.yM.yN.w4.w4.w4.w3.yO.yP.w8.yQ", +".yR.yS.yT.yU.yV.yW.yX.yY.yZ.y0.y1.y2.y3.y4.y5.y6.y7.y8.y9.z..z#.za.zb.zc.zd.ze.zf.zg.zh.zi.zj.zk.zl.zm.zn.zo.zp.zq.zr.zs.zt.zu.zv.zw.zx.zv.zy.zz.zA.zB.zC.zD.zE.zF.zG.zH.zI.zJ.zK.zL.zM.zN.zO.zP.zQ.zR.zS.zT.zU.zV.zW.zX.zY.zZ.z0.z1.z2.z3.z4.z5.z6.z7.z8.z9.A..A#.Aa.Ab.Ac.Ad.Ae.Af.Ag.Ah.Ai.iB.wQ.wR.wS.wS.wR.wR.wS.iz.ha.wV.fF.yG.Aj.Ak.Al.Am.w0.yL.w2.w2.yK.yK.An.Ao.w5.w4.yO.Ap.Aq.w8.w8.w8", +".Ar.As.At.Au.Av.Aw.Ax.Ay.Az.AA.AB.AC.AD.AE.AF.AG.AH.AI.AJ.AK.AL.AM.AN.AO.AP.AQ.AR.AS.AT.AU.AV.AW.AX.AY.AZ.A0.A1.A2.A3.A4.A5.A6.A7.A8.A9.B..B#.Ba.Bb.Bc.Bd.Be.Bf.Bg.Bh.Bi.Bj.Bk.Bl.qE.Bm.Bn.Bo.Bp.Bq.Br.Bs.Bt.Bu.Bv.Bw.Bx.By.Bz.BA.BB.BC.BD.BE.BF.BG.BH.BI.BJ.BK.BL.BM.BN.BO.BP.BQ.ou.BR.BS.BT.BU.BV.BW.BW.BW.BW.BW.wQ.wQ.Aj.BX.BX.Ak.Al.Am.BY.BZ.wZ.w1.yK.yK.w1.w1.yK.An.w6.w3.Ap.B0.w9.B1.B0.w8", +".B2.B3.B4.B5.B6.B3.B7.B8.B9.C..C#.Ca.Cb.Cc.Cd.Ce.Cf.Cg.Ch.Ci.Cj.Ck.Cl.Cm.Cn.Co.Cp.Cq.Cr.Cs.Ct.Cu.Cv.Cw.Cx.Cy.Cz.CA.CB.CC.CD.CE.CE.CF.CG.CH.CI.CE.CJ.CK.CL.CM.CN.CO.CP.CQ.CR.CS.CT.CU.CV.CW.CX.CY.CZ.C0.C1.C2.C3.C4.C5.C6.C7.C8.C9.D..D#.Da.Db.Dc.Dd.De.Df.Dg.Dh.Di.Dj.Dk.Dl.Dm.Dn.jU.Do.Dp.Dq.Dr.Ds.Dt.w2.Ds.yL.Du.Du.Dv.Dt.Dw.Dx.Dv.BZ.BZ.BY.Am.w1.yK.yM.w2.yL.yL.Dy.Dz.w4.yO.Aq.w9.DA.DA.w9.yQ", +".DB.DC.DD.DE.DF.DG.DH.DI.DJ.DK.DL.DM.DN.DO.DP.DQ.DR.DS.DT.DU.DV.DW.DX.DY.DZ.D0.D1.D2.D3.D4.D5.D6.D7.D8.D9.E..E#.Ea.Eb.Ec.Ed.Ee.Ef.Eg.Eh.Ei.Ej.Ek.El.Em.En.Eo.Ep.Eq.Er.Es.Et.Eu.Ev.Ew.Ex.Ey.Ez.EA.EB.EC.ED.EE.EF.EG.EH.EI.EJ.EK.EL.EM.EN.EO.EP.EQ.ER.ES.ET.EU.EV.EW.EX.EY.EZ.E0.E1.E2.E3.E4.E5.yL.E6.E7.E7.E7.E8.E9.E9.E6.F..F..F#.Fa.Dt.Dx.BZ.BZ.Fb.Fc.Fd.Fe.yN.Dz.Ao.Ff.w7.yP.w8.B1.DA.Fg.Fg.Fg", +"Qt..Fh.Fi.Fj.Fk.Fl.Fm.Fn.Fo.Fp.Fq.Fr.Fs.Ft.Fu.Fv.Fw.Fx.Fy.Fz.FA.FB.FC.FD.FE.FF.FG.FH.FI.FJ.FK.FL.FM.FN.FO.FP.FQ.FR.FS.FT.FU.FV.FW.FX.FY.FU.FZ.F0.F1.F2.F3.F4.F5.F6.F7.F8.F9.G..G#.Ga.Gb.Gc.Gd.Ge.Gf.Gg.Gh.Gi.Gj.Gk.Gl.Gm.Gn.Go.Gp.Gq.Gr.Gs.Gq.Gt.Gu.Gv.Gw.Gx.Gy.Gz.GA.GB.GC.GD.GE.GF.GG.GH.GI.Fb.E6.GJ.GK.GJ.E6.E9.E6.E7.GL.F..F..GM.F#.Fa.GN.GN.Fc.Fd.GO.Fd.Ao.Fb.Fc.Fd.w8.w8.w8.B0.w9.Fg.GP.GQ", +".GR.GS.GT.GU.GV.GW.GX.GY.GZ.G0.G1.G2.G3.G4.G5.G6.G7.G8.G9.H..H#.Ha.Hb.Hc.Hd.He.Hf.Hg.Hh.Hi.Hj.Hk.Hl.Hm.Hn.Ho.Hp.Hq.Hr.Hs.FU.Ht.Hu.Hv.Hw.Hx.Hy.Hz.HA.HB.HC.HD.HE.HF.HG.HH.HI.HJ.HK.HL.HM.HN.HO.HP.HQ.HR.HS.HT.HU.HV.HW.HX.HY.HZ.F0.H0.H1.H2.H3.H4.H5.F0.H6.H7.H8.H9.I..I#.Ia.Ib.Ic.Id.Ie.If.GI.yK.E6.E7.GK.E7.E9.Dt.E8.E7.F..F..F..F..F..F..F..F..Dz.Ao.Fe.Ao.An.w2.An.yN.w9.yQ.w8.w8.yQ.Fg.GQ.Ig", +".Ih.Ii.bw.Ij.Ik.Il.Ih.Im.In.Io.Ip.Iq.Ir.Is.It.Iu.Iv.Iw.Ix.Iy.Iz.IA.IB.IC.ID.IE.IF.IG.zo.IH.II.IJ.IK.IL.Hn.IM.IN.IO.IP.IQ.IR.IS.IT.IU.IV.IW.IX.IY.IZ.I0.I1.I2.I3.I4.I5.HF.I6.I7.I8.I8.I9.J..J#.I7.Ja.Ja.Jb.Gb.Jc.Jd.Je.Je.Jf.Jg.Jh.Ji.Jj.Jk.Jl.Jm.Jn.Jo.Jp.Jq.Jr.Js.Jt.Ju.Jv.Jw.Jx.Jy.Jz.JA.JB.JC.JD.JD.JD.JD.JE.JF.JF.JF.JG.JH.JH.JH.JI.JJ.JJ.JJ.JK.JK.JL.JL.JM.JN.JO.JP.JQ.JR.JS.JS.JT.JU.JU.JV", +".Io.JW.bw.JX.Ik.Il.Io.Im.JY.JZ.J0.J1.J2.J3.f7.J4.J5.J6.Ix.J7.J8Qte.J9.K..K#.Ka.Kb.Kc.Kd.Ke.Kf.Kg.Kh.Ki.yn.Kj.Kk.IO.Kl.Km.Kn.Ko.Kp.Kq.Kr.Ks.Kt.Ku.Kv.Kw.Kx.Jk.Ky.Kz.Kw.KA.KB.KC.KD.KB.KE.KF.KG.KB.KH.KH.KI.KJ.KK.ES.Gl.ER.KL.KM.KN.KO.KP.KQ.KR.KS.KT.KU.KV.KW.F5.KX.KY.KZ.K0.K1.K2.K3.K4.K5.K6.K7.K8.K8.K9.L..JD.JD.L#.JE.La.Lb.Lb.Lb.JG.JH.JH.JH.JO.JN.JN.JN.JN.JN.JN.JM.JU.JR.JS.Lc.JT.JU.JU.JV", +".Io.Ld.Le.Lf.Lg.Lh.Li.Lj.Lk.Ll.J0.iP.Lm.Ln.Lo.Lp.Lq.Lr.Ls.Lt.Lu.Lv.Lw.Lx.Ly.Lz.LA.LB.LC.LD.LE.LF.LG.LH.LI.LJ.Jq.IO.I0.Km.LK.LL.LM.LN.LO.LP.F0.F0.LQ.LR.LS.LQ.LT.LQ.LU.LV.LW.LX.LY.LZ.LY.LY.L0.L1.L2.L3.L4.L5.L6.L7.L8.L8.L9.FT.M..M#.Ma.I9.Mb.Mc.Md.Me.Mf.Mg.KD.Jk.Mh.Mi.Mj.Mk.Ml.Mm.Mn.Mo.Mp.eq.Mq.Mq.Mq.Mr.K8.K8.K8.K8.Ms.Ms.Mt.Mt.Mu.Mu.La.La.Mv.Mw.Mw.Mx.JP.JN.JN.My.Mz.JT.MA.MA.JT.Mz.JU.Mz", +".MB.MC.MD.ME.lX.MF.MG.MH.MI.Ll.Ip.MJ.MK.ML.MM.MN.MO.Lr.Ix.J7.J8Qte.Lw.MP.MQ.MR.MS.MT.MU.MV.MW.MX.MY.MZ.M0.M1.M2.IO.I2.Km.H4.M3.M4.M5.M6.M6.M7.M8.M9.N..N#.Na.Nb.Nc.Nb.Nb.Nd.Ne.Nf.tj.Ng.Nh.Nf.Nf.Ni.Ni.Nj.Nk.Nl.Nm.Nm.Nn.No.Ni.Np.Nq.Nr.Ns.Nt.Nu.Jf.Gq.Nv.Nw.Nx.Ny.Nz.NA.NB.NC.ND.NE.NF.NG.NH.NI.NJ.NK.NK.NL.NL.NM.NM.Mq.NN.NN.NO.NO.NP.NP.Ms.Ms.NQ.NQ.NR.Mv.Mw.Mw.NS.NS.JU.JV.JT.JR.NT.Mz.NU.NV", +".MG.NW.NX.NY.NZ.N0.N1.N2.N3.N4.N5.N6.N7.N8.N9.J4.O..O#.Oa.Ob.Oc.bq.J9.K..Od.Oe.Of.Og.Oh.Oi.Oj.Ok.Ol.MZ.Om.On.Oo.Op.H9.L0.Oq.Or.zv.Os.Ot.Ou.Ov.Ow.Ox.Oy.Oz.OA.OB.OC.OD.OE.OF.OG.OH.OI.OJ.OK.OL.OM.ON.OO.OP.OQ.OR.OS.OT.OU.OV.OW.OX.OY.OZ.O0.O1.O2.O3.O4.O5.O6.O7.O8.O9.P..P#.Pa.Pb.Pc.Pd.Pe.Pf.Pg.Ph.Ph.Ph.Ph.Pi.Pj.Pj.Pj.Pk.Pk.Pl.Pl.Pl.NN.NN.NO.NQ.NQ.NQ.Pm.Pn.Pn.Po.Po.NV.NU.NU.JU.JU.NU.Pp.Pq", +".Pr.NW.Ps.Pt.Pu.Pv.Pw.Px.Py.Pz.PA.PB.PC.PD.PEQth.PF.O#.PG.PH.PI.PJ.J9.PK.PL.PM.PN.PO.oS.PP.PQ.PR.PS.PT.LI.PU.Kr.PV.H9.PW.PX.PY.PZ.Na.P0.P1.P2.P3.P4.P5.P6.P7.P8.P9.Q..Q#.Qa.Qb.Qc.Qd.Qe.Qf.Qg.Qh.Qi.Qj.Qk.Ql.Qm.Qn.Qo.Qp.Qq.Qr.Qs.Qt.Qu.Qv.Qw.Ox.N#.Qx.Qy.Qz.QA.QB.QC.QD.QE.QF.QG.QH.QI.QJ.QK.QL.QM.QM.QN.QO.QO.QO.QP.QP.QQ.QQ.QQ.Pk.Pl.Pl.Pl.NN.Pm.QR.Pn.QS.QT.QU.QV.QW.QX.QX.QX.Pp.QY.Pp.QZ.Q0", +".Q1.Q2.Q3.Q4.Q5.Pv.Q6.Q7.Q8.Q9.R..MJ.R#.Ra.Rb.#3.Rc.Rd.Oa.Ob.rB.bq.Re.MP.Rf.Rg.Rh.Ri.Rj.Rk.Rl.Rm.Rn.Ro.Rp.Rq.Rr.PV.I2.PW.Rs.Rt.Ru.Rv.Rw.Rx.Ry.Rz.RA.RB.RC.RD.RE.RF.RG.RH.RI.RJ.RK.RJ.RL.RM.RN.RO.RP.RQ.RR.RS.RT.RU.RV.RW.RX.RY.RZ.R0.R1.R2.R3.R4.R5.R6.M6.R7.R8.R9.S..S#.Sa.Sb.Sc.Sd.Se.Sf.Sg.Sh.Si.Si.Sj.Sk.QM.QM.QM.Sl.QQ.QQ.QP.Pk.Pl.Pl.Pl.NN.Sm.QU.QU.QV.QV.QV.QV.QV.QZ.Sn.Q0.So.Pq.QZ.Sp.Sq", +".Sr.Ss.Q3.Q4.St.Su.Sv.Sw.Sx.Io.Sy.Sz.SA.c5.SB.SC.SDQto.SE.SF.SG.bq.SH.SI.f3.SJ.SK.SL.SM.SN.SO.SP.SQ.SR.SS.ST.SU.SV.I2.PW.SW.SX.SY.SZ.S0.S1.S2.S3.S4.S5.S6.S7.S8.S9.T..T#.Ta.Tb.Tc.Td.Te.Tf.Tg.Th.Ti.Tj.Tk.Tl.Tm.Tn.To.Tp.Tq.Tr.Ts.Tt.Tu.Tv.Tw.Tx.Ty.Tz.TA.TB.TC.TD.TE.TF.TG.TH.TI.TJ.TK.TL.TM.TN.TO.TP.Si.Si.Si.Sk.Sk.QM.QQ.QQ.Pk.Pk.Pl.Pl.NN.NN.TQ.TQ.TR.TS.QV.QV.Sm.QT.Sn.TT.TU.TT.So.TV.TW.TX", +".TY.TZ.T0.T1.T2.T3.T4.T5.T6.T7.T8.T9.U..U#.Ua.Ub.Uc.nH.Ud.Ue.Uf.Ug.Uh.Ui.Uj.Uk.Ul.Um.Un.Uo.Up.Uq.Ur.Us.Ut.Uu.Uv.Uw.Ux.Uy.Uz.UA.UB.UC.UD.UE.UF.UG.UH.UI.UJ.UK.UL.UM.UN.UO.UP.UQ.UR.US.UT.UU.UV.UP.UW.UX.UY.UZ.U0.U1.U2.U3.U4.U5.U6.U7.U8.U9.V..V#.Va.Vb.Vc.Vd.Ve.Vf.Vg.Vh.Vi.Vj.Vk.Vl.Vm.Vn.Vo.Vp.Vq.Vr.Vs.Vr.Vq.Vq.Vt.Vs.Vu.Vv.Vw.Vv.Vu.Vx.Vu.Vv.Vy.Vz.VA.VB.VC.VD.VE.VF.VG.VH.VH.VH.VI.VJ.VK.VL", +".VM.VN.VO.VP.VQ.VR.VS.VT.VU.VV.VW.VX.VY.VZ.V0.V1.V2.V3.V4.dy.V5.V6.V7.V8.V9.GU.W..W#.Wa.Wb.Wc.Wd.We.Wf.Wg.Wh.Wi.Wj.Wk.Wl.Wm.Wn.Wo.Wp.Wq.Wr.Ws.Wt.Wu.Wv.Ww.Wx.Wy.Wz.WA.WB.WC.WD.WE.WF.WG.WH.WI.WJ.WK.WL.WM.WN.WO.WP.WQ.WR.WS.WT.WU.WV.WW.WX.WY.WZ.W0.W1.W2.W3.W4.Nb.W5.Jj.W6.W7.W8.W9.X..X#.Xa.Xb.Xc.Vt.Xd.Vr.Vq.Xe.Vq.Vr.Xf.Vt.Xg.Xg.Vt.Vt.Xg.Xh.Xi.Xi.Xi.Xj.Vy.Vy.Vy.Vy.VI.VI.Xk.Xk.Xl.Xl.Xl.Xl", +".Xm.Xn.Xo.Xp.Xq.Xr.Xs.Xt.Xu.Xv.Xw.Xx.nh.bw.Xy.Xz.XA.XB.XC.XD.XE.XF.XG.XH.MB.Ld.XI.XJ.XK.XL.XM.XN.XO.XP.Ov.XQ.XR.XS.XT.XU.XV.XW.XX.XY.XZ.X0.X1.X2.X3.X4.X5.X5.X6.X7.X8.X9.Y..Y#.Ya.Yb.Ya.Yc.Yd.Y..Ye.Yf.Yg.Yh.Yi.Yj.Yk.Yl.Ym.Yn.Yo.Yp.Yq.Yr.Ys.Yt.Yu.Yv.Yw.Yx.Yy.Yz.YA.YB.YC.YD.YE.YF.YG.YH.YI.YJ.Xe.Vq.Vr.Vq.Xe.YK.Xe.Vt.YL.YM.YN.Vx.YN.Vx.Xg.Xh.YO.YP.YP.YQ.YQ.YR.YR.YS.Xk.VJ.YT.YU.YU.YT.VJ.TO", +".YV.YW.YX.YY.YZ.Y0.Y1.Y2.Y3.Y4.Y5.Y6.Y7.Y8.Y9.Z..Z#.Za.Zb.Zc.Zd.Ze.Zf.Zg.hr.Zh.Zi.Zj.Zk.Zl.Zm.Zn.Zo.Zp.Zq.Zr.Wj.Zs.Zt.Zu.Zv.Zw.Zx.Zy.Zz.ZA.ZB.ZC.ZD.ZE.ZF.ZG.ZH.ZI.ZF.ZJ.ZK.ZL.ZM.ZN.ZO.ZO.ZP.ZQ.ZR.ZS.ZT.ZU.ZV.ZW.ZX.ZY.ZZ.Z0.Z1.Z1.Z2.Z3.Z4.Z5.Z6.Z7.Z8.Z9.0..0#.0a.0b.0c.0d.0e.0f.0g.0h.0i.0j.0k.Xe.Vq.Xe.0k.0l.0k.0m.0n.YL.YK.YK.YM.YM.Xf.0o.0p.0p.0p.0p.0q.0q.0q.0q.Xl.0r.0s.YU.0t.YU.0s.YT", +".0u.0v.0w.0x.0y.0z.0A.0B.0C.0D.0E.0F.0G.0H.0I.0J.0K.0L.oW.0M.0N.0O.0P.0Q.ev.0R.0S.0T.0U.0V.0W.0X.0Y.0Z.00.01.02.03.04.05.06.07.08.09.1..1#.1a.1b.1c.1d.1e.1f.1f.1g.1h.1i.1j.1k.1l.1m.1n.1o.1p.1q.1r.1s.1t.1u.1v.1w.1x.1y.1z.1A.1B.1C.1D.1E.1F.1G.1H.1I.1J.1K.1L.1M.1N.1O.1P.1Q.1R.1S.1T.1U.1V.1W.1X.0k.YK.0k.1X.1Y.1X.0k.0n.YL.1Z.YL.0n.10.0n.0l.11.12.13.14.0q.15.YS.YS.0s.YT.YT.0s.0t.16.17.18", +".19.2..2#.2a.2b.2c.2d.2e.2f.2g.2h.2i.2j.2k.2l.2m.2n.2o.2p.2q.2r.2s.2t.2u.2v.2w.2x.2y.2z.2A.2B.2C.2D.2E.2F.2G.2H.2I.2J.2K.2L.2M.2N.2O.2P.2Q.2R.2S.2T.2U.2V.2W.2X.2Y.2Z.20.21.22.23.24.25.26.27.28.U0.29.3..3#.3a.3b.3c.3d.3e.3f.3g.3h.3i.3j.3k.3l.3m.3n.3o.3p.3q.3r.3s.3t.3u.3v.3w.3x.3y.3z.3A.3B.10.1X.0l.1X.3C.3D.3C.1X.3E.0n.3F.3G.3H.3I.3J.3E.3K.3L.11.13.3M.0p.YS.YR.3N.0t.YU.YU.3N.17.3O.3P", +".3Q.3R.3S.3T.3U.3V.3W.3X.i2.3Y.3Z.30.31.32.33.34.35.36.37.38.39.4..4#.4a.4b.4c.4d.4e.4f.4g.4h.4i.4j.4k.FO.4l.A9.4m.4n.4o.4p.4q.4r.4s.4t.4u.4v.4w.4x.4y.4z.4A.4B.4z.4C.4D.4E.4F.4G.4H.4I.4J.4K.4L.4M.4N.4O.4P.4Q.4R.4S.4T.4U.4V.4W.4X.4Y.4Z.40.41.42.43.44.45.46.47.48.49.5..5#.5a.5b.5c.YM.5d.5e.5f.3C.1X.3C.5f.5f.10.3F.5g.3I.5h.3H.5i.5j.3J.3E.3K.3K.3L.11.11.5k.13.13.16.16.16.5l.17.18.5m.3O", +".5n.5o.5p.5q.5r.5s.5t.5u.5v.5w.5x.5y.5z.5A.5B.5C.5D.5E.5F.5G.5H.5I.5J.5K.5L.5MQtI.5N.5O.5P.5Q.5R.5S.5T.5U.5V.5W.5X.5Y.5Z.50.51.52.53.54.55.56.57.58.59.6..6..6..6#.6a.6b.6c.6d.6e.6f.6g.6h.6i.6j.6k.6l.6m.6n.6o.6p.6q.6r.6s.6t.6u.6v.6w.6x.6y.6z.6A.6B.6C.6D.6E.6F.6G.6H.6I.6J.6K.6L.6M.6N.6O.6P.6Q.10.3C.3C.5f.6Q.5f.3C.6R.6S.5j.5i.5j.5j.5h.0n.3L.3L.3K.3K.3K.6T.6U.6U.16.17.18.3O.3O.18.17.6V", +".6W.6X.6Y.6Z.60.61.62.63.64.65.66.67.68.69.7..7#.7a.7b.7c.7d.7e.7f.7g.7h.7i.7j.7k.zr.7l.7m.7n.7o.7p.7q.7r.7s.7t.7u.7v.7w.7x.7y.7z.7A.7B.7C.7D.7E.7F.7G.7H.7I.7J.7K.7L.7M.7N.7O.7P.7Q.7R.7S.7T.7U.7V.7W.7X.7Y.7Z.70.71.72.73.74.75.76.77.78.79.8..8#.8a.8b.8c.8d.8e.8f.8g.8h.8i.8j.8k.8l.8m.8n.8o.8p.8p.8p.8p.8p.8p.8p.8p.8q.8q.8r.8s.8s.8r.8q.8t.8u.8u.8u.8v.8w.8x.8y.8y.8z.8A.8B.8C.8D.8E.8F.8G", +".8H.8I.8J.8K.8L.8M.8N.8O.8P.8Q.8R.8S.8T.8U.8V.8W.8X.8Y.T8.8Z.80.81.82.83.84.85.86.87.88.89.9..9#.9a.9b.9c.9d.9e.9f.9g.9h.9i.9j.9k.9l.9m.9n.9o.9p.9q.9r.9s.9t.9u.9v.9w.9x.9y.9z.9A.9B.9C.9D.9E.9F.9G.9H.9I.9J.9K.9L.9M.9N.9O.9P.9Q.9R.9S.9T.9U.9V.9W.9X.9Y.9Z.90.91.92.93.94.95.96.97.98.99#..#.#.8t.8t.8t.8t.8t.8t.8t.8t#.a.8r#.b#.c#.c.8r.8q#.d.8x#.e#.e.8w.8w.8w.8w.8w.8E#.f#.f#.e.8B.8A.8z#.g", +"#.h#.i#.j#.k#.l#.m#.n#.o#.p#.q#.r#.s#.t#.u#.v#.w.SK.7b#.x#.y#.z#.A.82#.B#.C#.D.86#.E#.F.89#.G#.H#.I#.J#.K#.L#.M#.N#.O#.P#.Q#.R#.S#.T.7r#.U#.V#.W#.X#.Y#.Z#.0#.1#.2#.3#.4#.5#.6#.7#.8#.9##.#####a##b##c##d##e##f##g##h##i##j##k##l##m##n##o##p##q##r##s##t##u##v##w##x##y##z##A##B##C##D##E##F##G.8r.8r.8r.8r.8r.8r.8r.8r#.c#.c##H##H##H#.c.8r.8q##I##J##J.8y.8y.8w.8w.8v.8D#.e.8C.8B.8z#.g##K##K", +"##L##M##N##O##P##Q##R##S##T##U##V##W##X##Y##Z##0##1##2.NW##3##4##5##6##7##8##9#a.#a##aa#ab#ac#ad#ae#af#ag#ah#ai#aj#ak#al#am#an#ao#ap#aq#ar#as#at#au#av#aw#ax#ay#az#aA#aB#aC#aD#aE#aF#aG#aH#aI#aJ#aK#aL#aM#aN#aO#aP#aQ#aR#aS#aT#aU#aV#aW#aX#aY#aZ#a0#a1#a2#a3#a4#a5#a6#a7#a8#a9#b.#b##ba#bb#bc#bd##H##H##H##H##H##H##H##H#be#bf#bf#bg#bf##H#.c.8r#bh#bh#bi##J##J#bj.8y.8y#bk#bk#bl##K#.g.8z.8A.8B", +"#bm#bn#bo#bp#bq#br#bs#bt#bu#bv#bw#bx#by#bz#bA#bB.Ud#bC#bD#bE#bF#bG#bH#bI#bJ#bK#bL#bM#bN#bO#bP#bQ#bR#bS#bT#bU#bV#bW#bX#bY#bZ#b0#b1#b2#b3#b4#b5#b6#b7#b8#b9#c.#c##ca#cb#cc#cd#ce#cf#cg#ch#ci#cj#ck#cl#cm#cn#co#cp#cq#cr#cs#ct#cu#cv#cw#cx#cy#cz#cA#cB#cC#cD#cE#cF#cG#cH#cI#cJ#cK#cL#cM#cN#cO#cP#cQ#cR#cR#cR#cR#cR#cR#cR#cR#cR#cS#cT#cT#cR#bf##H#.c##J##I#bh#bh#bh#cU#cV#cV#cW#cW#cX#bk#cY##K##I#.g", +"#cZ#c0#c1.dg#c2#c3#c4#c5#c6#c7#c8#c9#d.#d##da#db.7a#dc#dd#de#df#dg#dh#di#dj#dk#ab#dl#dm#a.#dn#.H#do#dp#dq#dr#ds#dt#du#dv#dw#dx#dy#dz#dA#dB#dC#dD#dE#dF#dG#dH#dI#dJ#dK#dL#dM#dN#dO#dP#dQ#dR#dS#dT#dU#dV#dW#dX#dY#dZ#d0#d1#d2#d3#d4#d5#d6#d7#d8#d9#e.#e##ea#eb#ec#ed#ee#ef#eg#eh#ei#ej#ek#el#em#en#cT#cT#cT#cT#cT#cT#cT#cT#eo#eo#ep#eo#eq#cR#bf##H#bh#bh#bh#cV#cX#er#er#es#bl#cY#bk#cX#cW#et#eu#ev", +"#ew#ex#ey#ez#eA#eB#eC#eD#eE#eF#eG#eH#eI#eJ#eK#eL#eM#eN.oG#eO#eP#eQ#eR#eS#eT#eU.yY#eV#eW#eX#eY#eZ#e0#e1#e2#e3#e4#e5#e6#e7#aY#e8#e9#f.#f##fa#fb#fc#fd#fe#ff#fg#fh#fi#fj#fk#fl#fm#fn#fo#fp#fq#fr.To#fs#ft#fu#fv#fw#fx#fy#fz#fA#fB#fC#fD#fE#fF#fG#fH#fI#fJ#fK#fL#fM#fN#fO#fP#fQ#fR#fS#fT#fU#fV#fW#fX#eo#eo#eo#eo#eo#eo#eo#eo#fY#fZ#f0#fY#eo#cT#bg#be#er#er#er#er#er#er#er#er#f1#f1#cW#f2#eu#ev#f3#f3", +"#f4#f5#f6#f7#f8#f9#g.#g##ga#gb#gc#gd#ge#gf.gv#gg#gh.c4#gi#gj#gk#gl#gm#gn#go#gp#gq#gr#dl#ab#gs#gt#gu#gv#gw#gx#gy#gz#gA#gB#gC#gD#gE#gF#gG#gH#gI#gJ#gK#gL#gM#gN#gO#gP#gQ#gR#gS#gT#gU#gV#gW#gX#gY#gZ#g0#g1#g2#g3#g4#g5#g6#g7#g8#g9#h.#h##ha#hb#hc#hd#he#hf#hg#hh#hi#hj#hk#hl#hm#hn#ho#hp#hq#hr#hs#ht#eo#eo#eo#eo#eo#eo#eo#eo#hu#hu#hu#hu#fY#cT#cR#bf#hv#hw#hw#es#er#er#cV#cV#hx#hx#f3#ev#eu#f2#cW#cX", +"#hy#hz#hA#hB#hC#hD#hE#hF#hG#hH#hI#hJ#hK#hL.XE.DF.p1#hM#hN#hO#hP#hQ#hR.uj#hS#hT#hU#hV#hW#hX#hY#hZ#h0#h1#h2#h3#h4#h5#h6#h7#h8#h9#i.#i##ia#ib#ic#id#ie#if#ig#ih#ii#ij#ik#il#im#in#io#ip#iq#ir#is#it#iu#iv#iw#ix#iy#iz#iA#iB#iC#iD#iE#iF#iG#iH#iI#iJ#iK#iL#iM#iN#iO#iP#iQ#iR#iS#iT#iU#iV#iW#iX#iY#iZ#i0#i1#i2#i2#i3#i0#i3#i2#i3#i2#i3#i4#i4#i2#i5#i2#i6#i7#i8#i9#j.#j##ja#jb#jc#jd#je#je#jf#es#jg#jg", +"#hy#hz#hA#jh#ji#jj#jk#jl#jm#jn#jo#jp#jq#jr#js.V9#jt#ju.ux#jv#hP#hQ#hR.uj#jw.IF#jx#jy#jz#jA#jB#jC#jD#jE#jF#jG#jH#jI#jJ#jK#jL#jM#jN#jO#jP#jQ#jR#jS#jT#jU#jV#jW#jX#jY#jZ#j0#j1#j2#j3#j4#j5#j6#j7#j8#j9#k.#k##ka#kb#kc#kd#iA#ke#g5#kf#kg#kh#ki#kj#kk#kl#km#kn#ko#kp#kq#kr#ks#kt#ku#kv#kw#kx#ky#kz#kA#i0#i3#i2#i2#kB#i0#i3#i2#i4#i3#i2#i0#i3#kC#i2#i3#i6#kD#i8#i9#kE#j##kF#ja#je#je#je#jf#jg#jg#jg#jg", +"#kG.MG#kH#kI#kJ#hG#kK#kL#kM#kN#kO#kP#kQ#kR#kS#kT#kU#kV#kW#kX#hP#kY#hR.uj#kZ#k0.Lk#k1#k2#k3#k4#k5#k6#k7#k8#k9#l.#l##la#lb#lc#ld#le#lf#lg#lh#li#lj#lk#ll#lm#ln#j2#lo#jZ#lp#lq#lr#ls#lt#lu#lv#lw#lx#ly#lz#lA#lB#lC#lD#lE#lF#lG#lH#lI#lJ#lK#lL#lM#lN#lO#lP#lQ#lR#lS#lT#lU#lV#lW#lX#lY#lZ#l0#l1#l2#l3#i0#i3#i2#i3#i0#i0#l4#i2#l5#i0#i2#i3#i2#i5#i1#i4#i6#kD#i7#i8#kE#kE#j.#j##jf#jf#jg#jg#jg#l6#l7#l7", +"#l8.MG#l9#m.#m##ma#mb#mc#hy#kN#md#me#mf#m.#mg#mh#mi#mj#mk#ml#hP#mm#mn.uj#mo#mp#mq#mr#ms#mt#mu#mv#mw#mx#my#mz#mA#mB#mC#mD#mE#mF#mG#mH#mI#mJ#mK#mL#mM#mN#mO#mP#mQ#mR#mS#mT#mU#mV#mW#mX#mY#mZ#m0#m1#m2#m3#m4#m5#m6#m7#m8#m9#n.#n##na#nb#nc#nd#jV#ne#nf#ng#nh#ni#nj#nk#nl#nm#nn#no#np#nq#nr#ns#nt#nu#i4#i0#i3#i3#i0#i4#i0#i3#l5#i0#i3#i0#i0#i2#i3#i4#i6#i6#i7#i8#i8#i9#kE#kE#jg#jg#l6#l7#l7#l7#nv#nv", +"#nw#nx#ny#hL#nz#nA#nB#nC#nD#nE.Uj#nF#jh#nF#nG#nH#nI#nJ#nK#nL#hP#nM#nN.uj#nO#nP#nQ#nR#nS#nT#nU#nV#nW#nX#nY#nZ#n0#n1#n2#n3#n4#n5#n6#n7#n8#n9#o.#o##oa#ob#oc#od#oe#of#og#oh#oi#oj#ok#ol#om#on#oo#op#oq#or#os#ot#ou#ov#ow#ox#oy#oz#oA#oB#oC#oD#oE#oF#oG#oH#oI#oJ#oK#oL#oM#oN#oO#oP#oQ#oR#oS#oT#oU#oV#i4#i0#i3#i0#i4#i4#i4#kB#i4#i0#i0#l5#l5#i3#oW#i0#i6#i6#i6#kD#i7#i7#i8#i8#l7#l7#l7#nv#iY#iY#iY#oX", +"#oY#jo#ny#oZ#o0#o1#o2#o3#o4#nE#jo#nF#o5#jp#o6#o7#o8.G0#o9#p.#hP#p##nN.uj#pa#pb#pc#pd#pe#pf#pg#ph#pi#pj#pk#pl#pm#pn#po#pp#pq#pr#ps#pt#pu#pv#pw#px#py#pz#pA#pB#pC#pD#pE#pF#pG#pH#pI#pJ#pK#pL.WN#pM#pN#pO#pP#pQ#pR#pS#pT#pU#pV#pW#pX#pY#pZ#p0#p1#p2#p3#p4#p5#p6#p7#p8#p9#q.#q##qa#qb#qc#qd#qe#qf#qg#l5#i4#i0#i0#i4#l5#i4#i0#i4#i0#i4#qh#qh#i0#i3#kB#i6#i6#i6#i6#i6#i6#i6#i6#iY#iY#iY#iY#qi#qj#qj#qj", +"#qk#jo#ny#ql#qm#qn#qo#qp#qq#hH#kO#kI#kQ#hJ#qr#qs#qt#qu#qv#qw#hP#qx#qy#qz#qA#qB#qC#qD.5J#qE#qF#qG#qH#qI#qJ#qK#qL#qM#qN#qO#qP#qQ#qR#qS#qT#qU#qV#qW#qX#qY#qZ#q0#q1#q2#q3#q4#q5#q6#q7#q8#q9#r.#r##ra#rb#rc#rd#re#rf#rg#rh#ri#rj#rk#rl#rm#rn#ro#rp#rq#rr#rs#rt#ru#rv#rw#rx#ry#rz#rA#rB#rC#rD#rE#rF#rG#l5#i4#i0#i4#l5#l5#i4#i0#rH#i4#i4#qh#l5#i0#i0#i4#i6#i6#rI#rI#rI#rJ#rK#rK#oX#oX#qj#qj#qj#rL#rM#rM", +"#qk#jo#ny#ql#rN#rO#rP#rQ#rR#jn#hI.lQ#rS#kI.MS#rT#rU#rV#qv#rW#hP#rX#rY#qz#rZ#r0#r1#r2#r3#r4#r5#r6#pi#r7#r8#r9#s.#s##sa#sb#sc#sd#se#sf#sg#sh#si#sj#sk#sl#sm#sn#so#sp#sq#sr#ss#st#su#sv#sw#sx#sy#sz#sA#sB#sC#sD#sE#sF#sG#sH#sI#sJ#sK#sL#sM#sN#sO#sP#sQ#sR#sS#sT#sU#sV#sW#sX#sY#sZ#s0#s1#s2#s3#s4#s5#l5#i4#i0#i4#l5#rH#l5#i4#s6#l5#i0#i4#i4#i0#i4#qh#i6#i6#rI#rJ#rK#rK#rK#rK#qj#qj#qj#qj#rL#rM#rM#rM", +"#s7#s8#s9#t.#t##ta#tb#tc#td.qa#te#tf#tg#th#ti#tj#tk#tl#tm#tn#to#tp#tq#tr#ts#tt#tu#tv#tw#tx#ty#tz#tA#tB#tC#tD#tE#tF#tG#tH#tI#tJ#tK#tL#tM#tN#tO#tP#tQ#tR#tS#tT#tU#tV#tW#tX#tY#tZ#t0#t1#t2#t3#t4#t5#t6#t7#t8#t9#u.#u##ua#ub#uc#ud#ue#uf#ug#uh#ui#uj#uk#ul#um#tN#un#uo#up#uq#ur#us#ut#uu#uv#uw#ux#uy#uz#uA#uB#uC#uz#uD#oU#uC#uB#uA#uz#uE#nr#nr#nr#uE#uF#uG#uH#uI#uJ#uK#uL#uH#uM#uN#uO#uP#uQ#uR#uS#uT", +"#uU.8W#uV#uW#uX#uY#uZ.HF#u0#u1#u2#u3#u4#u5#u6#u7#u8#u9#v.#v##va#vb#vc#vd#ve#vf#vg#vh#vi#vj#vk#vl#vm#vn#vo#vp#vq#vr#vs#vt#vu#vv#vw#vx#vy#vz#vA#vB#vC#vD#vE#vF#vG#vH#vI#vJ#vK#vL#vM#vN#vO#vP#vQ#vR#vS#vT#vU#vV#vW#vX#vY#vZ#v0#v1#v2#v3#v4#uh#v5#v6#v7#v8#v9#w.#w##wa#wb#wc#wd#we#wf#wg#wh#wi#wj#wk#uz#uA#uC#uA#uz#wl#oU#uC#uC#oU#wl#nr#wm#wm#wm#nr#uF#uG#uH#uI#uJ#uK#uL#uH#uM#uM#uN#uP#wn#wo#uR#uS", +"#wp#wq#wr#ws#wt#wu#wv#ww#wx#wy#wz#wA#wB#wC#wD#wE#wF#wG#wH#wI#wJ#wK#wL#wM#wN#wO#wP#wQ#wR#wS#wT#wU#wV#wW#wX#wY#wZ#w0#w1#w2#w3#w4#w5#w6#w7#w8#w9#x.#x##xa#xb#xc#xd#xe#xf#xg#xh#xi#xj#xk#xl#xm#xn#xo#xp#xq#xr#xs#xt#xu#xv#xw#xx#xy#xz#xA#xB#xC#v5#xD#xE#xF#xG#xH#xI#xJ#xK#xL#xM#xN#xO#xP#xQ#xR#xS#xT#wl#oU#uC#uA#uz#wl#oU#uC#oU#wl#uE#wm#xU#xU#wm#nr#uF#uG#uH#uI#uJ#uK#uL#uH#xV#xW#uM#uO#uP#uQ#wo#uR", +"#xX#xY#xZ#x0#x1#x2#x3#x4#x5#x6.zo#x7#x8.Zd#x9#y.#y##ya#yb#yc#yd.zs#ye#yf#yg#yh#yi#yj#yk#yl#ym#yn#yo#yp#yq#tD#yr#ys#yt#yu#yv#yw#yx#yy#yz#yA#yB#yC#yD#yE#yF#yG#yH#yI#yJ#yK#yL#yM#yN#yO#xl#yP#yQ#yR#yS#yT#yU#yV#yW#yX#yY#yZ#y0#y1#y2#y3#y4#y5#y6#y7#y8#y9#z.#z##za#zb#zc#zd#ze#zf#uE#zg#oU#zh#zh#zi#wl#oU#uA#uA#wl#zj#uz#uA#uD#zj#nr#xU#zk#xU#wm#nr#uF#uG#uH#uI#uJ#uK#uL#uH#zl#zl#xV#uM#uO#uP#wn#uQ", +"#zm#zn#zo#zp#zq#zr#zs#zt#zu#zv#zw#zx#zy#zz#zA#zB#zC#zD#zE#zF#zG#zH#zI#zJ#zK#zL#zM#zN#zO#zP#zQ#zR#zS#zT#zU#zV#zW#zX#zY#zZ#z0#z1#z2#z3#z4#z5#z6#z7#z8#xa#z9#A.#A##Aa#yJ#Ab#Ac#Ad#Ae#Af#Ag#Ah#Ai#Aj#Ak#Al#Am#An#Ao#Ap#Aq#Ar#As#At#Au#Av#Aw#fy#Ax#xD#Ay#Az#AA#AB#AC#AD#AE#AF#AG#AH#AI#AJ#AK#AL#AM#AN#zj#uz#uA#oU#wl#zj#wl#uA#wl#zj#nr#xU#xU#wm#nr#uE#uF#uG#uH#uI#uJ#uK#uL#uH#AO#AP#zl#xV#uM#uO#uP#uP", +"#AQ#AR#AS#AT#AU#AV#AW.7n#AX#AY#AZ#A0#A1#A2#u0#A3#A4#A5#A6#zq#A7#A8#A9#B.#B##Ba#Bb#Bc#Bd#Be#Bf#Bg#Bh#zT#Bi#Bj#Bk#Bl#Bm#Bn#Bo#Bp#Bq#Br#Bs#Bt#Bu#Bv#Bw#Bx#By#Bz#BA#BB#BC#BD#BE#BF#BG#BH#BI#BJ#BK#BL#BM#BN#BO#BP#BQ#BR#BS#BT#BU#BV#BW#BX#BY#BZ#B0#B1#B2#B3#B4#B5#B6#B7#B8#B9#C.#C##Ca#Cb#Cc#Cd#Ce#Cf#zj#uz#oU#oU#zj#uE#wl#oU#uz#wl#uE#nr#nr#uE#wl#uz#uF#uG#uH#uI#uJ#uK#uL#uH#Cg#Cg#AO#zl#xV#uM#uN#uO", +"#Ch#Ci#Cj#Ck#Cl#Cm#Cn#Co#Cp#Cq#Cr#Cs#Ct#Cu#Cv#Cw#Cx#Cy#Cz#CA#CB#CC#CD#CE#CF#CG#CH#CI#CJ#CK#CL#CM#CN#CO#CP#CQ#CR#CS#CT#CU#CV#CW#CX#CY#CZ#C0#C1#C2#Bx#C3#C4#C5#C6#C7#C8#C9#D.#D##Da#Db#Dc#Dd#De#Df#Dg#Dh#Di#Dj#Dk#Dl#Dm#Dn#Do#Dp#Dq#Dr#Ds#Dt#Du#Dv#Dw#Dx#Dy#Dz#DA#DB#DC#DD#DE#DF#DG#DH#DI#DJ#DK#DL#uE#wl#oU#uz#zj#uE#wl#oU#oU#uz#wl#zj#zj#wl#oU#uA#uF#uG#uH#uI#uJ#uK#uL#uH#DM#DN#Cg#AP#zl#xW#uM#uN", +"#DO#DP#DQ#DR#DS#DT#DU#DV#DW#DX#DY#DZ#D0#D1#D2#D3#D4#D5#D6#D7#D8#D9#E.#E##Ea#Eb#Ec#Ed#Ee#Ef#Eg#Eh#wV#Ei#Ej#Ek#El#Em#En#Eo#Ep#Eq#Er#Es#Et#Eu#Ev#Ew#Ex#Ey#Ez#EA#EB#C7#EC#ED#EE#EF#EG#EH#EI#EJ#EK#EL#EM#EN#EO#EP#EQ#ER#ES#ET#EU#EV#EW#EX#EY#EZ#E0#E1#E2#E3#E4#E5#E6#E7#E8#E9#F.#F##kD#Fa#Fb#Fc#Fd#Fe#uE#wl#oU#uz#zj#uE#zj#uz#uA#oU#uz#wl#uD#oU#uC#uB#uF#uG#uH#uI#uJ#uK#uL#uH#DM#DM#Cg#AO#zl#xV#uM#uM", +"#Ff#Fg#Fh#Fi#Fj#Fk.9.#Fl#Fm#Fn#Fo#Fp#Fq#Fr#Fs#Ft#Fu#Fv#Fw#Fx#Fy#Fz#FA#FB#FC#FD#FE#FF#FG#FH#FI#FJ#FK#FL#FM#FN#FO#FP#FQ#FR#FS#FT#FU#FV#FW#FX#FY#FZ#F0#F1#F2#F3#F4#F5#F6#F7#F8#F9#G.#G##Ga#Gb#Gc#Gd#Ge#Gf#Gg#Gh#Gi#Gj#Gk#Gl#Gm#Gn#Go#Gp#Gq#Gr#Gs#Gt#Gu#Gv#Gw#Gx#Gy#Gz#GA#GB#GC#qj#uQ#GD#GE#uv#GF#GG#GH#GH#GH#wh#wh#qe#qe#qe#GI#GJ#GK#GL#GL#GK#GM#GN#GO#GO#GP#GQ#GR#GS#GT#GU#GV#GW#GX#GX#GY#Cc#GP#Fb", +"#GZ#G0#G1#G2#G3#G4#G5#G6#G7#hY#G8#G9#H.#H##Ha#Hb.2r#Hc#Hd#He#Hf#Hg#Hh#Hi#Hj#Hk#ty#Hl#Hm#Hn#Ho#Hp#Hq#Hr#Hs#Ht#Hu#Hv#Hw#Hx#Hy#Hz#HA#HB#HC#HD#HE#HF#HG#HH#HI#HJ#HK#HL#HM#HN#HO#HP#HQ#HR#HS#HT#HU#HV#HW#HX#HY#HZ#H0#H1#H2#H3#H4#H5#H6#H7#H8#H9#I.#I##Ia#Ib#Ic#Id#Ie#If#Ig#Ih#Ii#rM#uP#Ij#Ik#uv#Il#Im#In#GH#GH#GH#wh#qe#qe#qe#In#GH#qe#GL#Io#Io#GL#qe#Ip#GO#Iq#AK#GR#GS#AI#GU#Ca#Cc#DI#DI#GX#uM#Ip#Ir", +"#Is#It#Iu#Iv#Iw#Ix#Iy#Iz#IA#IB#IC#ID#IE#IF#IG#IH#II#IJ#IK#IL#IM#IN#IO#IP#IQ#IR#IS#IT#IU#IV#IW#IX#IY#IZ#I0#I1#I2#I3#I4#I5#I6#I7#I8#I9#J.#J##Ja#Jb#Jc#Jd#Je#Jf#Jg#Jh#Ji#Jj#Jk#Jl#Jm#Jn#Jo#Jp#Jq#Jr#Js#Jt#Ju#Jv#Jw#Jx#Jy#Jz#JA#JB#JC#JD#JE#JF#JG#JH#JI#JJ#JK#JL#JM#JN#JO#JP#JQ#JR#Ip#Cf#JS#wh#JT#JU#GJ#GJ#In#GH#GH#GH#wh#wh#GL#qe#wh#GL#GN#GN#GL#In#JV#GO#Iq#AK#GR#GS#GS#GT#GY#GX#Ip#Ip#DI#DI#Fb#JW", +"#JX#JY#JZ#J0#J1#J1#J2#J3#J4#J5#J6#J7#J8#J9#K.#K##Ka#rY#Kb#Kc#Kd#Ke#Kf#Kg#Kh#Ki#Kj#Kk#Kl#Km#Kn#Ko#Kp#Kq#Kr#Ks#Kt#Ku#Kv#Kw#Kx#Ky#Kz#KA#KB#KC#KD#KE#KF#KG#KH#KI#KJ#KK#KL#KM#KN#KO#KP#KQ#KR#KS#KT#KU#KV#KW#KX#KY#KZ#K0#K1#K2#K3#K4#K5#K6#K7#K8#K9#L.#L##La#Lb#Lc#Ld#Le#Lf#Lg#Lh#Lh#Li#Lj#Lk#uC#Ll#Ll#GJ#GJ#GJ#GJ#In#GH#GH#GH#qe#qe#qe#GL#ut#ut#GL#qe#Lm#JV#GO#AK#GR#nt#GS#AI#Ca#Cc#DI#DI#GX#GX#Ip#Ir", +"#Ln#Lo#Lp#Lq#Lr##S#Ls#Lt#Lu#Lv#J6#Fp#Lw#Lx#Ly#Lz#LA#LB#LC#LD#LE#LF#LG#LH#LI#LJ#LK#LL#LM#LN#LO#LP#LQ#LR#LS#LT#LU#LV#LW#LX#LY#LZ#L0#L1#L2#L3#L4#L5#L6#L7#L8#L9#M.#M##Ma#Mb#Mc#Md#Me#Mf#Mg#Mh#Mi#Mj#Mk#Ml#Mm#Mn#Mo#Mp#Mq#Mr#Ms#Mt#Mu#Mv#Mw#Mx#My#Mz#MA#MB#MC#MD#ME#MF#MG#MH#MI#MJ#MK#ML#MM#MN#MO#MP#MQ#MQ#MR#GJ#GJ#GJ#In#In#qf#GJ#GK#GM#GL#GL#GM#Io#Lm#Lm#GO#GP#GQ#GR#GS#GS#MS#Ca#GY#Cc#GY#GY#GX#DI", +"#MT#MU#MV#MW#MX#MY#.G#MZ#M0#M1#IC#ID#M2#M3#rO#M4#M5#M6#M7#M8#M9#N.#N##Na#Nb#Nc#Nd#Ne#Nf#Ng#Nh#Ni#Nj#Nk#Nl#Nm#Nn#No#Np#Nq#Nr#Ns#Nt#Nu#Nv#Nw#Nx#Ny#Nz#NA#NB#NC#ND#NE#NF#NG#NH#NI#NJ#NK#NL#NM#NN#NO#NP#NQ#NR#NS#NT#NU#NV#NW#NX#NY#NZ#N0#N1#N2#N3#N4#N5#N6#N7#N8#N9#O.#O##Oa#Ob#Oc#Od#Oe#Of#Og#Oh#Oi#qf#MQ#MQ#MQ#MR#GJ#GJ#GJ#Oj#MQ#qe#GK#qe#wh#GL#ut#Ok#Lm#Ip#GO#AK#GR#nt#GS#Ol#GT#GW#GY#Ca#Ca#zl#GP", +"#Om#On#Oo#Op#Oq#Or.I.#Os#Ot#Ou#Ov#Ow.0H#Ox#Oy#Oz#OA#OB#OC#OD#OE#OF#OG#OH#OI#OJ#OK#OL#OM#ON#OO#OP#OQ#OR#OS#OT#OU#OV#OW#OX#OY#OZ#O0#O1#O2#O3#O4#O5#O6#O7#O8#O9#P.#P##Pa#Pb#Pc#Pd#Pe#Pf#Pg#Ph#Pi#Pj#Pk#Pl#Pm#Pn#Po#Pp#Pq#Pr#Ps#Pt#Pu#Pv#Pw#Px#Py#Pz#PA#PB#PC#PD#PE#PF#PG#PH#PI#PJ#PK#PL#PM#PN#PO#PP#PQ#qf#qf#MQ#MQ#MR#MR#MR#GI#PQ#GJ#GH#GH#GH#GH#GH#PR#Lm#JV#GO#AK#GR#GR#GW#MS#Ca#GY#GY#GY#GY#GX#DI", +"#A5#PS#PT#PU#PV#PW#PX#PY#PZ#P0#Ov#ID#J8#P1#P2#Hb#P3#P4#P5#P6#P7#P8#P9#Q.#Q##Qa#Qb#Qc#Qd#Qe#Qf#Qg#Qh#Qi#Qj#Qk#Ql#Qm#Qn#Qo#Qp#Qq#Qr#Qs#Qt#Qu#Qv#Qw#Qx#Qy#Qz#QA#QB#QC#QD#QE#QF#QG#QH#oE#QI#QJ#QK#QL#Pg#QM#QN#QO#QP#QQ#QR#QS#QT#QU#QV#QW#QX#QY#QZ#Q0#Q1#Q2#Q3#Q4#Q5#Q6#Q7#Q8#Q9#R.#R##Ra#Rb#Rc#Rd#Re#PQ#PQ#qf#qf#MQ#MQ#MQ#MR#MQ#qf#PQ#MR#GH#GH#MQ#GI#PR#Lm#Lm#GO#AK#Cc#GR#nt#Ca#GY#GX#GX#Cc#GX#DI#Fb", +"#Rf#Rg#Rh#Ri#Rj#Rk#Rl#Rm#Rn#Ro#Rp#Rq#Rr#Rs#Rt#Ru#Rv#Rw#Rx#Ry#Rz#RA#RB#RC#RD#RE#RF#RG#RH#RI#RJ#RK#RL#RM#RN#RO#RP#RQ#RR#RS#RT#RU#RV#RW#RX#RY#RZ#R0#R1#R2#R3#R4#R5#R6#R7#R8#R9#S.#S##Sa#Sb#Sc#Sd#Se#Sf#Sg#nj#Sh#Si#Sj#Sk#Sl#Sm#Sn#So#Sp#Sq#Sr#Ss#St#Su#Sv#Sw#Sx#Sy#Sz#SA#SB#SC#SD#SE#SF#SG#SH#SI#SJ#SK#SK#SK#SK#SK#SK#SK#SK#In#GJ#qf#PQ#PQ#MQ#GJ#GH#SL#MN#JW#Lm#GO#GQ#GR#GS#GP#GP#GP#GP#GP#GP#GP#GP", +"#Rf#Rg#Rh#Ri#Rj#SM#Rl#SN#SO#SP#SQ#SR#SS#ST#SU#SV#SW#SX#SY#SZ#S0#S1#S2#S3#S4#S5#S6#S7#S8#S9#T.#T##Ta#Tb#Tc#Td#Te#Tf#Tg#Th#Ti#Tj#Tk#Tl#Tm#Tn#To#Tp#Tq#Tr#Ts#Tt#Tu#Tv#Tw#Tx#Ty#Tz#TA#TB#TC#TD#TE#TF#TG#TH#TI#TJ#TK#TL#TM#TN#TO#TP#TQ#TR#TS#TT#TU#TV#TW#TX#TY#TZ#T0#T1#T2#T3#T4#Il#T5#T6#Oc#T7#T8#T9#s4#s4#s4#s4#s4#s4#s4#s4#MQ#MQ#qf#qf#qf#MQ#MR#GJ#SL#MN#U.#Lm#GO#AK#GR#nt#DI#DI#DI#DI#DI#DI#DI#DI", +"#Rf#Rg#Rh#U##Ua#Ub#Rl#SN#Uc#Ud#Ue#pd#Uf#Ug#Uh#Ui#Uj#Uk#Ul#Um#Un#Uo#Up#Uq#Ur#Us#Ut#Uu#Uv#Uw#Ux#Uy#Uz#UA#UB#UC#UD#UE#UF#UG#UH#UI#UJ#UK#UL#UM#UN#UO#UP.21#UQ#UR#US#UT#UU#UV#UW#UX#UY#UZ#U0#U1#U2#U3#U4#U5#U6#U7#U8#U9#V.#V##Va#Vb#Vc#Vd#Ve#Vf#Vg#Vh#Vi#Vj#Vk#Vl#Vm#Vn#Vo#Vp#Vq#Vr#MJ#Vs#Vt#Vu#Vv#Vw#Vx#Vx#Vx#Vx#Vx#Vx#Vx#Vx#Vy#PQ#qf#MQ#MR#MQ#MQ#MQ#SL#Vz#U.#PR#JV#Iq#AK#Cc#DI#DI#DI#DI#DI#DI#DI#DI", +"#VA#VB#VC#VD#VE#Ub#Rl#VF#VG#VH#VI#VJ#VK#VL#VM#VN#VO#VP#VQ#VR#VS#VT#VU#VV#VW#VX#VY#VZ#V0#V1#V2#V3#V4#V5#V6#V7#V8#V9#W.#W##Wa#Wb#Wc#Wd#We#Wf#Wg#Wh#Wi#Wj#Wk#Wl#Wm#Wn#Wo#Wp#Wq#Wr#Ws#Wt#Wu#Wv#Ww#Wx#Wy#Wz#aB#WA#WB#WC#WD#WE#WF#WG#WH#WI#WJ#WK#WL.N#.BK#WM#WN#WO#WP#WQ#WR#WS#WT#WU#WV#WW#WX#WY#WZ#W0#W1#W1#W1#W1#W1#W1#W1#W1#W2#W3#PQ#MR#GJ#MR#qf#PQ#SL#W4#MN#W5#Lm#GO#Iq#AK#Fb#Fb#Fb#Fb#Fb#Fb#Fb#Fb", +"#VA#VB#VC#W6#W7#Ub#W8#VF#W9#X.#X##Xa#Xb#Xc#Xd#Xe#Xf#Xg#Xh#Xi#Xj#Xk#Xl#Xm#Xn#Xo#Xp#Xq#Xr#Xs#Xt#Xu#Xv#Xw#Xx#Xy#Xz#XA#XB#XC#XD#XE#XF#XG#XH#XI#XJ#XK#XL#XM#XN#XO#XP#XQ#XR#XS#XT#XU#XV#XW#XX#XY#XZ#X0#X1#X2#X3#X4#X5#X6#X7#X8#X9#Y.#Y##Ya#Yb#Yc#Yd#Ye#Yf#Yg#Yh#Yi#Yj#Yk#Yl#Ym#Yn#Yo#Yp#Yq#Yr#Ys#Yt#Yu#W1#W1#W1#W1#W1#W1#W1#W1#Yv#W2#GI#MQ#MR#MQ#qf#PQ#SL#SL#MN#U.#W5#Lm#JV#GO#Fb#Fb#Fb#Fb#Fb#Fb#Fb#Fb", +"#Yw.lN#Yx#Yy#Yz#Ub#YA#YB#YC#YD#YE#YF#YG#YH#YI#YJ#YK#YL#YM#YN#YO#YP#S2#YQ#YR#YS#YT#YU#YV#YW#YX#YY#YZ#Y0#Y1#Y2#Y3#Y4#Y5#Y6#Y7#Y8#Y9#Z..Om.FT#Z##Za#Zb#Zc#Zd#Ze#Zf#Zg#Zh#Zi#Zj#Zk#Zl#Zm#Zn#Zo#Zp#Zq#Zr#Zs#Zt#Zu#Zv#Zw#Zx#Zy#Zz#ZA#K8#ZB#ZC#ZD#ZE#ZF#ZG#ZH#ZI#ZJ#ZK#ZL#ZM#ZN#ZO#ZP#ZQ#ZR#ZS#ZT#ZU#T4#ZV#ZV#ZV#ZV#ZV#ZV#ZV#ZV#Yv#ZW#Oj#GI#PQ#qf#qf#qf#SL#SL#W4#MN#JW#W5#PR#Lm#Ir#Ir#Ir#Ir#Ir#Ir#Ir#Ir", +"#Yw#ZX#ZY#ZZ#Z0#Ub#Z1#YB#Z2#Z3#Z4#Z5#Z6#Z7#Z8#Z9#0.#0##0a#0b#0c#0d#0e#0f#0g#0h#0i#0j#0k#0l#0m#0n#0o#0p#0q#0r#0s#0t#0u#0v#0w#0x#0y#0z#0A#0B#0C#0D#0E#0F#0G#0H#0I#0J#0K#0L#0M#0N#0O#0P#0Q#0R#0S#0T#0U#0V#0W#0X#0Y#0Z#00#01#02#03#04#05.Ym#06#07.L8#08#09.XR#1..HC#1##1a#1b#1c#1d#1e#1f#1g#Yq#1h#1i#1j#1j#1j#1j#1j#1j#1j#1j#ZW#ZW#ZW#W2#W3#PQ#MQ#GJ#SL#SL#W4#MN#MN#JW#W5#W5#Ir#Ir#Ir#Ir#Ir#Ir#Ir#Ir", +"#pc#ZX#ZY#1k.5J#1l#Z1#YB#1m#1n#1o#1p#1q#1r#1s#1t#1u#1v#1w#1x#1y#1z#1A#1B#1C#1D#1E#1F#1G#1H#1I#1J#1K#1L#1M#1N#1O#1P#1Q#1R#1S#1T#1U#1V#hY#1W#1X#1Y#1Z#10#11#12#13#14#15#16#17#18#19#2.#2##2a#2b#2c#2d#2e#2f#2g#2h#2i#2j#2k#2l#2m#2n#2o#2p#2q#2r#2s##9#2t#2u#2v#2w#2x#2y#2z#2A#2B#2C#2D#2E#2F#2G#2H#1j#1j#1j#1j#1j#1j#1j#1j#W2#ZW#Yv#Yv#W2#Vy#MQ#In#SL#SL#SL#Vz#MN#MN#U.#JW#JW#JW#JW#JW#JW#JW#JW#JW", +"#2I#2J#2K#2L#2M#2N#2O.Jf#2P#2Q#2R#2S#2T#2U#2V#2W#2X#2Y#2Z#20#21#22#23#24#25#26#27#28#YM#29#3.#3##3a#3b#3c#3d#3e#3f#3g#3h#3i#Rm#3j#3k.B.#3l#3m#3n#3o#3p#3q#3r#3s#3t#3u#3v#3w#3x#3y#3z#3A#3B#3C#3D#XY#3E#3F#3G#3H#3I#3J#3K#3L#3M#3N#3O#3P#3Q#3R#ve#3S#3S#3S#3S#3S#3S#3S#3S#3T#3U#3V#3W#3X#3Y#3Z#30#31#32#33#34#35#36#37#38#39#4.#4##4a#4b#4c#4d#4e#4f#1j#4g#4h#2F#PN#4i#4i#4j#4k#4l#4m#4n#4o#4p#4q", +"#4r#4s#4t#4u#4v#4w#4x#4y#4z#4A#4B#4C#4D#4E#4F#4G#4H#4I#4J#4K#4L#4M#4N#4O#4P#4Q#4R#4S#4T#4U#4V.6w#4W#4X#4Y#4Z#40#41.Hs#42#43.I4#44#45.B.#46#47#48#49#5.#5##5a#5b#5c#5d#5e#5f#5g#5h#5i#5j#5k#5l#5m#5n#5o#5p#5q#5r#5s#5t#5u#5v#5w#5x#5y#5z#5A#5B#5C#3S#3S#3S#3S#3S#3S#3S#3S#5D#5E#5F#5G#5H#5I#5J#5K#5L#5M#5N#5O#5P#5Q#5R#5S#5T#5U#5V#5W#5X#5Y#5Z#50#s4#W1#Yq#39#51#52#Rc#53#54#55#56#Lk#57#58#59#6.", +"#6##6a#6b#6c#6d#6e#6f#6g#6h#6i#6j#6k#6l#6m#6n#6o#6p#6q#6r#6s#6t#6u#6v#6w#6x#6y#6z#6A#6B#6C#6D#6E#6F.7s.Np#41#6G#6H.F9.HK.O9.Mb#6I#6J#6K#6L#6M#6N#6O#6P#6Q#6R#6S#6T#6U#6V#6W#6X#6Y#6Z#60#61#62#63#64#65#66#67#68#69#7.#7##7a#7b#7c#7d#7e#7f#7g#7h#3S#3S#3S#3S#3S#3S#3S#3S#7i#7j#7k#7l#Rr#7m#7n#7o#7p#7q#7r#7s#7t#7u#7v#7w#5P#7x#7y#7z#7A#7B#7C#7D#7E#W1#7F#7G#7H#7I#53#7J#7K#54#In#Lk#57#7L#7M#7N", +"#7O.yR#7P#7Q#7R#7S#7T#7U#7V#7W#7X#7Y#7Z#70#71#72#73#74#75#76#77#78#79#8.#8##8a#8b#8c#8d#8e#8f#8g.N.#8h#8i#8j#8k#8l#8m#8n#8o#8p#8q#8r#8s#8t#8u#8v#8w#8x#8y#8z#8A#8B#8C#8D#8E#8F#8G#8H#8I#8J#8K#8L#8M#8N#8O#8P#8Q#8R#8S#8T#8U#8V#8W#8X#8Y#8Z#80#81#3S#3S#3S#3S#3S#3S#3S#3S#82#83#84#85#86#87#88#89#9.#9##9a#9b#9c#9d#9e#9f#9g#9h#9i#9j#9k#9l#MK#9m#s4#1j#7F#9n#9n#52#53#7J#9o#9p#9q#4m#9r#7L#9s#7N", +"#9t#9u#9v#9w#9x.LF#9y#9z#9A#9B#9C#9D#9E#9F#9G#9H#9I#9J#9K#9L#9M#9N#9O#9P#9Q#9R#9S#9T#9U.Np.Jg.Hv#9V#9W#9X#9Y#9Z#90#91#92#93#94#95#96.Ep#97#98#99a..a.#a.aa.ba.ca.da.ea.fa.ga.ha.ia.ja.ka.la.ma.na.oa.pa.qa.ra.sa.ta.ua.va.wa.xa.ya.za.Aa.Ba.Ca.Da.Ea.Ea.Ea.Ea.Ea.Ea.Ea.Ea.Fa.Ga.Ha.Ia.Ja.Ka.La.Ma.Na.Oa.Pa.Qa.Ra.Sa.Ta.Ua.Va.Wa.Xa.Ya.Za.0#ZWa.1a.2a.3#Yqa.4#2F#Oga.5#53a.6a.7#wh#AN#9r#MPa.8a.9", +"a#.a##a#aa#ba#ca#da#ea#fa#ga#ha#ia#ja#ka#la#ma#na#oa#pa#qa#ra#sa#ta#ua#va#wa#xa#ya#za#Aa#Ba#Ca#Da#Ea#E#YAa#Fa#Ga#H.SV.SUa#Ia#Ja#Ka#La#Ma#Na#Oa#Pa#Qa#Ra#Sa#Ta#Ua#Va#Wa#Xa#Ya#Za#0a#1a#2a#3a#4a#5a#6a#7a#8a#9aa.aa#aaaaabaacaadaaeaafaagaahaaiaaja.Ea.Ea.Ea.Ea.Ea.Ea.Ea.EaakaalaamaanaaoaapaaqaaraasaataauaavaawaaxaayaazaaAaaBaaCaaDaaEaaFaaGaaHaaI#7F#Yq#4haaJaaKa.5aaL#55aaMaaN#AN#9r#MPa.8#9s", +"aaOaaP#zwaaQaaRaaSaaTaaUaaVaaWaaXaaYaaZaa0aa1aa2aa3aa4aa5aa6.Npaa7aa8aa9ab.ab#.S.abaabbabcabdabeabfabgabhabiabjabk.FVablablabmabnaboabpabqabrabsabtabuabvabwabxabyabzabAabBabCabDabE#WBabFabGabHabIabJabKabLabMabNabOabPabQabRabSabTabUabVabWabXa.Ea.Ea.Ea.Ea.Ea.Ea.Ea.EabYabZab0ab1.Gh.XQ.0Xab2#VEab3ab4ab5ab6ab7ab8ab9ac.ac#acaacbaccacdaceacfa.2a.2#7F#39#Yo#Ogacg#7J#WX#55#wh#AN#9r#GDachaci", +"acjackaclacmacnacoacpacqacracsactacuacvacwacxacyacz.O3acAacBacCacDacEacEacF.KW.KSacGacH.I2acIacJacKacLacMacNacOacPacPacQ.JnacRacSacTacUacVacWacXacYacZac0ac1ac2ac3ac4ac5ac6ac7ac8ac9ad.ad#adaadb#G#adcaddadeadfadgadhadiadjadkadladmadnadoadpadqa.Ea.Ea.Ea.Ea.Ea.Ea.Ea.EadradsadtaduadvadwadxadyadzadA#RjadBadCadDadEadFadGadHadI.ViadJadKadLadM#ZVa.3adN#7G#9nadOadP#woadQadR#In#AN#IjadSadTadU", +"adVadWadXadYadZad0ad1ad2ad3ad4ad5ad6ad7ad8ad9ae.ae#ae#aeaaeb.HM.HMaecaecaedaedaedaedaedaedaedaedaeeaeeaeeaeeaeeaeeaeeaeeaefaegaehaeiaefaefaejaekaelaemaenaeoaepaeqaeraesaetaeuaevaewaexaeyaezaeAaeBaeCaeDaeEaeFaeGaeHaeIaeJaeKaeLaeMaeNaeOaecaea#3Sa.EaePaeQaeQaePa.E#3SaeRaeSaeT.0AaeUaeVaeWaeW.LE.LE.LE.LE.LE.LE.LE.LEaeXaeYaeZae0ae1ae2ae3ae4ae5ae6ae7ae8ae9af.#wlaf##Ll#MNafaafbafcafdafeaff", +"afgafhafiafj.Hoafkaflafmafnafoafpafqafrafs.KIaft.Nwafuafuae#aeaaebaeb.HMaedaedaedaedaedaedaedaed.O8.O8.O8.O8.O8.O8.O8.O8afvafvafwafxafyafzafAafBafCafDafEafFafGafHafIafJafKafLafMafNafOafPafQafRafSafTafUafVafWafXafYafZaf0af1af2af3af4af5af6af6#3S#3Sa.EaeQaeQa.E#3S#3Saf7af8af9ag.ag#agaagbagc.LE.LE.LE.LE.LE.LE.LE.LEagdageagfaggaghagiagjagkaglagmagnagoagp#2Bagq#nsagragsafaafbafcagtaguagv", +"agwagxagyagzagAagBagCagDagEagFagGagHagIagJagKagLagMagMagNagN.Nwafuae#ae#agOagOagOagOagOagOagOagO#44#44#44#44#44#44#44#44afzaegagPafxaefagPagQagRagSagTagUagVagWagXagYagZag0ag1ag2ag3ag4ag5ag6ag7ag8ag9ah.ah#ahaahbahcahd.moaheahfaeJahg.H2ahhaf6ahi#3Sahja.Ea.Eahj#3SahiahkaeTaf9.EWahlahmagbahn.pS.pS.pS.pS.pS.pS.pS.pSahoahpahqahrahsahtahuahvahwahxahyahzahA#7rahBahCahD#58#MHahEahFagtahGahH", +"ahIahJahKahLahMahNahOahPahQahRacAahS.JfahT.F7.Mfaf5af5ahUagMagNagN.Nw.NwagOagOagOagOagOagOagOagO.H9.H9.H9.H9.H9.H9.H9.H9agPafx#3jafzaefahVahWahXahY.ptahZ.mEah0ah1ah2ah3ah4ah5ah6ah7ah8ah9ah8ai.ai#aiaaibaicaidaieaif.nRaigaihaiiaijaikaaiail.HMaimahi#3S#3S#3S#3Sahiaimainainaioaipag#ahmaiqairaisaisaisaisaisaisaisaisaitaiuaivaiwaixaiyaizaiAaiBaiCaiDaiEaiFaiGaiHaiIaiJaiK#LgaiLaiMaiN#uFaiO", +".CtaiPaiQaiRaiSaiTaiUaiVaiWaiXaiY.xN.xNaiZai0ai1af5af5ahUagMagNagN.Nw.Nwai2ai2ai2ai2ai2ai2ai2ai2.H9.H9.H9.H9.H9.H9.H9.H9ai3afzai4ai5ai6ai5afxai7ai8ai9aj.aj#ajaajbajcajdajeajfajgajhajiajjajkajlajmajnajoajpajqajrajs.q0ajt.l#ahfajuajvaecaf6aeaabhabhahiajwajwahiabhabhahkaio.DhajxahmajyajyajzaisaisaisaisaisaisaisaisajAajAajBajCajDajEajFajGajHajIajJajKajLajMajNajOajPajQajRaiLajSajTajUajV", +"ajWajXajYajZaj0.F9aj1aj2aj3aj4.Jgaj5.HVaj6aj7aj8agMagMagNagN.Nwafuae#ae#ai2ai2ai2ai2ai2ai2ai2ai2#44#44#44#44#44#44#44#44aeiaj9aegagPaj9ai6aehak.ak#akaakbakcagUakdakeakfakgakhakiakjakkaklakmaknakoakpakqakraksaktaku.ibakvaigaiiakwakxajvahUafu#8oakyabhahiahiabhaky#8oainakzakAakBaeUajyakCakDaisaisaisaisaisaisaisaisakEakFakGakHakIakJakKakLakMakNakOakPakQakRakSakTakUakVakWakXakY#iYakZak0", +"ak1ak2.IMak3ak4ak5ak6ak7ak8ak9al.al#.HNalaalbabf.Nwafuafuae#aeaaebaeb.HMalcalcalcalcalcalcalcalc.O8.O8.O8.O8.O8.O8.O8.O8aefafzaldaleaefai4afwaj9alfalgalhalialjalkallalmalnaloalpalqalralsaltalualvalwalxalyalzalAalBaku.moaihalCagNalDafualEalFalG#8oabhabhabhabh#8oalGalHalIakAajxalJahmalKakCalLalLalLalLalLalLalLalLalMalNalOalPagcalQalRalS.CYalTalUa#E.DjalValWalXalYalZakWal0al1al2al3al4", +"al5al6al7al8al9am.am#amaambamcamdameamfamgamh.Nzae#ae#aeaaeb.HM.HMaecaecalcalcalcalcalcalcalcalcaeeaeeaeeaeeaeeaeeaeeaeeamiaegafwai4aldaegafzamjamkamlammamnamoampamqakuamramsamtamuamvamwamxamyamzamAamB.l#.mSamCamDamE.jiamFamGamHamIamJamKamLalGamM#8oabhabh#8oamMalGamNamOalIamPamQamRajyamSamTamTamTamTamTamTamTamTamUamVamWamXamYamZam0am1am2am3am4am5am6am7am8am9an.an#anaal0anbal2ancand", +"aneanfang.Nhanh.R7anianjaeaaeaaeaaeaaeaaeaaeaaeaankankankankankankankank.KC.KC.O8.O8anlanmannannanoanoanoanoanoanoanoano#44#44anpanp.Mg.Mganqanq.rcanransantanuanv.jianuanwanxanyanzanAanBanCanDanEanFanGanH.mo.ji.l#anIanJanKanLanLanManNanOanPanQanRanR.HGanSanTanUanUanVanWanXanY.KfanZan0an1#YCan2an3an4an5#YCan6an7an8an8an9ao.ao#aoaaobaobaocaodaoeaofaoc.Klaogaohaoiaojaokaolaomaonaoo#ML", +"aopaoqaor.Neaosaotaouaovaeaaeaaeaaeaaeaaeaaeaaeaankankankankankankankank.KC.KC.KC.O8anlanmanmannanoanoanoanoanoanoanoano#44#44anpanp.Mg.Mgaowanqaoxaoy.rgaozaoA.l#.AF.qNaoBaoCaoDaoEaoFaoGaoHaoIaoJanF.JbaoKaoLaoM.l#aoNaoOaoPaoQaoRanOaoSaoTaoUaoVaoWaoXaoYaoZao0anZanZao1anYanYanYanYanYanYanYan4an3an9ao2an4an4ao3an9an7an3an8ao.ao#aobao4#SUaocaodaoeaofaf7.Klaogao5ao6ao7ao8ao9#9qap.ap#apa", +"apbapcapdape.Ncapfapgaphaeaaeaaeaaeaaeaaeaaeaaeaankankankankankankankankapiapi.KC.O8.O8anlanmanmapjapjapjapjapjapjapjapj#44#44apkanp.S..Mgaplanqapmapnapoaoz.l#appaiganuapqaprapsaptapuahNam4apvapwapxapyapzapAapB.jiapCapDapEapFapGanNanLapGaoUaoWaoWaoXaoYapHao0anZapIanWanWanWanWanWanWanWanW#YCan6apJan6#YC#YCan5apJapJan4an3an9apKao4apLapMapNapOapPaof#VF.KlaogapQapRapSapTapU#GHapV#rHapW", +"apXapYapZap0ap1ap2ap3ap4aeaaeaaeaaeaaeaaeaaeaaeaankankankankankankankankankankapi.KC.O8.O8anlanlapjapjapjapjapjapjapjapj#6I#44#44anpanp.Mg.Mg.Mgap5ap6ap7.moanuanvap8ap9aq.aq#aqaaqbaqcaqdaqeaqfaqgaqhaqiaqjaqkaqlaqmaqnaqoapFaqpaqqapGaqraqsaqpaqtaquaqvaqwaqxaqy.Kf.KfaqzaqAaqBaqCanWanY.KfaqDaqEaqF#YC#YCaqEaqEaqE#YCaqGapJan7an9aoa#SUapMaqHapNapOaqIao5aqJaqKaogapQaqLaqMaqNaqOaqPaqQaqR#Ol", +"aqSaqTaqUaqV.uIaqW.FTaqXaeaaeaaeaaeaaeaaeaaeaaeaankankankankankankankankaqYankankapi.KC.O8.O8.O8#6I#6I#6I#6I#6I#6I#6I#6IaqZaq0#44apkanp.S..Mg.Mgaq1aq2aq3.rfaq4.moaq5.BJaq6aftaq7aq8aq9ar.ar#araarbarcardakxarearfargarhariarjarkanPapGaoRanParlaquaquaqvarmarnaro.KfarparqaqzarrarsanWanY.KfapIan7an4an4an4an4an7an4an4aqGapJan7an9aoa#SUapMaqHartaruaqIarvaqJ.I2#VFapQarwarxaryarz#uwarAarBarC", +"arDarEarFarGarHarIarJanhaeaaeaaeaaeaaeaaeaaeaaeaankankankankankankankankaqYaqYankankapi.KC.KC.O8arfarfarfarfarfarfarfarfaqZaqZ#44#44anpanp.Mg.Mg.HKarKarLarM.l#arNarOarP.LOarQapiarRanlarS.LN.LOarTarUarVagNaecarWarXarYapFanOarZanOanMar0ar1anNar2ar3ar4ar5ar6ar7anYanYarsarsar8ar9anVanWanXanYan3an4an6an2an7an3an4apJapJan4an3an9apKao4apLapMaqJaruas.as#asa.I2#YAasbascasdaseasfasgashasiasj", +"askaslasmasnasoaspasqarJaeaaeaaeaaeaaeaaeaaeaaeaankankankankankankankank.LL.LLaqYankankapi.KC.KC.KP.KP.KP.KP.KP.KP.KP.KPaqZaqZaq0#44apkanp.S..Mgasrassastasuasva.C.HL.HLaswasxasyaszasAaswaswasBaqhasCasDaf5asEasFasGasHaqq.F6asIarjaqsarjaoQanPar3ar3ar4asJasKar7anY.HEarsar8ar9anVanWanYao1.Kfan7an6#YCan6an4ao3an4an5an7an3an8ao.ao#aobao4#SU.KlasLaohas##SN.I2#YAasMasNasOasPasQasRasSaiNasT", +"asUasVasWasXasYasZas0.Hsaeaaeaaeaaeaaeaaeaaeaaeaankankankankankankankank.LL.LLaqYaqYankapi.KC.KC.KP.KP.KP.KP.KP.KP.KP.KPaqZaqZaqZ#44apkanpanp.S.as1adpaoxas2a.Cap5arPadpas3as4as5as6as7abjas6as8aqhas9at.at#aaiataatbatcanManPanMaqratdateanOanLatfar3ar4asJasKatganY.HEaqzatharsatianYanZan1atjapKan9an3an8ao#aoaao.an3an8an8an9ao.ao#aoaaobaob.KlasLatkas##SNatl#YAasMatmatnatoatpatq#Ceatrats", +"attatuatvatwatxaty.Hsatzapjapjapjapjapjapjapjapjapiapiapiapiapiapiapiapiankankapi.KC.O8anlanmanmarfarfarfarfarfarfarfarfanpanpanpanpanpanpanpanpatAatBatCatDatDarn.McatEatFatGatHatIatJ.OqatKatLatMatNatOatPatQahWahVatRatSa.DatTaj8atUatVatWatSatfatXatYatZat0at1anWanVatianXanYatiarsat2ar9anYat3at4an0at5at6at7at3at8at7at7at7an0at6at6at5at5at9au.au##9Y.XR.S..TEaqY#YAauaaubaucaudaueaufaug", +"auhauiaujaukaulaum.Hsatzapjapjapjapjapjapjapjapjapiapiapiapiapiapiapiapi.KC.KC.KC.KC.O8.O8.O8.O8arfarfarfarfarfarfarfarfanpanpanpanpanpanpanpanpatEacHarn#ZHaunauoaupauoauqatI.HYaurausautauuauvauwauxauyauzatMauAatQaldaj8atTauBa.DauCatVauDauCauEaoWaoXauF.HGauGauHat5arp.KfanYar9aqBarrar9anYarpapIat6auIauIan0at4auJarpat4apIan0at5auIaapaapau.au.auKauLauM.S..TEaqYauN#wLauOauPauQauRauSauT", +"auUauVauWauXauYauZau0au1apjapjapjapjapjapjapjapjapiapiapiapiapiapiapiapi.O8.O8.O8.KC.KCapiankank#6I#6I#6I#6I#6I#6I#6I#6IanpanpanpanpanpanpanpanpatAau2arnatBauoau3au4aunau5au6au7au8au9av.aig.ji.mo.moav#avaavbavcaj9ai4avdalbalbaveavfauDauDatWanQ.H8avgavh#ZHaviavjau#anUanZanYar9aqBarsanW.Kfat4at7auIaapaapauIat7at4at3arpat4an0auIaapau.avkau#auK#9YauL.I0avlanpanpavmavnavoavpavqavravsavt", +"avuavvavwavxavy.Utavzau1apjapjapjapjapjapjapjapjapiapiapiapiapiapiapiapianl.O8.O8.KCankankaqYaqYapjapjapjapjapjapjapjapjanpanpanpanpanpanpanpanpatE.HGavAavhavBaoYatCavC#6JavDavEavFavGavHavI.l#avJavJavKavLavMai5afzavcavNavNavda.DatSatUatVatVaqtavOaoX.HGavPavQatjatjanZ.KfanWar8ar8anWanZatjapIan0avR.3Wau.aapat5at7at4apIat7at6avRavSau.avT#9YauLauLavBavB.I0avlaegavUavVavWavXavYavZav0av1", +"av2avvav3avxav4.Ow.5Vau1apjapjapjapjapjapjapjapjapiapiapiapiapiapiapiapi.KCapiapiankankankaqYaqYanoanoanoanoanoanoanoanoanpanpanpanpanpanpanpanpau2av5av6av7av8avAav8atCau6av9aw.aw#.l#aig.jiaw#.l#awaawbawcawdafwaweaehalbauBa.DawfatSatUatVawgaquaquaqvarmarnawh.KfarpanYanWar9ar9anYanUawiawjat4an0avRau.au.avSauIat6at6at6at5auIavRaapavSavS.XRauM.I0avBavBawkawlawlawmawnawoawpawqawraws#Sz", +"awtawuav3awvaww#41avzau1apjapjapjapjapjapjapjapjapiapiapiapiapiapiapiapiawxawx.LLaqYankapi.KC.KCanoanoanoanoanoanoanoanoanpanpanpanpanpanpanpanpatAatBatBapHawyawyar5apHawzawAawBaigawCawD.l#.moawEav#awFawGavcaweawHawIaj8atSatUatUauCauCauDawJaquaquaqvar5asKatganXanWar9arsar8anXanUawKauKawLarpat7auIavSau.aapauIat6auIauIavRaapaapaapavSavS.S..S.avl.I0awkawMawNa#EawOawPawQawRawSawTawUawV", +"awtawWawXawYawZ.Owavzau1apjapjapjapjapjapjapjapjapiapiapiapiapiapiapiapiaw0aw1.LNawxank.O8anmannamgamgamgamgamgamgamgamganpanpanpanpanpanpanpanpacHarnar5av6atBatBatEaw2aw3au8aw4aw5aig.l#aw6aw7aoOaw8aw9ax.afwax#ak.auAatUawgaxaawgatWauCauDawJasGaxbatYatZat0axcanWanWarsarsatiaqDawiauKauKavj.HEat4at6aapavSaapauIat6at5auIauIaapavSau.avkavk.TE.TEanpavlawlawNa#Eaxdaxearkaxfaxgaxhaxiaxj#4i", +"awtaxkaxlaxmaxnaxoau0au1apjapjapjapjapjapjapjapjapiapiapiapiapiapiapiapiarSaxpaw1awxankanlarR.KF.TE.TE.TE.TE.TE.TE.TE.TEanpanpanpanpanpanpanpanp#ZHaxqarnaxraxsacHaxtaxuaxvaxw.l#.moaw4aig.l#.l#axxaxyaxzaxAaxBaxCafzaxDawJaxEaxFaxEatVauCauDawJaxGaxGaxHaxIaxJaxKar9atiaqCar9anXan1avjawLavjatjat8at3an0auIaapavRat5an0at7axLat5aapau.avkaxdaxMaqYaqYanpaegawla#EaxdaxNaxO#2uaxPaxQaxRaceaxSaxT", +"axUaxVaxWaxXaxYaxZas9ax0apiapiapiapiapiapiapiapi.KO.KOax1.F0ax2ax3a#La#L.Gbax4ax4ax5.KHax6.Gb.Oqaj6ax7#2uadpax8ax9ay.#8q.XR.XR.I0avlavl.HH.HH.HHaroay#ayaaybaycar7aydayeayfaygayhaigaigayiawDayjaykaylaymaynayoaypavPayqayraysaytayuatWayvaszaywayxayyayzayAayBayCayDayEayFayGahqayHayIayJayKayLayMayNat1ayOayPayQ#2xayRaySayTayUayVayWayXayYayZay0ahiay1aqKasa#VFaogay2ay3ay4ay5ay6ay7ay8ay9az.", +"az#azaazbazcazdaze.Maaeiapiapiapiapiapiapiapiapi.IJ.KOacTazfazgazgazhacTaziazjax5azk.KHazl.Gbaziazm.F0abbaznazoax7azpazq.XR.XR.I0avlavl.H9.HH.HHay#aqyazrazsaztazuazvazwazx.l#avGawCaw6aigazyazzazAazBazCazDazEazFazGazHazIazJazKazLatXazMayvazNazOazPar1azQawgazRaxJazS.CsazTazUazVazWazXazYazZaz0akMaz1az2az3az4alOaz5#wMaz6.HRaz7az8az9.QCaA.#3S#3SaA#.I2#Rm#YA#Z1awLaAaaAbaAcay6aAdaAeaAfaAg", +"aAhaAiaAjaAkaAl.QxaAmafxapiapiapiapiapiapiapiapiaAnaAoaApaAqaAraAsaAtaAuaAvaAwaAxaAyaAzaAA.F9aABareahUaACalEailalEaADafu.XR.XR.I0.I0avlavlavl.H9aAEayaaAFaAGauGaAHaAIaAJaAKaALaAMaig.qNaANaAOaAPaAQaARaASanYaATaAUaAVaAWaAXaAYaAZaytatVamhaA0aA1aqxazSaA2aA2aA3ab2aA4aA5aA6aA7aA8aA9aB.aB#aBaaBbaBcaBdaBeaBfaBgaBhaBiaBjaBkaBlaBkaBmaBn.XR.KkaBoaq0aBpaBqaA#aeR#SN#YA#Z1.MiaBra.HaBsaBtaBuaBvaBw", +"aBxaByaBzaBAaBBaiUaBCaj9apiapiapiapiapiapiapiapiaBD#2OaBEaBFaBGaBHaBIaBJaBKaBL#viaBMaBNaBOaBPaBQaBRaBSaBTaBUaBV.H0aBWaAC.XR.XR.I0.I0.I0.I0avlavlaAGaroawlaBXao0aroaBYaBZaB0aB1aB2aB3aB4aB5aB6aB7aB8aB9aC.aC#aCaaCbaCcaCdaCeaCfaAYaAZaCgatUavfaChaCiaCjaCkaClaCmaA4aCnaCoaCpaCqaCraCsaCtaCuaCvaCwaCxaCyaCzaCAaCBaCCabpaCDaCEaCFaCGaCHaCIaCJaCKaCLa.Eahj.Mb.EVaCMaCN#W8#W8aCOaCPaCQaCRaCSaCTaCUaCV", +"aCWaCXaCYaCZaC0aC1.F9ai4apiapiapiapiapiapiapiapiaC2aC3aC4aC5aC6aBHaC7aC8aC9aD.aD#aDaaDbaDcaDdaDeaDfaDgaDhaDiaDjaDk.HOaDl.I0.I0auM.XR.XR.XR.XR.XRaDmaAEaDmaBXaxcaqyaDnaDoaDpaDqaDraDsaDtaDuaDvaDwaDxaDyaeUaDzaDAaDBaDCaDDaDEaDFaDGanXaDHazKaCgauDaDI.HQayWaDJaDKaDLaDMaDNaDOaDPaDQaDRaDSaDTaDUaDVaDWaDXaDYaDZaD0aD1.EN.RvaD2#6GaD3aD4aD5aD6.I3axqaq0aBp.MbaA#aeR#SN#YA#Z1aD7aeTasLaD8aD9aE.aE#aEa", +"aEbaEcazbaEdaBBaxZaEeawIapiapiapiapiapiapiapiapiacoaEfaEgaEhaEiaEjaEkaElaEmaEnaEoaEpaEqaEraEsaEtaEuaEvaEwaExaEyaEzaEAarU.I0.I0auM.XR.XR.IP.IPaEBar7ay#aqyaECat1aEDar7aEEaEFaEGaEHaEIaEJaEKaELaEMaENamRaEOaEPaEQaERaESaETamVaEUaEVaEWaEXaAZazKaEYaEZaE0aE1aE2aE3aE4aE5aE6aE7aE8aE9aF.aF#aFaaFbaFcaFdaFeaFfaFgaFh.UyaFiaFjaFk#6F#8gaFlaFm#94aFnaFo#3SaBqaFp.I2#Rm#YAawLawLaFqaf8aFraFsaFtaFuaFvaFw", +"aFxaAiaFyaFzaFAaxZaEeauMapiapiapiapiapiapiapiapiadxaFBaFCaFDaFEaFFaFGaFHaFIaFJaFKaFLaFMaFNaFOaFPaFQaFRaFSaFTaFRaFUaFVaFWavl.I0auM.XR.IPaEBaEBaEBaqyanSauGanSaroayaaFXanSaFYaFZaF0aF1aF2aF3aF4aF5aF6aF7#YCaF8aF9aG.aG#aGaaGbaGcaGdaGeaGfaAYaAZaGgaGhaGiaGjaGkaGlaGmaGnaGoaGpaGqaGraGsaGtaGuaGvaGwaGxaGyaGzaGAaGBaGCaGDaGEaGFaGGaGHaGIaGJ.4iaGKaGLahiay1aGM.KlaqJaogawjawjaGNaGOatgaGPaGQaGRaGSaGT", +"aGUaxVaFyaGVaGWaC1aGXagPapiapiapiapiapiapiapiapiaGYaGZaG0aG1aG2aG3aG4aG5aG6aG7aG8aG9aH.aH#aHaaHbaHcaHdaHeaHfaHgaHhaFUaHiavlavlauM.XR.IPaEBaHjaHjay#anSawlaHkaqyaECayaaztaHlaHmaHnaHoaHpaHqaHraHsan7aHtaHuaHvaHwaHxaHyaHzaHAaHBaGcaGeaGfaCfaAZ.GAaHCaHDaHEaHFaHGaHHaHIaHJaHKaHLaHMaHNaHOaHPaHQaHRaHSaHTaHUaHVaHWaHXaHYaHZaH0aH1aH2aH3aH4aH5aH6aH7abhabhaH8apNaocaH9aruaruaGNaI.aI#aIaaIbaIcaIdaIe", +"aIfaIgaIhaIi.L8aIj.NyaIkai2agOagOaedaedabnabnabnaIlaImaInaIoaIpaIqaIraIsaItaIuaIvaIwaIxaIyaIzaIAaIBaHgaHfaICaIDaIEaIFaIG#44#44apkanpanpanp.S..S.acHauoatB#ZHatDavA.HG.HGaIHaIIaIJaIKaILaIMaINaIOaIPaIQaIRaISaITar5aCgaIUaIVaIWarmaIXaIYaIZaI0aI1aI2aI3aI4aI5aI6aI7aI8aI9aJ.aJ#aJaaJbaJcaJdaJeaJfaJgaJhaJiaJjaJkaJlaJmaJnaJoaJpaJqaJraJsaJtaJuaJvaJwatEaJxaviaruaBraJyaJzaJAaJBar5aap#RnaJCaJDaJE", +"aJFaJGaJHaJIaJJaIjaJKaJLai2ai2agOaJMaedaedabnabnaJNaJO.HZ.LLaJPanlaJQaJRaJSaJTaJUaJVaJWaJXaJYaJZaJ0aJ1aJ2aFUaJ3aJ4aJ5aJ6#44#44#44apkanpanpanp.S.acHauoatBatB#ZH#ZHatDavAaJ7aJ8aJ9aK.aK#aKaaKbaKcaKdaKeaKfaJwatDacGaKgaKhaKiaKjaqw.7oaKkaKlaKmaKnaKoaKpaKqaKraKsaKtaKuaKvaKwaKxaKyaKzaKAaKBaKCaKDaKEaKFaKGaKHaKIaKJaKKaKLaKMaKNaKOaKPaKQ.N#aKR.GAaJwatEaJxaviaruaBraJyaJzaKS.Nz.HGat7#M4aKTaKUaKV", +"aKWaKXaKYaKZ.L7.GpaK0.IUai2ai2ai2agOaedaedaedabn.F7apiaJNaJNanlaK1aK2arRaK3aK3aK4aK5aK6aKRaK7aK8aK9aqha#daL.aL#aLaaLbaLc#44#44#44#44anpanpanpanpacHacHauoauoauoauoauoauoaLdaLeaLfaLgaLhaLiaLjaLkaLlaLmatBaocaLnaLoaLpaLqaLraLsaLtaLuaLvaLwaLxaLyaLzaLAaLBaLCaLDaLEaLFaLGaLHaLIaLJaLKaLLaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaLWaLXaLYaLZaL0aL1aL2aL3.KtaJwatEaJxaviaruaBraJyaJzaL4aGOatEaEWaL5aL6aL7aJE", +"aL8aKXaL9.Nf.L6agJaD6aM.alcai2ai2ai2agOaedaedaedaJN.GwaK1aK1aK1apiaK1aznaM#aM#.HKaMaaMb.Ja.BJaMcarcaMdaMdaBCaqiaMdaGX.HOaq0#44#44#44apkanpanpanpacHacHacHacHaunavBavBavBaphaMeaMfaMgaMhaFWaMiaMeaMjaI.aMkaMlaMmaLoaMnaMoaMpaMqahWaMraMsaMtaMuaMvaMwaMxaMyaMzaMAaMBaMCaMDaMEaMFaMGaMHaMIaMJaMKaMLaMMaMNaMOaMPaMQaMRaMSaMTaMUaMVaMWaMXaMYaMZ.Jk.KRaJwatEaJxaviaruaBraJyaJzaL4.NzauoanVaM0aM1aM2aM3", +"aM4aM5aM6.P0aM7.GraD6aM.alcalc.Gvai2ai2agOaJMaedaJOazmaJO.GwaaiaaiaK2aM8.I7.I7.I7.I7.I7.I7.I7.I7.OqaM9aN..HM.HMaN#aNaaNbaqZaq0aq0#44#44#44apkanpacHacHacHaunavBavBavBavBaf5aNcaNdaNeaNfakx.HUaNgaNhaNiaNjaNjaMmaJBacIaNkaNlaNmatDaNnaNoaNpaNqaNraNsaNtaNuaNvaNwaNxaNyaNzaNAaNBaNCaNDaNEaNFaNGaNH.ihaNIaNJaNKaNLaNMaNNaNOaNPaNQaNRaNS.L8aAnaNTaNUaJwatEaJxaviaruaBraJyaJzaFqaJBatEaNVaL5ascaNWaNX", +"aNYaNZaN0.P0.O3aN1#93aN2aN3aN3alc.Gvai2ai2agOagOaK1aK2aK1.H1aN4.LO.HZazmanNanNanNanNanNanNaN5aN5amIaN6aikaADazpawmailaecaqZaqZaqZaq0#44#44#44apkaunaunaun.IPacHacHacHacHano.TEaN7ano.KPaN8aN9aO.aO#aNiaNjaOaacGapHar5aObaOcaOd.O9.LFaOeaOfaOgaOhaOiaOjaOk.SYaOlaOmaOnaOoaOpaOqaOraEDaHkaOsaynaOtaOuaOvaOwaOxaOyaOzaOAaOBaOCaODaOE.FT.NuaaiaOFaOGaJwatEaJxaviaruaBraJyaJzaOHaOIavAaOJaOKaOLaOMaON", +"aOOaOPaOQaORaOS.QAaOTaIkaN3aN3aN3alcai2ai2ai2agOaN4aM8.GwaJN.GwaK1aK2.Gwanpanpamg#44#6IaqZaqZ.H7azn#94#2uaOU.Nwaaiax8alEaqZaqZaqZaq0#44#44#44#44avBavBaunacHauoatBatBatEaOVaOWaOXaJKaOVaOYaOZ.Kx.NzaLnaO0aO1aO2aO3aO4aO5aO6aO7aO8azMaO9aP.aP#aPaaPbaPcaPdaPeaPfaPgaPhaPiaPjaPkaPlaPmaPnaPoaPpaPqaPraPsaPtaPuaPv.H8aPwaPxaPyaPzaPAaPBaPC.LJajwaPDaJwatEaJxaviaruaBraJyaJzaPEaI.aPFau.aPGaPHaPIaPJ", +"aPKaPLaPM.ZqaPNaPO.Kp.RraN3aN3aN3alcalcai2ai2ai2aJOaM8aM8aPPaJNarR.LNaPQanpanpanpanp.S..S.aimaimaPRano.EUasFaPSai0aPTabbaqZaqZaqZaqZaq0#44#44#44avBavBaunacHatB#ZHatDavAaPUaPVaPWaPXaPYaPZ.KAaP0aGgaP1aO1aP2aP3aP4aP5aP6aP7aP8aP9aQ.aQ#aQaaQbaQcaQdaEYaQeaQfaKSaQgaQhaQiaQjaFXaQkaQlaQmaQnay#aOsaQoaQpaQqaQrayWaQsazGaQtaQuaQvaQwaQxaQyaQzaQAaQBaJwatEaJxaviaruaBraJyaJzaQCaQDaPFavkaQEaOLaQFaQG"}; diff --git a/Tests/test_file_xpm.py b/Tests/test_file_xpm.py index 7b0429301..04df023cb 100644 --- a/Tests/test_file_xpm.py +++ b/Tests/test_file_xpm.py @@ -20,11 +20,17 @@ def test_sanity() -> None: assert_image_similar(im.convert("RGB"), hopper(), 23) -def test_read_bpp2() -> None: +def test_bpp2() -> None: with Image.open("Tests/images/hopper_bpp2.xpm") as im: assert_image_similar(im.convert("RGB"), hopper(), 11) +def test_rgb() -> None: + with Image.open("Tests/images/hopper_rgb.xpm") as im: + assert im.mode == "RGB" + assert_image_similar(im, hopper(), 16) + + def test_invalid_file() -> None: invalid_file = "Tests/images/flower.jpg" diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index bfa462c04..51d829abe 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1650,7 +1650,8 @@ handler. :: XPM ^^^ -Pillow reads X pixmap files (mode ``P``) with 256 colors or less. +Pillow reads X pixmap files as P mode images if there are 256 colors or less, and as +RGB images otherwise. .. _xpm-opening: diff --git a/src/PIL/XpmImagePlugin.py b/src/PIL/XpmImagePlugin.py index fcee142e3..d80ca7ce4 100644 --- a/src/PIL/XpmImagePlugin.py +++ b/src/PIL/XpmImagePlugin.py @@ -56,10 +56,6 @@ class XpmImageFile(ImageFile.ImageFile): palette_length = int(m.group(3)) bpp = int(m.group(4)) - if palette_length > 256: - msg = "cannot read this XPM file" - raise ValueError(msg) - # # load palette description @@ -93,15 +89,16 @@ class XpmImageFile(ImageFile.ImageFile): msg = "cannot read this XPM file" raise ValueError(msg) - self._mode = "P" - self.palette = ImagePalette.raw("RGB", b"".join(palette.values())) + args: tuple[int, dict[bytes, bytes] | tuple[bytes, ...]] + if palette_length > 256: + self._mode = "RGB" + args = (bpp, palette) + else: + self._mode = "P" + self.palette = ImagePalette.raw("RGB", b"".join(palette.values())) + args = (bpp, tuple(palette.keys())) - palette_keys = tuple(palette.keys()) - self.tile = [ - ImageFile._Tile( - "xpm", (0, 0) + self.size, self.fp.tell(), (bpp, palette_keys) - ) - ] + self.tile = [ImageFile._Tile("xpm", (0, 0) + self.size, self.fp.tell(), args)] def load_read(self, read_bytes: int) -> bytes: # @@ -119,17 +116,27 @@ class XpmDecoder(ImageFile.PyDecoder): def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: assert self.fd is not None - self.fd.readline() # Read '/* pixels */' data = bytearray() - bpp, palette_keys = self.args + bpp, palette = self.args dest_length = self.state.xsize * self.state.ysize + if self.mode == "RGB": + dest_length *= 3 + pixel_header = False while len(data) < dest_length: - s = self.fd.readline().rstrip()[1:] - s = s[: -1 if s.endswith(b'"') else -2] + s = self.fd.readline() + if s.rstrip() == b"/* pixels */" and not pixel_header: + pixel_header = True + continue + if not s: + break + s = b'"'.join(s.split(b'"')[1:-1]) for i in range(0, len(s), bpp): key = s[i : i + bpp] - data += o8(palette_keys.index(key)) + if self.mode == "RGB": + data += palette[key] + else: + data += o8(palette.index(key)) self.set_as_raw(bytes(data)) return -1, 0 From 6512a8e371476b91bc5adfbe076ace2c0f076da2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 9 Apr 2025 23:41:45 +1000 Subject: [PATCH 053/268] Test not enough image data --- Tests/test_file_xpm.py | 10 ++++++++++ src/PIL/XpmImagePlugin.py | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_xpm.py b/Tests/test_file_xpm.py index 04df023cb..96365d7f4 100644 --- a/Tests/test_file_xpm.py +++ b/Tests/test_file_xpm.py @@ -1,5 +1,7 @@ from __future__ import annotations +from io import BytesIO + import pytest from PIL import Image, XpmImagePlugin @@ -31,6 +33,14 @@ def test_rgb() -> None: assert_image_similar(im, hopper(), 16) +def test_not_enough_image_data() -> None: + with open(TEST_FILE, "rb") as fp: + data = fp.read().split(b"/* pixels */")[0] + with Image.open(BytesIO(data)) as im: + with pytest.raises(ValueError, match="not enough image data"): + im.load() + + def test_invalid_file() -> None: invalid_file = "Tests/images/flower.jpg" diff --git a/src/PIL/XpmImagePlugin.py b/src/PIL/XpmImagePlugin.py index d80ca7ce4..ff216a6c1 100644 --- a/src/PIL/XpmImagePlugin.py +++ b/src/PIL/XpmImagePlugin.py @@ -125,11 +125,11 @@ class XpmDecoder(ImageFile.PyDecoder): pixel_header = False while len(data) < dest_length: s = self.fd.readline() + if not s: + break if s.rstrip() == b"/* pixels */" and not pixel_header: pixel_header = True continue - if not s: - break s = b'"'.join(s.split(b'"')[1:-1]) for i in range(0, len(s), bpp): key = s[i : i + bpp] From 34efaaddf306f3a435f490ca6082fc80bc7cad37 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 10 Apr 2025 18:57:31 +1000 Subject: [PATCH 054/268] Improved type hints --- src/PIL/XpmImagePlugin.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/PIL/XpmImagePlugin.py b/src/PIL/XpmImagePlugin.py index ff216a6c1..3be240fbc 100644 --- a/src/PIL/XpmImagePlugin.py +++ b/src/PIL/XpmImagePlugin.py @@ -37,17 +37,18 @@ class XpmImageFile(ImageFile.ImageFile): format_description = "X11 Pixel Map" def _open(self) -> None: + assert self.fp is not None if not _accept(self.fp.read(9)): msg = "not an XPM file" raise SyntaxError(msg) # skip forward to next string while True: - s = self.fp.readline() - if not s: + line = self.fp.readline() + if not line: msg = "broken XPM file" raise SyntaxError(msg) - m = xpm_head.match(s) + m = xpm_head.match(line) if m: break @@ -62,10 +63,10 @@ class XpmImageFile(ImageFile.ImageFile): palette = {} for _ in range(palette_length): - s = self.fp.readline().rstrip() + line = self.fp.readline().rstrip() - c = s[1 : bpp + 1] - s = s[bpp + 1 : -2].split() + c = line[1 : bpp + 1] + s = line[bpp + 1 : -2].split() for i in range(0, len(s), 2): if s[i] == b"c": @@ -74,9 +75,11 @@ class XpmImageFile(ImageFile.ImageFile): if rgb == b"None": self.info["transparency"] = c elif rgb.startswith(b"#"): - rgb = int(rgb[1:], 16) + rgb_int = int(rgb[1:], 16) palette[c] = ( - o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255) + o8((rgb_int >> 16) & 255) + + o8((rgb_int >> 8) & 255) + + o8(rgb_int & 255) ) else: # unknown colour @@ -106,6 +109,7 @@ class XpmImageFile(ImageFile.ImageFile): xsize, ysize = self.size + assert self.fp is not None s = [self.fp.readline()[1 : xsize + 1].ljust(xsize) for i in range(ysize)] return b"".join(s) @@ -124,15 +128,15 @@ class XpmDecoder(ImageFile.PyDecoder): dest_length *= 3 pixel_header = False while len(data) < dest_length: - s = self.fd.readline() - if not s: + line = self.fd.readline() + if not line: break - if s.rstrip() == b"/* pixels */" and not pixel_header: + if line.rstrip() == b"/* pixels */" and not pixel_header: pixel_header = True continue - s = b'"'.join(s.split(b'"')[1:-1]) - for i in range(0, len(s), bpp): - key = s[i : i + bpp] + line = b'"'.join(line.split(b'"')[1:-1]) + for i in range(0, len(line), bpp): + key = line[i : i + bpp] if self.mode == "RGB": data += palette[key] else: From af52060e973063b259708a8e91bfbbf13376c247 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 10 Apr 2025 20:45:53 +1000 Subject: [PATCH 055/268] Mention that tobytes() with the raw encoder uses Pack.c --- src/PIL/Image.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 88ea6f3b5..b419405fb 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -767,18 +767,20 @@ class Image: .. warning:: - This method returns the raw image data from the internal - storage. For compressed image data (e.g. PNG, JPEG) use - :meth:`~.save`, with a BytesIO parameter for in-memory - data. + This method returns raw image data derived from Pillow's internal + storage. For compressed image data (e.g. PNG, JPEG) use + :meth:`~.save`, with a BytesIO parameter for in-memory data. - :param encoder_name: What encoder to use. The default is to - use the standard "raw" encoder. + :param encoder_name: What encoder to use. - A list of C encoders can be seen under - codecs section of the function array in - :file:`_imaging.c`. Python encoders are - registered within the relevant plugins. + The default is to use the standard "raw" encoder. + To see how this packs pixel data into the returned + bytes, see :file:`libImaging/Pack.c`. + + A list of C encoders can be seen under codecs + section of the function array in + :file:`_imaging.c`. Python encoders are registered + within the relevant plugins. :param args: Extra arguments to the encoder. :returns: A :py:class:`bytes` object. """ From dce96089614a2bfac112b5baa5f19d87874f526b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 10 Apr 2025 21:59:04 +1000 Subject: [PATCH 056/268] Test unknown colour and missing colour key --- Tests/test_file_xpm.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_xpm.py b/Tests/test_file_xpm.py index 96365d7f4..de2d9bb79 100644 --- a/Tests/test_file_xpm.py +++ b/Tests/test_file_xpm.py @@ -33,12 +33,23 @@ def test_rgb() -> None: assert_image_similar(im, hopper(), 16) +def test_cannot_read() -> None: + with open(TEST_FILE, "rb") as fp: + data = fp.read().split(b"#")[0] + with pytest.raises(ValueError, match="cannot read this XPM file"): + with Image.open(BytesIO(data)) as im: + pass + with pytest.raises(ValueError, match="cannot read this XPM file"): + with Image.open(BytesIO(data+b"invalid")) as im: + pass + + def test_not_enough_image_data() -> None: with open(TEST_FILE, "rb") as fp: data = fp.read().split(b"/* pixels */")[0] - with Image.open(BytesIO(data)) as im: - with pytest.raises(ValueError, match="not enough image data"): - im.load() + with Image.open(BytesIO(data)) as im: + with pytest.raises(ValueError, match="not enough image data"): + im.load() def test_invalid_file() -> None: From b2945ec2aaf20d4698479c843f0d26ffcaf6222b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 10 Apr 2025 22:07:55 +1000 Subject: [PATCH 057/268] Test truncated header --- Tests/test_file_xpm.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_xpm.py b/Tests/test_file_xpm.py index de2d9bb79..86d86602f 100644 --- a/Tests/test_file_xpm.py +++ b/Tests/test_file_xpm.py @@ -33,14 +33,22 @@ def test_rgb() -> None: assert_image_similar(im, hopper(), 16) -def test_cannot_read() -> None: +def test_truncated_header() -> None: + data = b"/* XPM */" + with pytest.raises(SyntaxError, match="broken XPM file"): + with XpmImagePlugin.XpmImageFile(BytesIO(data)): + pass + + +def test_cannot_read_color() -> None: with open(TEST_FILE, "rb") as fp: data = fp.read().split(b"#")[0] with pytest.raises(ValueError, match="cannot read this XPM file"): - with Image.open(BytesIO(data)) as im: + with Image.open(BytesIO(data)): pass + with pytest.raises(ValueError, match="cannot read this XPM file"): - with Image.open(BytesIO(data+b"invalid")) as im: + with Image.open(BytesIO(data + b"invalid")): pass From 04909483a70e29cd265446199a8f22c1acdc6db7 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 12 Apr 2025 17:29:06 +1000 Subject: [PATCH 058/268] Remove GPL v2 license (#8884) --- wheels/dependency_licenses/FREETYPE2.txt | 345 ----------------------- 1 file changed, 345 deletions(-) diff --git a/wheels/dependency_licenses/FREETYPE2.txt b/wheels/dependency_licenses/FREETYPE2.txt index 93efc6126..8f2345992 100644 --- a/wheels/dependency_licenses/FREETYPE2.txt +++ b/wheels/dependency_licenses/FREETYPE2.txt @@ -211,351 +211,6 @@ Legal Terms --- end of FTL.TXT --- --------------------------------------------------------------------------- - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - --------------------------------------------------------------------------- - The following license details are part of `src/bdf/README`: ``` From 07d78002488063f29cd24e49dd38b5fc2f319989 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Apr 2025 19:08:45 +1000 Subject: [PATCH 059/268] Removed release notes update --- docs/releasenotes/11.2.0.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/releasenotes/11.2.0.rst b/docs/releasenotes/11.2.0.rst index ed41c2116..de3db3c84 100644 --- a/docs/releasenotes/11.2.0.rst +++ b/docs/releasenotes/11.2.0.rst @@ -106,6 +106,5 @@ Pillow images can also be converted to Arrow objects:: Reading and writing AVIF images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Pillow can now read and write AVIF images. However, due to concern over size, this -functionality is not included in our prebuilt wheels. You will need to build Pillow -from source with libavif 1.0.0 or later. +Pillow can now read and write AVIF images. If you are building Pillow from source, this +will require libavif 1.0.0 or later. From 8dafc38371b99616d3fdcc926f4f5a1f7762ae3f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Apr 2025 19:24:35 +1000 Subject: [PATCH 060/268] Added 11.2.1 release notes --- docs/releasenotes/11.2.0.rst | 6 ++++++ docs/releasenotes/11.2.1.rst | 11 +++++++++++ docs/releasenotes/index.rst | 1 + 3 files changed, 18 insertions(+) create mode 100644 docs/releasenotes/11.2.1.rst diff --git a/docs/releasenotes/11.2.0.rst b/docs/releasenotes/11.2.0.rst index de3db3c84..3a7d618e4 100644 --- a/docs/releasenotes/11.2.0.rst +++ b/docs/releasenotes/11.2.0.rst @@ -1,6 +1,12 @@ 11.2.0 ------ +.. warning:: + + The release of Pillow 11.2.0 was halted prematurely, due to concern over the size + of Pillow wheels containing libavif. Instead, Pillow 11.2.1 has been released, + without libavif included in the wheels. + Security ======== diff --git a/docs/releasenotes/11.2.1.rst b/docs/releasenotes/11.2.1.rst new file mode 100644 index 000000000..7d9a40382 --- /dev/null +++ b/docs/releasenotes/11.2.1.rst @@ -0,0 +1,11 @@ +11.2.1 +------ + +Reading and writing AVIF images +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The release of Pillow 11.2.0 was halted prematurely, due to concern over the size of +Pillow wheels containing libavif. + +Instead, Pillow 11.2.1's wheels do not contain libavif. If you wish to read and write +AVIF images, you will need to build Pillow from source with libavif 1.0.0 or later. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index be9f623d0..0d159fc51 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -14,6 +14,7 @@ expected to be backported to earlier versions. .. toctree:: :maxdepth: 2 + 11.2.1 11.2.0 11.1.0 11.0.0 From 7a0092f2072a5deca433e2a6b752eced49e4ee16 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 12 Apr 2025 18:56:38 +0300 Subject: [PATCH 061/268] Remove incomplete 11.2.0 release, bill as 11.2.1 instead --- docs/deprecations.rst | 2 +- docs/handbook/image-file-formats.rst | 2 +- docs/reference/ImageDraw.rst | 8 +- docs/reference/ImageGrab.rst | 2 +- docs/releasenotes/11.2.0.rst | 116 -------------------------- docs/releasenotes/11.2.1.rst | 117 +++++++++++++++++++++++++-- docs/releasenotes/index.rst | 1 - src/PIL/Image.py | 2 +- 8 files changed, 120 insertions(+), 130 deletions(-) delete mode 100644 docs/releasenotes/11.2.0.rst diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 634cee689..7f8e76bcc 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -186,7 +186,7 @@ ExifTags.IFD.Makernote Image.Image.get_child_images() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. deprecated:: 11.2.0 +.. deprecated:: 11.2.1 ``Image.Image.get_child_images()`` has been deprecated. and will be removed in Pillow 13 (2026-10-15). It will be moved to ``ImageFile.ImageFile.get_child_images()``. The diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index bfa462c04..49431b3d0 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -170,7 +170,7 @@ DXT1 and DXT5 pixel formats can be read, only in ``RGBA`` mode. in ``P`` mode. -.. versionadded:: 11.2.0 +.. versionadded:: 11.2.1 DXT1, DXT3, DXT5, BC2, BC3 and BC5 pixel formats can be saved:: im.save(out, pixel_format="DXT1") diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index b2f1bdc93..bd6f6b048 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -391,7 +391,7 @@ Methods the relative alignment of lines. Use the ``anchor`` parameter to specify the alignment to ``xy``. - .. versionadded:: 11.2.0 ``"justify"`` + .. versionadded:: 11.2.1 ``"justify"`` :param direction: Direction of the text. It can be ``"rtl"`` (right to left), ``"ltr"`` (left to right) or ``"ttb"`` (top to bottom). Requires libraqm. @@ -462,7 +462,7 @@ Methods the relative alignment of lines. Use the ``anchor`` parameter to specify the alignment to ``xy``. - .. versionadded:: 11.2.0 ``"justify"`` + .. versionadded:: 11.2.1 ``"justify"`` :param direction: Direction of the text. It can be ``"rtl"`` (right to left), ``"ltr"`` (left to right) or ``"ttb"`` (top to bottom). Requires libraqm. @@ -609,7 +609,7 @@ Methods the relative alignment of lines. Use the ``anchor`` parameter to specify the alignment to ``xy``. - .. versionadded:: 11.2.0 ``"justify"`` + .. versionadded:: 11.2.1 ``"justify"`` :param direction: Direction of the text. It can be ``"rtl"`` (right to left), ``"ltr"`` (left to right) or ``"ttb"`` (top to bottom). Requires libraqm. @@ -663,7 +663,7 @@ Methods the relative alignment of lines. Use the ``anchor`` parameter to specify the alignment to ``xy``. - .. versionadded:: 11.2.0 ``"justify"`` + .. versionadded:: 11.2.1 ``"justify"`` :param direction: Direction of the text. It can be ``"rtl"`` (right to left), ``"ltr"`` (left to right) or ``"ttb"`` (top to bottom). Requires libraqm. diff --git a/docs/reference/ImageGrab.rst b/docs/reference/ImageGrab.rst index d59ed0bd6..1e827a676 100644 --- a/docs/reference/ImageGrab.rst +++ b/docs/reference/ImageGrab.rst @@ -44,7 +44,7 @@ or the clipboard to a PIL image memory. :param window: HWND, to capture a single window. Windows only. - .. versionadded:: 11.2.0 + .. versionadded:: 11.2.1 :return: An image .. py:function:: grabclipboard() diff --git a/docs/releasenotes/11.2.0.rst b/docs/releasenotes/11.2.0.rst deleted file mode 100644 index 3a7d618e4..000000000 --- a/docs/releasenotes/11.2.0.rst +++ /dev/null @@ -1,116 +0,0 @@ -11.2.0 ------- - -.. warning:: - - The release of Pillow 11.2.0 was halted prematurely, due to concern over the size - of Pillow wheels containing libavif. Instead, Pillow 11.2.1 has been released, - without libavif included in the wheels. - -Security -======== - -Undefined shift when loading compressed DDS images -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When loading some compressed DDS formats, an integer was bitshifted by 24 places to -generate the 32 bits of the lookup table. This was undefined behaviour, and has been -present since Pillow 3.4.0. - -Deprecations -============ - -Image.Image.get_child_images() -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 11.2.0 - -``Image.Image.get_child_images()`` has been deprecated. and will be removed in Pillow -13 (2026-10-15). It will be moved to ``ImageFile.ImageFile.get_child_images()``. The -method uses an image's file pointer, and so child images could only be retrieved from -an :py:class:`PIL.ImageFile.ImageFile` instance. - -API Changes -=========== - -``append_images`` no longer requires ``save_all`` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Previously, ``save_all`` was required to in order to use ``append_images``. Now, -``save_all`` will default to ``True`` if ``append_images`` is not empty and the format -supports saving multiple frames:: - - im.save("out.gif", append_images=ims) - -API Additions -============= - -``"justify"`` multiline text alignment -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -In addition to ``"left"``, ``"center"`` and ``"right"``, multiline text can also be -aligned using ``"justify"`` in :py:mod:`~PIL.ImageDraw`:: - - from PIL import Image, ImageDraw - im = Image.new("RGB", (50, 25)) - draw = ImageDraw.Draw(im) - draw.multiline_text((0, 0), "Multiline\ntext 1", align="justify") - draw.multiline_textbbox((0, 0), "Multiline\ntext 2", align="justify") - -Specify window in ImageGrab on Windows -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When using :py:meth:`~PIL.ImageGrab.grab`, a specific window can be selected using the -HWND:: - - from PIL import ImageGrab - ImageGrab.grab(window=hwnd) - -Check for MozJPEG -^^^^^^^^^^^^^^^^^ - -You can check if Pillow has been built against the MozJPEG version of the -libjpeg library, and what version of MozJPEG is being used:: - - from PIL import features - features.check_feature("mozjpeg") # True or False - features.version_feature("mozjpeg") # "4.1.1" for example, or None - -Saving compressed DDS images -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Compressed DDS images can now be saved using a ``pixel_format`` argument. DXT1, DXT3, -DXT5, BC2, BC3 and BC5 are supported:: - - im.save("out.dds", pixel_format="DXT1") - -Other Changes -============= - -Arrow support -^^^^^^^^^^^^^ - -`Arrow `__ is an in-memory data exchange format that is the -spiritual successor to the NumPy array interface. It provides for zero-copy access to -columnar data, which in our case is ``Image`` data. - -To create an image with zero-copy shared memory from an object exporting the -arrow_c_array interface protocol:: - - from PIL import Image - import pyarrow as pa - arr = pa.array([0]*(5*5*4), type=pa.uint8()) - im = Image.fromarrow(arr, 'RGBA', (5, 5)) - -Pillow images can also be converted to Arrow objects:: - - from PIL import Image - import pyarrow as pa - im = Image.open('hopper.jpg') - arr = pa.array(im) - -Reading and writing AVIF images -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Pillow can now read and write AVIF images. If you are building Pillow from source, this -will require libavif 1.0.0 or later. diff --git a/docs/releasenotes/11.2.1.rst b/docs/releasenotes/11.2.1.rst index 7d9a40382..5c6d40d9d 100644 --- a/docs/releasenotes/11.2.1.rst +++ b/docs/releasenotes/11.2.1.rst @@ -1,11 +1,118 @@ 11.2.1 ------ +.. warning:: + + The release of Pillow *11.2.0* was halted prematurely, due to hitting PyPI's + project size limit and concern over the size of Pillow wheels containing libavif. + The PyPI limit has now been increased and Pillow *11.2.1* has been released + instead, without libavif included in the wheels. + To avoid confusion, the incomplete 11.2.0 release has been removed from PyPI. + +Security +======== + +Undefined shift when loading compressed DDS images +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When loading some compressed DDS formats, an integer was bitshifted by 24 places to +generate the 32 bits of the lookup table. This was undefined behaviour, and has been +present since Pillow 3.4.0. + +Deprecations +============ + +Image.Image.get_child_images() +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 11.2.1 + +``Image.Image.get_child_images()`` has been deprecated. and will be removed in Pillow +13 (2026-10-15). It will be moved to ``ImageFile.ImageFile.get_child_images()``. The +method uses an image's file pointer, and so child images could only be retrieved from +an :py:class:`PIL.ImageFile.ImageFile` instance. + +API Changes +=========== + +``append_images`` no longer requires ``save_all`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Previously, ``save_all`` was required to in order to use ``append_images``. Now, +``save_all`` will default to ``True`` if ``append_images`` is not empty and the format +supports saving multiple frames:: + + im.save("out.gif", append_images=ims) + +API Additions +============= + +``"justify"`` multiline text alignment +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to ``"left"``, ``"center"`` and ``"right"``, multiline text can also be +aligned using ``"justify"`` in :py:mod:`~PIL.ImageDraw`:: + + from PIL import Image, ImageDraw + im = Image.new("RGB", (50, 25)) + draw = ImageDraw.Draw(im) + draw.multiline_text((0, 0), "Multiline\ntext 1", align="justify") + draw.multiline_textbbox((0, 0), "Multiline\ntext 2", align="justify") + +Specify window in ImageGrab on Windows +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When using :py:meth:`~PIL.ImageGrab.grab`, a specific window can be selected using the +HWND:: + + from PIL import ImageGrab + ImageGrab.grab(window=hwnd) + +Check for MozJPEG +^^^^^^^^^^^^^^^^^ + +You can check if Pillow has been built against the MozJPEG version of the +libjpeg library, and what version of MozJPEG is being used:: + + from PIL import features + features.check_feature("mozjpeg") # True or False + features.version_feature("mozjpeg") # "4.1.1" for example, or None + +Saving compressed DDS images +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Compressed DDS images can now be saved using a ``pixel_format`` argument. DXT1, DXT3, +DXT5, BC2, BC3 and BC5 are supported:: + + im.save("out.dds", pixel_format="DXT1") + +Other Changes +============= + +Arrow support +^^^^^^^^^^^^^ + +`Arrow `__ is an in-memory data exchange format that is the +spiritual successor to the NumPy array interface. It provides for zero-copy access to +columnar data, which in our case is ``Image`` data. + +To create an image with zero-copy shared memory from an object exporting the +arrow_c_array interface protocol:: + + from PIL import Image + import pyarrow as pa + arr = pa.array([0]*(5*5*4), type=pa.uint8()) + im = Image.fromarrow(arr, 'RGBA', (5, 5)) + +Pillow images can also be converted to Arrow objects:: + + from PIL import Image + import pyarrow as pa + im = Image.open('hopper.jpg') + arr = pa.array(im) + Reading and writing AVIF images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The release of Pillow 11.2.0 was halted prematurely, due to concern over the size of -Pillow wheels containing libavif. - -Instead, Pillow 11.2.1's wheels do not contain libavif. If you wish to read and write -AVIF images, you will need to build Pillow from source with libavif 1.0.0 or later. +Pillow can now read and write AVIF images when built from source with libavif 1.0.0 +or later. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 0d159fc51..a116ef056 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -15,7 +15,6 @@ expected to be backported to earlier versions. :maxdepth: 2 11.2.1 - 11.2.0 11.1.0 11.0.0 10.4.0 diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 88ea6f3b5..ded40bc5d 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3362,7 +3362,7 @@ def fromarrow( See: :ref:`arrow-support` for more detailed information - .. versionadded:: 11.2.0 + .. versionadded:: 11.2.1 """ if not hasattr(obj, "__arrow_c_array__"): From 339bc5db93bd95decf65a59fab273f300db6594d Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 12 Apr 2025 19:55:46 +0300 Subject: [PATCH 062/268] 11.2.1 version bump --- src/PIL/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/_version.py b/src/PIL/_version.py index e93c7887b..9380e9927 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,4 +1,4 @@ # Master version for Pillow from __future__ import annotations -__version__ = "11.2.0.dev0" +__version__ = "11.2.1" From f9083264ff561389ee5931598df9bffe269db504 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 12 Apr 2025 20:56:35 +0300 Subject: [PATCH 063/268] 11.3.0.dev0 version bump --- src/PIL/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/_version.py b/src/PIL/_version.py index 9380e9927..ac678c7d2 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,4 +1,4 @@ # Master version for Pillow from __future__ import annotations -__version__ = "11.2.1" +__version__ = "11.3.0.dev0" From 529402143826732973463104000fd91d0a271103 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 3 Apr 2025 12:09:46 +1100 Subject: [PATCH 064/268] Removed Fedora 40 --- .github/workflows/test-docker.yml | 1 - docs/installation/platform-support.rst | 2 -- 2 files changed, 3 deletions(-) diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml index 25aef55fb..9e42ed884 100644 --- a/.github/workflows/test-docker.yml +++ b/.github/workflows/test-docker.yml @@ -47,7 +47,6 @@ jobs: centos-stream-10-amd64, debian-12-bookworm-x86, debian-12-bookworm-amd64, - fedora-40-amd64, fedora-41-amd64, gentoo, ubuntu-22.04-jammy-amd64, diff --git a/docs/installation/platform-support.rst b/docs/installation/platform-support.rst index 9eafad3c4..36b9a7bdd 100644 --- a/docs/installation/platform-support.rst +++ b/docs/installation/platform-support.rst @@ -31,8 +31,6 @@ These platforms are built and tested for every change. +----------------------------------+----------------------------+---------------------+ | Debian 12 Bookworm | 3.11 | x86, x86-64 | +----------------------------------+----------------------------+---------------------+ -| Fedora 40 | 3.12 | x86-64 | -+----------------------------------+----------------------------+---------------------+ | Fedora 41 | 3.13 | x86-64 | +----------------------------------+----------------------------+---------------------+ | Gentoo | 3.12 | x86-64 | From c6434dbbbc667d42ad236aa2eeb407a44bbd2174 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 13 Apr 2025 23:00:06 +1000 Subject: [PATCH 065/268] Set color table fourth channel to zero for 1 and L mode when saving --- src/PIL/BmpImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 43131cfe2..54fc69ab4 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -445,9 +445,9 @@ def _save( image = stride * im.size[1] if im.mode == "1": - palette = b"".join(o8(i) * 4 for i in (0, 255)) + palette = b"".join(o8(i) * 3 + b"\x00" for i in (0, 255)) elif im.mode == "L": - palette = b"".join(o8(i) * 4 for i in range(256)) + palette = b"".join(o8(i) * 3 + b"\x00" for i in range(256)) elif im.mode == "P": palette = im.im.getpalette("RGB", "BGRX") colors = len(palette) // 4 From 4716bb78189108ceffcc80db226fe099cca20448 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sun, 13 Apr 2025 23:59:05 +1000 Subject: [PATCH 066/268] Update macOS tested Pillow versions (#8890) --- docs/installation/platform-support.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/platform-support.rst b/docs/installation/platform-support.rst index 36b9a7bdd..ca810dc2a 100644 --- a/docs/installation/platform-support.rst +++ b/docs/installation/platform-support.rst @@ -71,7 +71,7 @@ These platforms have been reported to work at the versions mentioned. | Operating system | | Tested Python | | Latest tested | | Tested | | | | versions | | Pillow version | | processors | +==================================+============================+==================+==============+ -| macOS 15 Sequoia | 3.9, 3.10, 3.11, 3.12, 3.13| 11.1.0 |arm | +| macOS 15 Sequoia | 3.9, 3.10, 3.11, 3.12, 3.13| 11.2.1 |arm | | +----------------------------+------------------+ | | | 3.8 | 10.4.0 | | +----------------------------------+----------------------------+------------------+--------------+ From 8b1777b9997a48cd59a3bddd888bebddd8adc6de Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Mon, 14 Apr 2025 14:51:01 -0400 Subject: [PATCH 067/268] Move XV Thumbnails to read only section --- docs/handbook/image-file-formats.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 49431b3d0..46fe8b630 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1664,6 +1664,11 @@ The :py:meth:`~PIL.Image.open` method sets the following Transparency color index. This key is omitted if the image is not transparent. +XV Thumbnails +^^^^^^^^^^^^^ + +Pillow can read XV thumbnail files. + Write-only formats ------------------ @@ -1769,11 +1774,6 @@ The :py:meth:`~PIL.Image.Image.save` method can take the following keyword argum .. versionadded:: 5.3.0 -XV Thumbnails -^^^^^^^^^^^^^ - -Pillow can read XV thumbnail files. - Identify-only formats --------------------- From 507fefbce4c3b8c46c6c21483d488884f1b5a8e1 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 15 Apr 2025 21:02:35 +1000 Subject: [PATCH 068/268] Python 3.13 is tested on Arch (#8894) --- docs/installation/platform-support.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/platform-support.rst b/docs/installation/platform-support.rst index ca810dc2a..d5634b384 100644 --- a/docs/installation/platform-support.rst +++ b/docs/installation/platform-support.rst @@ -23,7 +23,7 @@ These platforms are built and tested for every change. +----------------------------------+----------------------------+---------------------+ | Amazon Linux 2023 | 3.9 | x86-64 | +----------------------------------+----------------------------+---------------------+ -| Arch | 3.12 | x86-64 | +| Arch | 3.13 | x86-64 | +----------------------------------+----------------------------+---------------------+ | CentOS Stream 9 | 3.9 | x86-64 | +----------------------------------+----------------------------+---------------------+ From 6ea7dc8eeafaf7528d2817bdd443de367eca2940 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 16 Apr 2025 17:06:52 +1000 Subject: [PATCH 069/268] Add Fedora 42 (#8899) --- .github/workflows/test-docker.yml | 1 + docs/installation/platform-support.rst | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml index 9e42ed884..0b90732eb 100644 --- a/.github/workflows/test-docker.yml +++ b/.github/workflows/test-docker.yml @@ -48,6 +48,7 @@ jobs: debian-12-bookworm-x86, debian-12-bookworm-amd64, fedora-41-amd64, + fedora-42-amd64, gentoo, ubuntu-22.04-jammy-amd64, ubuntu-24.04-noble-amd64, diff --git a/docs/installation/platform-support.rst b/docs/installation/platform-support.rst index d5634b384..d751620fd 100644 --- a/docs/installation/platform-support.rst +++ b/docs/installation/platform-support.rst @@ -33,6 +33,8 @@ These platforms are built and tested for every change. +----------------------------------+----------------------------+---------------------+ | Fedora 41 | 3.13 | x86-64 | +----------------------------------+----------------------------+---------------------+ +| Fedora 42 | 3.13 | x86-64 | ++----------------------------------+----------------------------+---------------------+ | Gentoo | 3.12 | x86-64 | +----------------------------------+----------------------------+---------------------+ | macOS 13 Ventura | 3.9 | x86-64 | From f630ec097b4d5d2a132d4ade5e5b903452bf27d8 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 16 Apr 2025 21:05:08 +1000 Subject: [PATCH 070/268] Build Windows arm64 wheels on arm64 runner (#8898) --- .github/workflows/wheels.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 40d3dc7e8..33e1976f0 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -121,14 +121,17 @@ jobs: windows: if: github.event_name != 'schedule' || github.repository_owner == 'python-pillow' name: Windows ${{ matrix.cibw_arch }} - runs-on: windows-latest + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - cibw_arch: x86 + os: windows-latest - cibw_arch: AMD64 + os: windows-latest - cibw_arch: ARM64 + os: windows-11-arm steps: - uses: actions/checkout@v4 with: From 3d4119521c853e1014012f73fdf9b2a8dc137722 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Thu, 17 Apr 2025 01:49:57 +1000 Subject: [PATCH 071/268] Close file pointer earlier (#8895) --- Tests/test_file_bmp.py | 12 ++++++------ Tests/test_file_jpeg2k.py | 4 ++-- Tests/test_file_libtiff.py | 12 ++++++------ Tests/test_file_libtiff_small.py | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index 757650711..746b2e180 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -190,9 +190,9 @@ def test_rle8() -> None: # Signal end of bitmap before the image is finished with open("Tests/images/bmp/g/pal8rle.bmp", "rb") as fp: data = fp.read(1063) + b"\x01" - with Image.open(io.BytesIO(data)) as im: - with pytest.raises(ValueError): - im.load() + with Image.open(io.BytesIO(data)) as im: + with pytest.raises(ValueError): + im.load() def test_rle4() -> None: @@ -214,9 +214,9 @@ def test_rle4() -> None: def test_rle8_eof(file_name: str, length: int) -> None: with open(file_name, "rb") as fp: data = fp.read(length) - with Image.open(io.BytesIO(data)) as im: - with pytest.raises(ValueError): - im.load() + with Image.open(io.BytesIO(data)) as im: + with pytest.raises(ValueError): + im.load() def test_offset() -> None: diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 4095bfaf2..a5365a90d 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -457,8 +457,8 @@ def test_comment() -> None: # Test an image that is truncated partway through a codestream with open("Tests/images/comment.jp2", "rb") as fp: b = BytesIO(fp.read(130)) - with Image.open(b) as im: - pass + with Image.open(b) as im: + pass def test_save_comment(card: ImageFile.ImageFile) -> None: diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 9916215fb..1ec39eba5 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -81,7 +81,7 @@ class TestFileLibTiff(LibTiffTestCase): s = io.BytesIO() with open(test_file, "rb") as f: s.write(f.read()) - s.seek(0) + s.seek(0) with Image.open(s) as im: assert im.size == (500, 500) self._assert_noerr(tmp_path, im) @@ -1050,12 +1050,12 @@ class TestFileLibTiff(LibTiffTestCase): with open("Tests/images/old-style-jpeg-compression.tif", "rb") as fp: data = fp.read() - # Set EXIF Orientation to 2 - data = data[:102] + b"\x02" + data[103:] + # Set EXIF Orientation to 2 + data = data[:102] + b"\x02" + data[103:] - with Image.open(io.BytesIO(data)) as im: - im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - assert_image_equal_tofile(im, "Tests/images/old-style-jpeg-compression.png") + with Image.open(io.BytesIO(data)) as im: + im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + assert_image_equal_tofile(im, "Tests/images/old-style-jpeg-compression.png") def test_open_missing_samplesperpixel(self) -> None: with Image.open( diff --git a/Tests/test_file_libtiff_small.py b/Tests/test_file_libtiff_small.py index 617e1e89c..65ba80c20 100644 --- a/Tests/test_file_libtiff_small.py +++ b/Tests/test_file_libtiff_small.py @@ -32,7 +32,7 @@ class TestFileLibTiffSmall(LibTiffTestCase): s = BytesIO() with open(test_file, "rb") as f: s.write(f.read()) - s.seek(0) + s.seek(0) with Image.open(s) as im: assert im.size == (128, 128) self._assert_noerr(tmp_path, im) From ccc4668d4ed27754a09f819462732dc42c584fc0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 17 Apr 2025 08:04:34 +1000 Subject: [PATCH 072/268] Updated harfbuzz to 11.1.0 --- .github/workflows/wheels-dependencies.sh | 2 +- winbuild/build_prepare.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index 0df22c4cb..d53cf059b 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -38,7 +38,7 @@ ARCHIVE_SDIR=pillow-depends-main # Package versions for fresh source builds FREETYPE_VERSION=2.13.3 -HARFBUZZ_VERSION=11.0.1 +HARFBUZZ_VERSION=11.1.0 LIBPNG_VERSION=1.6.47 JPEGTURBO_VERSION=3.1.0 OPENJPEG_VERSION=2.5.3 diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 3e75c1411..17fc37572 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -113,7 +113,7 @@ V = { "BROTLI": "1.1.0", "FREETYPE": "2.13.3", "FRIBIDI": "1.0.16", - "HARFBUZZ": "11.0.1", + "HARFBUZZ": "11.1.0", "JPEGTURBO": "3.1.0", "LCMS2": "2.17", "LIBAVIF": "1.2.1", From cccc07269ae60226f0bb6475970d6fab255538b4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 17 Apr 2025 19:23:24 +1000 Subject: [PATCH 073/268] Do not justify a single word --- .../multiline_text_justify_single_word.png | Bin 0 -> 2436 bytes Tests/test_imagefont.py | 12 ++++++ src/PIL/ImageDraw.py | 36 +++++++++--------- 3 files changed, 31 insertions(+), 17 deletions(-) create mode 100644 Tests/images/multiline_text_justify_single_word.png diff --git a/Tests/images/multiline_text_justify_single_word.png b/Tests/images/multiline_text_justify_single_word.png new file mode 100644 index 0000000000000000000000000000000000000000..e124e91f5e34d64b002b06f5c66fc72ddb80a31c GIT binary patch literal 2436 zcmY*beLRzEA0J0yB(}_ud7mN7_>h-jBJ%#S6r0e=A!LqpWpoYZ?RWh!4&n+g#Fg+L<5j4t5r#GU+=GKvJekb!n|JNhWUPt9 zc^|#kHd}rgFLU3^f{E8JRg_;!n-Rw$$N!R6_4e#U2Z5kCJ=I%2#>%{yn3%dzS#+Wu zis~bqn=&_Q5o#_&bJF&+0JS885_d(Tw!_WYY<6l#W@_pK4rhf=fsPINA(y8FMck}S zEgcDgW>S}9iBZ(Fz{iY5M4o*(m+Psr&3F;BPU)jU z;U5t#$D5vHtlf=C;8YAqOpJ~7g)J>DWHOmTq0~}-I6$6o4n^Gxta3SBg(~aU(b3uY zJ25soS`USKo~mC^P|#8WL^uFb>PV@ptDBjbvGmt;v+rDfCl+%v){>kRCteYk@$X zJP80N#BWA{m6X_PUO7ikj!VkjnfPPJDkFNu1L9(dQ~Lbn%a>_8PmZt7`up!$9V+xN zu;$$5LW|?R>+XNupL?Mj_8NJIt0^9L2dZ4}3qO^VsO7r7|NPn6s*cT8BgasEVq;?1 zXWrVmRBbOy0y~IVpGDS5wB(}2f>}ismC<-xv@-Y7Mi@cgj=lSnqLNZ#LP7_k)42m{C8iFG~*YPyTz|nw=f0 z3#`)7v9r1P%+#|RV_pCbMMZ%mlGRn7K7?YcB^|Eyoeh41n4}Ivb#<#~v<98q<>i_h z8gaJ}QBhG>+;R1<73E}e-4s+*=A}~qz(B#XS-KLU=nWuqEvW76^Qaex86y`CGzxrj;ip{bdf)!8A#n%l+2s!(YD zEkIO31LWL`7#o`oqNN=VlX>*eOrBth?s7@XR3H$<#l|ungGm+a_4V;nknK7Z zZ=(>vO5)-qBO@b&gF)xduXJD9up>=0={VTiYrx@vIyieZXVp%qVd-=_-b~oj(=$Ab z!D2T7YI}DT7Wy7LRu+7bf71FYF9r>75QiHWpF4?-9YCb8cvDwb zZb!%Z#FGpg8=J<)M!=#)?ZQQp(}d2`7a9G%=OeW|Fm*A zItNp70_v6IWN#dXs;dh{BGK4bLK9-Yib-joC9ypRA4w#(6O&J$Hod4B@jX_yr7v=s zl)(N`aMPYN5l!$m8qTX!ABWHHptd09x@P{H5+5Ibbf>A)16(gG>ZLWq8|rIocXdS; z_kSc>YGeeXQ!M}4$@o)lhpLQ>%*&TAftoQoI;x_gl4M6fmf}>;%?|2IqZ{$}s?B-W zp8huv6W_4*>bl^=!VHe)x($ww&P-3AYGN>%%%!DNts7+CrWrVr_gX!xkllq?(S~+y@-R3j!WyANv;eA<2h9C z0FTED3kzHB#Jn?nydSHOpPvudqN#w-KhQ21zApiC2&{KyWyOq|keT_owl;Pm3xpF8 zoqt)9JMz5TCQkJWTG{Y-e`ZJ{TKUb$NRwOE=#y+{i`}<9TmDbST5fJu=5S>GwU_y> z{HBbjPAM|5S(_|_lH)|;RSjcsxIasdjWoo%TL)g5hoCeviZ9 zXjq+SWwWjCL7$HO_%327OP&>cSXGXFoERKzZEI@;D^v?abtZ#mt}AY(=bvyjed-+E zyrHKvyHYCqXQ^0h{`&Rn3(i?*$Rl$myJ#j{Nm5dh@>QNO5(%MrKq%9H|6N{E!uIK| zZzi<;My1AV)&Ldi None: + im = Image.new("RGB", (185, 65)) + draw = ImageDraw.Draw(im) + draw.multiline_text( + (0, 0), "hey you\nyou are awesome\nthis", font=font, align="justify" + ) + + assert_image_equal_tofile(im, "Tests/images/multiline_text_justify_single_word.png") + + def test_unknown_align(font: ImageFont.FreeTypeFont) -> None: im = Image.new(mode="RGB", size=(300, 100)) draw = ImageDraw.Draw(im) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index e6c7b0298..e865f4516 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -772,24 +772,26 @@ class ImageDraw: if align == "justify" and width_difference != 0: words = line.split(" " if isinstance(text, str) else b" ") - word_widths = [ - self.textlength( - word, - font, - direction=direction, - features=features, - language=language, - embedded_color=embedded_color, - ) - for word in words - ] - width_difference = max_width - sum(word_widths) - for i, word in enumerate(words): - parts.append(((left, top), word)) - left += word_widths[i] + width_difference / (len(words) - 1) - else: - parts.append(((left, top), line)) + if len(words) > 1: + word_widths = [ + self.textlength( + word, + font, + direction=direction, + features=features, + language=language, + embedded_color=embedded_color, + ) + for word in words + ] + width_difference = max_width - sum(word_widths) + for i, word in enumerate(words): + parts.append(((left, top), word)) + left += word_widths[i] + width_difference / (len(words) - 1) + top += line_spacing + continue + parts.append(((left, top), line)) top += line_spacing return font, anchor, parts From b955cee725da2613b34145eea56227c57ec414d4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 17 Apr 2025 19:36:52 +1000 Subject: [PATCH 074/268] Do not justify last line --- .../images/multiline_text_justify_last_line.png | Bin 0 -> 3581 bytes .../multiline_text_justify_single_word.png | Bin 2436 -> 0 bytes Tests/test_imagefont.py | 11 +++++++---- src/PIL/ImageDraw.py | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 Tests/images/multiline_text_justify_last_line.png delete mode 100644 Tests/images/multiline_text_justify_single_word.png diff --git a/Tests/images/multiline_text_justify_last_line.png b/Tests/images/multiline_text_justify_last_line.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc1afd72969c4a476cabc5a074154994a222a94 GIT binary patch literal 3581 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 literal 0 HcmV?d00001 diff --git a/Tests/images/multiline_text_justify_single_word.png b/Tests/images/multiline_text_justify_single_word.png deleted file mode 100644 index e124e91f5e34d64b002b06f5c66fc72ddb80a31c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2436 zcmY*beLRzEA0J0yB(}_ud7mN7_>h-jBJ%#S6r0e=A!LqpWpoYZ?RWh!4&n+g#Fg+L<5j4t5r#GU+=GKvJekb!n|JNhWUPt9 zc^|#kHd}rgFLU3^f{E8JRg_;!n-Rw$$N!R6_4e#U2Z5kCJ=I%2#>%{yn3%dzS#+Wu zis~bqn=&_Q5o#_&bJF&+0JS885_d(Tw!_WYY<6l#W@_pK4rhf=fsPINA(y8FMck}S zEgcDgW>S}9iBZ(Fz{iY5M4o*(m+Psr&3F;BPU)jU z;U5t#$D5vHtlf=C;8YAqOpJ~7g)J>DWHOmTq0~}-I6$6o4n^Gxta3SBg(~aU(b3uY zJ25soS`USKo~mC^P|#8WL^uFb>PV@ptDBjbvGmt;v+rDfCl+%v){>kRCteYk@$X zJP80N#BWA{m6X_PUO7ikj!VkjnfPPJDkFNu1L9(dQ~Lbn%a>_8PmZt7`up!$9V+xN zu;$$5LW|?R>+XNupL?Mj_8NJIt0^9L2dZ4}3qO^VsO7r7|NPn6s*cT8BgasEVq;?1 zXWrVmRBbOy0y~IVpGDS5wB(}2f>}ismC<-xv@-Y7Mi@cgj=lSnqLNZ#LP7_k)42m{C8iFG~*YPyTz|nw=f0 z3#`)7v9r1P%+#|RV_pCbMMZ%mlGRn7K7?YcB^|Eyoeh41n4}Ivb#<#~v<98q<>i_h z8gaJ}QBhG>+;R1<73E}e-4s+*=A}~qz(B#XS-KLU=nWuqEvW76^Qaex86y`CGzxrj;ip{bdf)!8A#n%l+2s!(YD zEkIO31LWL`7#o`oqNN=VlX>*eOrBth?s7@XR3H$<#l|ungGm+a_4V;nknK7Z zZ=(>vO5)-qBO@b&gF)xduXJD9up>=0={VTiYrx@vIyieZXVp%qVd-=_-b~oj(=$Ab z!D2T7YI}DT7Wy7LRu+7bf71FYF9r>75QiHWpF4?-9YCb8cvDwb zZb!%Z#FGpg8=J<)M!=#)?ZQQp(}d2`7a9G%=OeW|Fm*A zItNp70_v6IWN#dXs;dh{BGK4bLK9-Yib-joC9ypRA4w#(6O&J$Hod4B@jX_yr7v=s zl)(N`aMPYN5l!$m8qTX!ABWHHptd09x@P{H5+5Ibbf>A)16(gG>ZLWq8|rIocXdS; z_kSc>YGeeXQ!M}4$@o)lhpLQ>%*&TAftoQoI;x_gl4M6fmf}>;%?|2IqZ{$}s?B-W zp8huv6W_4*>bl^=!VHe)x($ww&P-3AYGN>%%%!DNts7+CrWrVr_gX!xkllq?(S~+y@-R3j!WyANv;eA<2h9C z0FTED3kzHB#Jn?nydSHOpPvudqN#w-KhQ21zApiC2&{KyWyOq|keT_owl;Pm3xpF8 zoqt)9JMz5TCQkJWTG{Y-e`ZJ{TKUb$NRwOE=#y+{i`}<9TmDbST5fJu=5S>GwU_y> z{HBbjPAM|5S(_|_lH)|;RSjcsxIasdjWoo%TL)g5hoCeviZ9 zXjq+SWwWjCL7$HO_%327OP&>cSXGXFoERKzZEI@;D^v?abtZ#mt}AY(=bvyjed-+E zyrHKvyHYCqXQ^0h{`&Rn3(i?*$Rl$myJ#j{Nm5dh@>QNO5(%MrKq%9H|6N{E!uIK| zZzi<;My1AV)&Ldi None: - im = Image.new("RGB", (185, 65)) + im = Image.new("RGB", (280, 60)) draw = ImageDraw.Draw(im) draw.multiline_text( - (0, 0), "hey you\nyou are awesome\nthis", font=font, align="justify" + (0, 0), + "hey you you are awesome\nthis\nlooks awkward", + font=font, + align="justify", ) - assert_image_equal_tofile(im, "Tests/images/multiline_text_justify_single_word.png") + assert_image_equal_tofile(im, "Tests/images/multiline_text_justify_last_line.png") def test_unknown_align(font: ImageFont.FreeTypeFont) -> None: diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index e865f4516..47ae575c9 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -770,7 +770,7 @@ class ImageDraw: msg = 'align must be "left", "center", "right" or "justify"' raise ValueError(msg) - if align == "justify" and width_difference != 0: + if align == "justify" and width_difference != 0 and idx != len(lines) - 1: words = line.split(" " if isinstance(text, str) else b" ") if len(words) > 1: word_widths = [ From bc05a88ce664dff5eee1bb024e4922d86ad86f96 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 17 Apr 2025 20:56:02 +1000 Subject: [PATCH 075/268] Anchor left when justifying words --- .../images/multiline_text_justify_anchor.png | Bin 0 -> 11282 bytes .../multiline_text_justify_last_line.png | Bin 3581 -> 0 bytes Tests/test_imagefont.py | 20 +++++----- src/PIL/ImageDraw.py | 37 ++++++++++-------- 4 files changed, 32 insertions(+), 25 deletions(-) create mode 100644 Tests/images/multiline_text_justify_anchor.png delete mode 100644 Tests/images/multiline_text_justify_last_line.png diff --git a/Tests/images/multiline_text_justify_anchor.png b/Tests/images/multiline_text_justify_anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..6d3fb421d1832e82dcfba255891240cf2aa5b92d GIT binary patch literal 11282 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 ^Ow{8V4_rXU6&3`dV6!`l3PEJl{WwF}! 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 HzUTh}m8~Dn literal 0 HcmV?d00001 diff --git a/Tests/images/multiline_text_justify_last_line.png b/Tests/images/multiline_text_justify_last_line.png deleted file mode 100644 index bcc1afd72969c4a476cabc5a074154994a222a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3581 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 diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index f99275925..fd622c945 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -267,19 +267,21 @@ def test_render_multiline_text_align( assert_image_similar_tofile(im, f"Tests/images/multiline_text{ext}.png", 0.01) -def test_render_multiline_text_align_justify_last_line( +def test_render_multiline_text_justify_anchor( font: ImageFont.FreeTypeFont, ) -> None: - im = Image.new("RGB", (280, 60)) + im = Image.new("RGB", (280, 240)) draw = ImageDraw.Draw(im) - draw.multiline_text( - (0, 0), - "hey you you are awesome\nthis\nlooks awkward", - font=font, - align="justify", - ) + for xy, anchor in (((0, 0), "la"), ((140, 80), "ma"), ((280, 160), "ra")): + draw.multiline_text( + xy, + "hey you you are awesome\nthis looks awkward\nthis\nlooks awkward", + font=font, + anchor=anchor, + align="justify", + ) - assert_image_equal_tofile(im, "Tests/images/multiline_text_justify_last_line.png") + assert_image_equal_tofile(im, "Tests/images/multiline_text_justify_anchor.png") def test_unknown_align(font: ImageFont.FreeTypeFont) -> None: diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 47ae575c9..d35cda602 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -702,8 +702,7 @@ class ImageDraw: font_size: float | None, ) -> tuple[ ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont, - str, - list[tuple[tuple[float, float], AnyStr]], + list[tuple[tuple[float, float], str, AnyStr]], ]: if direction == "ttb": msg = "ttb direction is unsupported for multiline text" @@ -753,13 +752,7 @@ class ImageDraw: left = xy[0] width_difference = max_width - widths[idx] - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter + # align by align parameter if align in ("left", "justify"): pass elif align == "center": @@ -773,6 +766,12 @@ class ImageDraw: if align == "justify" and width_difference != 0 and idx != len(lines) - 1: words = line.split(" " if isinstance(text, str) else b" ") if len(words) > 1: + # align left by anchor + if anchor[0] == "m": + left -= max_width / 2.0 + elif anchor[0] == "r": + left -= max_width + word_widths = [ self.textlength( word, @@ -784,17 +783,23 @@ class ImageDraw: ) for word in words ] + word_anchor = "l" + anchor[1] width_difference = max_width - sum(word_widths) for i, word in enumerate(words): - parts.append(((left, top), word)) + parts.append(((left, top), word_anchor, word)) left += word_widths[i] + width_difference / (len(words) - 1) top += line_spacing continue - parts.append(((left, top), line)) + # align left by anchor + if anchor[0] == "m": + left -= width_difference / 2.0 + elif anchor[0] == "r": + left -= width_difference + parts.append(((left, top), anchor, line)) top += line_spacing - return font, anchor, parts + return font, parts def multiline_text( self, @@ -819,7 +824,7 @@ class ImageDraw: *, font_size: float | None = None, ) -> None: - font, anchor, lines = self._prepare_multiline_text( + font, lines = self._prepare_multiline_text( xy, text, font, @@ -834,7 +839,7 @@ class ImageDraw: font_size, ) - for xy, line in lines: + for xy, anchor, line in lines: self.text( xy, line, @@ -949,7 +954,7 @@ class ImageDraw: *, font_size: float | None = None, ) -> tuple[float, float, float, float]: - font, anchor, lines = self._prepare_multiline_text( + font, lines = self._prepare_multiline_text( xy, text, font, @@ -966,7 +971,7 @@ class ImageDraw: bbox: tuple[float, float, float, float] | None = None - for xy, line in lines: + for xy, anchor, line in lines: bbox_line = self.textbbox( xy, line, From 3d77723a0c9d245f61e124c58a11e3a1779b3c0d Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 17 Apr 2025 21:42:42 +0100 Subject: [PATCH 076/268] Added arrow support for a flat array of 4*uint8 for image32 modes --- Tests/test_pyarrow.py | 66 +++++++++++++++++++++++++++++++++++++--- src/libImaging/Storage.c | 14 +++++++++ 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index ece9f8f26..e7f2bc5f9 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -18,18 +18,25 @@ TEST_IMAGE_SIZE = (10, 10) def _test_img_equals_pyarray( - img: Image.Image, arr: Any, mask: list[int] | None + img: Image.Image, arr: Any, mask: list[int] | None, elts_per_pixel: int = 1 ) -> None: - assert img.height * img.width == len(arr) + assert img.height * img.width * elts_per_pixel == len(arr) px = img.load() assert px is not None + if elts_per_pixel > 1 and mask is None: + # have to do element wise comparison when we're comparing + # flattened r,g,b,a to a pixel. + mask = list(range(elts_per_pixel)) for x in range(0, img.size[0], int(img.size[0] / 10)): for y in range(0, img.size[1], int(img.size[1] / 10)): if mask: + pixel = px[x, y] + assert isinstance(pixel, tuple) for ix, elt in enumerate(mask): - pixel = px[x, y] - assert isinstance(pixel, tuple) - assert pixel[ix] == arr[y * img.width + x].as_py()[elt] + if elts_per_pixel == 1: + assert pixel[ix] == arr[y * img.width + x].as_py()[elt] + else: + assert pixel[ix] == arr[(y * img.width + x) * elts_per_pixel + elt].as_py() else: assert_deep_equal(px[x, y], arr[y * img.width + x].as_py()) @@ -110,3 +117,52 @@ def test_lifetime2() -> None: px = img2.load() assert px # make mypy happy assert isinstance(px[0, 0], int) + + +UINT_ARR = ( + fl_uint8_4_type, + [1,2,3,4], + 1 +) +UINT = ( + pyarrow.uint8(), + 3, + 4 +) + + + +@pytest.mark.parametrize( + "mode, data_tp, mask", + ( + ("L", (pyarrow.uint8(), 3, 1), None), + ("I", (pyarrow.int32(), 1<<24, 1), None), + ("F", (pyarrow.float32(), 3.14159, 1), None), + ("LA", UINT_ARR, [0, 3]), + ("LA", UINT, [0, 3]), + ("RGB", UINT_ARR, [0, 1, 2]), + ("RGBA", UINT_ARR, None), + ("RGBA", UINT_ARR, None), + ("CMYK", UINT_ARR, None), + ("YCbCr", UINT_ARR, [0, 1, 2]), + ("HSV", UINT_ARR, [0, 1, 2]), + ("RGB", UINT, [0, 1, 2]), + ("RGBA", UINT, None), + ("RGBA", UINT, None), + ("CMYK", UINT, None), + ("YCbCr", UINT, [0, 1, 2]), + ("HSV", UINT, [0, 1, 2]), + ), +) +def test_fromarray(mode: str, + data_tp: tuple, + mask:list[int] | None) -> None: + (dtype, + elt, + elts_per_pixel) = data_tp + + ct_pixels = TEST_IMAGE_SIZE[0] * TEST_IMAGE_SIZE[1] + arr = pyarrow.array([elt]*(ct_pixels*elts_per_pixel), type=dtype) + img = Image.fromarrow(arr, mode, TEST_IMAGE_SIZE) + + _test_img_equals_pyarray(img, arr, mask, elts_per_pixel) diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 4fa4ecd1c..7f8d9c4a0 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -723,6 +723,8 @@ ImagingNewArrow( int64_t pixels = (int64_t)xsize * (int64_t)ysize; // fmt:off // don't reformat this + // stored as a single array, one element per pixel, either single band + // or multiband, where each pixel is an I32. if (((strcmp(schema->format, "I") == 0 // int32 && im->pixelsize == 4 // 4xchar* storage && im->bands >= 2) // INT32 into any INT32 Storage mode @@ -735,6 +737,7 @@ ImagingNewArrow( return im; } } + // Stored as [[r,g,b,a],....] if (strcmp(schema->format, "+w:4") == 0 // 4 up array && im->pixelsize == 4 // storage as 32 bpc && schema->n_children > 0 // make sure schema is well formed. @@ -750,6 +753,17 @@ ImagingNewArrow( return im; } } + // Stored as [r,g,b,a,r,g,b,a....] + if (strcmp(schema->format, "C") == 0 // uint8 + && im->pixelsize == 4 // storage as 32 bpc + && schema->n_children == 0 // make sure schema is well formed. + && strcmp(im->arrow_band_format, "C") == 0 // Expected Format + && 4* pixels == external_array->length) { // expected length + // single flat array, interleaved storage. + if (ImagingBorrowArrow(im, external_array, 1, array_capsule)) { + return im; + } + } // fmt: on ImagingDelete(im); return NULL; From c729d4e2085b96662b89ad09f99327f4516ce4ed Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 17 Apr 2025 22:16:27 +0100 Subject: [PATCH 077/268] Test uint32 array creation -> image32 images --- Tests/test_pyarrow.py | 61 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index e7f2bc5f9..92bc4c807 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -9,6 +9,7 @@ from PIL import Image from .helper import ( assert_deep_equal, assert_image_equal, + is_big_endian, hopper, ) @@ -41,6 +42,34 @@ def _test_img_equals_pyarray( assert_deep_equal(px[x, y], arr[y * img.width + x].as_py()) +def _test_img_equals_int32_pyarray( + img: Image.Image, arr: Any, mask: list[int] | None, elts_per_pixel: int = 1 +) -> None: + assert img.height * img.width * elts_per_pixel == len(arr) + px = img.load() + assert px is not None + if mask is None: + # have to do element wise comparison when we're comparing + # flattened rgba in an uint32 to a pixel. + mask = list(range(elts_per_pixel)) + for x in range(0, img.size[0], int(img.size[0] / 10)): + for y in range(0, img.size[1], int(img.size[1] / 10)): + pixel = px[x, y] + assert isinstance(pixel, tuple) + arr_pixel_int = arr[y * img.width + x].as_py() + arr_pixel_tuple = ( + arr_pixel_int % 256, + (arr_pixel_int // 256) % 256, + (arr_pixel_int // 256**2) % 256, + (arr_pixel_int // 256**3), + ) + if is_big_endian(): + arr_pixel_tuple = arr_pixel_tuple[::-1] + + for ix, elt in enumerate(mask): + assert pixel[ix] == arr_pixel_tuple[elt] + + # really hard to get a non-nullable list type fl_uint8_4_type = pyarrow.field( "_", pyarrow.list_(pyarrow.field("_", pyarrow.uint8()).with_nullable(False), 4) @@ -129,7 +158,11 @@ UINT = ( 3, 4 ) - +INT32 = ( + pyarrow.uint32(), + 0xabcdef45, + 1 +) @pytest.mark.parametrize( @@ -166,3 +199,29 @@ def test_fromarray(mode: str, img = Image.fromarrow(arr, mode, TEST_IMAGE_SIZE) _test_img_equals_pyarray(img, arr, mask, elts_per_pixel) + + +@pytest.mark.parametrize( + "mode, data_tp, mask", + ( + ("LA", INT32, [0, 3]), + ("RGB", INT32, [0, 1, 2]), + ("RGBA", INT32, None), + ("RGBA", INT32, None), + ("CMYK", INT32, None), + ("YCbCr", INT32, [0, 1, 2]), + ("HSV", INT32, [0, 1, 2]), + ), +) +def test_from_int32array(mode: str, + data_tp: tuple, + mask:list[int] | None) -> None: + (dtype, + elt, + elts_per_pixel) = data_tp + + ct_pixels = TEST_IMAGE_SIZE[0] * TEST_IMAGE_SIZE[1] + arr = pyarrow.array([elt]*(ct_pixels*elts_per_pixel), type=dtype) + img = Image.fromarrow(arr, mode, TEST_IMAGE_SIZE) + + _test_img_equals_int32_pyarray(img, arr, mask, elts_per_pixel) From ac500460dfc6ddaa7c0660de3f0233d05e207852 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 17 Apr 2025 22:22:31 +0100 Subject: [PATCH 078/268] lint --- Tests/test_pyarrow.py | 44 ++++++++++++++++------------------------ src/libImaging/Storage.c | 10 ++++----- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index 92bc4c807..bcdd7ddc9 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -9,8 +9,8 @@ from PIL import Image from .helper import ( assert_deep_equal, assert_image_equal, - is_big_endian, hopper, + is_big_endian, ) pyarrow = pytest.importorskip("pyarrow", reason="PyArrow not installed") @@ -37,7 +37,10 @@ def _test_img_equals_pyarray( if elts_per_pixel == 1: assert pixel[ix] == arr[y * img.width + x].as_py()[elt] else: - assert pixel[ix] == arr[(y * img.width + x) * elts_per_pixel + elt].as_py() + assert ( + pixel[ix] + == arr[(y * img.width + x) * elts_per_pixel + elt].as_py() + ) else: assert_deep_equal(px[x, y], arr[y * img.width + x].as_py()) @@ -169,33 +172,27 @@ INT32 = ( "mode, data_tp, mask", ( ("L", (pyarrow.uint8(), 3, 1), None), - ("I", (pyarrow.int32(), 1<<24, 1), None), + ("I", (pyarrow.int32(), 1 << 24, 1), None), ("F", (pyarrow.float32(), 3.14159, 1), None), ("LA", UINT_ARR, [0, 3]), ("LA", UINT, [0, 3]), ("RGB", UINT_ARR, [0, 1, 2]), ("RGBA", UINT_ARR, None), - ("RGBA", UINT_ARR, None), ("CMYK", UINT_ARR, None), - ("YCbCr", UINT_ARR, [0, 1, 2]), - ("HSV", UINT_ARR, [0, 1, 2]), + ("YCbCr", UINT_ARR, [0, 1, 2]), + ("HSV", UINT_ARR, [0, 1, 2]), ("RGB", UINT, [0, 1, 2]), ("RGBA", UINT, None), - ("RGBA", UINT, None), ("CMYK", UINT, None), - ("YCbCr", UINT, [0, 1, 2]), - ("HSV", UINT, [0, 1, 2]), + ("YCbCr", UINT, [0, 1, 2]), + ("HSV", UINT, [0, 1, 2]), ), ) -def test_fromarray(mode: str, - data_tp: tuple, - mask:list[int] | None) -> None: - (dtype, - elt, - elts_per_pixel) = data_tp +def test_fromarray(mode: str, data_tp: tuple, mask: list[int] | None) -> None: + (dtype, elt, elts_per_pixel) = data_tp ct_pixels = TEST_IMAGE_SIZE[0] * TEST_IMAGE_SIZE[1] - arr = pyarrow.array([elt]*(ct_pixels*elts_per_pixel), type=dtype) + arr = pyarrow.array([elt] * (ct_pixels * elts_per_pixel), type=dtype) img = Image.fromarrow(arr, mode, TEST_IMAGE_SIZE) _test_img_equals_pyarray(img, arr, mask, elts_per_pixel) @@ -207,21 +204,16 @@ def test_fromarray(mode: str, ("LA", INT32, [0, 3]), ("RGB", INT32, [0, 1, 2]), ("RGBA", INT32, None), - ("RGBA", INT32, None), ("CMYK", INT32, None), - ("YCbCr", INT32, [0, 1, 2]), - ("HSV", INT32, [0, 1, 2]), + ("YCbCr", INT32, [0, 1, 2]), + ("HSV", INT32, [0, 1, 2]), ), ) -def test_from_int32array(mode: str, - data_tp: tuple, - mask:list[int] | None) -> None: - (dtype, - elt, - elts_per_pixel) = data_tp +def test_from_int32array(mode: str, data_tp: tuple, mask: list[int] | None) -> None: + (dtype, elt, elts_per_pixel) = data_tp ct_pixels = TEST_IMAGE_SIZE[0] * TEST_IMAGE_SIZE[1] - arr = pyarrow.array([elt]*(ct_pixels*elts_per_pixel), type=dtype) + arr = pyarrow.array([elt] * (ct_pixels * elts_per_pixel), type=dtype) img = Image.fromarrow(arr, mode, TEST_IMAGE_SIZE) _test_img_equals_int32_pyarray(img, arr, mask, elts_per_pixel) diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 7f8d9c4a0..2c57165c1 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -754,11 +754,11 @@ ImagingNewArrow( } } // Stored as [r,g,b,a,r,g,b,a....] - if (strcmp(schema->format, "C") == 0 // uint8 - && im->pixelsize == 4 // storage as 32 bpc - && schema->n_children == 0 // make sure schema is well formed. - && strcmp(im->arrow_band_format, "C") == 0 // Expected Format - && 4* pixels == external_array->length) { // expected length + if (strcmp(schema->format, "C") == 0 // uint8 + && im->pixelsize == 4 // storage as 32 bpc + && schema->n_children == 0 // make sure schema is well formed. + && strcmp(im->arrow_band_format, "C") == 0 // Expected Format + && 4 * pixels == external_array->length) { // expected length // single flat array, interleaved storage. if (ImagingBorrowArrow(im, external_array, 1, array_capsule)) { return im; From 00ae9dda35e512e3bdfa69daff1625fd006cff21 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 18 Apr 2025 18:49:11 +1000 Subject: [PATCH 079/268] Changed harfbuzz buildtype to minsize --- .github/workflows/wheels-dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index d53cf059b..a4592871f 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -92,7 +92,7 @@ function build_harfbuzz { local out_dir=$(fetch_unpack https://github.com/harfbuzz/harfbuzz/releases/download/$HARFBUZZ_VERSION/harfbuzz-$HARFBUZZ_VERSION.tar.xz harfbuzz-$HARFBUZZ_VERSION.tar.xz) (cd $out_dir \ - && meson setup build --prefix=$BUILD_PREFIX --libdir=$BUILD_PREFIX/lib --buildtype=release -Dfreetype=enabled -Dglib=disabled -Dtests=disabled) + && meson setup build --prefix=$BUILD_PREFIX --libdir=$BUILD_PREFIX/lib --buildtype=minsize -Dfreetype=enabled -Dglib=disabled -Dtests=disabled) (cd $out_dir/build \ && meson install) touch harfbuzz-stamp From cf48bbf0c48f871ecd62fb473611a7e2552580d9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 19 Apr 2025 20:26:03 +1000 Subject: [PATCH 080/268] Removed indentation from list --- docs/handbook/concepts.rst | 44 +++++++++++++++--------------- docs/reference/block_allocator.rst | 18 ++++++------ 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/docs/handbook/concepts.rst b/docs/handbook/concepts.rst index 7da1078c1..fe874a740 100644 --- a/docs/handbook/concepts.rst +++ b/docs/handbook/concepts.rst @@ -30,35 +30,35 @@ image. Each pixel uses the full range of the bit depth. So a 1-bit pixel has a r INT32 and a 32-bit floating point pixel has the range of FLOAT32. The current release supports the following standard modes: - * ``1`` (1-bit pixels, black and white, stored with one pixel per byte) - * ``L`` (8-bit pixels, grayscale) - * ``P`` (8-bit pixels, mapped to any other mode using a color palette) - * ``RGB`` (3x8-bit pixels, true color) - * ``RGBA`` (4x8-bit pixels, true color with transparency mask) - * ``CMYK`` (4x8-bit pixels, color separation) - * ``YCbCr`` (3x8-bit pixels, color video format) +* ``1`` (1-bit pixels, black and white, stored with one pixel per byte) +* ``L`` (8-bit pixels, grayscale) +* ``P`` (8-bit pixels, mapped to any other mode using a color palette) +* ``RGB`` (3x8-bit pixels, true color) +* ``RGBA`` (4x8-bit pixels, true color with transparency mask) +* ``CMYK`` (4x8-bit pixels, color separation) +* ``YCbCr`` (3x8-bit pixels, color video format) - * Note that this refers to the JPEG, and not the ITU-R BT.2020, standard + * Note that this refers to the JPEG, and not the ITU-R BT.2020, standard - * ``LAB`` (3x8-bit pixels, the L*a*b color space) - * ``HSV`` (3x8-bit pixels, Hue, Saturation, Value color space) +* ``LAB`` (3x8-bit pixels, the L*a*b color space) +* ``HSV`` (3x8-bit pixels, Hue, Saturation, Value color space) - * Hue's range of 0-255 is a scaled version of 0 degrees <= Hue < 360 degrees + * Hue's range of 0-255 is a scaled version of 0 degrees <= Hue < 360 degrees - * ``I`` (32-bit signed integer pixels) - * ``F`` (32-bit floating point pixels) +* ``I`` (32-bit signed integer pixels) +* ``F`` (32-bit floating point pixels) Pillow also provides limited support for a few additional modes, including: - * ``LA`` (L with alpha) - * ``PA`` (P with alpha) - * ``RGBX`` (true color with padding) - * ``RGBa`` (true color with premultiplied alpha) - * ``La`` (L with premultiplied alpha) - * ``I;16`` (16-bit unsigned integer pixels) - * ``I;16L`` (16-bit little endian unsigned integer pixels) - * ``I;16B`` (16-bit big endian unsigned integer pixels) - * ``I;16N`` (16-bit native endian unsigned integer pixels) +* ``LA`` (L with alpha) +* ``PA`` (P with alpha) +* ``RGBX`` (true color with padding) +* ``RGBa`` (true color with premultiplied alpha) +* ``La`` (L with premultiplied alpha) +* ``I;16`` (16-bit unsigned integer pixels) +* ``I;16L`` (16-bit little endian unsigned integer pixels) +* ``I;16B`` (16-bit big endian unsigned integer pixels) +* ``I;16N`` (16-bit native endian unsigned integer pixels) Premultiplied alpha is where the values for each other channel have been multiplied by the alpha. For example, an RGBA pixel of ``(10, 20, 30, 127)`` diff --git a/docs/reference/block_allocator.rst b/docs/reference/block_allocator.rst index f4d27e24e..c6be5b7e6 100644 --- a/docs/reference/block_allocator.rst +++ b/docs/reference/block_allocator.rst @@ -37,14 +37,14 @@ fresh allocation. This caching of free blocks is currently disabled by default, but can be enabled and tweaked using three environment variables: - * ``PILLOW_ALIGNMENT``, in bytes. Specifies the alignment of memory - allocations. Valid values are powers of 2 between 1 and - 128, inclusive. Defaults to 1. +* ``PILLOW_ALIGNMENT``, in bytes. Specifies the alignment of memory + allocations. Valid values are powers of 2 between 1 and + 128, inclusive. Defaults to 1. - * ``PILLOW_BLOCK_SIZE``, in bytes, K, or M. Specifies the maximum - block size for ``ImagingAllocateArray``. Valid values are - integers, with an optional ``k`` or ``m`` suffix. Defaults to 16M. +* ``PILLOW_BLOCK_SIZE``, in bytes, K, or M. Specifies the maximum + block size for ``ImagingAllocateArray``. Valid values are + integers, with an optional ``k`` or ``m`` suffix. Defaults to 16M. - * ``PILLOW_BLOCKS_MAX`` Specifies the number of freed blocks to - retain to fill future memory requests. Any freed blocks over this - threshold will be returned to the OS immediately. Defaults to 0. +* ``PILLOW_BLOCKS_MAX`` Specifies the number of freed blocks to + retain to fill future memory requests. Any freed blocks over this + threshold will be returned to the OS immediately. Defaults to 0. From 03e7871afdb8f558cddc10cc9013e1db143298d9 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sun, 20 Apr 2025 00:18:01 +0300 Subject: [PATCH 081/268] Add `make [-C docs] htmllive` to rebuild and reload HTML files (#8913) Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Makefile | 5 +++++ docs/Guardfile | 10 ---------- docs/Makefile | 9 +++++---- pyproject.toml | 1 + 4 files changed, 11 insertions(+), 14 deletions(-) delete mode 100755 docs/Guardfile diff --git a/Makefile b/Makefile index 53164b08a..5a8152454 100644 --- a/Makefile +++ b/Makefile @@ -23,6 +23,10 @@ doc html: htmlview: $(MAKE) -C docs htmlview +.PHONY: htmllive +htmllive: + $(MAKE) -C docs htmllive + .PHONY: doccheck doccheck: $(MAKE) doc @@ -43,6 +47,7 @@ help: @echo " docserve run an HTTP server on the docs directory" @echo " html make HTML docs" @echo " htmlview open the index page built by the html target in your browser" + @echo " htmllive rebuild and reload HTML files in your browser" @echo " install make and install" @echo " install-coverage make and install with C coverage" @echo " lint run the lint checks" diff --git a/docs/Guardfile b/docs/Guardfile deleted file mode 100755 index 16a891a73..000000000 --- a/docs/Guardfile +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python3 -from __future__ import annotations - -from livereload.compiler import shell -from livereload.task import Task - -Task.add("*.rst", shell("make html")) -Task.add("*/*.rst", shell("make html")) -Task.add("Makefile", shell("make html")) -Task.add("conf.py", shell("make html")) diff --git a/docs/Makefile b/docs/Makefile index e90af0519..4412fc806 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -20,8 +20,8 @@ help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " htmlview to open the index page built by the html target in your browser" + @echo " htmllive to rebuild and reload HTML files in your browser" @echo " serve to start a local server for viewing docs" - @echo " livehtml to start a local server for viewing docs and auto-reload on change" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @@ -201,9 +201,10 @@ doctest: htmlview: html $(PYTHON) -c "import os, webbrowser; webbrowser.open('file://' + os.path.realpath('$(BUILDDIR)/html/index.html'))" -.PHONY: livehtml -livehtml: html - livereload $(BUILDDIR)/html -p 33233 +.PHONY: htmllive +htmllive: SPHINXBUILD = $(PYTHON) -m sphinx_autobuild +htmllive: SPHINXOPTS = --open-browser --delay 0 +htmllive: html .PHONY: serve serve: diff --git a/pyproject.toml b/pyproject.toml index e8e76796a..a3ff9723b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,7 @@ optional-dependencies.docs = [ "furo", "olefile", "sphinx>=8.2", + "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph", From 4402797b35137666413efcc04fb91064e846cd90 Mon Sep 17 00:00:00 2001 From: Adian Kozlica <105174725+AdianKozlica@users.noreply.github.com> Date: Mon, 21 Apr 2025 04:36:40 +0200 Subject: [PATCH 082/268] Add support for Grim in Wayland sessions ImageGrab (#8912) Co-authored-by: Andrew Murray --- Tests/test_imagegrab.py | 1 + docs/reference/ImageGrab.rst | 6 +++--- src/PIL/ImageGrab.py | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py index 5f51171f1..01fa090dc 100644 --- a/Tests/test_imagegrab.py +++ b/Tests/test_imagegrab.py @@ -43,6 +43,7 @@ class TestImageGrab: if ( sys.platform not in ("win32", "darwin") and not shutil.which("gnome-screenshot") + and not shutil.which("grim") and not shutil.which("spectacle") ): with pytest.raises(OSError) as e: diff --git a/docs/reference/ImageGrab.rst b/docs/reference/ImageGrab.rst index 1e827a676..0fd8f68df 100644 --- a/docs/reference/ImageGrab.rst +++ b/docs/reference/ImageGrab.rst @@ -16,9 +16,9 @@ or the clipboard to a PIL image memory. the entire screen is copied, and on macOS, it will be at 2x if on a Retina screen. On Linux, if ``xdisplay`` is ``None`` and the default X11 display does not return - a snapshot of the screen, ``gnome-screenshot`` or ``spectacle`` will be used as a - fallback if they are installed. To disable this behaviour, pass ``xdisplay=""`` - instead. + a snapshot of the screen, ``gnome-screenshot``, ``grim`` or ``spectacle`` will be + used as a fallback if they are installed. To disable this behaviour, pass + ``xdisplay=""`` instead. .. versionadded:: 1.1.3 (Windows), 3.0.0 (macOS), 7.1.0 (Linux) diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index 4da14f8e4..c29350b7a 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -89,6 +89,8 @@ def grab( if display_name is None and sys.platform not in ("darwin", "win32"): if shutil.which("gnome-screenshot"): args = ["gnome-screenshot", "-f"] + elif shutil.which("grim"): + args = ["grim"] elif shutil.which("spectacle"): args = ["spectacle", "-n", "-b", "-f", "-o"] else: From 8fe7a7aaf89a5f312fe60382c1c5196876f53452 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 21 Apr 2025 17:32:47 +1000 Subject: [PATCH 083/268] Update redirected URL --- docs/releasenotes/10.1.0.rst | 2 +- src/PIL/ImageFont.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/10.1.0.rst b/docs/releasenotes/10.1.0.rst index fd556bdf1..e4efb069e 100644 --- a/docs/releasenotes/10.1.0.rst +++ b/docs/releasenotes/10.1.0.rst @@ -71,7 +71,7 @@ size and font_size arguments when using default font Pillow has had a "better than nothing" default font, which can only be drawn at one font size. Now, if FreeType support is available, a version of -`Aileron Regular `_ is loaded, which can be +`Aileron Regular `_ is loaded, which can be drawn at chosen font sizes. The following ``size`` and ``font_size`` arguments can now be used to specify a diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index ebe510ba9..329c463ff 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -1093,7 +1093,7 @@ w7IkEbzhVQAAAABJRU5ErkJggg== def load_default(size: float | None = None) -> FreeTypeFont | ImageFont: """If FreeType support is available, load a version of Aileron Regular, - https://dotcolon.net/font/aileron, with a more limited character set. + https://dotcolon.net/fonts/aileron, with a more limited character set. Otherwise, load a "better than nothing" font. From d03ce3d235c9a80fb5a336634115a331749af9f8 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 21 Apr 2025 11:22:03 +0300 Subject: [PATCH 084/268] Docs: remove unused Makefile targets (#8917) Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- docs/Makefile | 135 -------------------------------------------------- docs/conf.py | 91 ---------------------------------- docs/make.bat | 123 --------------------------------------------- 3 files changed, 349 deletions(-) diff --git a/docs/Makefile b/docs/Makefile index 4412fc806..1e6c06ede 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -24,22 +24,7 @@ help: @echo " serve to start a local server for viewing docs" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" .PHONY: clean clean: @@ -69,119 +54,6 @@ singlehtml: @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." -.PHONY: pickle -pickle: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -.PHONY: json -json: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -.PHONY: htmlhelp -htmlhelp: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -.PHONY: qthelp -qthelp: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PillowPILfork.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PillowPILfork.qhc" - -.PHONY: devhelp -devhelp: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/PillowPILfork" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PillowPILfork" - @echo "# devhelp" - -.PHONY: epub -epub: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -.PHONY: latex -latex: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -.PHONY: latexpdf -latexpdf: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: text -text: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -.PHONY: man -man: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -.PHONY: texinfo -texinfo: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -.PHONY: info -info: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -.PHONY: gettext -gettext: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -.PHONY: changes -changes: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - .PHONY: linkcheck linkcheck: $(MAKE) install-sphinx @@ -190,13 +62,6 @@ linkcheck: @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." -.PHONY: doctest -doctest: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - .PHONY: htmlview htmlview: html $(PYTHON) -c "import os, webbrowser; webbrowser.open('file://' + os.path.realpath('$(BUILDDIR)/html/index.html'))" diff --git a/docs/conf.py b/docs/conf.py index bfbcf9151..040301433 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -229,97 +229,6 @@ html_js_files = [ # implements a search results scorer. If empty, the default will be used. # html_search_scorer = 'scorer.js' -# Output file base name for HTML help builder. -htmlhelp_basename = "PillowPILForkdoc" - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements: dict[str, str] = { - # The paper size ('letterpaper' or 'a4paper'). - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # 'preamble': '', - # Latex figure (float) alignment - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ( - master_doc, - "PillowPILFork.tex", - "Pillow (PIL Fork) Documentation", - "Jeffrey A. Clark", - "manual", - ) -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -# latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -# latex_use_parts = False - -# If true, show page references after internal links. -# latex_show_pagerefs = False - -# If true, show URL addresses after external links. -# latex_show_urls = False - -# Documents to append as an appendix to all manuals. -# latex_appendices = [] - -# If false, no module index is generated. -# latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, "pillowpilfork", "Pillow (PIL Fork) Documentation", [author], 1) -] - -# If true, show URL addresses after external links. -# man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "PillowPILFork", - "Pillow (PIL Fork) Documentation", - author, - "PillowPILFork", - "Pillow is the friendly PIL fork by Jeffrey A. Clark and contributors.", - "Miscellaneous", - ) -] - -# Documents to append as an appendix to all manuals. -# texinfo_appendices = [] - -# If false, no module index is generated. -# texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -# texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -# texinfo_no_detailmenu = False - linkcheck_allowed_redirects = { r"https://www.bestpractices.dev/projects/6331": r"https://www.bestpractices.dev/en/.*", diff --git a/docs/make.bat b/docs/make.bat index 0ed5ee1a5..4126f786b 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -22,20 +22,7 @@ if "%1" == "help" ( echo. htmlview to open the index page built by the html target in your browser echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled goto end ) @@ -80,107 +67,6 @@ if "%1" == "singlehtml" ( goto end ) -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\PillowPILfork.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\PillowPILfork.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 @@ -190,13 +76,4 @@ or in %BUILDDIR%/linkcheck/output.txt. goto end ) -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - :end From 348589a367bba81bd9e2d1f4b6280ada91caae2e Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 21 Apr 2025 12:03:31 +0300 Subject: [PATCH 085/268] Docs: use sentence case for headers (#8914) Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Tests/README.rst | 2 +- docs/PIL.rst | 32 +++---- docs/deprecations.rst | 2 +- docs/handbook/concepts.rst | 2 +- docs/handbook/image-file-formats.rst | 4 +- docs/handbook/overview.rst | 6 +- docs/handbook/tutorial.rst | 4 +- .../writing-your-own-image-plugin.rst | 6 +- docs/installation.rst | 10 +- docs/installation/basic-installation.rst | 2 +- docs/installation/building-from-source.rst | 8 +- docs/installation/platform-support.rst | 6 +- docs/installation/python-support.rst | 2 +- docs/reference/ExifTags.rst | 2 +- docs/reference/Image.rst | 6 +- docs/reference/ImageChops.rst | 2 +- docs/reference/ImageCms.rst | 2 +- docs/reference/ImageColor.rst | 4 +- docs/reference/ImageDraw.rst | 8 +- docs/reference/ImageEnhance.rst | 2 +- docs/reference/ImageFile.rst | 2 +- docs/reference/ImageFilter.rst | 2 +- docs/reference/ImageFont.rst | 2 +- docs/reference/ImageGrab.rst | 2 +- docs/reference/ImageMath.rst | 10 +- docs/reference/ImageMorph.rst | 2 +- docs/reference/ImageOps.rst | 2 +- docs/reference/ImagePalette.rst | 2 +- docs/reference/ImagePath.rst | 2 +- docs/reference/ImageQt.rst | 2 +- docs/reference/ImageSequence.rst | 2 +- docs/reference/ImageShow.rst | 4 +- docs/reference/ImageStat.rst | 2 +- docs/reference/ImageTk.rst | 2 +- docs/reference/ImageTransform.rst | 2 +- docs/reference/ImageWin.rst | 2 +- docs/reference/JpegPresets.rst | 2 +- docs/reference/PSDraw.rst | 2 +- docs/reference/PixelAccess.rst | 4 +- docs/reference/TiffTags.rst | 2 +- docs/reference/arrow_support.rst | 10 +- docs/reference/block_allocator.rst | 8 +- docs/reference/c_extension_debugging.rst | 8 +- docs/reference/features.rst | 2 +- docs/reference/internal_design.rst | 2 +- docs/reference/internal_modules.rst | 16 ++-- docs/reference/limits.rst | 6 +- docs/reference/open_files.rst | 6 +- docs/reference/plugins.rst | 92 +++++++++---------- docs/releasenotes/10.0.0.rst | 8 +- docs/releasenotes/10.0.1.rst | 2 +- docs/releasenotes/10.1.0.rst | 6 +- docs/releasenotes/10.2.0.rst | 6 +- docs/releasenotes/10.3.0.rst | 6 +- docs/releasenotes/10.4.0.rst | 4 +- docs/releasenotes/11.0.0.rst | 12 +-- docs/releasenotes/11.1.0.rst | 6 +- docs/releasenotes/11.2.1.rst | 6 +- docs/releasenotes/2.7.0.rst | 6 +- docs/releasenotes/3.0.0.rst | 12 +-- docs/releasenotes/3.1.0.rst | 4 +- docs/releasenotes/3.2.0.rst | 4 +- docs/releasenotes/3.3.0.rst | 4 +- docs/releasenotes/3.3.2.rst | 4 +- docs/releasenotes/3.4.0.rst | 8 +- docs/releasenotes/4.0.0.rst | 2 +- docs/releasenotes/4.1.0.rst | 10 +- docs/releasenotes/4.1.1.rst | 2 +- docs/releasenotes/4.2.0.rst | 12 +-- docs/releasenotes/4.2.1.rst | 2 +- docs/releasenotes/4.3.0.rst | 26 +++--- docs/releasenotes/5.0.0.rst | 22 ++--- docs/releasenotes/5.1.0.rst | 10 +- docs/releasenotes/5.2.0.rst | 6 +- docs/releasenotes/5.3.0.rst | 6 +- docs/releasenotes/5.4.0.rst | 4 +- docs/releasenotes/6.0.0.rst | 8 +- docs/releasenotes/6.1.0.rst | 4 +- docs/releasenotes/6.2.0.rst | 6 +- docs/releasenotes/6.2.1.rst | 4 +- docs/releasenotes/7.0.0.rst | 6 +- docs/releasenotes/7.1.0.rst | 6 +- docs/releasenotes/7.2.0.rst | 2 +- docs/releasenotes/8.0.0.rst | 8 +- docs/releasenotes/8.1.0.rst | 6 +- docs/releasenotes/8.1.1.rst | 2 +- docs/releasenotes/8.2.0.rst | 6 +- docs/releasenotes/8.3.0.rst | 6 +- docs/releasenotes/8.3.2.rst | 2 +- docs/releasenotes/8.4.0.rst | 4 +- docs/releasenotes/9.0.0.rst | 8 +- docs/releasenotes/9.0.1.rst | 2 +- docs/releasenotes/9.1.0.rst | 6 +- docs/releasenotes/9.2.0.rst | 4 +- docs/releasenotes/9.3.0.rst | 4 +- docs/releasenotes/9.4.0.rst | 4 +- docs/releasenotes/9.5.0.rst | 4 +- docs/releasenotes/index.rst | 2 +- docs/releasenotes/template.rst | 8 +- 99 files changed, 313 insertions(+), 313 deletions(-) diff --git a/Tests/README.rst b/Tests/README.rst index 2d014e5a4..a955ec4fa 100644 --- a/Tests/README.rst +++ b/Tests/README.rst @@ -1,4 +1,4 @@ -Pillow Tests +Pillow tests ============ Test scripts are named ``test_xxx.py``. Helper classes and functions can be found in ``helper.py``. diff --git a/docs/PIL.rst b/docs/PIL.rst index bdbf1373d..5225e9644 100644 --- a/docs/PIL.rst +++ b/docs/PIL.rst @@ -1,10 +1,10 @@ -PIL Package (autodoc of remaining modules) +PIL package (autodoc of remaining modules) ========================================== Reference for modules whose documentation has not yet been ported or written can be found here. -:mod:`PIL` Module +:mod:`PIL` module ----------------- .. py:module:: PIL @@ -12,7 +12,7 @@ can be found here. .. autoexception:: UnidentifiedImageError :show-inheritance: -:mod:`~PIL.BdfFontFile` Module +:mod:`~PIL.BdfFontFile` module ------------------------------ .. automodule:: PIL.BdfFontFile @@ -20,7 +20,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.ContainerIO` Module +:mod:`~PIL.ContainerIO` module ------------------------------ .. automodule:: PIL.ContainerIO @@ -28,7 +28,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.FontFile` Module +:mod:`~PIL.FontFile` module --------------------------- .. automodule:: PIL.FontFile @@ -36,7 +36,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.GdImageFile` Module +:mod:`~PIL.GdImageFile` module ------------------------------ .. automodule:: PIL.GdImageFile @@ -44,7 +44,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.GimpGradientFile` Module +:mod:`~PIL.GimpGradientFile` module ----------------------------------- .. automodule:: PIL.GimpGradientFile @@ -52,7 +52,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.GimpPaletteFile` Module +:mod:`~PIL.GimpPaletteFile` module ---------------------------------- .. automodule:: PIL.GimpPaletteFile @@ -60,7 +60,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.ImageDraw2` Module +:mod:`~PIL.ImageDraw2` module ----------------------------- .. automodule:: PIL.ImageDraw2 @@ -69,7 +69,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.ImageMode` Module +:mod:`~PIL.ImageMode` module ---------------------------- .. automodule:: PIL.ImageMode @@ -77,7 +77,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.PaletteFile` Module +:mod:`~PIL.PaletteFile` module ------------------------------ .. automodule:: PIL.PaletteFile @@ -85,7 +85,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.PcfFontFile` Module +:mod:`~PIL.PcfFontFile` module ------------------------------ .. automodule:: PIL.PcfFontFile @@ -93,7 +93,7 @@ can be found here. :undoc-members: :show-inheritance: -:class:`.PngImagePlugin.iTXt` Class +:class:`.PngImagePlugin.iTXt` class ----------------------------------- .. autoclass:: PIL.PngImagePlugin.iTXt @@ -107,7 +107,7 @@ can be found here. :param lang: language code :param tkey: UTF-8 version of the key name -:class:`.PngImagePlugin.PngInfo` Class +:class:`.PngImagePlugin.PngInfo` class -------------------------------------- .. autoclass:: PIL.PngImagePlugin.PngInfo @@ -116,7 +116,7 @@ can be found here. :show-inheritance: -:mod:`~PIL.TarIO` Module +:mod:`~PIL.TarIO` module ------------------------ .. automodule:: PIL.TarIO @@ -124,7 +124,7 @@ can be found here. :undoc-members: :show-inheritance: -:mod:`~PIL.WalImageFile` Module +:mod:`~PIL.WalImageFile` module ------------------------------- .. automodule:: PIL.WalImageFile diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 7f8e76bcc..0490ba439 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -155,7 +155,7 @@ JpegImageFile.huffman_ac and JpegImageFile.huffman_dc The ``huffman_ac`` and ``huffman_dc`` dictionaries on JPEG images were unused. They have been deprecated, and will be removed in Pillow 12 (2025-10-15). -Specific WebP Feature Checks +Specific WebP feature checks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. deprecated:: 11.0.0 diff --git a/docs/handbook/concepts.rst b/docs/handbook/concepts.rst index fe874a740..c9d3f5e91 100644 --- a/docs/handbook/concepts.rst +++ b/docs/handbook/concepts.rst @@ -84,7 +84,7 @@ pixels. .. _coordinate-system: -Coordinate System +Coordinate system ----------------- The Python Imaging Library uses a Cartesian pixel coordinate system, with (0,0) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 46fe8b630..5ca549c37 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1222,7 +1222,7 @@ numbers are returned as a tuple of ``(numerator, denominator)``. .. deprecated:: 3.0.0 -Reading Multi-frame TIFF Images +Reading multi-frame TIFF images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The TIFF loader supports the :py:meth:`~PIL.Image.Image.seek` and @@ -1664,7 +1664,7 @@ The :py:meth:`~PIL.Image.open` method sets the following Transparency color index. This key is omitted if the image is not transparent. -XV Thumbnails +XV thumbnails ^^^^^^^^^^^^^ Pillow can read XV thumbnail files. diff --git a/docs/handbook/overview.rst b/docs/handbook/overview.rst index 17964d1c5..ab22b9807 100644 --- a/docs/handbook/overview.rst +++ b/docs/handbook/overview.rst @@ -13,7 +13,7 @@ processing tool. Let’s look at a few possible uses of this library. -Image Archives +Image archives -------------- The Python Imaging Library is ideal for image archival and batch processing @@ -24,7 +24,7 @@ The current version identifies and reads a large number of formats. Write support is intentionally restricted to the most commonly used interchange and presentation formats. -Image Display +Image display ------------- The current release includes Tk :py:class:`~PIL.ImageTk.PhotoImage` and @@ -36,7 +36,7 @@ support. For debugging, there’s also a :py:meth:`~PIL.Image.Image.show` method which saves an image to disk, and calls an external display utility. -Image Processing +Image processing ---------------- The library contains basic image processing functionality, including point operations, filtering with a set of built-in convolution kernels, and colour space conversions. diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index f1a2849b8..28c0abe44 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -122,7 +122,7 @@ This means that opening an image file is a fast operation, which is independent of the file size and compression type. Here’s a simple script to quickly identify a set of image files: -Identify Image Files +Identify image files ^^^^^^^^^^^^^^^^^^^^ :: @@ -399,7 +399,7 @@ Applying filters .. image:: enhanced_hopper.webp :align: center -Point Operations +Point operations ^^^^^^^^^^^^^^^^ The :py:meth:`~PIL.Image.Image.point` method can be used to translate the pixel diff --git a/docs/handbook/writing-your-own-image-plugin.rst b/docs/handbook/writing-your-own-image-plugin.rst index 9e7d14c57..21a9124d7 100644 --- a/docs/handbook/writing-your-own-image-plugin.rst +++ b/docs/handbook/writing-your-own-image-plugin.rst @@ -1,6 +1,6 @@ .. _image-plugins: -Writing Your Own Image Plugin +Writing your own image plugin ============================= Pillow uses a plugin model which allows you to add your own @@ -329,7 +329,7 @@ The fields are used as follows: .. _file-codecs: -Writing Your Own File Codec in C +Writing your own file codec in C ================================ There are 3 stages in a file codec's lifetime: @@ -414,7 +414,7 @@ memory and release any resources from external libraries. .. _file-codecs-py: -Writing Your Own File Codec in Python +Writing your own file codec in Python ===================================== Python file decoders and encoders should derive from diff --git a/docs/installation.rst b/docs/installation.rst index b4bf2fa00..03f18c195 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -3,27 +3,27 @@ Installation ============ -Basic Installation +Basic installation ------------------ .. Note:: This section has moved to :ref:`basic-installation`. Please update references accordingly. -Python Support +Python support -------------- .. Note:: This section has moved to :ref:`python-support`. Please update references accordingly. -Platform Support +Platform support ---------------- .. Note:: This section has moved to :ref:`platform-support`. Please update references accordingly. -Building From Source +Building from source -------------------- .. Note:: This section has moved to :ref:`building-from-source`. Please update references accordingly. -Old Versions +Old versions ------------ .. Note:: This section has moved to :ref:`old-versions`. Please update references accordingly. diff --git a/docs/installation/basic-installation.rst b/docs/installation/basic-installation.rst index 989f72ddd..f66ee8707 100644 --- a/docs/installation/basic-installation.rst +++ b/docs/installation/basic-installation.rst @@ -8,7 +8,7 @@ .. _basic-installation: -Basic Installation +Basic installation ================== .. note:: diff --git a/docs/installation/building-from-source.rst b/docs/installation/building-from-source.rst index 9ba389b66..c72568b20 100644 --- a/docs/installation/building-from-source.rst +++ b/docs/installation/building-from-source.rst @@ -8,12 +8,12 @@ .. _building-from-source: -Building From Source +Building from source ==================== .. _external-libraries: -External Libraries +External libraries ------------------ .. note:: @@ -271,7 +271,7 @@ After navigating to the Pillow directory, run:: .. _compressed archive from PyPI: https://pypi.org/project/pillow/#files -Build Options +Build options ^^^^^^^^^^^^^ * Config setting: ``-C parallel=n``. Can also be given @@ -319,7 +319,7 @@ Sample usage:: .. _old-versions: -Old Versions +Old versions ============ You can download old distributions from the `release history at PyPI diff --git a/docs/installation/platform-support.rst b/docs/installation/platform-support.rst index d751620fd..93486d034 100644 --- a/docs/installation/platform-support.rst +++ b/docs/installation/platform-support.rst @@ -1,6 +1,6 @@ .. _platform-support: -Platform Support +Platform support ================ Current platform support for Pillow. Binary distributions are @@ -9,7 +9,7 @@ should compile and run everywhere platform support is listed. In general, we aim to support all current versions of Linux, macOS, and Windows. -Continuous Integration Targets +Continuous integration targets ------------------------------ These platforms are built and tested for every change. @@ -59,7 +59,7 @@ These platforms are built and tested for every change. +----------------------------------+----------------------------+---------------------+ -Other Platforms +Other platforms --------------- These platforms have been reported to work at the versions mentioned. diff --git a/docs/installation/python-support.rst b/docs/installation/python-support.rst index dd5765b6b..7daee8afc 100644 --- a/docs/installation/python-support.rst +++ b/docs/installation/python-support.rst @@ -1,6 +1,6 @@ .. _python-support: -Python Support +Python support ============== Pillow supports these Python versions. diff --git a/docs/reference/ExifTags.rst b/docs/reference/ExifTags.rst index 06965ead3..e6bcd9d59 100644 --- a/docs/reference/ExifTags.rst +++ b/docs/reference/ExifTags.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ExifTags .. py:currentmodule:: PIL.ExifTags -:py:mod:`~PIL.ExifTags` Module +:py:mod:`~PIL.ExifTags` module ============================== The :py:mod:`~PIL.ExifTags` module exposes several :py:class:`enum.IntEnum` diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index a3ba8cfd8..e68722900 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.Image .. py:currentmodule:: PIL.Image -:py:mod:`~PIL.Image` Module +:py:mod:`~PIL.Image` module =========================== The :py:mod:`~PIL.Image` module provides a class with the same name which is @@ -113,7 +113,7 @@ Registering plugins .. autofunction:: register_decoder .. autofunction:: register_encoder -The Image Class +The Image class --------------- .. autoclass:: PIL.Image.Image @@ -261,7 +261,7 @@ method. :: .. automethod:: PIL.Image.Image.load .. automethod:: PIL.Image.Image.close -Image Attributes +Image attributes ---------------- Instances of the :py:class:`Image` class have the following attributes: diff --git a/docs/reference/ImageChops.rst b/docs/reference/ImageChops.rst index 9519361a7..505181db6 100644 --- a/docs/reference/ImageChops.rst +++ b/docs/reference/ImageChops.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageChops .. py:currentmodule:: PIL.ImageChops -:py:mod:`~PIL.ImageChops` ("Channel Operations") Module +:py:mod:`~PIL.ImageChops` ("channel operations") module ======================================================= The :py:mod:`~PIL.ImageChops` module contains a number of arithmetical image diff --git a/docs/reference/ImageCms.rst b/docs/reference/ImageCms.rst index 4a1f5a3ee..238390e75 100644 --- a/docs/reference/ImageCms.rst +++ b/docs/reference/ImageCms.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageCms .. py:currentmodule:: PIL.ImageCms -:py:mod:`~PIL.ImageCms` Module +:py:mod:`~PIL.ImageCms` module ============================== The :py:mod:`~PIL.ImageCms` module provides color profile management diff --git a/docs/reference/ImageColor.rst b/docs/reference/ImageColor.rst index 31faeac78..68e228dba 100644 --- a/docs/reference/ImageColor.rst +++ b/docs/reference/ImageColor.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageColor .. py:currentmodule:: PIL.ImageColor -:py:mod:`~PIL.ImageColor` Module +:py:mod:`~PIL.ImageColor` module ================================ The :py:mod:`~PIL.ImageColor` module contains color tables and converters from @@ -11,7 +11,7 @@ others. .. _color-names: -Color Names +Color names ----------- The ImageColor module supports the following string formats: diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index bd6f6b048..6e73233a1 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageDraw .. py:currentmodule:: PIL.ImageDraw -:py:mod:`~PIL.ImageDraw` Module +:py:mod:`~PIL.ImageDraw` module =============================== The :py:mod:`~PIL.ImageDraw` module provides simple 2D graphics for @@ -54,7 +54,7 @@ later, you can also use RGB 3-tuples or color names (see below). The drawing layer will automatically assign color indexes, as long as you don’t draw with more than 256 colors. -Color Names +Color names ^^^^^^^^^^^ See :ref:`color-names` for the color names supported by Pillow. @@ -75,7 +75,7 @@ To load a OpenType/TrueType font, use the truetype function in the :py:mod:`~PIL.ImageFont` module. Note that this function depends on third-party libraries, and may not available in all PIL builds. -Example: Draw Partial Opacity Text +Example: Draw partial opacity text ---------------------------------- :: @@ -102,7 +102,7 @@ Example: Draw Partial Opacity Text out.show() -Example: Draw Multiline Text +Example: Draw multiline text ---------------------------- :: diff --git a/docs/reference/ImageEnhance.rst b/docs/reference/ImageEnhance.rst index 529acad4a..334d1d4b2 100644 --- a/docs/reference/ImageEnhance.rst +++ b/docs/reference/ImageEnhance.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageEnhance .. py:currentmodule:: PIL.ImageEnhance -:py:mod:`~PIL.ImageEnhance` Module +:py:mod:`~PIL.ImageEnhance` module ================================== The :py:mod:`~PIL.ImageEnhance` module contains a number of classes that can be used diff --git a/docs/reference/ImageFile.rst b/docs/reference/ImageFile.rst index 64abd71d1..043559352 100644 --- a/docs/reference/ImageFile.rst +++ b/docs/reference/ImageFile.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageFile .. py:currentmodule:: PIL.ImageFile -:py:mod:`~PIL.ImageFile` Module +:py:mod:`~PIL.ImageFile` module =============================== The :py:mod:`~PIL.ImageFile` module provides support functions for the image open diff --git a/docs/reference/ImageFilter.rst b/docs/reference/ImageFilter.rst index 5f2b6af7c..1c201cacc 100644 --- a/docs/reference/ImageFilter.rst +++ b/docs/reference/ImageFilter.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageFilter .. py:currentmodule:: PIL.ImageFilter -:py:mod:`~PIL.ImageFilter` Module +:py:mod:`~PIL.ImageFilter` module ================================= The :py:mod:`~PIL.ImageFilter` module contains definitions for a pre-defined set of diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index d9d9cac6e..8b2f92323 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageFont .. py:currentmodule:: PIL.ImageFont -:py:mod:`~PIL.ImageFont` Module +:py:mod:`~PIL.ImageFont` module =============================== The :py:mod:`~PIL.ImageFont` module defines a class with the same name. Instances of diff --git a/docs/reference/ImageGrab.rst b/docs/reference/ImageGrab.rst index 0fd8f68df..f6a2ec5bc 100644 --- a/docs/reference/ImageGrab.rst +++ b/docs/reference/ImageGrab.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageGrab .. py:currentmodule:: PIL.ImageGrab -:py:mod:`~PIL.ImageGrab` Module +:py:mod:`~PIL.ImageGrab` module =============================== The :py:mod:`~PIL.ImageGrab` module can be used to copy the contents of the screen diff --git a/docs/reference/ImageMath.rst b/docs/reference/ImageMath.rst index f4e1081e6..0ee49b150 100644 --- a/docs/reference/ImageMath.rst +++ b/docs/reference/ImageMath.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageMath .. py:currentmodule:: PIL.ImageMath -:py:mod:`~PIL.ImageMath` Module +:py:mod:`~PIL.ImageMath` module =============================== The :py:mod:`~PIL.ImageMath` module can be used to evaluate “image expressions”, that @@ -86,7 +86,7 @@ Expression syntax It is not recommended to process expressions without considering this. :py:meth:`lambda_eval` is a more secure alternative. -Standard Operators +Standard operators ^^^^^^^^^^^^^^^^^^ You can use standard arithmetical operators for addition (+), subtraction (-), @@ -102,7 +102,7 @@ an 8-bit image, the result will be a 32-bit floating point image. You can force conversion using the ``convert()``, ``float()``, and ``int()`` functions described below. -Bitwise Operators +Bitwise operators ^^^^^^^^^^^^^^^^^ The module also provides operations that operate on individual bits. This @@ -116,7 +116,7 @@ mask off unwanted bits. Bitwise operators don’t work on floating point images. -Logical Operators +Logical operators ^^^^^^^^^^^^^^^^^ Logical operators like ``and``, ``or``, and ``not`` work @@ -128,7 +128,7 @@ treated as true. Note that ``and`` and ``or`` return the last evaluated operand, while not always returns a boolean value. -Built-in Functions +Built-in functions ^^^^^^^^^^^^^^^^^^ These functions are applied to each individual pixel. diff --git a/docs/reference/ImageMorph.rst b/docs/reference/ImageMorph.rst index d4522a06a..30b89a54d 100644 --- a/docs/reference/ImageMorph.rst +++ b/docs/reference/ImageMorph.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageMorph .. py:currentmodule:: PIL.ImageMorph -:py:mod:`~PIL.ImageMorph` Module +:py:mod:`~PIL.ImageMorph` module ================================ The :py:mod:`~PIL.ImageMorph` module provides morphology operations on images. diff --git a/docs/reference/ImageOps.rst b/docs/reference/ImageOps.rst index fcaa3c8f6..1ecff09f0 100644 --- a/docs/reference/ImageOps.rst +++ b/docs/reference/ImageOps.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageOps .. py:currentmodule:: PIL.ImageOps -:py:mod:`~PIL.ImageOps` Module +:py:mod:`~PIL.ImageOps` module ============================== The :py:mod:`~PIL.ImageOps` module contains a number of ‘ready-made’ image diff --git a/docs/reference/ImagePalette.rst b/docs/reference/ImagePalette.rst index 72ccfac7d..42ce5cb13 100644 --- a/docs/reference/ImagePalette.rst +++ b/docs/reference/ImagePalette.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImagePalette .. py:currentmodule:: PIL.ImagePalette -:py:mod:`~PIL.ImagePalette` Module +:py:mod:`~PIL.ImagePalette` module ================================== The :py:mod:`~PIL.ImagePalette` module contains a class of the same name to diff --git a/docs/reference/ImagePath.rst b/docs/reference/ImagePath.rst index 23544b613..5f5606349 100644 --- a/docs/reference/ImagePath.rst +++ b/docs/reference/ImagePath.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImagePath .. py:currentmodule:: PIL.ImagePath -:py:mod:`~PIL.ImagePath` Module +:py:mod:`~PIL.ImagePath` module =============================== The :py:mod:`~PIL.ImagePath` module is used to store and manipulate 2-dimensional diff --git a/docs/reference/ImageQt.rst b/docs/reference/ImageQt.rst index 7e67a44d3..88d7b8a20 100644 --- a/docs/reference/ImageQt.rst +++ b/docs/reference/ImageQt.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageQt .. py:currentmodule:: PIL.ImageQt -:py:mod:`~PIL.ImageQt` Module +:py:mod:`~PIL.ImageQt` module ============================= The :py:mod:`~PIL.ImageQt` module contains support for creating PyQt6 or PySide6 diff --git a/docs/reference/ImageSequence.rst b/docs/reference/ImageSequence.rst index a27b2fb4e..0d6f394dd 100644 --- a/docs/reference/ImageSequence.rst +++ b/docs/reference/ImageSequence.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageSequence .. py:currentmodule:: PIL.ImageSequence -:py:mod:`~PIL.ImageSequence` Module +:py:mod:`~PIL.ImageSequence` module =================================== The :py:mod:`~PIL.ImageSequence` module contains a wrapper class that lets you diff --git a/docs/reference/ImageShow.rst b/docs/reference/ImageShow.rst index 5cedede69..12c8741ce 100644 --- a/docs/reference/ImageShow.rst +++ b/docs/reference/ImageShow.rst @@ -1,10 +1,10 @@ .. py:module:: PIL.ImageShow .. py:currentmodule:: PIL.ImageShow -:py:mod:`~PIL.ImageShow` Module +:py:mod:`~PIL.ImageShow` module =============================== -The :py:mod:`~PIL.ImageShow` Module is used to display images. +The :py:mod:`~PIL.ImageShow` module is used to display images. All default viewers convert the image to be shown to PNG format. .. autofunction:: PIL.ImageShow.show diff --git a/docs/reference/ImageStat.rst b/docs/reference/ImageStat.rst index f69466382..ede119920 100644 --- a/docs/reference/ImageStat.rst +++ b/docs/reference/ImageStat.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageStat .. py:currentmodule:: PIL.ImageStat -:py:mod:`~PIL.ImageStat` Module +:py:mod:`~PIL.ImageStat` module =============================== The :py:mod:`~PIL.ImageStat` module calculates global statistics for an image, or diff --git a/docs/reference/ImageTk.rst b/docs/reference/ImageTk.rst index 134ef5651..3ab72b83d 100644 --- a/docs/reference/ImageTk.rst +++ b/docs/reference/ImageTk.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageTk .. py:currentmodule:: PIL.ImageTk -:py:mod:`~PIL.ImageTk` Module +:py:mod:`~PIL.ImageTk` module ============================= The :py:mod:`~PIL.ImageTk` module contains support to create and modify Tkinter diff --git a/docs/reference/ImageTransform.rst b/docs/reference/ImageTransform.rst index 5b0a5ce49..530279934 100644 --- a/docs/reference/ImageTransform.rst +++ b/docs/reference/ImageTransform.rst @@ -2,7 +2,7 @@ .. py:module:: PIL.ImageTransform .. py:currentmodule:: PIL.ImageTransform -:py:mod:`~PIL.ImageTransform` Module +:py:mod:`~PIL.ImageTransform` module ==================================== The :py:mod:`~PIL.ImageTransform` module contains implementations of diff --git a/docs/reference/ImageWin.rst b/docs/reference/ImageWin.rst index 4151be4a7..c0b9bd2ba 100644 --- a/docs/reference/ImageWin.rst +++ b/docs/reference/ImageWin.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.ImageWin .. py:currentmodule:: PIL.ImageWin -:py:mod:`~PIL.ImageWin` Module (Windows-only) +:py:mod:`~PIL.ImageWin` module (Windows-only) ============================================= The :py:mod:`~PIL.ImageWin` module contains support to create and display images on diff --git a/docs/reference/JpegPresets.rst b/docs/reference/JpegPresets.rst index aafae44cf..b0a3ba8b5 100644 --- a/docs/reference/JpegPresets.rst +++ b/docs/reference/JpegPresets.rst @@ -1,6 +1,6 @@ .. py:currentmodule:: PIL.JpegPresets -:py:mod:`~PIL.JpegPresets` Module +:py:mod:`~PIL.JpegPresets` module ================================= .. automodule:: PIL.JpegPresets diff --git a/docs/reference/PSDraw.rst b/docs/reference/PSDraw.rst index 3e8512e7a..9eed775fc 100644 --- a/docs/reference/PSDraw.rst +++ b/docs/reference/PSDraw.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.PSDraw .. py:currentmodule:: PIL.PSDraw -:py:mod:`~PIL.PSDraw` Module +:py:mod:`~PIL.PSDraw` module ============================ The :py:mod:`~PIL.PSDraw` module provides simple print support for PostScript diff --git a/docs/reference/PixelAccess.rst b/docs/reference/PixelAccess.rst index 1ac3d034b..9d7cf83b6 100644 --- a/docs/reference/PixelAccess.rst +++ b/docs/reference/PixelAccess.rst @@ -1,6 +1,6 @@ .. _PixelAccess: -:py:class:`PixelAccess` Class +:py:class:`PixelAccess` class ============================= The PixelAccess class provides read and write access to @@ -40,7 +40,7 @@ Access using negative indexes is also possible. :: -:py:class:`PixelAccess` Class +:py:class:`PixelAccess` class ----------------------------- .. class:: PixelAccess diff --git a/docs/reference/TiffTags.rst b/docs/reference/TiffTags.rst index 7cb7d16ae..d75a48478 100644 --- a/docs/reference/TiffTags.rst +++ b/docs/reference/TiffTags.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.TiffTags .. py:currentmodule:: PIL.TiffTags -:py:mod:`~PIL.TiffTags` Module +:py:mod:`~PIL.TiffTags` module ============================== The :py:mod:`~PIL.TiffTags` module exposes many of the standard TIFF diff --git a/docs/reference/arrow_support.rst b/docs/reference/arrow_support.rst index 4a5c45e86..063046d8c 100644 --- a/docs/reference/arrow_support.rst +++ b/docs/reference/arrow_support.rst @@ -1,7 +1,7 @@ .. _arrow-support: ============= -Arrow Support +Arrow support ============= `Arrow `__ @@ -18,7 +18,7 @@ with any Arrow provider or consumer in the Python ecosystem. full-copy memory cost to reading an Arrow image. -Data Formats +Data formats ============ Pillow currently supports exporting Arrow images in all modes @@ -43,7 +43,7 @@ interpreted using the mode-specific interpretation of the bytes. The image mode must match the Arrow band format when reading single channel images. -Memory Allocator +Memory allocator ================ Pillow's default memory allocator, the :ref:`block_allocator`, @@ -59,7 +59,7 @@ To enable the single block allocator:: Note that this is a global setting, not a per-image setting. -Unsupported Features +Unsupported features ==================== * Table/dataframe protocol. We support a single array. @@ -71,7 +71,7 @@ Unsupported Features parameter. * Array metadata. -Internal Details +Internal details ================ Python Arrow C interface: diff --git a/docs/reference/block_allocator.rst b/docs/reference/block_allocator.rst index c6be5b7e6..5ad9d9fd1 100644 --- a/docs/reference/block_allocator.rst +++ b/docs/reference/block_allocator.rst @@ -1,10 +1,10 @@ .. _block_allocator: -Block Allocator +Block allocator =============== -Previous Design +Previous design --------------- Historically there have been two image allocators in Pillow: @@ -16,7 +16,7 @@ large images and makes one allocation for each scan line of size between one allocation and potentially thousands of small allocations, leading to unpredictable performance penalties around the transition. -New Design +New design ---------- ``ImagingAllocateArray`` now allocates space for images as a chain of @@ -28,7 +28,7 @@ line. This is now the default for all internal allocations. specifically requesting a single segment of memory for sharing with other code. -Memory Pools +Memory pools ------------ There is now a memory pool to contain a supply of recently freed diff --git a/docs/reference/c_extension_debugging.rst b/docs/reference/c_extension_debugging.rst index 5e8586905..12dca6cf2 100644 --- a/docs/reference/c_extension_debugging.rst +++ b/docs/reference/c_extension_debugging.rst @@ -1,5 +1,5 @@ -C Extension debugging on Linux, with gbd/valgrind. -================================================== +C extension debugging on Linux, with GBD/Valgrind +================================================= Install the tools ----------------- @@ -17,7 +17,7 @@ Then ``sudo apt-get install libtiff5-dbgsym`` - There's a bug with the ``python3-dbg`` package for at least Python 3.8 on Ubuntu 20.04, and you need to add a new link or two to make it autoload when - running python: + running Python: :: @@ -49,7 +49,7 @@ Then ``sudo apt-get install libtiff5-dbgsym`` source ~/vpy38-dbg/bin/activate cd ~/Pillow && make install -Test Case +Test case --------- Take your test image, and make a really simple harness. diff --git a/docs/reference/features.rst b/docs/reference/features.rst index c5d89b838..381d7830a 100644 --- a/docs/reference/features.rst +++ b/docs/reference/features.rst @@ -1,7 +1,7 @@ .. py:module:: PIL.features .. py:currentmodule:: PIL.features -:py:mod:`~PIL.features` Module +:py:mod:`~PIL.features` module ============================== The :py:mod:`PIL.features` module can be used to detect which Pillow features are available on your system. diff --git a/docs/reference/internal_design.rst b/docs/reference/internal_design.rst index 041177953..6bba673b9 100644 --- a/docs/reference/internal_design.rst +++ b/docs/reference/internal_design.rst @@ -1,4 +1,4 @@ -Internal Reference +Internal reference ================== .. toctree:: diff --git a/docs/reference/internal_modules.rst b/docs/reference/internal_modules.rst index 93fd82cf9..19f78864d 100644 --- a/docs/reference/internal_modules.rst +++ b/docs/reference/internal_modules.rst @@ -1,7 +1,7 @@ -Internal Modules +Internal modules ================ -:mod:`~PIL._binary` Module +:mod:`~PIL._binary` module -------------------------- .. automodule:: PIL._binary @@ -9,7 +9,7 @@ Internal Modules :undoc-members: :show-inheritance: -:mod:`~PIL._deprecate` Module +:mod:`~PIL._deprecate` module ----------------------------- .. automodule:: PIL._deprecate @@ -17,7 +17,7 @@ Internal Modules :undoc-members: :show-inheritance: -:mod:`~PIL._tkinter_finder` Module +:mod:`~PIL._tkinter_finder` module ---------------------------------- .. automodule:: PIL._tkinter_finder @@ -25,7 +25,7 @@ Internal Modules :undoc-members: :show-inheritance: -:mod:`~PIL._typing` Module +:mod:`~PIL._typing` module -------------------------- .. module:: PIL._typing @@ -58,7 +58,7 @@ on some Python versions. See :py:obj:`typing.TypeGuard`. -:mod:`~PIL._util` Module +:mod:`~PIL._util` module ------------------------ .. automodule:: PIL._util @@ -66,7 +66,7 @@ on some Python versions. :undoc-members: :show-inheritance: -:mod:`~PIL._version` Module +:mod:`~PIL._version` module --------------------------- .. module:: PIL._version @@ -78,7 +78,7 @@ on some Python versions. This is the master version number for Pillow, all other uses reference this module. -:mod:`PIL.Image.core` Module +:mod:`PIL.Image.core` module ---------------------------- .. module:: PIL._imaging diff --git a/docs/reference/limits.rst b/docs/reference/limits.rst index a71b514b5..d2f8f7d1f 100644 --- a/docs/reference/limits.rst +++ b/docs/reference/limits.rst @@ -4,7 +4,7 @@ Limits This page is documentation to the various fundamental size limits in the Pillow implementation. -Internal Limits +Internal limits =============== * Image sizes cannot be negative. These are checked both in @@ -25,10 +25,10 @@ Internal Limits is smaller than 2GB, as calculated by ``y*stride`` (so 2Gpx for 'L' images, and .5Gpx for 'RGB' -Format Size Limits +Format size limits ================== * ICO: Max size is 256x256 -* Webp: 16383x16383 (underlying library size limit: +* WebP: 16383x16383 (underlying library size limit: https://developers.google.com/speed/webp/docs/api) diff --git a/docs/reference/open_files.rst b/docs/reference/open_files.rst index 730c8da5b..0d43cbc73 100644 --- a/docs/reference/open_files.rst +++ b/docs/reference/open_files.rst @@ -1,6 +1,6 @@ .. _file-handling: -File Handling in Pillow +File handling in Pillow ======================= When opening a file as an image, Pillow requires a filename, ``os.PathLike`` @@ -36,7 +36,7 @@ have multiple frames. Pillow cannot in general close and reopen a file, so any access to that file needs to be prior to the close. -Image Lifecycle +Image lifecycle --------------- * ``Image.open()`` Filenames and ``Path`` objects are opened as a file. @@ -97,7 +97,7 @@ Complications im6.load() # FAILS, closed file -Proposed File Handling +Proposed file handling ---------------------- * ``Image.Image.load()`` should close the image file, unless there are diff --git a/docs/reference/plugins.rst b/docs/reference/plugins.rst index c789f5757..243d4f353 100644 --- a/docs/reference/plugins.rst +++ b/docs/reference/plugins.rst @@ -1,7 +1,7 @@ Plugin reference ================ -:mod:`~PIL.AvifImagePlugin` Module +:mod:`~PIL.AvifImagePlugin` module ---------------------------------- .. automodule:: PIL.AvifImagePlugin @@ -9,7 +9,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.BmpImagePlugin` Module +:mod:`~PIL.BmpImagePlugin` module --------------------------------- .. automodule:: PIL.BmpImagePlugin @@ -17,7 +17,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.BufrStubImagePlugin` Module +:mod:`~PIL.BufrStubImagePlugin` module -------------------------------------- .. automodule:: PIL.BufrStubImagePlugin @@ -25,7 +25,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.CurImagePlugin` Module +:mod:`~PIL.CurImagePlugin` module --------------------------------- .. automodule:: PIL.CurImagePlugin @@ -33,7 +33,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.DcxImagePlugin` Module +:mod:`~PIL.DcxImagePlugin` module --------------------------------- .. automodule:: PIL.DcxImagePlugin @@ -41,7 +41,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.DdsImagePlugin` Module +:mod:`~PIL.DdsImagePlugin` module --------------------------------- .. automodule:: PIL.DdsImagePlugin @@ -49,7 +49,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.EpsImagePlugin` Module +:mod:`~PIL.EpsImagePlugin` module --------------------------------- .. automodule:: PIL.EpsImagePlugin @@ -57,15 +57,15 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.FitsImagePlugin` Module --------------------------------------- +:mod:`~PIL.FitsImagePlugin` module +---------------------------------- .. automodule:: PIL.FitsImagePlugin :members: :undoc-members: :show-inheritance: -:mod:`~PIL.FliImagePlugin` Module +:mod:`~PIL.FliImagePlugin` module --------------------------------- .. automodule:: PIL.FliImagePlugin @@ -73,7 +73,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.FpxImagePlugin` Module +:mod:`~PIL.FpxImagePlugin` module --------------------------------- .. automodule:: PIL.FpxImagePlugin @@ -81,7 +81,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.GbrImagePlugin` Module +:mod:`~PIL.GbrImagePlugin` module --------------------------------- .. automodule:: PIL.GbrImagePlugin @@ -89,7 +89,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.GifImagePlugin` Module +:mod:`~PIL.GifImagePlugin` module --------------------------------- .. automodule:: PIL.GifImagePlugin @@ -97,7 +97,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.GribStubImagePlugin` Module +:mod:`~PIL.GribStubImagePlugin` module -------------------------------------- .. automodule:: PIL.GribStubImagePlugin @@ -105,7 +105,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.Hdf5StubImagePlugin` Module +:mod:`~PIL.Hdf5StubImagePlugin` module -------------------------------------- .. automodule:: PIL.Hdf5StubImagePlugin @@ -113,7 +113,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.IcnsImagePlugin` Module +:mod:`~PIL.IcnsImagePlugin` module ---------------------------------- .. automodule:: PIL.IcnsImagePlugin @@ -121,7 +121,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.IcoImagePlugin` Module +:mod:`~PIL.IcoImagePlugin` module --------------------------------- .. automodule:: PIL.IcoImagePlugin @@ -129,7 +129,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.ImImagePlugin` Module +:mod:`~PIL.ImImagePlugin` module -------------------------------- .. automodule:: PIL.ImImagePlugin @@ -137,7 +137,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.ImtImagePlugin` Module +:mod:`~PIL.ImtImagePlugin` module --------------------------------- .. automodule:: PIL.ImtImagePlugin @@ -145,7 +145,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.IptcImagePlugin` Module +:mod:`~PIL.IptcImagePlugin` module ---------------------------------- .. automodule:: PIL.IptcImagePlugin @@ -153,7 +153,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.JpegImagePlugin` Module +:mod:`~PIL.JpegImagePlugin` module ---------------------------------- .. automodule:: PIL.JpegImagePlugin @@ -161,7 +161,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.Jpeg2KImagePlugin` Module +:mod:`~PIL.Jpeg2KImagePlugin` module ------------------------------------ .. automodule:: PIL.Jpeg2KImagePlugin @@ -169,7 +169,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.McIdasImagePlugin` Module +:mod:`~PIL.McIdasImagePlugin` module ------------------------------------ .. automodule:: PIL.McIdasImagePlugin @@ -177,7 +177,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.MicImagePlugin` Module +:mod:`~PIL.MicImagePlugin` module --------------------------------- .. automodule:: PIL.MicImagePlugin @@ -185,7 +185,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.MpegImagePlugin` Module +:mod:`~PIL.MpegImagePlugin` module ---------------------------------- .. automodule:: PIL.MpegImagePlugin @@ -193,15 +193,15 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.MpoImagePlugin` Module ----------------------------------- +:mod:`~PIL.MpoImagePlugin` module +--------------------------------- .. automodule:: PIL.MpoImagePlugin :members: :undoc-members: :show-inheritance: -:mod:`~PIL.MspImagePlugin` Module +:mod:`~PIL.MspImagePlugin` module --------------------------------- .. automodule:: PIL.MspImagePlugin @@ -209,7 +209,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.PalmImagePlugin` Module +:mod:`~PIL.PalmImagePlugin` module ---------------------------------- .. automodule:: PIL.PalmImagePlugin @@ -217,7 +217,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.PcdImagePlugin` Module +:mod:`~PIL.PcdImagePlugin` module --------------------------------- .. automodule:: PIL.PcdImagePlugin @@ -225,7 +225,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.PcxImagePlugin` Module +:mod:`~PIL.PcxImagePlugin` module --------------------------------- .. automodule:: PIL.PcxImagePlugin @@ -233,7 +233,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.PdfImagePlugin` Module +:mod:`~PIL.PdfImagePlugin` module --------------------------------- .. automodule:: PIL.PdfImagePlugin @@ -241,7 +241,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.PixarImagePlugin` Module +:mod:`~PIL.PixarImagePlugin` module ----------------------------------- .. automodule:: PIL.PixarImagePlugin @@ -249,7 +249,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.PngImagePlugin` Module +:mod:`~PIL.PngImagePlugin` module --------------------------------- .. automodule:: PIL.PngImagePlugin @@ -260,7 +260,7 @@ Plugin reference :member-order: groupwise -:mod:`~PIL.PpmImagePlugin` Module +:mod:`~PIL.PpmImagePlugin` module --------------------------------- .. automodule:: PIL.PpmImagePlugin @@ -268,7 +268,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.PsdImagePlugin` Module +:mod:`~PIL.PsdImagePlugin` module --------------------------------- .. automodule:: PIL.PsdImagePlugin @@ -276,7 +276,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.SgiImagePlugin` Module +:mod:`~PIL.SgiImagePlugin` module --------------------------------- .. automodule:: PIL.SgiImagePlugin @@ -284,7 +284,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.SpiderImagePlugin` Module +:mod:`~PIL.SpiderImagePlugin` module ------------------------------------ .. automodule:: PIL.SpiderImagePlugin @@ -292,7 +292,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.SunImagePlugin` Module +:mod:`~PIL.SunImagePlugin` module --------------------------------- .. automodule:: PIL.SunImagePlugin @@ -300,7 +300,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.TgaImagePlugin` Module +:mod:`~PIL.TgaImagePlugin` module --------------------------------- .. automodule:: PIL.TgaImagePlugin @@ -308,7 +308,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.TiffImagePlugin` Module +:mod:`~PIL.TiffImagePlugin` module ---------------------------------- .. automodule:: PIL.TiffImagePlugin @@ -316,7 +316,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.WebPImagePlugin` Module +:mod:`~PIL.WebPImagePlugin` module ---------------------------------- .. automodule:: PIL.WebPImagePlugin @@ -324,7 +324,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.WmfImagePlugin` Module +:mod:`~PIL.WmfImagePlugin` module --------------------------------- .. automodule:: PIL.WmfImagePlugin @@ -332,7 +332,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.XVThumbImagePlugin` Module +:mod:`~PIL.XVThumbImagePlugin` module ------------------------------------- .. automodule:: PIL.XVThumbImagePlugin @@ -340,7 +340,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.XbmImagePlugin` Module +:mod:`~PIL.XbmImagePlugin` module --------------------------------- .. automodule:: PIL.XbmImagePlugin @@ -348,7 +348,7 @@ Plugin reference :undoc-members: :show-inheritance: -:mod:`~PIL.XpmImagePlugin` Module +:mod:`~PIL.XpmImagePlugin` module --------------------------------- .. automodule:: PIL.XpmImagePlugin diff --git a/docs/releasenotes/10.0.0.rst b/docs/releasenotes/10.0.0.rst index 2ea973c5c..3e2aa84b1 100644 --- a/docs/releasenotes/10.0.0.rst +++ b/docs/releasenotes/10.0.0.rst @@ -28,7 +28,7 @@ This threshold can be changed by setting :py:data:`PIL.ImageFont.MAX_STRING_LENGTH`. It can be disabled by setting ``ImageFont.MAX_STRING_LENGTH = None``. -Backwards Incompatible Changes +Backwards incompatible changes ============================== Categories @@ -164,7 +164,7 @@ Since Pillow's C API is now faster than PyAccess on PyPy, ``Image.USE_CFFI_ACCESS``, for switching from the C API to PyAccess, is similarly deprecated. -API Changes +API changes =========== Added line width parameter to ImageDraw regular_polygon @@ -173,7 +173,7 @@ Added line width parameter to ImageDraw regular_polygon An optional line ``width`` parameter has been added to ``ImageDraw.Draw.regular_polygon``. -API Additions +API additions ============= Added ``alpha_only`` argument to ``getbbox()`` @@ -184,7 +184,7 @@ Added ``alpha_only`` argument to ``getbbox()`` and the image has an alpha channel, trim transparent pixels. Otherwise, trim pixels when all channels are zero. -Other Changes +Other changes ============= 32-bit wheels diff --git a/docs/releasenotes/10.0.1.rst b/docs/releasenotes/10.0.1.rst index 02189d514..aa17a62e0 100644 --- a/docs/releasenotes/10.0.1.rst +++ b/docs/releasenotes/10.0.1.rst @@ -11,7 +11,7 @@ This release provides an updated install script and updated wheels to include libwebp 1.3.2, preventing a potential heap buffer overflow in WebP. -Other Changes +Other changes ============= Updated tests to pass with latest zlib version diff --git a/docs/releasenotes/10.1.0.rst b/docs/releasenotes/10.1.0.rst index fd556bdf1..649c2bdf9 100644 --- a/docs/releasenotes/10.1.0.rst +++ b/docs/releasenotes/10.1.0.rst @@ -1,7 +1,7 @@ 10.1.0 ------ -API Changes +API changes =========== Setting image mode @@ -35,7 +35,7 @@ to be specified, rather than a single number for both dimensions. :: ImageFilter.BoxBlur((2, 5)) ImageFilter.GaussianBlur((2, 5)) -API Additions +API additions ============= EpsImagePlugin.gs_binary @@ -84,7 +84,7 @@ font size for this new builtin font:: draw.multiline_text((0, 0), "test", font_size=24) draw.multiline_textbbox((0, 0), "test", font_size=24) -Other Changes +Other changes ============= Python 3.12 diff --git a/docs/releasenotes/10.2.0.rst b/docs/releasenotes/10.2.0.rst index 1c6b78b08..337748785 100644 --- a/docs/releasenotes/10.2.0.rst +++ b/docs/releasenotes/10.2.0.rst @@ -53,7 +53,7 @@ The functions ``IptcImageFile.dump`` and ``IptcImageFile.i``, and the constant for internal use, so there is no replacement. They can each be replaced by a single line of code using builtin functions in Python. -API Changes +API changes =========== Zero or negative font size error @@ -63,7 +63,7 @@ When creating a :py:class:`~PIL.ImageFont.FreeTypeFont` instance, either directl through :py:func:`~PIL.ImageFont.truetype`, if the font size is zero or less, a :py:exc:`ValueError` will now be raised. -API Additions +API additions ============= Added DdsImagePlugin enums @@ -95,7 +95,7 @@ JPEG tables-only streamtype When saving JPEG files, ``streamtype`` can now be set to 1, for tables-only. This will output only the quantization and Huffman tables for the image. -Other Changes +Other changes ============= Added DDS BC4U and DX10 BC1 and BC4 reading diff --git a/docs/releasenotes/10.3.0.rst b/docs/releasenotes/10.3.0.rst index 2f0437d94..6c7d8ea0a 100644 --- a/docs/releasenotes/10.3.0.rst +++ b/docs/releasenotes/10.3.0.rst @@ -65,7 +65,7 @@ ImageMath.eval() :py:meth:`~PIL.ImageMath.unsafe_eval` instead. See earlier security notes for more information. -API Changes +API changes =========== Added alpha_quality argument when saving WebP images @@ -87,7 +87,7 @@ Negative P1-P3 PPM value error If a P1-P3 PPM image contains a negative value, a :py:exc:`ValueError` will now be raised. -API Additions +API additions ============= Added PerspectiveTransform @@ -97,7 +97,7 @@ Added PerspectiveTransform that all of the :py:data:`~PIL.Image.Transform` values now have a corresponding subclass of :py:class:`~PIL.ImageTransform.Transform`. -Other Changes +Other changes ============= Portable FloatMap (PFM) images diff --git a/docs/releasenotes/10.4.0.rst b/docs/releasenotes/10.4.0.rst index 8d3706be6..84a6091c9 100644 --- a/docs/releasenotes/10.4.0.rst +++ b/docs/releasenotes/10.4.0.rst @@ -41,7 +41,7 @@ ImageDraw.getdraw hints parameter The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been deprecated. -API Additions +API additions ============= ImageDraw.circle @@ -51,7 +51,7 @@ Added :py:meth:`~PIL.ImageDraw.ImageDraw.circle`. It provides the same functiona :py:meth:`~PIL.ImageDraw.ImageDraw.ellipse`, but instead of taking a bounding box, it takes a center point and radius. -Other Changes +Other changes ============= Python 3.13 beta diff --git a/docs/releasenotes/11.0.0.rst b/docs/releasenotes/11.0.0.rst index c3f18140f..020fbf7df 100644 --- a/docs/releasenotes/11.0.0.rst +++ b/docs/releasenotes/11.0.0.rst @@ -1,7 +1,7 @@ 11.0.0 ------ -Backwards Incompatible Changes +Backwards incompatible changes ============================== Python 3.8 @@ -103,7 +103,7 @@ JpegImageFile.huffman_ac and JpegImageFile.huffman_dc The ``huffman_ac`` and ``huffman_dc`` dictionaries on JPEG images were unused. They have been deprecated, and will be removed in Pillow 12 (2025-10-15). -Specific WebP Feature Checks +Specific WebP feature checks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. deprecated:: 11.0.0 @@ -113,7 +113,7 @@ Specific WebP Feature Checks ``True`` if the WebP module is installed, until they are removed in Pillow 12.0.0 (2025-10-15). -API Changes +API changes =========== Default resampling filter for I;16* image modes @@ -122,7 +122,7 @@ Default resampling filter for I;16* image modes The default resampling filter for I;16, I;16L, I;16B and I;16N has been changed from ``Image.NEAREST`` to ``Image.BICUBIC``, to match the majority of modes. -API Additions +API additions ============= Writing XMP bytes to JPEG and MPO @@ -138,7 +138,7 @@ either JPEG or MPO images:: im.info["xmp"] = b"test" im.save("out.jpg") -Other Changes +Other changes ============= Python 3.13 @@ -154,7 +154,7 @@ Support has also been added for the experimental free-threaded mode of :pep:`703 Python 3.13 only supports macOS versions 10.13 and later. -C-level Flags +C-level flags ^^^^^^^^^^^^^ Some compiling flags like ``WITH_THREADING``, ``WITH_IMAGECHOPS``, and other diff --git a/docs/releasenotes/11.1.0.rst b/docs/releasenotes/11.1.0.rst index 0d56cb420..4888ddf56 100644 --- a/docs/releasenotes/11.1.0.rst +++ b/docs/releasenotes/11.1.0.rst @@ -10,7 +10,7 @@ ExifTags.IFD.Makernote ``ExifTags.IFD.Makernote`` has been deprecated. Instead, use ``ExifTags.IFD.MakerNote``. -API Changes +API changes =========== Writing XMP bytes to JPEG and MPO @@ -34,7 +34,7 @@ be used:: second_im.encoderinfo = {"xmp": b"test"} im.save("out.mpo", save_all=True, append_images=[second_im]) -API Additions +API additions ============= Check for zlib-ng @@ -54,7 +54,7 @@ TIFF images can now be saved as BigTIFF using a ``big_tiff`` argument:: im.save("out.tiff", big_tiff=True) -Other Changes +Other changes ============= Reading JPEG 2000 comments diff --git a/docs/releasenotes/11.2.1.rst b/docs/releasenotes/11.2.1.rst index 5c6d40d9d..f55b0d7d7 100644 --- a/docs/releasenotes/11.2.1.rst +++ b/docs/releasenotes/11.2.1.rst @@ -32,7 +32,7 @@ Image.Image.get_child_images() method uses an image's file pointer, and so child images could only be retrieved from an :py:class:`PIL.ImageFile.ImageFile` instance. -API Changes +API changes =========== ``append_images`` no longer requires ``save_all`` @@ -44,7 +44,7 @@ supports saving multiple frames:: im.save("out.gif", append_images=ims) -API Additions +API additions ============= ``"justify"`` multiline text alignment @@ -86,7 +86,7 @@ DXT5, BC2, BC3 and BC5 are supported:: im.save("out.dds", pixel_format="DXT1") -Other Changes +Other changes ============= Arrow support diff --git a/docs/releasenotes/2.7.0.rst b/docs/releasenotes/2.7.0.rst index e9b0995bb..a1ddd1178 100644 --- a/docs/releasenotes/2.7.0.rst +++ b/docs/releasenotes/2.7.0.rst @@ -1,13 +1,13 @@ 2.7.0 ----- -Sane Plugin +Sane plugin ^^^^^^^^^^^ The Sane plugin has now been split into its own repo: https://github.com/python-pillow/Sane . -Png text chunk size limits +PNG text chunk size limits ^^^^^^^^^^^^^^^^^^^^^^^^^^ To prevent potential denial of service attacks using compressed text @@ -155,7 +155,7 @@ so the quality was worse compared to other Gaussian blur software. The new implementation does not have this drawback. -TIFF Parameter Changes +TIFF parameter changes ^^^^^^^^^^^^^^^^^^^^^^ Several kwarg parameters for saving TIFF images were previously diff --git a/docs/releasenotes/3.0.0.rst b/docs/releasenotes/3.0.0.rst index 8bc477f70..dcd8031f5 100644 --- a/docs/releasenotes/3.0.0.rst +++ b/docs/releasenotes/3.0.0.rst @@ -1,7 +1,7 @@ 3.0.0 ----- -Backwards Incompatible Changes +Backwards incompatible changes ============================== Several methods that have been marked as deprecated for many releases @@ -18,10 +18,10 @@ have been removed in this release: * ``ImageWin.fromstring()`` * ``ImageWin.tostring()`` -Other Changes +Other changes ============= -Saving Multipage Images +Saving multipage images ^^^^^^^^^^^^^^^^^^^^^^^ There is now support for saving multipage images in the ``GIF`` and @@ -30,10 +30,10 @@ as a keyword argument to the save:: im.save('test.pdf', save_all=True) -Tiff ImageFileDirectory Rewrite +TIFF ImageFileDirectory rewrite ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The Tiff ImageFileDirectory metadata code has been rewritten. Where +The TIFF ImageFileDirectory metadata code has been rewritten. Where previously it returned a somewhat arbitrary set of values and tuples, it now returns bare values where appropriate and tuples when the metadata item is a sequence or collection. @@ -41,7 +41,7 @@ metadata item is a sequence or collection. The original metadata is still available in the TiffImage.tags, the new values are available in the TiffImage.tags_v2 member. The old structures will be deprecated at some point in the future. When -saving Tiff metadata, new code should use the +saving TIFF metadata, new code should use the TiffImagePlugin.ImageFileDirectory_v2 class. LibJpeg and Zlib are required by default diff --git a/docs/releasenotes/3.1.0.rst b/docs/releasenotes/3.1.0.rst index 951819f19..90f77ff61 100644 --- a/docs/releasenotes/3.1.0.rst +++ b/docs/releasenotes/3.1.0.rst @@ -22,7 +22,7 @@ not the absolute height of each line. There is also now a default spacing of 4px between lines. -Exif, Jpeg and Tiff Metadata +EXIF, JPEG and TIFF metadata ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There were major changes in the TIFF ImageFileDirectory support in @@ -63,7 +63,7 @@ single item tuples have been unwrapped and return a bare element. The format returned by Pillow 3.0 has been abandoned. A more fully featured interface for EXIF is anticipated in a future release. -Out of Spec Metadata +Out of spec metadata ++++++++++++++++++++ In Pillow 3.0 and 3.1, images that contain metadata that is internally diff --git a/docs/releasenotes/3.2.0.rst b/docs/releasenotes/3.2.0.rst index 3ed8fae57..20d7d073e 100644 --- a/docs/releasenotes/3.2.0.rst +++ b/docs/releasenotes/3.2.0.rst @@ -1,7 +1,7 @@ 3.2.0 ----- -New DDS and FTEX Image Plugins +New DDS and FTEX image plugins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``DdsImagePlugin`` reading DXT1 and DXT5 encoded ``.dds`` images was @@ -18,7 +18,7 @@ Updates to the GbrImagePlugin The ``GbrImagePlugin`` (GIMP brush format) has been updated to fix support for version 1 files and add support for version 2 files. -Passthrough Parameters for ImageDraw.text +Passthrough parameters for ImageDraw.text ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``ImageDraw.multiline_text`` and ``ImageDraw.multiline_size`` take extra diff --git a/docs/releasenotes/3.3.0.rst b/docs/releasenotes/3.3.0.rst index cd6f7e2f9..9447245c4 100644 --- a/docs/releasenotes/3.3.0.rst +++ b/docs/releasenotes/3.3.0.rst @@ -11,7 +11,7 @@ libimagequant. We cannot distribute binaries due to licensing differences. -New Setup.py options +New setup.py options ^^^^^^^^^^^^^^^^^^^^ There are two new options to control the ``build_ext`` task in ``setup.py``: @@ -43,7 +43,7 @@ This greatly improves both quality and performance in this case. Also, the bug with wrong image size calculation when rotating by 90 degrees was fixed. -Image Metadata +Image metadata ^^^^^^^^^^^^^^ The return type for binary data in version 2 Exif and Tiff metadata diff --git a/docs/releasenotes/3.3.2.rst b/docs/releasenotes/3.3.2.rst index 73156a65d..60ffbdcba 100644 --- a/docs/releasenotes/3.3.2.rst +++ b/docs/releasenotes/3.3.2.rst @@ -4,7 +4,7 @@ Security ======== -Integer overflow in Map.c +Integer overflow in map.c ^^^^^^^^^^^^^^^^^^^^^^^^^ Pillow prior to 3.3.2 may experience integer overflow errors in map.c @@ -27,7 +27,7 @@ memory without duplicating the image first. This issue was found by Cris Neckar at Divergent Security. -Sign Extension in Storage.c +Sign extension in Storage.c ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pillow prior to 3.3.2 and PIL 1.1.7 (at least) do not check for diff --git a/docs/releasenotes/3.4.0.rst b/docs/releasenotes/3.4.0.rst index 8a5a7efe3..01ec77a58 100644 --- a/docs/releasenotes/3.4.0.rst +++ b/docs/releasenotes/3.4.0.rst @@ -1,7 +1,7 @@ 3.4.0 ----- -Backwards Incompatible Changes +Backwards incompatible changes ============================== Image.core.open_ppm removed @@ -14,7 +14,7 @@ been removed. If you were using this function, please use Deprecations ============ -Deprecation Warning when Saving JPEGs +Deprecation warning when saving JPEGs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ JPEG images cannot contain an alpha channel. Pillow prior to 3.4.0 @@ -22,7 +22,7 @@ silently drops the alpha channel. With this release Pillow will now issue a :py:exc:`DeprecationWarning` when attempting to save a ``RGBA`` mode image as a JPEG. This will become an error in Pillow 4.2. -API Additions +API additions ============= New resizing filters @@ -37,7 +37,7 @@ two times shorter window than ``BILINEAR``. It can be used for image reduction providing the image downscaling quality comparable to ``BICUBIC``. Both new filters don't show good quality for the image upscaling. -New DDS Decoders +New DDS decoders ^^^^^^^^^^^^^^^^ Pillow can now decode DXT3 images, as well as the previously supported diff --git a/docs/releasenotes/4.0.0.rst b/docs/releasenotes/4.0.0.rst index 625f237e8..dd97463f6 100644 --- a/docs/releasenotes/4.0.0.rst +++ b/docs/releasenotes/4.0.0.rst @@ -1,7 +1,7 @@ 4.0.0 ----- -Python 2.6 and 3.2 Dropped +Python 2.6 and 3.2 dropped ^^^^^^^^^^^^^^^^^^^^^^^^^^ Pillow 4.0 no longer supports Python 2.6 and 3.2. We will not be diff --git a/docs/releasenotes/4.1.0.rst b/docs/releasenotes/4.1.0.rst index 80ad9b9fb..1f809ad18 100644 --- a/docs/releasenotes/4.1.0.rst +++ b/docs/releasenotes/4.1.0.rst @@ -15,10 +15,10 @@ Several deprecated items have been removed. ``PIL.ImageDraw.ImageDraw.setfont`` have been removed. -Other Changes +Other changes ============= -Closing Files When Opening Images +Closing files when opening images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The file handling when opening images has been overhauled. Previously, @@ -41,7 +41,7 @@ is specified: the underlying file until we are done with the image. The mapping will be closed in the ``close`` or ``__del__`` method. -Changes to GIF Handling When Saving +Changes to GIF handling when saving ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The :py:class:`PIL.GifImagePlugin` code has been refactored to fix the flow when @@ -57,14 +57,14 @@ saving images. There are two external changes that arise from this: This refactor fixed some bugs with palette handling when saving multiple frame GIFs. -New Method: Image.remap_palette +New method: Image.remap_palette ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The method :py:meth:`PIL.Image.Image.remap_palette()` has been added. This method was hoisted from the GifImagePlugin code used to optimize the palette. -Added Decoder Registry and Support for Python Based Decoders +Added decoder registry and support for Python-based decoders ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There is now a decoder registry similar to the image plugin diff --git a/docs/releasenotes/4.1.1.rst b/docs/releasenotes/4.1.1.rst index 8c8055bfa..1cbd3853b 100644 --- a/docs/releasenotes/4.1.1.rst +++ b/docs/releasenotes/4.1.1.rst @@ -1,7 +1,7 @@ 4.1.1 ----- -Fix Regression with reading DPI from EXIF data +Fix regression with reading DPI from EXIF data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Some JPEG images don't contain DPI information in the image metadata, diff --git a/docs/releasenotes/4.2.0.rst b/docs/releasenotes/4.2.0.rst index bc2a45f02..0ea3de399 100644 --- a/docs/releasenotes/4.2.0.rst +++ b/docs/releasenotes/4.2.0.rst @@ -1,7 +1,7 @@ 4.2.0 ----- -Backwards Incompatible Changes +Backwards incompatible changes ============================== Several deprecated items have been removed @@ -17,17 +17,17 @@ Several deprecated items have been removed was shown. From Pillow 4.2.0, the deprecation warning is removed and an :py:exc:`IOError` is raised. -Removed Core Image Function +Removed core Image function ^^^^^^^^^^^^^^^^^^^^^^^^^^^ The unused function ``Image.core.new_array`` was removed. This is an internal function that should not have been used by user code, but it was accessible from the python layer. -Other Changes +Other changes ============= -Added Complex Text Rendering +Added complex text rendering ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pillow now supports complex text rendering for scripts requiring glyph @@ -36,7 +36,7 @@ dependencies: harfbuzz, fribidi, and raqm. See the :doc:`install documentation <../installation>` for further details. This feature is tested and works on Unix and Mac, but has not yet been built on Windows platforms. -New Optional Parameters +New optional parameters ^^^^^^^^^^^^^^^^^^^^^^^ * :py:meth:`PIL.ImageDraw.floodfill` has a new optional parameter: @@ -47,7 +47,7 @@ New Optional Parameters optional parameter for specifying additional images to create multipage outputs. -New DecompressionBomb Warning +New DecompressionBomb warning ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :py:meth:`PIL.Image.Image.crop` now may raise a DecompressionBomb diff --git a/docs/releasenotes/4.2.1.rst b/docs/releasenotes/4.2.1.rst index 2061f6467..617d51e52 100644 --- a/docs/releasenotes/4.2.1.rst +++ b/docs/releasenotes/4.2.1.rst @@ -3,7 +3,7 @@ There are no functional changes in this release. -Fixed Windows PyPy Build +Fixed Windows PyPy build ^^^^^^^^^^^^^^^^^^^^^^^^ A change in the 4.2.0 cycle broke the Windows PyPy build. This has diff --git a/docs/releasenotes/4.3.0.rst b/docs/releasenotes/4.3.0.rst index ea81fc45e..87a57799f 100644 --- a/docs/releasenotes/4.3.0.rst +++ b/docs/releasenotes/4.3.0.rst @@ -1,7 +1,7 @@ 4.3.0 ----- -API Changes +API changes =========== Deprecations @@ -12,7 +12,7 @@ Several undocumented functions in ImageOps have been deprecated: ``box_blur``. Use the equivalent operations in ``ImageFilter`` instead. These functions will be removed in a future release. -TIFF Metadata Changes +TIFF metadata changes ^^^^^^^^^^^^^^^^^^^^^ * TIFF tags with unknown type/quantity now default to being bare @@ -27,7 +27,7 @@ TIFF Metadata Changes items, as there can be multiple items, one for UTF-8, and one for UTF-16. -Core Image API Changes +Core Image API changes ^^^^^^^^^^^^^^^^^^^^^^ These are internal functions that should not have been used by user @@ -44,10 +44,10 @@ The ``PIL.Image.core.getcount`` methods have been removed, use ``PIL.Image.core.get_stats()['new_count']`` property instead. -API Additions +API additions ============= -Get One Channel From Image +Get one channel from image ^^^^^^^^^^^^^^^^^^^^^^^^^^ A new method :py:meth:`PIL.Image.Image.getchannel` has been added to @@ -56,14 +56,14 @@ return a single channel by index or name. For example, ``getchannel`` should work up to 6 times faster than ``image.split()[0]`` in previous Pillow versions. -Box Blur +Box blur ^^^^^^^^ A new filter, :py:class:`PIL.ImageFilter.BoxBlur`, has been added. This is a filter with similar results to a Gaussian blur, but is much faster. -Partial Resampling +Partial resampling ^^^^^^^^^^^^^^^^^^ Added new argument ``box`` for :py:meth:`PIL.Image.Image.resize`. This @@ -71,14 +71,14 @@ argument defines a source rectangle from within the source image to be resized. This is very similar to the ``image.crop(box).resize(size)`` sequence except that ``box`` can be specified with subpixel accuracy. -New Transpose Operation +New transpose operation ^^^^^^^^^^^^^^^^^^^^^^^ The ``Image.TRANSVERSE`` operation has been added to :py:meth:`PIL.Image.Image.transpose`. This is equivalent to a transpose operation about the opposite diagonal. -Multiband Filters +Multiband filters ^^^^^^^^^^^^^^^^^ There is a new :py:class:`PIL.ImageFilter.MultibandFilter` base class @@ -87,10 +87,10 @@ operation. The original :py:class:`PIL.ImageFilter.Filter` class remains for image filters that can process only single band images, or require splitting of channels prior to filtering. -Other Changes +Other changes ============= -Loading 16-bit TIFF Images +Loading 16-bit TIFF images ^^^^^^^^^^^^^^^^^^^^^^^^^^ Pillow now can read 16-bit multichannel TIFF files including files @@ -101,7 +101,7 @@ Pillow now can read 16-bit signed integer single channel TIFF files. The image data is promoted to 32-bit for storage and processing. -SGI Images +SGI images ^^^^^^^^^^ Pillow can now read and write uncompressed 16-bit multichannel SGI @@ -129,7 +129,7 @@ This release contains several performance improvements: falling back to an allocation for each scan line for images larger than the block size. -CMYK Conversion +CMYK conversion ^^^^^^^^^^^^^^^ The basic CMYK->RGB conversion has been tweaked to match the formula diff --git a/docs/releasenotes/5.0.0.rst b/docs/releasenotes/5.0.0.rst index be00a45cd..2b93e0322 100644 --- a/docs/releasenotes/5.0.0.rst +++ b/docs/releasenotes/5.0.0.rst @@ -1,10 +1,10 @@ 5.0.0 ----- -Backwards Incompatible Changes +Backwards incompatible changes ============================== -Python 3.3 Dropped +Python 3.3 dropped ^^^^^^^^^^^^^^^^^^ Python 3.3 is EOL and no longer supported due to moving testing from nose, @@ -12,7 +12,7 @@ which is deprecated, to pytest, which doesn't support Python 3.3. We will not be creating binaries, testing, or retaining compatibility with this version. The final version of Pillow for Python 3.3 is 4.3.0. -Decompression Bombs now raise Exceptions +Decompression bombs now raise exceptions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pillow has previously emitted warnings for images that are @@ -31,7 +31,7 @@ separate package, pillow-scripts, living at https://github.com/python-pillow/pillow-scripts. -API Changes +API changes =========== OleFileIO.py @@ -54,7 +54,7 @@ Several image plugins supported a named ``check`` parameter on their nominally private ``_save`` method to preflight if the image could be saved in that format. That parameter has been removed. -API Additions +API additions ============= Image.transform @@ -65,16 +65,16 @@ A new named parameter, ``fillcolor``, has been added to the area outside the transformed area in the output image. This parameter takes the same color specifications as used in ``Image.new``. -GIF Disposal +GIF disposal ^^^^^^^^^^^^ Multiframe GIF images now take an optional disposal parameter to specify the disposal option for changed pixels. -Other Changes +Other changes ============= -Compressed TIFF Images +Compressed TIFF images ^^^^^^^^^^^^^^^^^^^^^^ Previously, there were some compression modes (JPEG, Packbits, and @@ -82,7 +82,7 @@ LZW) that were supported with Pillow's internal TIFF decoder. All compressed TIFFs are now read using the ``libtiff`` decoder, as it implements the compression schemes more correctly. -Libraqm is now Dynamically Linked +Libraqm is now dynamically linked ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The libraqm dependency for complex text scripts is now linked @@ -90,14 +90,14 @@ dynamically at runtime rather than at packaging time. This allows us to release binaries with support for libraqm if it is installed on the user's machine. -Source Layout Changes +Source layout changes ^^^^^^^^^^^^^^^^^^^^^ The Pillow source is now stored within the ``src`` directory of the distribution. This prevents accidental imports of the PIL directory when running Python from the project directory. -Setup.py Changes +Setup.py changes ^^^^^^^^^^^^^^^^ Multiarch support on Linux should be more robust, especially on Debian diff --git a/docs/releasenotes/5.1.0.rst b/docs/releasenotes/5.1.0.rst index 4e3d10ac5..4b80e8521 100644 --- a/docs/releasenotes/5.1.0.rst +++ b/docs/releasenotes/5.1.0.rst @@ -1,7 +1,7 @@ 5.1.0 ----- -API Changes +API changes =========== Optional channels for TIFF files @@ -12,22 +12,22 @@ and ``CMYK`` with up to 6 8-bit channels, discarding any extra channels if the content is tagged as UNSPECIFIED. Pillow still does not store more than 4 8-bit channels of image data. -API Additions +API additions ============= -Append to PDF Files +Append to PDF files ^^^^^^^^^^^^^^^^^^^ Images can now be appended to PDF files in place by passing in ``append=True`` when saving the image. -New BLP File Format +New BLP file format ^^^^^^^^^^^^^^^^^^^ Pillow now supports reading the BLP "Blizzard Mipmap" file format used for tiles in Blizzard's engine. -Other Changes +Other changes ============= WebP memory leak diff --git a/docs/releasenotes/5.2.0.rst b/docs/releasenotes/5.2.0.rst index d9b8f0fb7..d18337820 100644 --- a/docs/releasenotes/5.2.0.rst +++ b/docs/releasenotes/5.2.0.rst @@ -1,7 +1,7 @@ 5.2.0 ----- -API Changes +API changes =========== Deprecations @@ -17,7 +17,7 @@ Pillow 6.0.0, and ``PILLOW_VERSION`` will be removed after that. Use ``PIL.__version__`` instead. -API Additions +API additions ============= 3D color lookup tables @@ -75,7 +75,7 @@ TGA file format Pillow can now read and write LA data (in addition to L, P, RGB and RGBA), and write RLE data (in addition to uncompressed). -Other Changes +Other changes ============= Support added for Python 3.7 diff --git a/docs/releasenotes/5.3.0.rst b/docs/releasenotes/5.3.0.rst index 8f276da24..6adce95b2 100644 --- a/docs/releasenotes/5.3.0.rst +++ b/docs/releasenotes/5.3.0.rst @@ -1,7 +1,7 @@ 5.3.0 ----- -API Changes +API changes =========== Image size @@ -20,7 +20,7 @@ The exceptions to this are: as direct image size setting was previously necessary to work around an issue with tile extents. -API Additions +API additions ============= Added line width parameter to rectangle and ellipse-based shapes @@ -59,7 +59,7 @@ and size, new method ``ImageOps.pad`` pads images to fill a requested aspect ratio and size, filling new space with a provided ``color`` and positioning the image within the new area through a ``centering`` argument. -Other Changes +Other changes ============= Added support for reading tiled TIFF images through LibTIFF. Compressed TIFF diff --git a/docs/releasenotes/5.4.0.rst b/docs/releasenotes/5.4.0.rst index 6d7277c70..13b540d60 100644 --- a/docs/releasenotes/5.4.0.rst +++ b/docs/releasenotes/5.4.0.rst @@ -1,7 +1,7 @@ 5.4.0 ----- -API Changes +API changes =========== APNG extension to PNG plugin @@ -55,7 +55,7 @@ TIFF images can now be saved with custom integer, float and string TIFF tags:: print(im2.tag_v2[37002]) # "custom tag value" print(im2.tag_v2[37004]) # b"custom tag value" -Other Changes +Other changes ============= ImageOps.fit diff --git a/docs/releasenotes/6.0.0.rst b/docs/releasenotes/6.0.0.rst index 5e69f0b6b..b788b2eeb 100644 --- a/docs/releasenotes/6.0.0.rst +++ b/docs/releasenotes/6.0.0.rst @@ -1,7 +1,7 @@ 6.0.0 ----- -Backwards Incompatible Changes +Backwards incompatible changes ============================== Python 3.4 dropped @@ -32,7 +32,7 @@ Removed deprecated VERSION ``VERSION`` (the old PIL version, always 1.1.7) has been removed. Use ``__version__`` instead. -API Changes +API changes =========== Deprecations @@ -137,7 +137,7 @@ loaded, ``Image.MIME["PPM"]`` will now return the generic "image/x-portable-anym The TGA, PCX and ICO formats also now have MIME types: "image/x-tga", "image/x-pcx" and "image/x-icon" respectively. -API Additions +API additions ============= DIB file format @@ -186,7 +186,7 @@ EXIF data can now be read from and saved to PNG images. However, unlike other im formats, EXIF data is not guaranteed to be present in :py:attr:`~PIL.Image.Image.info` until :py:meth:`~PIL.Image.Image.load` has been called. -Other Changes +Other changes ============= Reading new DDS image format diff --git a/docs/releasenotes/6.1.0.rst b/docs/releasenotes/6.1.0.rst index ce3edc5fa..761f435f3 100644 --- a/docs/releasenotes/6.1.0.rst +++ b/docs/releasenotes/6.1.0.rst @@ -23,7 +23,7 @@ Use instead:: with Image.open("hopper.png") as im: im.save("out.jpg") -API Additions +API additions ============= Image.entropy @@ -61,7 +61,7 @@ file. ``ImageFont.FreeTypeFont`` has four new methods, instead. An :py:exc:`IOError` will be raised if the font is not a variation font. FreeType 2.9.1 or greater is required. -Other Changes +Other changes ============= ImageTk.getimage diff --git a/docs/releasenotes/6.2.0.rst b/docs/releasenotes/6.2.0.rst index b851c56fc..b37cd7160 100644 --- a/docs/releasenotes/6.2.0.rst +++ b/docs/releasenotes/6.2.0.rst @@ -29,7 +29,7 @@ perform operations on it. The CVE is regarding DOS problems, such as consuming large amounts of memory, or taking a large amount of time to process an image. -API Changes +API changes =========== Image.getexif @@ -48,7 +48,7 @@ There has been a longstanding warning that the defaults of ``Image.frombuffer`` may change in the future for the "raw" decoder. The change will now take place in Pillow 7.0. -API Additions +API additions ============= Text stroking @@ -93,7 +93,7 @@ ImageGrab on multi-monitor Windows An ``all_screens`` argument has been added to ``ImageGrab.grab``. If ``True``, all monitors will be included in the created image. -Other Changes +Other changes ============= Removed bdist_wininst .exe installers diff --git a/docs/releasenotes/6.2.1.rst b/docs/releasenotes/6.2.1.rst index 372298fbc..0ede05917 100644 --- a/docs/releasenotes/6.2.1.rst +++ b/docs/releasenotes/6.2.1.rst @@ -1,7 +1,7 @@ 6.2.1 ----- -API Changes +API changes =========== Deprecations @@ -15,7 +15,7 @@ Python 2.7 reaches end-of-life on 2020-01-01. Pillow 7.0.0 will be released on 2020-01-01 and will drop support for Python 2.7, making Pillow 6.2.x the last release series to support Python 2. -Other Changes +Other changes ============= Support added for Python 3.8 diff --git a/docs/releasenotes/7.0.0.rst b/docs/releasenotes/7.0.0.rst index ed6026593..9504c974a 100644 --- a/docs/releasenotes/7.0.0.rst +++ b/docs/releasenotes/7.0.0.rst @@ -1,7 +1,7 @@ 7.0.0 ----- -Backwards Incompatible Changes +Backwards incompatible changes ============================== Python 2.7 @@ -78,7 +78,7 @@ bounds of resulting image. This may be useful in a subsequent .. _chain methods: https://en.wikipedia.org/wiki/Method_chaining -API Additions +API additions ============= Custom unidentified image error @@ -124,7 +124,7 @@ now also be loaded at another resolution:: with Image.open("drawing.wmf") as im: im.load(dpi=144) -Other Changes +Other changes ============= Image.__del__ diff --git a/docs/releasenotes/7.1.0.rst b/docs/releasenotes/7.1.0.rst index 0dd8669a5..c2aeb0f74 100644 --- a/docs/releasenotes/7.1.0.rst +++ b/docs/releasenotes/7.1.0.rst @@ -35,7 +35,7 @@ out-of-bounds reads via a crafted JP2 file. In ``libImaging/SgiRleDecode.c`` in Pillow through 7.0.0, a number of out-of-bounds reads exist in the parsing of SGI image files, a different issue than :cve:`2020-5311`. -API Changes +API changes =========== Allow saving of zero quality JPEG images @@ -50,7 +50,7 @@ been resolved. :: im = Image.open("hopper.jpg") im.save("out.jpg", quality=0) -API Additions +API additions ============= New channel operations @@ -101,7 +101,7 @@ Passing a different value on Windows or macOS will force taking a snapshot using the selected X server; pass an empty string to use the default X server. XCB support is not included in pre-compiled wheels for Windows and macOS. -Other Changes +Other changes ============= If present, only use alpha channel for bounding box diff --git a/docs/releasenotes/7.2.0.rst b/docs/releasenotes/7.2.0.rst index 91e54da19..12bafa8ce 100644 --- a/docs/releasenotes/7.2.0.rst +++ b/docs/releasenotes/7.2.0.rst @@ -1,7 +1,7 @@ 7.2.0 ----- -API Changes +API changes =========== Replaced TiffImagePlugin DEBUG with logging diff --git a/docs/releasenotes/8.0.0.rst b/docs/releasenotes/8.0.0.rst index 1fc245c9a..d0dde756f 100644 --- a/docs/releasenotes/8.0.0.rst +++ b/docs/releasenotes/8.0.0.rst @@ -1,7 +1,7 @@ 8.0.0 ----- -Backwards Incompatible Changes +Backwards incompatible changes ============================== Python 3.5 @@ -44,7 +44,7 @@ Removed Use instead ``product_model`` Unicode :py:attr:`~.CmsProfile.model` ======================== =================================================== -API Changes +API changes =========== ImageDraw.text: stroke_width @@ -67,7 +67,7 @@ Add MIME type to PsdImagePlugin "image/vnd.adobe.photoshop" is now registered as the :py:class:`.PsdImagePlugin.PsdImageFile` MIME type. -API Additions +API additions ============= Image.open: add formats parameter @@ -135,7 +135,7 @@ and :py:meth:`.FreeTypeFont.getbbox` return the bounding box of rendered text. These functions accept an ``anchor`` parameter, see :ref:`text-anchors` for details. -Other Changes +Other changes ============= Improved ellipse-drawing algorithm diff --git a/docs/releasenotes/8.1.0.rst b/docs/releasenotes/8.1.0.rst index 5c3993318..06e6d9974 100644 --- a/docs/releasenotes/8.1.0.rst +++ b/docs/releasenotes/8.1.0.rst @@ -26,7 +26,7 @@ leading to an out-of-bounds write in ``TiffDecode.c``. This potentially affects versions from 6.0.0 to 8.0.1, depending on the version of LibTIFF. This was reported through `Tidelift`_. -:cve:`2020-35655`: SGI Decode buffer overrun +:cve:`2020-35655`: SGI decode buffer overrun ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 4 byte read overflow in ``SgiRleDecode.c``, where the code was not correctly @@ -64,7 +64,7 @@ Makefile The ``install-venv`` target has been deprecated. -API Additions +API additions ============= Append images to ICO @@ -77,7 +77,7 @@ With this release, a list of images can be provided to the ``append_images`` par when saving, to replace the scaled down versions. This is the same functionality that already exists for the ICNS format. -Other Changes +Other changes ============= Makefile diff --git a/docs/releasenotes/8.1.1.rst b/docs/releasenotes/8.1.1.rst index 690421c2a..b8ad5a898 100644 --- a/docs/releasenotes/8.1.1.rst +++ b/docs/releasenotes/8.1.1.rst @@ -32,7 +32,7 @@ DOS attack. There is an out-of-bounds read in ``SgiRleDecode.c`` since Pillow 4.3.0. -Other Changes +Other changes ============= A crash with the feature flags for libimagequant, libjpeg-turbo, WebP and XCB on diff --git a/docs/releasenotes/8.2.0.rst b/docs/releasenotes/8.2.0.rst index 50fe9aa19..a59560695 100644 --- a/docs/releasenotes/8.2.0.rst +++ b/docs/releasenotes/8.2.0.rst @@ -74,7 +74,7 @@ Tk/Tcl 8.4 Support for Tk/Tcl 8.4 is deprecated and will be removed in Pillow 10.0.0 (2023-07-01), when Tk/Tcl 8.5 will be the minimum supported. -API Changes +API changes =========== Image.alpha_composite: dest @@ -107,7 +107,7 @@ removed. Instead, ``Image.getmodebase()``, ``Image.getmodetype()``, ``Image.getmodebandnames()``, ``Image.getmodebands()`` or ``ImageMode.getmode()`` can be used. -API Additions +API additions ============= getxmp() for JPEG images @@ -177,7 +177,7 @@ be specified through a keyword argument:: im.save("out.tif", icc_profile=...) -Other Changes +Other changes ============= GIF writer uses LZW encoding diff --git a/docs/releasenotes/8.3.0.rst b/docs/releasenotes/8.3.0.rst index 4ef914f64..c46240854 100644 --- a/docs/releasenotes/8.3.0.rst +++ b/docs/releasenotes/8.3.0.rst @@ -33,7 +33,7 @@ dictionary. The ``convert_dict_qtables`` method no longer performs any operations on the data given to it, has been deprecated and will be removed in Pillow 10.0.0 (2023-07-01). -API Changes +API changes =========== Changed WebP default "method" value when saving @@ -73,7 +73,7 @@ through :py:meth:`~PIL.Image.Image.getexif`. This also provides access to the GP EXIF IFDs, through ``im.getexif().get_ifd(0x8825)`` and ``im.getexif().get_ifd(0x8769)`` respectively. -API Additions +API additions ============= ImageOps.contain @@ -100,7 +100,7 @@ format, through the new ``bitmap_format`` argument:: im.save("out.ico", bitmap_format="bmp") -Other Changes +Other changes ============= Added DDS BC5 reading and uncompressed saving diff --git a/docs/releasenotes/8.3.2.rst b/docs/releasenotes/8.3.2.rst index 34ba703f7..e26a6ceda 100644 --- a/docs/releasenotes/8.3.2.rst +++ b/docs/releasenotes/8.3.2.rst @@ -20,7 +20,7 @@ bytes off the end of the allocated buffer from the heap. Present since Pillow 7. This bug was found by Google's `OSS-Fuzz`_ `CIFuzz`_ runs. -Other Changes +Other changes ============= Python 3.10 wheels diff --git a/docs/releasenotes/8.4.0.rst b/docs/releasenotes/8.4.0.rst index bdc8e8020..3bdf77d56 100644 --- a/docs/releasenotes/8.4.0.rst +++ b/docs/releasenotes/8.4.0.rst @@ -13,7 +13,7 @@ Before Pillow 8.3.0, ``ImagePalette`` required palette data of particular length default, and the size parameter could be used to override that. Pillow 8.3.0 removed the default required length, also removing the need for the size parameter. -API Additions +API additions ============= Added "transparency" argument for loading EPS images @@ -33,7 +33,7 @@ Added WalImageFile class :py:class:`PIL.Image.Image` instance. It now returns a dedicated :py:class:`PIL.WalImageFile.WalImageFile` class. -Other Changes +Other changes ============= Speed improvement when rotating square images diff --git a/docs/releasenotes/9.0.0.rst b/docs/releasenotes/9.0.0.rst index fee66b6d0..660e5514c 100644 --- a/docs/releasenotes/9.0.0.rst +++ b/docs/releasenotes/9.0.0.rst @@ -59,7 +59,7 @@ initializing ``ImagePath.Path``. .. _OSS-Fuzz: https://github.com/google/oss-fuzz -Backwards Incompatible Changes +Backwards incompatible changes ============================== Python 3.6 @@ -102,7 +102,7 @@ ImageFile.raise_ioerror has been removed. Use ``ImageFile.raise_oserror`` instead. -API Changes +API changes =========== Added line width parameter to ImageDraw polygon @@ -111,7 +111,7 @@ Added line width parameter to ImageDraw polygon An optional line ``width`` parameter has been added to ``ImageDraw.Draw.polygon``. -API Additions +API additions ============= ImageShow.XDGViewer @@ -132,7 +132,7 @@ Support has been added for the "title" argument in argument will also now be supported, e.g. ``im.show(title="My Image")`` and ``ImageShow.show(im, title="My Image")``. -Other Changes +Other changes ============= Convert subsequent GIF frames to RGB or RGBA diff --git a/docs/releasenotes/9.0.1.rst b/docs/releasenotes/9.0.1.rst index f65e3bcc2..5326afe78 100644 --- a/docs/releasenotes/9.0.1.rst +++ b/docs/releasenotes/9.0.1.rst @@ -21,7 +21,7 @@ While Pillow 9.0 restricted top-level builtins available to :py:meth:`!PIL.ImageMath.eval`, it did not prevent builtins available to lambda expressions. These are now also restricted. -Other Changes +Other changes ============= Pillow 9.0 added support for ``xdg-open`` as an image viewer, but there have been diff --git a/docs/releasenotes/9.1.0.rst b/docs/releasenotes/9.1.0.rst index 5b83d1e9c..72749ce8c 100644 --- a/docs/releasenotes/9.1.0.rst +++ b/docs/releasenotes/9.1.0.rst @@ -94,7 +94,7 @@ The stub image plugin ``FitsStubImagePlugin`` has been deprecated and will be re Pillow 10.0.0 (2023-07-01). FITS images can be read without a handler through :mod:`~PIL.FitsImagePlugin` instead. -API Changes +API changes =========== Raise an error when performing a negative crop @@ -137,7 +137,7 @@ On macOS, the last argument may need to be wrapped in quotes, e.g. Therefore ``requirements.txt`` has been removed along with the ``make install-req`` command for installing its contents. -API Additions +API additions ============= Added get_photoshop_blocks() to parse Photoshop TIFF tag @@ -193,7 +193,7 @@ palette. :: from PIL import GifImagePlugin GifImagePlugin.LOADING_STRATEGY = GifImagePlugin.LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY -Other Changes +Other changes ============= musllinux wheels diff --git a/docs/releasenotes/9.2.0.rst b/docs/releasenotes/9.2.0.rst index 6e0647343..a3c9800b6 100644 --- a/docs/releasenotes/9.2.0.rst +++ b/docs/releasenotes/9.2.0.rst @@ -126,7 +126,7 @@ Use instead:: draw = ImageDraw.Draw(im) draw.text((100 / 2, 100 / 2), "Hello world", font=font, anchor="mm") -API Additions +API additions ============= Image.apply_transparency @@ -137,7 +137,7 @@ with "transparency" in ``im.info``, and apply the transparency to the palette in The image's palette mode will become "RGBA", and "transparency" will be removed from ``im.info``. -Other Changes +Other changes ============= Using gnome-screenshot on Linux diff --git a/docs/releasenotes/9.3.0.rst b/docs/releasenotes/9.3.0.rst index e5987ce08..bb1e731fd 100644 --- a/docs/releasenotes/9.3.0.rst +++ b/docs/releasenotes/9.3.0.rst @@ -28,7 +28,7 @@ This was introduced in Pillow 9.2.0, found with `OSS-Fuzz`_ and fixed by limitin ``SAMPLESPERPIXEL`` to the number of planes that we can decode. -API Additions +API additions ============= Allow default ImageDraw font to be set @@ -65,7 +65,7 @@ The data from :py:data:`~PIL.ExifTags.TAGS` and :py:data:`~PIL.ExifTags.GPS`. -Other Changes +Other changes ============= Python 3.11 wheels diff --git a/docs/releasenotes/9.4.0.rst b/docs/releasenotes/9.4.0.rst index 37f26a22c..3b202157d 100644 --- a/docs/releasenotes/9.4.0.rst +++ b/docs/releasenotes/9.4.0.rst @@ -20,7 +20,7 @@ Pillow attempted to dereference a null pointer in ``ImageFont``, leading to a crash. An error is now raised instead. This has been present since Pillow 8.0.0. -API Additions +API additions ============= Added start position for getmask and getmask2 @@ -88,7 +88,7 @@ When saving a JPEG image, a comment can now be written from im.save(out, comment="Test comment") -Other Changes +Other changes ============= Added support for DDS L and LA images diff --git a/docs/releasenotes/9.5.0.rst b/docs/releasenotes/9.5.0.rst index 501479bb6..6bf2079c8 100644 --- a/docs/releasenotes/9.5.0.rst +++ b/docs/releasenotes/9.5.0.rst @@ -37,7 +37,7 @@ be removed in Pillow 11 (2024-10-15). This class was only made as a helper to be used internally, so there is no replacement. If you need this functionality though, it is a very short class that can easily be recreated in your own code. -API Additions +API additions ============= QOI file format @@ -71,7 +71,7 @@ If OpenJPEG 2.4.0 or later is available and the ``plt`` keyword argument is present and true when saving JPEG2000 images, tell the encoder to generate PLT markers. -Other Changes +Other changes ============= Added support for saving PDFs in RGBA mode diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index a116ef056..5d7b21d59 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -1,4 +1,4 @@ -Release Notes +Release notes ============= Pillow is released quarterly on January 2nd, April 1st, July 1st and October 15th. diff --git a/docs/releasenotes/template.rst b/docs/releasenotes/template.rst index cfc7221a3..a453d2a43 100644 --- a/docs/releasenotes/template.rst +++ b/docs/releasenotes/template.rst @@ -14,7 +14,7 @@ TODO TODO -Backwards Incompatible Changes +Backwards incompatible changes ============================== TODO @@ -28,7 +28,7 @@ TODO TODO -API Changes +API changes =========== TODO @@ -36,7 +36,7 @@ TODO TODO -API Additions +API additions ============= TODO @@ -44,7 +44,7 @@ TODO TODO -Other Changes +Other changes ============= TODO From 58e48745cc7b6c6f7dd26a50fe68d1a82ea51562 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 21 Apr 2025 19:14:08 +1000 Subject: [PATCH 086/268] Add list of third-party plugins (#8910) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- docs/handbook/appendices.rst | 1 + docs/handbook/third-party-plugins.rst | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 docs/handbook/third-party-plugins.rst diff --git a/docs/handbook/appendices.rst b/docs/handbook/appendices.rst index 347a8848b..c20d8bc8b 100644 --- a/docs/handbook/appendices.rst +++ b/docs/handbook/appendices.rst @@ -8,4 +8,5 @@ Appendices image-file-formats text-anchors + third-party-plugins writing-your-own-image-plugin diff --git a/docs/handbook/third-party-plugins.rst b/docs/handbook/third-party-plugins.rst new file mode 100644 index 000000000..a189a5773 --- /dev/null +++ b/docs/handbook/third-party-plugins.rst @@ -0,0 +1,18 @@ +Third-party plugins +=================== + +Pillow uses a plugin model which allows users to add their own +decoders and encoders to the library, without any changes to the library +itself. + +Here is a list of PyPI projects that offer additional plugins: + +* :pypi:`DjvuRleImagePlugin`: Plugin for the DjVu RLE image format as defined in the DjVuLibre docs. +* :pypi:`heif-image-plugin`: Simple HEIF/HEIC images plugin, based on the pyheif library. +* :pypi:`jxlpy`: Introduces reading and writing support for JPEG XL. +* :pypi:`pillow-heif`: Python bindings to libheif for working with HEIF images. +* :pypi:`pillow-jpls`: Plugin for the JPEG-LS codec, based on the Charls JPEG-LS implemetation. Python bindings implemented using pybind11. +* :pypi:`pillow-jxl-plugin`: Plugin for JPEG-XL, using Rust for bindings. +* :pypi:`pillow-mbm`: Adds support for KSP's proprietary MBM texture format. +* :pypi:`pillow-svg`: Implements basic SVG read support. Supports basic paths, shapes, and text. +* :pypi:`raw-pillow-opener`: Simple camera raw opener, based on the rawpy library. From 6bf791a3e7b2490bcb34ae9eb44419ee65c3caee Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 21 Apr 2025 10:27:49 +0100 Subject: [PATCH 087/268] Use a named tuple for the packed parameters --- Tests/test_pyarrow.py | 56 ++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index bcdd7ddc9..822cd18ac 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any # undone +from typing import Any, NamedTuple import pytest @@ -151,29 +151,37 @@ def test_lifetime2() -> None: assert isinstance(px[0, 0], int) -UINT_ARR = ( - fl_uint8_4_type, - [1,2,3,4], - 1 +class DataShape(NamedTuple): + dtype: Any + elt: Any + elts_per_pixel: int + + +UINT_ARR = DataShape( + dtype=fl_uint8_4_type, + elt=[1, 2, 3, 4], # array of 4 uint 8 per pixel + elts_per_pixel=1, # only one array per pixel ) -UINT = ( - pyarrow.uint8(), - 3, - 4 + +UINT = DataShape( + dtype=pyarrow.uint8(), + elt=3, # one uint8, + elts_per_pixel=4, # but repeated 4x per pixel ) -INT32 = ( - pyarrow.uint32(), - 0xabcdef45, - 1 + +UINT32 = DataShape( + dtype=pyarrow.uint32(), + elt=0xABCDEF45, # one packed int, doesn't fit in a int32 > 0x80000000 + elts_per_pixel=1, # one per pixel ) @pytest.mark.parametrize( "mode, data_tp, mask", ( - ("L", (pyarrow.uint8(), 3, 1), None), - ("I", (pyarrow.int32(), 1 << 24, 1), None), - ("F", (pyarrow.float32(), 3.14159, 1), None), + ("L", DataShape(pyarrow.uint8(), 3, 1), None), + ("I", DataShape(pyarrow.int32(), 1 << 24, 1), None), + ("F", DataShape(pyarrow.float32(), 3.14159, 1), None), ("LA", UINT_ARR, [0, 3]), ("LA", UINT, [0, 3]), ("RGB", UINT_ARR, [0, 1, 2]), @@ -188,7 +196,7 @@ INT32 = ( ("HSV", UINT, [0, 1, 2]), ), ) -def test_fromarray(mode: str, data_tp: tuple, mask: list[int] | None) -> None: +def test_fromarray(mode: str, data_tp: DataShape, mask: list[int] | None) -> None: (dtype, elt, elts_per_pixel) = data_tp ct_pixels = TEST_IMAGE_SIZE[0] * TEST_IMAGE_SIZE[1] @@ -201,15 +209,15 @@ def test_fromarray(mode: str, data_tp: tuple, mask: list[int] | None) -> None: @pytest.mark.parametrize( "mode, data_tp, mask", ( - ("LA", INT32, [0, 3]), - ("RGB", INT32, [0, 1, 2]), - ("RGBA", INT32, None), - ("CMYK", INT32, None), - ("YCbCr", INT32, [0, 1, 2]), - ("HSV", INT32, [0, 1, 2]), + ("LA", UINT32, [0, 3]), + ("RGB", UINT32, [0, 1, 2]), + ("RGBA", UINT32, None), + ("CMYK", UINT32, None), + ("YCbCr", UINT32, [0, 1, 2]), + ("HSV", UINT32, [0, 1, 2]), ), ) -def test_from_int32array(mode: str, data_tp: tuple, mask: list[int] | None) -> None: +def test_from_int32array(mode: str, data_tp: DataShape, mask: list[int] | None) -> None: (dtype, elt, elts_per_pixel) = data_tp ct_pixels = TEST_IMAGE_SIZE[0] * TEST_IMAGE_SIZE[1] From ce204f47f45f2ecdc831faac9c1b7ad8192a9fc7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 21 Apr 2025 10:37:32 +0100 Subject: [PATCH 088/268] lint --- src/libImaging/Storage.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 2c57165c1..1a9171a0c 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -737,7 +737,7 @@ ImagingNewArrow( return im; } } - // Stored as [[r,g,b,a],....] + // Stored as [[r,g,b,a],...] if (strcmp(schema->format, "+w:4") == 0 // 4 up array && im->pixelsize == 4 // storage as 32 bpc && schema->n_children > 0 // make sure schema is well formed. @@ -753,7 +753,7 @@ ImagingNewArrow( return im; } } - // Stored as [r,g,b,a,r,g,b,a....] + // Stored as [r,g,b,a,r,g,b,a,...] if (strcmp(schema->format, "C") == 0 // uint8 && im->pixelsize == 4 // storage as 32 bpc && schema->n_children == 0 // make sure schema is well formed. From bc4b664b7094a311eb516e7eab1b88acf7496b67 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 21 Apr 2025 10:46:45 +0100 Subject: [PATCH 089/268] Add integer range tests --- Tests/test_pyarrow.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index 822cd18ac..6eedcafe7 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -153,7 +153,10 @@ def test_lifetime2() -> None: class DataShape(NamedTuple): dtype: Any - elt: Any + elt: Any # Strictly speaking, this should be a pixel or pixel component, + # so list[uint8][4], float, int, uint32, uint8, etc. + # But more correctly, it should be exactly the dtype from the + # line above. elts_per_pixel: int @@ -175,6 +178,12 @@ UINT32 = DataShape( elts_per_pixel=1, # one per pixel ) +INT32 = DataShape( + dtype=pyarrow.uint32(), + elt=0x12CDEF45, # one packed int + elts_per_pixel=1, # one per pixel +) + @pytest.mark.parametrize( "mode, data_tp, mask", @@ -215,6 +224,12 @@ def test_fromarray(mode: str, data_tp: DataShape, mask: list[int] | None) -> Non ("CMYK", UINT32, None), ("YCbCr", UINT32, [0, 1, 2]), ("HSV", UINT32, [0, 1, 2]), + ("LA", INT32, [0, 3]), + ("RGB", INT32, [0, 1, 2]), + ("RGBA", INT32, None), + ("CMYK", INT32, None), + ("YCbCr", INT32, [0, 1, 2]), + ("HSV", INT32, [0, 1, 2]), ), ) def test_from_int32array(mode: str, data_tp: DataShape, mask: list[int] | None) -> None: From 45e24e429f7d443000a6955d228fa00055104414 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Mon, 21 Apr 2025 10:54:00 +0100 Subject: [PATCH 090/268] Rearrance so black doesn't screw up the formatting --- Tests/test_pyarrow.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index 6eedcafe7..e7fce1e33 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -153,10 +153,10 @@ def test_lifetime2() -> None: class DataShape(NamedTuple): dtype: Any - elt: Any # Strictly speaking, this should be a pixel or pixel component, - # so list[uint8][4], float, int, uint32, uint8, etc. - # But more correctly, it should be exactly the dtype from the - # line above. + # Strictly speaking, elt should be a pixel or pixel component, so + # list[uint8][4], float, int, uint32, uint8, etc. But more + # correctly, it should be exactly the dtype from the line above. + elt: Any elts_per_pixel: int From 7a48a9fae083697bb30a6bec42c0c73399f3979a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 23 Apr 2025 20:34:53 +1000 Subject: [PATCH 091/268] Do not load image more than once --- src/PIL/IptcImagePlugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index 60ab7c83f..4336b8154 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -179,6 +179,7 @@ class IptcImageFile(ImageFile.ImageFile): with Image.open(o) as _im: _im.load() self.im = _im.im + self.tile = [] return None From 1e365d8c7282f77f5959ba9b772c5fd1b9aa4315 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 23 Apr 2025 21:10:54 +1000 Subject: [PATCH 092/268] Return PixelAccess on first load --- Tests/test_file_ico.py | 1 + Tests/test_file_iptc.py | 3 +++ src/PIL/IcoImagePlugin.py | 2 +- src/PIL/IptcImagePlugin.py | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 5d2ace35e..0eef7c07a 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -99,6 +99,7 @@ def test_getpixel(tmp_path: Path) -> None: reloaded.load() reloaded.size = (32, 32) + assert reloaded.load() is not None assert reloaded.getpixel((0, 0)) == (18, 20, 62) diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index c6c0c1aab..424820ce4 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -23,6 +23,9 @@ def test_open() -> None: assert im.tile == [("iptc", (0, 0, 1, 1), 25, "raw")] assert_image_equal(im, expected) + with Image.open(f) as im: + assert im.load() is not None + def test_getiptcinfo_jpg_none() -> None: # Arrange diff --git a/src/PIL/IcoImagePlugin.py b/src/PIL/IcoImagePlugin.py index 55c57f203..bd35ac890 100644 --- a/src/PIL/IcoImagePlugin.py +++ b/src/PIL/IcoImagePlugin.py @@ -362,7 +362,7 @@ class IcoImageFile(ImageFile.ImageFile): self.info["sizes"] = set(sizes) self.size = im.size - return None + return Image.Image.load(self) def load_seek(self, pos: int) -> None: # Flag the ImageFile.Parser so that it diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index 4336b8154..637f67810 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -180,7 +180,7 @@ class IptcImageFile(ImageFile.ImageFile): _im.load() self.im = _im.im self.tile = [] - return None + return Image.Image.load(self) Image.register_open(IptcImageFile.format, IptcImageFile) From d8afcb762fdc2a8d8e06deedd903993ab26805d8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 23 Apr 2025 23:09:08 +1000 Subject: [PATCH 093/268] Do not update palette for L mode frame --- .../no_palette_with_transparency_after_rgb.gif | Bin 0 -> 16290 bytes Tests/test_file_gif.py | 12 ++++++++++++ src/PIL/GifImagePlugin.py | 9 ++++++--- 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 Tests/images/no_palette_with_transparency_after_rgb.gif diff --git a/Tests/images/no_palette_with_transparency_after_rgb.gif b/Tests/images/no_palette_with_transparency_after_rgb.gif new file mode 100644 index 0000000000000000000000000000000000000000..41357c1471db6ffeff5ac16d717b97e73f24094d GIT binary patch literal 16290 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 b#g&ycnzVQest<+eu%s{I~DmZd$pp4lG=e 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 None: assert im.mode == "RGB" +def test_l_mode_transparency_after_rgb() -> None: + with Image.open("Tests/images/no_palette_with_transparency_after_rgb.gif") as im: + expected = im.convert("RGB") + d = ImageDraw.Draw(expected) + d.rectangle([(0, 0), (64, 128)], fill="#000") + + im.seek(1) + assert im.mode == "RGB" + + assert_image_equal(im, expected) + + def test_palette_not_needed_for_second_frame() -> None: with Image.open("Tests/images/palette_not_needed_for_second_frame.gif") as im: im.seek(1) diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 4392c4cb9..2102614db 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -477,8 +477,11 @@ class GifImageFile(ImageFile.ImageFile): self._prev_im = expanded_im assert self._prev_im is not None if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - frame_im = self.im.convert("RGBA") + if self.mode == "L": + frame_im = self.im.convert_transparent("LA", self._frame_transparency) + else: + self.im.putpalettealpha(self._frame_transparency, 0) + frame_im = self.im.convert("RGBA") else: frame_im = self.im.convert("RGB") @@ -487,7 +490,7 @@ class GifImageFile(ImageFile.ImageFile): self.im = self._prev_im self._mode = self.im.mode - if frame_im.mode == "RGBA": + if frame_im.mode in ("LA", "RGBA"): self.im.paste(frame_im, self.dispose_extent, frame_im) else: self.im.paste(frame_im, self.dispose_extent) From 3bd55822cd81930231db9bcb3bdc53deeeb56736 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 24 Apr 2025 13:26:58 +1000 Subject: [PATCH 094/268] Handle IPTC TIFF tags with incorrect type --- Tests/test_file_iptc.py | 16 +++++++++++----- src/PIL/IptcImagePlugin.py | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index c6c0c1aab..07335c269 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -5,7 +5,7 @@ from io import BytesIO, StringIO import pytest -from PIL import Image, IptcImagePlugin +from PIL import Image, IptcImagePlugin, TiffImagePlugin, TiffTags from .helper import assert_image_equal, hopper @@ -75,13 +75,19 @@ def test_getiptcinfo_zero_padding() -> None: def test_getiptcinfo_tiff() -> None: - # Arrange + expected = {(1, 90): b"\x1b%G", (2, 0): b"\xcf\xc0"} + with Image.open("Tests/images/hopper.Lab.tif") as im: - # Act iptc = IptcImagePlugin.getiptcinfo(im) - # Assert - assert iptc == {(1, 90): b"\x1b%G", (2, 0): b"\xcf\xc0"} + assert iptc == expected + + # Test with LONG tag type + with Image.open("Tests/images/hopper.Lab.tif") as im: + im.tag_v2.tagtype[TiffImagePlugin.IPTC_NAA_CHUNK] = TiffTags.LONG + iptc = IptcImagePlugin.getiptcinfo(im) + + assert iptc == expected def test_getiptcinfo_tiff_none() -> None: diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index 60ab7c83f..9df498e26 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -219,7 +219,7 @@ def getiptcinfo( # get raw data from the IPTC/NAA tag (PhotoShop tags the data # as 4-byte integers, so we cannot use the get method...) try: - data = im.tag_v2[TiffImagePlugin.IPTC_NAA_CHUNK] + data = im.tag_v2._tagdata[TiffImagePlugin.IPTC_NAA_CHUNK] except KeyError: pass From 225182414c3c5cccc2fa42b3dd47147ef06790f9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 25 Apr 2025 17:14:13 +1000 Subject: [PATCH 095/268] libavif below 1.0 is not supported --- src/PIL/AvifImagePlugin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/PIL/AvifImagePlugin.py b/src/PIL/AvifImagePlugin.py index b2c5ab15d..366e0c864 100644 --- a/src/PIL/AvifImagePlugin.py +++ b/src/PIL/AvifImagePlugin.py @@ -16,7 +16,6 @@ except ImportError: # Decoder options as module globals, until there is a way to pass parameters # to Image.open (see https://github.com/python-pillow/Pillow/issues/569) DECODE_CODEC_CHOICE = "auto" -# Decoding is only affected by this for libavif **0.8.4** or greater. DEFAULT_MAX_THREADS = 0 From 4c2227758ec7bda10213220dc022e0e105533391 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Sun, 27 Apr 2025 07:09:53 -0400 Subject: [PATCH 096/268] Add template for quarterly release issue --- .github/ISSUE_TEMPLATE/RELEASE.md | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/RELEASE.md diff --git a/.github/ISSUE_TEMPLATE/RELEASE.md b/.github/ISSUE_TEMPLATE/RELEASE.md new file mode 100644 index 000000000..db4c94a09 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/RELEASE.md @@ -0,0 +1,45 @@ +--- +name: Release +about: Schedule a release +--- + +## Main Release + +Released quarterly on January 2nd, April 1st, July 1st and October 15th. + +* [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154 +* [ ] Develop and prepare release in `main` branch. + * [ ] Add release notes for 11.2.1 https://github.com/python-pillow/Pillow/pull/8885 +* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) to confirm passing tests in `main` branch. +* [ ] Check that all the wheel builds pass the tests in the [GitHub Actions "Wheels" workflow](https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml) jobs by manually triggering them. +* [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), update version identifier in `src/PIL/_version.py` +* [ ] Run pre-release check via `make release-test` in a freshly cloned repo. +* [ ] Create branch and tag for release e.g.: + ```bash + git branch [[MAJOR.MINOR.PATCH]] + git tag [[MAJOR.MINOR.PATCH]] + git push --tags + ``` +* [ ] Check the [GitHub Actions "Wheels" workflow](https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml) has passed, including the "Upload release to PyPI" job. This will have been triggered by the new tag. +* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases). +* [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), increment and append `.dev0` to version identifier in `src/PIL/_version.py` and then: + ```bash + git push --all + ``` + +## Publicize Release + +* [ ] Announce release availability via [Mastodon](https://fosstodon.org/@pillow) e.g. https://fosstodon.org/@pillow/110639450470725321 + +## Documentation + +* [ ] Make sure the [default version for Read the Docs](https://pillow.readthedocs.io/en/stable/) is up-to-date with the release changes + +## Docker Images + +* [ ] Update Pillow in the Docker Images repository + ```bash + git clone https://github.com/python-pillow/docker-images + cd docker-images + ./update-pillow-tag.sh [[release tag]] + ``` From da9d5522f7c7cd96d99a25a580ac6488f63bedaf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 27 Apr 2025 21:35:08 +1000 Subject: [PATCH 097/268] Update dependency cibuildwheel to v2.23.3 (#8931) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .ci/requirements-cibw.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/requirements-cibw.txt b/.ci/requirements-cibw.txt index db5f89c9a..0e314b8bf 100644 --- a/.ci/requirements-cibw.txt +++ b/.ci/requirements-cibw.txt @@ -1 +1 @@ -cibuildwheel==2.23.2 +cibuildwheel==2.23.3 From 8ab3bc469ec4ebcc7e5bc5a848fd59bd4a9a8221 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Sun, 27 Apr 2025 08:21:48 -0400 Subject: [PATCH 098/268] Update .github/ISSUE_TEMPLATE/RELEASE.md Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/RELEASE.md b/.github/ISSUE_TEMPLATE/RELEASE.md index db4c94a09..c5bae8b2a 100644 --- a/.github/ISSUE_TEMPLATE/RELEASE.md +++ b/.github/ISSUE_TEMPLATE/RELEASE.md @@ -9,7 +9,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. * [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154 * [ ] Develop and prepare release in `main` branch. - * [ ] Add release notes for 11.2.1 https://github.com/python-pillow/Pillow/pull/8885 + * [ ] Add release notes e.g. https://github.com/python-pillow/Pillow/pull/8885 * [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) to confirm passing tests in `main` branch. * [ ] Check that all the wheel builds pass the tests in the [GitHub Actions "Wheels" workflow](https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml) jobs by manually triggering them. * [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), update version identifier in `src/PIL/_version.py` From 0205fb4fa2e9905dcec12715d60b5f4a75e30266 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Sun, 27 Apr 2025 08:21:57 -0400 Subject: [PATCH 099/268] Update .github/ISSUE_TEMPLATE/RELEASE.md Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/RELEASE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/RELEASE.md b/.github/ISSUE_TEMPLATE/RELEASE.md index c5bae8b2a..72499e01d 100644 --- a/.github/ISSUE_TEMPLATE/RELEASE.md +++ b/.github/ISSUE_TEMPLATE/RELEASE.md @@ -16,8 +16,8 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. * [ ] Run pre-release check via `make release-test` in a freshly cloned repo. * [ ] Create branch and tag for release e.g.: ```bash - git branch [[MAJOR.MINOR.PATCH]] - git tag [[MAJOR.MINOR.PATCH]] + git branch [[MAJOR.MINOR]].0 + git tag [[MAJOR.MINOR]].0 git push --tags ``` * [ ] Check the [GitHub Actions "Wheels" workflow](https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml) has passed, including the "Upload release to PyPI" job. This will have been triggered by the new tag. From 6f672191ad83b522c47e1facdeb12889f91a5824 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sun, 27 Apr 2025 22:30:35 +1000 Subject: [PATCH 100/268] Branch uses .x --- .github/ISSUE_TEMPLATE/RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/RELEASE.md b/.github/ISSUE_TEMPLATE/RELEASE.md index 72499e01d..5dd070886 100644 --- a/.github/ISSUE_TEMPLATE/RELEASE.md +++ b/.github/ISSUE_TEMPLATE/RELEASE.md @@ -16,7 +16,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. * [ ] Run pre-release check via `make release-test` in a freshly cloned repo. * [ ] Create branch and tag for release e.g.: ```bash - git branch [[MAJOR.MINOR]].0 + git branch [[MAJOR.MINOR]].x git tag [[MAJOR.MINOR]].0 git push --tags ``` From 6881863eab8106a6a0e3cb788f11c7d0d71cf124 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Sun, 27 Apr 2025 15:37:42 -0400 Subject: [PATCH 101/268] Update .github/ISSUE_TEMPLATE/RELEASE.md Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/RELEASE.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/RELEASE.md b/.github/ISSUE_TEMPLATE/RELEASE.md index 5dd070886..97701f30e 100644 --- a/.github/ISSUE_TEMPLATE/RELEASE.md +++ b/.github/ISSUE_TEMPLATE/RELEASE.md @@ -1,6 +1,7 @@ --- -name: Release -about: Schedule a release +name: "Maintainers only: Release" +about: For maintainers to schedule a quarterly release +labels: Release --- ## Main Release From fcaffa22293c41851e9e28b3229b981398deacda Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Sun, 27 Apr 2025 15:37:50 -0400 Subject: [PATCH 102/268] Update .github/ISSUE_TEMPLATE/RELEASE.md Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/RELEASE.md b/.github/ISSUE_TEMPLATE/RELEASE.md index 97701f30e..d7b246378 100644 --- a/.github/ISSUE_TEMPLATE/RELEASE.md +++ b/.github/ISSUE_TEMPLATE/RELEASE.md @@ -4,7 +4,7 @@ about: For maintainers to schedule a quarterly release labels: Release --- -## Main Release +## Main release Released quarterly on January 2nd, April 1st, July 1st and October 15th. From 1eba198b62d1444e72f598db805121022a19ab04 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Sun, 27 Apr 2025 15:37:56 -0400 Subject: [PATCH 103/268] Update .github/ISSUE_TEMPLATE/RELEASE.md Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/RELEASE.md b/.github/ISSUE_TEMPLATE/RELEASE.md index d7b246378..16bf30fdc 100644 --- a/.github/ISSUE_TEMPLATE/RELEASE.md +++ b/.github/ISSUE_TEMPLATE/RELEASE.md @@ -28,7 +28,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. git push --all ``` -## Publicize Release +## Publicize release * [ ] Announce release availability via [Mastodon](https://fosstodon.org/@pillow) e.g. https://fosstodon.org/@pillow/110639450470725321 From e6ff42303b54d16e213b2152984a39f07742fcaf Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Sun, 27 Apr 2025 15:38:02 -0400 Subject: [PATCH 104/268] Update .github/ISSUE_TEMPLATE/RELEASE.md Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/RELEASE.md b/.github/ISSUE_TEMPLATE/RELEASE.md index 16bf30fdc..20d1ac79b 100644 --- a/.github/ISSUE_TEMPLATE/RELEASE.md +++ b/.github/ISSUE_TEMPLATE/RELEASE.md @@ -36,7 +36,7 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th. * [ ] Make sure the [default version for Read the Docs](https://pillow.readthedocs.io/en/stable/) is up-to-date with the release changes -## Docker Images +## Docker images * [ ] Update Pillow in the Docker Images repository ```bash From e140027262b95d26080b5d58e095d2e294609e69 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Sun, 27 Apr 2025 15:45:40 -0400 Subject: [PATCH 105/268] Move checklist to issue template --- RELEASING.md | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 932beb2c2..b626d7d23 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -7,27 +7,8 @@ information about how the version numbers line up with releases. Released quarterly on January 2nd, April 1st, July 1st and October 15th. -* [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154 -* [ ] Develop and prepare release in `main` branch. -* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) to confirm passing tests in `main` branch. -* [ ] Check that all the wheel builds pass the tests in the [GitHub Actions "Wheels" workflow](https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml) jobs by manually triggering them. -* [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), update version identifier in `src/PIL/_version.py` -* [ ] Run pre-release check via `make release-test` in a freshly cloned repo. -* [ ] Create branch and tag for release e.g.: - ```bash - git branch 5.2.x - git tag 5.2.0 - git push --tags - ``` -* [ ] Check the [GitHub Actions "Wheels" workflow](https://github.com/python-pillow/Pillow/actions/workflows/wheels.yml) - has passed, including the "Upload release to PyPI" job. This will have been triggered - by the new tag. -* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases). -* [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), - increment and append `.dev0` to version identifier in `src/PIL/_version.py` and then: - ```bash - git push --all - ``` +* [ ] Create a new issue and select the "Release" template. + ## Point Release Released as needed for security, installation or critical bug fixes. From f1d5cdaa07fbf4377d3cf4c68377e64998619b60 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 28 Apr 2025 06:17:47 +1000 Subject: [PATCH 106/268] Use sentence case --- README.md | 4 ++-- RELEASING.md | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 1cae558ad..365d356a0 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ This library provides extensive file format support, an efficient internal repre The core image library is designed for fast access to data stored in a few basic pixel formats. It should provide a solid foundation for a general image processing tool. -## More Information +## More information - [Documentation](https://pillow.readthedocs.io/) - [Installation](https://pillow.readthedocs.io/en/latest/installation/basic-installation.html) @@ -107,6 +107,6 @@ The core image library is designed for fast access to data stored in a few basic - [Changelog](https://github.com/python-pillow/Pillow/releases) - [Pre-fork](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst#pre-fork) -## Report a Vulnerability +## Report a vulnerability To report a security vulnerability, please follow the procedure described in the [Tidelift security policy](https://tidelift.com/docs/security). diff --git a/RELEASING.md b/RELEASING.md index b626d7d23..c160e96f5 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1,15 +1,15 @@ -# Release Checklist +# Release checklist See https://pillow.readthedocs.io/en/stable/releasenotes/versioning.html for information about how the version numbers line up with releases. -## Main Release +## Main release Released quarterly on January 2nd, April 1st, July 1st and October 15th. * [ ] Create a new issue and select the "Release" template. -## Point Release +## Point release Released as needed for security, installation or critical bug fixes. @@ -39,7 +39,7 @@ Released as needed for security, installation or critical bug fixes. git push ``` -## Embargoed Release +## Embargoed release Released as needed privately to individual vendors for critical security-related bug fixes. @@ -63,7 +63,7 @@ Released as needed privately to individual vendors for critical security-related git push origin 2.5.x ``` -## Publicize Release +## Publicize release * [ ] Announce release availability via [Mastodon](https://fosstodon.org/@pillow) e.g. https://fosstodon.org/@pillow/110639450470725321 @@ -71,7 +71,7 @@ Released as needed privately to individual vendors for critical security-related * [ ] Make sure the [default version for Read the Docs](https://pillow.readthedocs.io/en/stable/) is up-to-date with the release changes -## Docker Images +## Docker images * [ ] Update Pillow in the Docker Images repository ```bash From dbe538a1307dc14c3ecb685819f28f22c02060ab Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 28 Apr 2025 06:19:18 +1000 Subject: [PATCH 107/268] Updated template name --- RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASING.md b/RELEASING.md index c160e96f5..3c6188c82 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -7,7 +7,7 @@ information about how the version numbers line up with releases. Released quarterly on January 2nd, April 1st, July 1st and October 15th. -* [ ] Create a new issue and select the "Release" template. +* [ ] Create a new issue and select the "Maintainers only: Release" template. ## Point release From 47bebfc801c3905979715d0d22a9560c395581e6 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 29 Apr 2025 14:57:10 +1000 Subject: [PATCH 108/268] Allow loading state from Pillow < 11.2.1 --- Tests/test_pickle.py | 10 ++++++++++ src/PIL/ImageFile.py | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Tests/test_pickle.py b/Tests/test_pickle.py index 1c48cb743..54cef00ad 100644 --- a/Tests/test_pickle.py +++ b/Tests/test_pickle.py @@ -162,3 +162,13 @@ def test_pickle_font_file(tmp_path: Path, protocol: int) -> None: # Assert helper_assert_pickled_font_images(font, unpickled_font) + + +def test_load_earlier_data() -> None: + im = pickle.loads( + b"\x80\x04\x95@\x00\x00\x00\x00\x00\x00\x00\x8c\x12PIL.PngImagePlugin" + b"\x94\x8c\x0cPngImageFile\x94\x93\x94)\x81\x94]\x94(}\x94\x8c\x01L\x94K\x01" + b"K\x01\x86\x94NC\x01\x00\x94eb." + ) + assert im.mode == "L" + assert im.size == (1, 1) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index bcb7d462e..bf556a2c6 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -257,7 +257,8 @@ class ImageFile(Image.Image): def __setstate__(self, state: list[Any]) -> None: self.tile = [] - self.filename = state[5] + if len(state) > 5: + self.filename = state[5] super().__setstate__(state) def verify(self) -> None: From 07df26aa5d2cf0937737c787bc88ff05454e53d2 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:37:45 +0300 Subject: [PATCH 109/268] Refactor docs `Makefile` (#8933) Co-authored-by: Andrew Murray --- docs/Makefile | 42 ++++++++++++++++++------------------------ docs/make.bat | 2 -- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/docs/Makefile b/docs/Makefile index 1e6c06ede..8c1019294 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,17 +3,23 @@ # You can set these variables from the command line. PYTHON = python3 -SPHINXOPTS = SPHINXBUILD = $(PYTHON) -m sphinx.cmd.build -PAPER = +SPHINXOPTS = --fail-on-warning BUILDDIR = _build +BUILDER = html +JOBS = auto +PAPER = # Internal variables. PAPEROPT_a4 = --define latex_paper_size=a4 PAPEROPT_letter = --define latex_paper_size=letter -ALLSPHINXOPTS = --doctree-dir $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +ALLSPHINXOPTS = --builder $(BUILDER) \ + --doctree-dir $(BUILDDIR)/doctrees \ + --jobs $(JOBS) \ + $(PAPEROPT_$(PAPER)) \ + $(SPHINXOPTS) \ + . $(BUILDDIR)/$(BUILDER) .PHONY: help help: @@ -36,31 +42,19 @@ install-sphinx: .PHONY: html html: $(MAKE) install-sphinx - $(SPHINXBUILD) --builder html --fail-on-warning --keep-going $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + $(SPHINXBUILD) $(ALLSPHINXOPTS) .PHONY: dirhtml -dirhtml: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." +dirhtml: BUILDER = dirhtml +dirhtml: html .PHONY: singlehtml -singlehtml: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." +singlehtml: BUILDER = singlehtml +singlehtml: html .PHONY: linkcheck -linkcheck: - $(MAKE) install-sphinx - $(SPHINXBUILD) --builder linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck -j auto - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." +linkcheck: BUILDER = linkcheck +linkcheck: html .PHONY: htmlview htmlview: html diff --git a/docs/make.bat b/docs/make.bat index 4126f786b..9d15537fb 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -7,10 +7,8 @@ if "%SPHINXBUILD%" == "" ( ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help From 2245fd09de9c358bce2cb7f6f49b3f9710229489 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 30 Apr 2025 07:54:07 +1000 Subject: [PATCH 110/268] Updated Ghostscript to 10.5.1 --- .github/workflows/test-windows.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index bf8ec2f2c..abbfd95c8 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -98,8 +98,8 @@ jobs: choco install nasm --no-progress echo "C:\Program Files\NASM" >> $env:GITHUB_PATH - choco install ghostscript --version=10.5.0 --no-progress - echo "C:\Program Files\gs\gs10.05.0\bin" >> $env:GITHUB_PATH + choco install ghostscript --version=10.5.1 --no-progress + echo "C:\Program Files\gs\gs10.05.1\bin" >> $env:GITHUB_PATH # Install extra test images xcopy /S /Y Tests\test-images\* Tests\images From 0e292a80c8bed0f98cd56141431632a9433c5274 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 3 May 2025 00:52:35 +1000 Subject: [PATCH 111/268] Restore original encoderinfo after saving --- Tests/test_file_mpo.py | 3 +++ src/PIL/Image.py | 8 +++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 73838ef44..716422537 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -315,6 +315,9 @@ def test_save_xmp() -> None: im2.encoderinfo = {"xmp": b"Second frame"} im_reloaded = roundtrip(im, xmp=b"First frame", save_all=True, append_images=[im2]) + # Test that encoderinfo is unchanged + assert im2.encoderinfo == {"xmp": b"Second frame"} + assert im_reloaded.info["xmp"] == b"First frame" im_reloaded.seek(1) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ded40bc5d..02627c37a 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2551,7 +2551,8 @@ class Image: self.load() save_all = params.pop("save_all", None) - self.encoderinfo = {**getattr(self, "encoderinfo", {}), **params} + encoderinfo = getattr(self, "encoderinfo", {}) + self.encoderinfo = {**encoderinfo, **params} self.encoderconfig: tuple[Any, ...] = () if format.upper() not in SAVE: @@ -2589,10 +2590,7 @@ class Image: pass raise finally: - try: - del self.encoderinfo - except AttributeError: - pass + self.encoderinfo = encoderinfo if open_fp: fp.close() From 4d56b90f38eda564ce8913bdc9b5222c3407652f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 5 May 2025 07:12:20 +1000 Subject: [PATCH 112/268] Updated docstring --- src/PIL/DdsImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/DdsImagePlugin.py b/src/PIL/DdsImagePlugin.py index 26307817c..f9ade18f9 100644 --- a/src/PIL/DdsImagePlugin.py +++ b/src/PIL/DdsImagePlugin.py @@ -1,5 +1,5 @@ """ -A Pillow loader for .dds files (S3TC-compressed aka DXTC) +A Pillow plugin for .dds files (S3TC-compressed aka DXTC) Jerome Leclanche Documentation: From d02f7868732cdacc227dd794f6ff84bd6f1858c9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 19:16:40 +1000 Subject: [PATCH 113/268] [pre-commit.ci] pre-commit autoupdate (#8944) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/zizmor.yml | 7 +++++++ .pre-commit-config.yaml | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 .github/zizmor.yml diff --git a/.github/zizmor.yml b/.github/zizmor.yml new file mode 100644 index 000000000..5bdc48c30 --- /dev/null +++ b/.github/zizmor.yml @@ -0,0 +1,7 @@ +# Configuration for the zizmor static analysis tool, run via pre-commit in CI +# https://woodruffw.github.io/zizmor/configuration/ +rules: + unpinned-uses: + config: + policies: + "*": ref-pin diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 140ce33be..e15e6f639 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.4 + rev: v0.11.8 hooks: - id: ruff args: [--exit-non-zero-on-fix] @@ -24,7 +24,7 @@ repos: exclude: (Makefile$|\.bat$|\.cmake$|\.eps$|\.fits$|\.gd$|\.opt$) - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v20.1.0 + rev: v20.1.3 hooks: - id: clang-format types: [c] @@ -51,14 +51,14 @@ repos: exclude: ^.github/.*TEMPLATE|^Tests/(fonts|images)/ - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.32.1 + rev: 0.33.0 hooks: - id: check-github-workflows - id: check-readthedocs - id: check-renovate - repo: https://github.com/woodruffw/zizmor-pre-commit - rev: v1.5.2 + rev: v1.6.0 hooks: - id: zizmor From c7193f74fc5ce1a0fe1742a0845165024be45ef5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 8 May 2025 20:10:34 +1000 Subject: [PATCH 114/268] Updated error message --- Tests/test_image_resample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index ce6209c0d..73b25ed51 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -462,7 +462,7 @@ class TestCoreResampleBox: im.resize((32, 32), resample, (20, 20, 20, 100)) im.resize((32, 32), resample, (20, 20, 100, 20)) - with pytest.raises(TypeError, match="must be sequence of length 4"): + with pytest.raises(TypeError, match="must be (sequence|tuple) of length 4"): im.resize((32, 32), resample, (im.width, im.height)) # type: ignore[arg-type] with pytest.raises(ValueError, match="can't be negative"): From 71a916ad53502ed8cb8ea71c40081c169c3eae0f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 8 May 2025 22:10:22 +1000 Subject: [PATCH 115/268] Do not install PyQt6 on Python 3.14 --- .github/workflows/test-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index bf8ec2f2c..12f06ee03 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -84,7 +84,7 @@ jobs: python3 -m pip install --upgrade pip - name: Install CPython dependencies - if: "!contains(matrix.python-version, 'pypy') && matrix.architecture != 'x86'" + if: "!contains(matrix.python-version, 'pypy') && !contains(matrix.python-version, '3.14') && matrix.architecture != 'x86'" run: | python3 -m pip install PyQt6 From 215069af5ddec6f4d3b92b8bc7554a10e2efb669 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 8 May 2025 22:13:13 +1000 Subject: [PATCH 116/268] Added support for Python 3.14 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5ecd6b816..5d41e27d9 100644 --- a/setup.py +++ b/setup.py @@ -46,7 +46,7 @@ WEBP_ROOT = None ZLIB_ROOT = None FUZZING_BUILD = "LIB_FUZZING_ENGINE" in os.environ -if sys.platform == "win32" and sys.version_info >= (3, 14): +if sys.platform == "win32" and sys.version_info >= (3, 15): import atexit atexit.register( From 78887f6114e68d4208a6d5e8f3d5134a6da6831a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 9 May 2025 23:52:18 +1000 Subject: [PATCH 117/268] Corrected comment --- Tests/test_pyarrow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index e7fce1e33..c5872231b 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -162,7 +162,7 @@ class DataShape(NamedTuple): UINT_ARR = DataShape( dtype=fl_uint8_4_type, - elt=[1, 2, 3, 4], # array of 4 uint 8 per pixel + elt=[1, 2, 3, 4], # array of 4 uint8 per pixel elts_per_pixel=1, # only one array per pixel ) From 74ab5ac4cda564714545eee52ab789d4bddf1516 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sun, 11 May 2025 23:46:21 +0200 Subject: [PATCH 118/268] Fix memory leak in arrow export using array structure --- src/libImaging/Arrow.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libImaging/Arrow.c b/src/libImaging/Arrow.c index 33ff2ce77..36f4554fc 100644 --- a/src/libImaging/Arrow.c +++ b/src/libImaging/Arrow.c @@ -127,9 +127,7 @@ static void release_const_array(struct ArrowArray *array) { Imaging im = (Imaging)array->private_data; - if (array->n_children == 0) { - ImagingDelete(im); - } + ImagingDelete(im); // Free the buffers and the buffers array if (array->buffers) { From c64a7b50983d64b15bc8551315e28f4ac0cd8e84 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 13 May 2025 07:41:00 +1000 Subject: [PATCH 119/268] Updated harfbuzz to 11.2.1 --- .github/workflows/wheels-dependencies.sh | 2 +- winbuild/build_prepare.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index a4592871f..a6b52064c 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -38,7 +38,7 @@ ARCHIVE_SDIR=pillow-depends-main # Package versions for fresh source builds FREETYPE_VERSION=2.13.3 -HARFBUZZ_VERSION=11.1.0 +HARFBUZZ_VERSION=11.2.1 LIBPNG_VERSION=1.6.47 JPEGTURBO_VERSION=3.1.0 OPENJPEG_VERSION=2.5.3 diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 17fc37572..fbe479291 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -113,7 +113,7 @@ V = { "BROTLI": "1.1.0", "FREETYPE": "2.13.3", "FRIBIDI": "1.0.16", - "HARFBUZZ": "11.1.0", + "HARFBUZZ": "11.2.1", "JPEGTURBO": "3.1.0", "LCMS2": "2.17", "LIBAVIF": "1.2.1", From 4984c45da2f6b854cb49dc81fc56372f335d43a0 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 May 2025 10:27:38 +0200 Subject: [PATCH 120/268] valgrind memory leak check --- Makefile | 6 ++++++ Tests/oss-fuzz/python.supp | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/Makefile b/Makefile index 53164b08a..fd124d124 100644 --- a/Makefile +++ b/Makefile @@ -99,6 +99,12 @@ valgrind: --log-file=/tmp/valgrind-output \ python3 -m pytest --no-memcheck -vv --valgrind --valgrind-log=/tmp/valgrind-output +.PHONY: valgrind-leak +valgrind-leak: + PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp --leak-check=full --show-leak-kinds=definite --errors-for-leak-kinds=definite \ + --log-file=/tmp/valgrind-output \ + python3 -m pytest -vv --valgrind --valgrind-log=/tmp/valgrind-output Tests/ + .PHONY: readme readme: python3 -c "import markdown2" > /dev/null 2>&1 || python3 -m pip install markdown2 diff --git a/Tests/oss-fuzz/python.supp b/Tests/oss-fuzz/python.supp index 36385d672..1ea2a8eb5 100644 --- a/Tests/oss-fuzz/python.supp +++ b/Tests/oss-fuzz/python.supp @@ -14,3 +14,23 @@ fun:_TIFFReadEncodedTileAndAllocBuffer ... } + +{ + + Memcheck:Leak + match-leak-kinds: possible + fun:malloc + fun:_PyMem_RawMalloc + fun:PyObject_Malloc + ... +} + +{ + + Memcheck:Leak + match-leak-kinds: possible + fun:malloc + fun:_PyMem_RawRealloc + fun:PyMem_Realloc + ... +} From fdfba982c8d514240435f3ecef540939fb97f120 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 May 2025 10:28:09 +0200 Subject: [PATCH 121/268] fix memory leak in arrow schema --- src/libImaging/Arrow.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/libImaging/Arrow.c b/src/libImaging/Arrow.c index 36f4554fc..7d3306123 100644 --- a/src/libImaging/Arrow.c +++ b/src/libImaging/Arrow.c @@ -37,6 +37,10 @@ ReleaseExportedSchema(struct ArrowSchema *array) { child->release = NULL; } // UNDONE -- should I be releasing the children? + free(array->children[i]); + } + if (array->children) { + free(array->children); } // Release dictionary @@ -117,6 +121,7 @@ export_imaging_schema(Imaging im, struct ArrowSchema *schema) { retval = export_named_type(schema->children[0], im->arrow_band_format, "pixel"); if (retval != 0) { free(schema->children[0]); + free(schema->children); schema->release(schema); return retval; } From 84b88a9fbc9c4cfd2bfb7d7a8d18225ee43efedb Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 May 2025 10:58:12 +0200 Subject: [PATCH 122/268] Suppress all python level leaks for now --- Tests/oss-fuzz/python.supp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/oss-fuzz/python.supp b/Tests/oss-fuzz/python.supp index 1ea2a8eb5..4803497ad 100644 --- a/Tests/oss-fuzz/python.supp +++ b/Tests/oss-fuzz/python.supp @@ -18,7 +18,7 @@ { Memcheck:Leak - match-leak-kinds: possible + match-leak-kinds: all fun:malloc fun:_PyMem_RawMalloc fun:PyObject_Malloc @@ -28,7 +28,7 @@ { Memcheck:Leak - match-leak-kinds: possible + match-leak-kinds: all fun:malloc fun:_PyMem_RawRealloc fun:PyMem_Realloc From eaab43540344e26889116262651001f4e42b1630 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 May 2025 10:58:37 +0200 Subject: [PATCH 123/268] Fix leak in webp_encode * Free the output buffer on webp encode error --- src/_webp.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/_webp.c b/src/_webp.c index 3aa4c408b..a7809c40e 100644 --- a/src/_webp.c +++ b/src/_webp.c @@ -641,6 +641,10 @@ WebPEncode_wrapper(PyObject *self, PyObject *args) { ImagingSectionLeave(&cookie); WebPPictureFree(&pic); + + output = writer.mem; + ret_size = writer.size; + if (!ok) { int error_code = (&pic)->error_code; char message[50] = ""; @@ -652,10 +656,9 @@ WebPEncode_wrapper(PyObject *self, PyObject *args) { ); } PyErr_Format(PyExc_ValueError, "encoding error %d%s", error_code, message); + free(output); return NULL; } - output = writer.mem; - ret_size = writer.size; { /* I want to truncate the *_size items that get passed into WebP From a9bcd7db884d89bbfe1966c0611f7f3dda1f8f08 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 May 2025 19:50:55 +0200 Subject: [PATCH 124/268] Fix leak of destination image in ImagingUnsharpMask when an error occurs --- src/_imaging.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/_imaging.c b/src/_imaging.c index 72f122143..79e0a2b23 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2226,6 +2226,7 @@ _unsharp_mask(ImagingObject *self, PyObject *args) { } if (!ImagingUnsharpMask(imOut, imIn, radius, percent, threshold)) { + ImagingDelete(imOut); return NULL; } From e2e40c54568236d2504921eb0b335cdab734a7d5 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 May 2025 22:33:27 +0200 Subject: [PATCH 125/268] Fix memory leak in TiffEncode * If setimage errors out, the tiff client state was not freed. --- src/encode.c | 2 ++ src/libImaging/TiffDecode.c | 42 ++++++++++++++++++------------------- src/libImaging/TiffDecode.h | 2 ++ 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/encode.c b/src/encode.c index 7c365a74f..e56494036 100644 --- a/src/encode.c +++ b/src/encode.c @@ -703,6 +703,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) { return NULL; } + encoder->cleanup = ImagingLibTiffEncodeCleanup; + num_core_tags = sizeof(core_tags) / sizeof(int); for (pos = 0; pos < tags_size; pos++) { item = PyList_GetItemRef(tags, pos); diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 9a2db95b4..173eca160 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -929,6 +929,27 @@ ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...) { return status; } +int +ImagingLibTiffEncodeCleanup(ImagingCodecState state) { + TIFFSTATE *clientstate = (TIFFSTATE *)state->context; + TIFF *tiff = clientstate->tiff; + + if (!tiff) { + return 0; + } + // TIFFClose in libtiff calls tif_closeproc and TIFFCleanup + if (clientstate->fp) { + // Python will manage the closing of the file rather than libtiff + // So only call TIFFCleanup + TIFFCleanup(tiff); + } else { + // When tif_closeproc refers to our custom _tiffCloseProc though, + // that is fine, as it does not close the file + TIFFClose(tiff); + } + return 0; +} + int ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes) { /* One shot encoder. Encode everything to the tiff in the clientstate. @@ -1010,16 +1031,6 @@ ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int byt TRACE(("Encode Error, row %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; - // TIFFClose in libtiff calls tif_closeproc and TIFFCleanup - if (clientstate->fp) { - // Python will manage the closing of the file rather than libtiff - // So only call TIFFCleanup - TIFFCleanup(tiff); - } else { - // When tif_closeproc refers to our custom _tiffCloseProc though, - // that is fine, as it does not close the file - TIFFClose(tiff); - } if (!clientstate->fp) { free(clientstate->data); } @@ -1036,22 +1047,11 @@ ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int byt TRACE(("Error flushing the tiff")); // likely reason is memory. state->errcode = IMAGING_CODEC_MEMORY; - if (clientstate->fp) { - TIFFCleanup(tiff); - } else { - TIFFClose(tiff); - } if (!clientstate->fp) { free(clientstate->data); } return -1; } - TRACE(("Closing \n")); - if (clientstate->fp) { - TIFFCleanup(tiff); - } else { - TIFFClose(tiff); - } // reset the clientstate metadata to use it to read out the buffer. clientstate->loc = 0; clientstate->size = clientstate->eof; // redundant? diff --git a/src/libImaging/TiffDecode.h b/src/libImaging/TiffDecode.h index 22361210d..77808b543 100644 --- a/src/libImaging/TiffDecode.h +++ b/src/libImaging/TiffDecode.h @@ -40,6 +40,8 @@ ImagingLibTiffInit(ImagingCodecState state, int fp, uint32_t offset); extern int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp); extern int +ImagingLibTiffEncodeCleanup(ImagingCodecState state); +extern int ImagingLibTiffMergeFieldInfo( ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length ); From f792e0b1ef4f25e0df33e8e971056142f9f5248d Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 May 2025 22:48:36 +0200 Subject: [PATCH 126/268] Fix memory leak * Return after setting the error for advanced features without libraqm. Not returning here leads to an alloc that's never freed. --- src/_imagingft.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/_imagingft.c b/src/_imagingft.c index 62dab73e5..ca8e556f0 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -425,6 +425,7 @@ text_layout_fallback( "setting text direction, language or font features is not supported " "without libraqm" ); + return 0; } if (PyUnicode_Check(string)) { From 789631c60c3760beeb623cd1728a737502fd9ca3 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 May 2025 23:31:09 +0200 Subject: [PATCH 127/268] Fix memory leak when JpegEncode returns an error. --- src/libImaging/JpegEncode.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libImaging/JpegEncode.c b/src/libImaging/JpegEncode.c index 3c11eac22..79a38e12f 100644 --- a/src/libImaging/JpegEncode.c +++ b/src/libImaging/JpegEncode.c @@ -131,6 +131,7 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { break; default: state->errcode = IMAGING_CODEC_CONFIG; + jpeg_destroy_compress(&context->cinfo); return -1; } @@ -161,6 +162,7 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { /* Would subsample the green and blue channels, which doesn't make sense */ state->errcode = IMAGING_CODEC_CONFIG; + jpeg_destroy_compress(&context->cinfo); return -1; } jpeg_set_colorspace(&context->cinfo, JCS_RGB); From 7aa6a61d430c585cd10c91c5a73ce13f9f851b9e Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Tue, 13 May 2025 23:50:52 +0200 Subject: [PATCH 128/268] Wrap Makefile --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index fd124d124..15f03ba45 100644 --- a/Makefile +++ b/Makefile @@ -101,7 +101,8 @@ valgrind: .PHONY: valgrind-leak valgrind-leak: - PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp --leak-check=full --show-leak-kinds=definite --errors-for-leak-kinds=definite \ + PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp \ + --leak-check=full --show-leak-kinds=definite --errors-for-leak-kinds=definite \ --log-file=/tmp/valgrind-output \ python3 -m pytest -vv --valgrind --valgrind-log=/tmp/valgrind-output Tests/ From efa2288643a3d2840b573d14b1aec41f6fd2b80c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 15 May 2025 08:38:33 +1000 Subject: [PATCH 129/268] Updated libavif to 1.3.0 --- Tests/test_file_avif.py | 2 +- depends/install_libavif.sh | 2 +- winbuild/build_prepare.py | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_avif.py b/Tests/test_file_avif.py index bd87947c0..b2e586637 100644 --- a/Tests/test_file_avif.py +++ b/Tests/test_file_avif.py @@ -233,7 +233,7 @@ class TestFileAvif: with Image.open(out_gif) as reread: reread_value = reread.convert("RGB").getpixel((1, 1)) difference = sum([abs(original_value[i] - reread_value[i]) for i in range(3)]) - assert difference <= 3 + assert difference <= 6 def test_save_single_frame(self, tmp_path: Path) -> None: temp_file = tmp_path / "temp.avif" diff --git a/depends/install_libavif.sh b/depends/install_libavif.sh index fc10d3e54..26af8a36c 100755 --- a/depends/install_libavif.sh +++ b/depends/install_libavif.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -eo pipefail -version=1.2.1 +version=1.3.0 ./download-and-extract.sh libavif-$version https://github.com/AOMediaCodec/libavif/archive/refs/tags/v$version.tar.gz diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 17fc37572..9fee5bd90 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -116,7 +116,7 @@ V = { "HARFBUZZ": "11.1.0", "JPEGTURBO": "3.1.0", "LCMS2": "2.17", - "LIBAVIF": "1.2.1", + "LIBAVIF": "1.3.0", "LIBIMAGEQUANT": "4.3.4", "LIBPNG": "1.6.47", "LIBWEBP": "1.5.0", @@ -399,7 +399,6 @@ DEPS: dict[str, dict[str, Any]] = { "-DAVIF_CODEC_DAV1D=LOCAL", "-DAVIF_CODEC_RAV1E=LOCAL", "-DAVIF_CODEC_SVT=LOCAL", - "-DCMAKE_POLICY_VERSION_MINIMUM=3.5", ), cmd_xcopy("include", "{inc_dir}"), ], From fb126af7a6a12e0870e56187257f75f35fe8558b Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 15 May 2025 21:10:48 +0200 Subject: [PATCH 130/268] Adding pytest-valgrind install --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 15f03ba45..bdddecda5 100644 --- a/Makefile +++ b/Makefile @@ -101,6 +101,7 @@ valgrind: .PHONY: valgrind-leak valgrind-leak: + python3 -c "import pytest_valgrind" > /dev/null 2>&1 || python3 -m pip install pytest-valgrind PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp \ --leak-check=full --show-leak-kinds=definite --errors-for-leak-kinds=definite \ --log-file=/tmp/valgrind-output \ From d5449d576013566100d8a0d41bbc1a756df86da5 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 15 May 2025 21:11:31 +0200 Subject: [PATCH 131/268] Guess so. --- src/libImaging/Arrow.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libImaging/Arrow.c b/src/libImaging/Arrow.c index 7d3306123..0b8c89a07 100644 --- a/src/libImaging/Arrow.c +++ b/src/libImaging/Arrow.c @@ -36,7 +36,6 @@ ReleaseExportedSchema(struct ArrowSchema *array) { child->release(child); child->release = NULL; } - // UNDONE -- should I be releasing the children? free(array->children[i]); } if (array->children) { From 218f055865a4f0abd05ac221c48cf86127907ca9 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 15 May 2025 21:59:02 +0200 Subject: [PATCH 132/268] Add github workflow/test-script --- .github/workflows/test-valgrind-memory.yml | 60 ++++++++++++++++++++++ depends/docker-test-valgrind-memory.sh | 11 ++++ 2 files changed, 71 insertions(+) create mode 100644 .github/workflows/test-valgrind-memory.yml create mode 100644 depends/docker-test-valgrind-memory.sh diff --git a/.github/workflows/test-valgrind-memory.yml b/.github/workflows/test-valgrind-memory.yml new file mode 100644 index 000000000..e6a5f6e77 --- /dev/null +++ b/.github/workflows/test-valgrind-memory.yml @@ -0,0 +1,60 @@ +name: Test Valgrind Memory Leaks + +# like the Docker tests, but running valgrind only on *.c/*.h changes. + +# this is very expensive. Only run on the pull request. +on: + # push: + # branches: + # - "**" + # paths: + # - ".github/workflows/test-valgrind.yml" + # - "**.c" + # - "**.h" + pull_request: + paths: + - ".github/workflows/test-valgrind.yml" + - "**.c" + - "**.h" + - "depends/docker-test-valgrind-memory.sh" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + docker: [ + ubuntu-22.04-jammy-amd64-valgrind, + ] + dockerTag: [main] + + name: ${{ matrix.docker }} + + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Build system information + run: python3 .github/workflows/system-info.py + + - name: Docker pull + run: | + docker pull pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} + + - name: Build and Run Valgrind + run: | + # The Pillow user in the docker container is UID 1001 + sudo chown -R 1001 $GITHUB_WORKSPACE + docker run --name pillow_container -e "PILLOW_VALGRIND_TEST=true" -v $GITHUB_WORKSPACE:/Pillow pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }} /Pillow/depends/docker-test-valgrind-memory.sh + sudo chown -R runner $GITHUB_WORKSPACE diff --git a/depends/docker-test-valgrind-memory.sh b/depends/docker-test-valgrind-memory.sh new file mode 100644 index 000000000..4fd6652d8 --- /dev/null +++ b/depends/docker-test-valgrind-memory.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +## Run this as the test script in the docker valgrind image. +## Note -- can be included directly into the docker image, +## but requires the currnet python.supp. + +source /vpy3/bin/activate +cd /Pillow +make clean +make install +make valgrind-memory From a6b8b3af7709081d8c53818e68b8bc15e9a48f34 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 15 May 2025 22:04:14 +0200 Subject: [PATCH 133/268] executable --- depends/docker-test-valgrind-memory.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 depends/docker-test-valgrind-memory.sh diff --git a/depends/docker-test-valgrind-memory.sh b/depends/docker-test-valgrind-memory.sh old mode 100644 new mode 100755 From 2d506f6f5a478b4a798b3ce71f31b5e5f6f6b60f Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Thu, 15 May 2025 22:06:35 +0200 Subject: [PATCH 134/268] correct target --- depends/docker-test-valgrind-memory.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/docker-test-valgrind-memory.sh b/depends/docker-test-valgrind-memory.sh index 4fd6652d8..29fc6f230 100755 --- a/depends/docker-test-valgrind-memory.sh +++ b/depends/docker-test-valgrind-memory.sh @@ -8,4 +8,4 @@ source /vpy3/bin/activate cd /Pillow make clean make install -make valgrind-memory +make valgrind-leak From f1957b49b2d01a9d063aed4000f985b220e30fa0 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 16 May 2025 12:08:45 +0200 Subject: [PATCH 135/268] Xfail timouts in Valgrind tests * ensure that the env variable is set in the makefile --- Makefile | 4 ++-- Tests/test_file_jpeg.py | 5 +++++ Tests/test_imagefontpil.py | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index bdddecda5..82c2c085f 100644 --- a/Makefile +++ b/Makefile @@ -95,14 +95,14 @@ test: .PHONY: valgrind valgrind: python3 -c "import pytest_valgrind" > /dev/null 2>&1 || python3 -m pip install pytest-valgrind - PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp --leak-check=no \ + PILLOW_VALGRIND_TEST=true PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp --leak-check=no \ --log-file=/tmp/valgrind-output \ python3 -m pytest --no-memcheck -vv --valgrind --valgrind-log=/tmp/valgrind-output .PHONY: valgrind-leak valgrind-leak: python3 -c "import pytest_valgrind" > /dev/null 2>&1 || python3 -m pip install pytest-valgrind - PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp \ + PILLOW_VALGRIND_TEST=true PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp \ --leak-check=full --show-leak-kinds=definite --errors-for-leak-kinds=definite \ --log-file=/tmp/valgrind-output \ python3 -m pytest -vv --valgrind --valgrind-log=/tmp/valgrind-output Tests/ diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 79f0ec1a8..fb9f26fc7 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1034,6 +1034,11 @@ class TestFileJpeg: im.save(f, xmp=b"1" * 65505) @pytest.mark.timeout(timeout=1) + @pytest.mark.xfail( + "PILLOW_VALGRIND_TEST" in os.environ, + reason="Valgrind is slower", + raises=TimeoutError + ) def test_eof(self, monkeypatch: pytest.MonkeyPatch) -> None: # Even though this decoder never says that it is finished # the image should still end when there is no new data diff --git a/Tests/test_imagefontpil.py b/Tests/test_imagefontpil.py index 695aecbde..adce4a75c 100644 --- a/Tests/test_imagefontpil.py +++ b/Tests/test_imagefontpil.py @@ -2,6 +2,7 @@ from __future__ import annotations import struct from io import BytesIO +import os import pytest @@ -73,6 +74,11 @@ def test_decompression_bomb() -> None: @pytest.mark.timeout(4) +@pytest.mark.xfail( + "PILLOW_VALGRIND_TEST" in os.environ, + reason="Valgrind is slower", + raises=TimeoutError +) def test_oom() -> None: glyph = struct.pack( ">hhhhhhhhhh", 1, 0, -32767, -32767, 32767, 32767, -32767, -32767, 32767, 32767 From ff50e30d3e9f1425ca6af95ac044d365c63719d1 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 16 May 2025 12:47:22 +0200 Subject: [PATCH 136/268] Fix memory leak in text_layout_raqm on 0 length string --- src/_imagingft.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/_imagingft.c b/src/_imagingft.c index ca8e556f0..0d70544a5 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -275,6 +275,7 @@ text_layout_raqm( if (!text || !size) { /* return 0 and clean up, no glyphs==no size, and raqm fails with empty strings */ + PyMem_Free(text); goto failed; } set_text = raqm_set_text(rq, text, size); From 20b49a332bd0f0f39660fbb3587cfc4b6d539f0c Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 17 May 2025 10:45:43 +0200 Subject: [PATCH 137/268] Remove timeout as the specific reason, pytest-timeout doesn't raise a timeout error. --- Tests/test_file_jpeg.py | 3 +-- Tests/test_imagefontpil.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index fb9f26fc7..d923020c8 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1036,8 +1036,7 @@ class TestFileJpeg: @pytest.mark.timeout(timeout=1) @pytest.mark.xfail( "PILLOW_VALGRIND_TEST" in os.environ, - reason="Valgrind is slower", - raises=TimeoutError + reason="Valgrind is slower" ) def test_eof(self, monkeypatch: pytest.MonkeyPatch) -> None: # Even though this decoder never says that it is finished diff --git a/Tests/test_imagefontpil.py b/Tests/test_imagefontpil.py index adce4a75c..bd9bafb55 100644 --- a/Tests/test_imagefontpil.py +++ b/Tests/test_imagefontpil.py @@ -76,8 +76,7 @@ def test_decompression_bomb() -> None: @pytest.mark.timeout(4) @pytest.mark.xfail( "PILLOW_VALGRIND_TEST" in os.environ, - reason="Valgrind is slower", - raises=TimeoutError + reason="Valgrind is slower" ) def test_oom() -> None: glyph = struct.pack( From c35082b619899d5351ba249e8ea23a4412d0c728 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 17 May 2025 08:47:59 +0000 Subject: [PATCH 138/268] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Tests/test_file_jpeg.py | 3 +-- Tests/test_imagefontpil.py | 7 ++----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index d923020c8..7c33c7517 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1035,8 +1035,7 @@ class TestFileJpeg: @pytest.mark.timeout(timeout=1) @pytest.mark.xfail( - "PILLOW_VALGRIND_TEST" in os.environ, - reason="Valgrind is slower" + "PILLOW_VALGRIND_TEST" in os.environ, reason="Valgrind is slower" ) def test_eof(self, monkeypatch: pytest.MonkeyPatch) -> None: # Even though this decoder never says that it is finished diff --git a/Tests/test_imagefontpil.py b/Tests/test_imagefontpil.py index bd9bafb55..e5b770745 100644 --- a/Tests/test_imagefontpil.py +++ b/Tests/test_imagefontpil.py @@ -1,8 +1,8 @@ from __future__ import annotations +import os import struct from io import BytesIO -import os import pytest @@ -74,10 +74,7 @@ def test_decompression_bomb() -> None: @pytest.mark.timeout(4) -@pytest.mark.xfail( - "PILLOW_VALGRIND_TEST" in os.environ, - reason="Valgrind is slower" -) +@pytest.mark.xfail("PILLOW_VALGRIND_TEST" in os.environ, reason="Valgrind is slower") def test_oom() -> None: glyph = struct.pack( ">hhhhhhhhhh", 1, 0, -32767, -32767, 32767, 32767, -32767, -32767, 32767, 32767 From 45d1c4162b9666281857f3b5d38fdefdbf9b1979 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 22 May 2025 15:55:43 +1000 Subject: [PATCH 139/268] Do not build against libavif < 1 --- setup.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 5d41e27d9..ab36c6b17 100644 --- a/setup.py +++ b/setup.py @@ -224,13 +224,14 @@ def _add_directory( path.insert(where, subdir) -def _find_include_file(self: pil_build_ext, include: str) -> int: +def _find_include_file(self: pil_build_ext, include: str) -> str | None: for directory in self.compiler.include_dirs: _dbg("Checking for include file %s in %s", (include, directory)) - if os.path.isfile(os.path.join(directory, include)): + path = os.path.join(directory, include) + if os.path.isfile(path): _dbg("Found %s", include) - return 1 - return 0 + return path + return None def _find_library_file(self: pil_build_ext, library: str) -> str | None: @@ -852,9 +853,13 @@ class pil_build_ext(build_ext): if feature.want("avif"): _dbg("Looking for avif") - if _find_include_file(self, "avif/avif.h"): - if _find_library_file(self, "avif"): - feature.set("avif", "avif") + if avif_h := _find_include_file(self, "avif/avif.h"): + with open(avif_h, "rb") as fp: + major_version = int( + fp.read().split(b"#define AVIF_VERSION_MAJOR ")[1].split()[0] + ) + if major_version >= 1 and _find_library_file(self, "avif"): + feature.set("avif", "avif") for f in feature: if not feature.get(f) and feature.require(f): From 7824d2f8c61648c6ea0185b50e55df1a71213168 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 23 May 2025 08:48:38 +1000 Subject: [PATCH 140/268] Update rust when building libavif --- winbuild/build_prepare.py | 1 + 1 file changed, 1 insertion(+) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 9fee5bd90..6cdcf6f0d 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -389,6 +389,7 @@ DEPS: dict[str, dict[str, Any]] = { "filename": f"libavif-{V['LIBAVIF']}.zip", "license": "LICENSE", "build": [ + "rustup update", f"{sys.executable} -m pip install meson", *cmds_cmake( "avif_static", From 2603a249df9223133b74c671acfcdc6a51567843 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 23 May 2025 10:57:03 +0100 Subject: [PATCH 141/268] Update depends/docker-test-valgrind-memory.sh Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- depends/docker-test-valgrind-memory.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/docker-test-valgrind-memory.sh b/depends/docker-test-valgrind-memory.sh index 29fc6f230..5f7805421 100755 --- a/depends/docker-test-valgrind-memory.sh +++ b/depends/docker-test-valgrind-memory.sh @@ -2,7 +2,7 @@ ## Run this as the test script in the docker valgrind image. ## Note -- can be included directly into the docker image, -## but requires the currnet python.supp. +## but requires the current python.supp. source /vpy3/bin/activate cd /Pillow From 9526d949b07bbddfc7e515810dc23738b778bee4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 23 May 2025 10:58:28 +0100 Subject: [PATCH 142/268] Update Tests/test_pyarrow.py Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Tests/test_pyarrow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index e7fce1e33..c5872231b 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -162,7 +162,7 @@ class DataShape(NamedTuple): UINT_ARR = DataShape( dtype=fl_uint8_4_type, - elt=[1, 2, 3, 4], # array of 4 uint 8 per pixel + elt=[1, 2, 3, 4], # array of 4 uint8 per pixel elts_per_pixel=1, # only one array per pixel ) From 6807bd3d70cc5873b3cad29d598e08a34fdc1fa0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 10 May 2025 00:03:08 +1000 Subject: [PATCH 143/268] Added type hints --- .ci/requirements-mypy.txt | 1 + Tests/test_pyarrow.py | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/.ci/requirements-mypy.txt b/.ci/requirements-mypy.txt index 2e3610478..86ac2e0b2 100644 --- a/.ci/requirements-mypy.txt +++ b/.ci/requirements-mypy.txt @@ -4,6 +4,7 @@ IceSpringPySideStubs-PySide6 ipython numpy packaging +pyarrow-stubs pytest sphinx types-atheris diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index c5872231b..2029f96f5 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -13,7 +13,11 @@ from .helper import ( is_big_endian, ) -pyarrow = pytest.importorskip("pyarrow", reason="PyArrow not installed") +TYPE_CHECKING = False +if TYPE_CHECKING: + import pyarrow +else: + pyarrow = pytest.importorskip("pyarrow", reason="PyArrow not installed") TEST_IMAGE_SIZE = (10, 10) @@ -94,14 +98,14 @@ fl_uint8_4_type = pyarrow.field( ("HSV", fl_uint8_4_type, [0, 1, 2]), ), ) -def test_to_array(mode: str, dtype: Any, mask: list[int] | None) -> None: +def test_to_array(mode: str, dtype: pyarrow.DataType, mask: list[int] | None) -> None: img = hopper(mode) # Resize to non-square img = img.crop((3, 0, 124, 127)) assert img.size == (121, 127) - arr = pyarrow.array(img) + arr = pyarrow.array(img) # type: ignore[call-overload] _test_img_equals_pyarray(img, arr, mask) assert arr.type == dtype @@ -118,8 +122,8 @@ def test_lifetime() -> None: img = hopper("L") - arr_1 = pyarrow.array(img) - arr_2 = pyarrow.array(img) + arr_1 = pyarrow.array(img) # type: ignore[call-overload] + arr_2 = pyarrow.array(img) # type: ignore[call-overload] del img @@ -136,8 +140,8 @@ def test_lifetime2() -> None: img = hopper("L") - arr_1 = pyarrow.array(img) - arr_2 = pyarrow.array(img) + arr_1 = pyarrow.array(img) # type: ignore[call-overload] + arr_2 = pyarrow.array(img) # type: ignore[call-overload] assert arr_1.sum().as_py() > 0 del arr_1 @@ -152,7 +156,7 @@ def test_lifetime2() -> None: class DataShape(NamedTuple): - dtype: Any + dtype: pyarrow.DataType # Strictly speaking, elt should be a pixel or pixel component, so # list[uint8][4], float, int, uint32, uint8, etc. But more # correctly, it should be exactly the dtype from the line above. From 60a1a20536fe18cfe936e90140ed56c3eb31bd81 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 23 May 2025 15:32:46 +0200 Subject: [PATCH 144/268] add timeouts to two more tests --- Tests/test_file_tiff.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 502d9df9a..050bfe578 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -990,6 +990,10 @@ class TestFileTiff: @pytest.mark.timeout(6) @pytest.mark.filterwarnings("ignore:Truncated File Read") + @pytest.mark.xfail( + "PILLOW_VALGRIND_TEST" in os.environ, + reason="Valgrind is slower" + ) def test_timeout(self, monkeypatch: pytest.MonkeyPatch) -> None: with Image.open("Tests/images/timeout-6646305047838720") as im: monkeypatch.setattr(ImageFile, "LOAD_TRUNCATED_IMAGES", True) @@ -1002,6 +1006,10 @@ class TestFileTiff: ], ) @pytest.mark.timeout(2) + @pytest.mark.xfail( + "PILLOW_VALGRIND_TEST" in os.environ, + reason="Valgrind is slower" + ) def test_oom(self, test_file: str) -> None: with pytest.raises(UnidentifiedImageError): with pytest.warns(UserWarning): From c63db77db3850c51df38af8f4a96f5c13f286b42 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 23 May 2025 13:37:02 +0000 Subject: [PATCH 145/268] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Tests/test_file_tiff.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 050bfe578..b6985b83b 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -991,8 +991,7 @@ class TestFileTiff: @pytest.mark.timeout(6) @pytest.mark.filterwarnings("ignore:Truncated File Read") @pytest.mark.xfail( - "PILLOW_VALGRIND_TEST" in os.environ, - reason="Valgrind is slower" + "PILLOW_VALGRIND_TEST" in os.environ, reason="Valgrind is slower" ) def test_timeout(self, monkeypatch: pytest.MonkeyPatch) -> None: with Image.open("Tests/images/timeout-6646305047838720") as im: @@ -1007,8 +1006,7 @@ class TestFileTiff: ) @pytest.mark.timeout(2) @pytest.mark.xfail( - "PILLOW_VALGRIND_TEST" in os.environ, - reason="Valgrind is slower" + "PILLOW_VALGRIND_TEST" in os.environ, reason="Valgrind is slower" ) def test_oom(self, test_file: str) -> None: with pytest.raises(UnidentifiedImageError): From 4d0678ca33b65af2686fe93be5b77c2b28027959 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Fri, 23 May 2025 16:35:57 +0200 Subject: [PATCH 146/268] Add parallel test target, using pytest-xdist --- Makefile | 8 +++++++- pyproject.toml | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5a8152454..a56fe8fec 100644 --- a/Makefile +++ b/Makefile @@ -95,7 +95,13 @@ sdist: .PHONY: test test: python3 -c "import pytest" > /dev/null 2>&1 || python3 -m pip install pytest - python3 -m pytest -qq + python3 -m pytest -qq Tests/ + +.PHONY: test-p +test-p: + python3 -c "import xdist" > /dev/null 2>&1 || python3 -m pip install pytest-xdist + python3 -m pytest -qq -n auto Tests/ + .PHONY: valgrind valgrind: diff --git a/pyproject.toml b/pyproject.toml index a3ff9723b..683ab24ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,6 +70,7 @@ optional-dependencies.tests = [ "pytest", "pytest-cov", "pytest-timeout", + "pytest-xdist", "trove-classifiers>=2024.10.12", ] From e018dc99faf8d7196ec2a2e7d2760cede851fbd9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 24 May 2025 08:51:51 +1000 Subject: [PATCH 147/268] Updated libpng to 1.6.48 --- .github/workflows/wheels-dependencies.sh | 2 +- winbuild/build_prepare.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index a6b52064c..1583435c1 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -39,7 +39,7 @@ ARCHIVE_SDIR=pillow-depends-main # Package versions for fresh source builds FREETYPE_VERSION=2.13.3 HARFBUZZ_VERSION=11.2.1 -LIBPNG_VERSION=1.6.47 +LIBPNG_VERSION=1.6.48 JPEGTURBO_VERSION=3.1.0 OPENJPEG_VERSION=2.5.3 XZ_VERSION=5.8.1 diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index d23f0eb5b..6e176e29c 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -118,7 +118,7 @@ V = { "LCMS2": "2.17", "LIBAVIF": "1.3.0", "LIBIMAGEQUANT": "4.3.4", - "LIBPNG": "1.6.47", + "LIBPNG": "1.6.48", "LIBWEBP": "1.5.0", "OPENJPEG": "2.5.3", "TIFF": "4.7.0", From 4eb89f8e5bcd19ad64ed2328c9566061a7116cc2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 21 May 2025 20:36:19 +1000 Subject: [PATCH 148/268] Reduced number of bytes read for header --- src/PIL/WmfImagePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/WmfImagePlugin.py b/src/PIL/WmfImagePlugin.py index f709d026b..d569cb4b8 100644 --- a/src/PIL/WmfImagePlugin.py +++ b/src/PIL/WmfImagePlugin.py @@ -81,7 +81,7 @@ class WmfStubImageFile(ImageFile.StubImageFile): def _open(self) -> None: # check placable header - s = self.fp.read(80) + s = self.fp.read(44) if s.startswith(b"\xd7\xcd\xc6\x9a\x00\x00"): # placeable windows metafile From 57b77bde96484d4a1d6f92adec9a2c2b86485f55 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 24 May 2025 11:55:18 +1000 Subject: [PATCH 149/268] Removed CMAKE_POLICY_VERSION_MINIMUM=3.5 --- .ci/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/install.sh b/.ci/install.sh index d065e7ab5..acb84f046 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -66,7 +66,7 @@ if [[ $(uname) != CYGWIN* ]]; then pushd depends && ./install_raqm.sh && popd # libavif - pushd depends && CMAKE_POLICY_VERSION_MINIMUM=3.5 ./install_libavif.sh && popd + pushd depends && ./install_libavif.sh && popd # extra test images pushd depends && ./install_extra_test_images.sh && popd From 041acf13440f9307dcc129eff21bcd065362ae91 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 25 May 2025 15:00:47 +1000 Subject: [PATCH 150/268] Clear core image if memory mapping was used for last load --- Tests/test_tiff_crashes.py | 14 ++++++++++++++ src/PIL/TiffImagePlugin.py | 5 +++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Tests/test_tiff_crashes.py b/Tests/test_tiff_crashes.py index 073e5415c..976f62384 100644 --- a/Tests/test_tiff_crashes.py +++ b/Tests/test_tiff_crashes.py @@ -52,3 +52,17 @@ def test_tiff_crashes(test_file: str) -> None: pytest.skip("test image not found") except OSError: pass + + +def test_tiff_mmap() -> None: + try: + with Image.open("Tests/images/crash_mmap.tif") as im: + im.seek(1) + im.load() + + im.seek(0) + im.load() + except FileNotFoundError: + if on_ci(): + raise + pytest.skip("test image not found") diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 88af9162e..5cbac0c26 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1217,9 +1217,10 @@ class TiffImageFile(ImageFile.ImageFile): return self._seek(frame) if self._im is not None and ( - self.im.size != self._tile_size or self.im.mode != self.mode + self.im.size != self._tile_size + or self.im.mode != self.mode + or self.readonly ): - # The core image will no longer be used self._im = None def _seek(self, frame: int) -> None: From eff667a8614ba3b567684597795924387c8cbaaa Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 23 May 2025 10:22:59 +0100 Subject: [PATCH 151/268] Mark the image read-only in the C layer if it's created from a read only buffer --- src/map.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/map.c b/src/map.c index c66702981..9a3144ab9 100644 --- a/src/map.c +++ b/src/map.c @@ -137,6 +137,7 @@ PyImaging_MapBuffer(PyObject *self, PyObject *args) { } } + im->read_only = view.readonly; im->destroy = mapping_destroy_buffer; Py_INCREF(target); From bcc6e42bf82dfc962d49ed1876a946bd7be16b4f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 27 May 2025 21:08:58 +1000 Subject: [PATCH 152/268] Fixed saving MPO with more than one appended image --- Tests/test_file_mpo.py | 18 ++++++++++-------- src/PIL/MpoImagePlugin.py | 13 ++++++++++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 73838ef44..adfa61962 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -293,16 +293,18 @@ def test_save_all() -> None: assert_image_similar(im, im_reloaded, 30) im = Image.new("RGB", (1, 1)) - im2 = Image.new("RGB", (1, 1), "#f00") - im_reloaded = roundtrip(im, save_all=True, append_images=[im2]) + for colors in (("#f00",), ("#f00", "#0f0")): + append_images = (Image.new("RGB", (1, 1), color) for color in colors) + im_reloaded = roundtrip(im, save_all=True, append_images=append_images) - assert_image_equal(im, im_reloaded) - assert isinstance(im_reloaded, MpoImagePlugin.MpoImageFile) - assert im_reloaded.mpinfo is not None - assert im_reloaded.mpinfo[45056] == b"0100" + assert_image_equal(im, im_reloaded) + assert isinstance(im_reloaded, MpoImagePlugin.MpoImageFile) + assert im_reloaded.mpinfo is not None + assert im_reloaded.mpinfo[45056] == b"0100" - im_reloaded.seek(1) - assert_image_similar(im2, im_reloaded, 1) + for im_expected in append_images: + im_reloaded.seek(im_reloaded.tell() + 1) + assert_image_similar(im_reloaded, im_expected, 1) # Test that a single frame image will not be saved as an MPO jpg = roundtrip(im, save_all=True) diff --git a/src/PIL/MpoImagePlugin.py b/src/PIL/MpoImagePlugin.py index f7393eac0..f96f658fc 100644 --- a/src/PIL/MpoImagePlugin.py +++ b/src/PIL/MpoImagePlugin.py @@ -19,7 +19,6 @@ # from __future__ import annotations -import itertools import os import struct from typing import IO, Any, cast @@ -47,12 +46,20 @@ def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: mpf_offset = 28 offsets: list[int] = [] - for imSequence in itertools.chain([im], append_images): + total = 0 + imSequences = [im] + list(append_images) + for imSequence in imSequences: + total += getattr(imSequence, "n_frames", 1) + for imSequence in imSequences: for im_frame in ImageSequence.Iterator(imSequence): if not offsets: # APP2 marker + ifd_length = 66 + 16 * total im_frame.encoderinfo["extra"] = ( - b"\xff\xe2" + struct.pack(">H", 6 + 82) + b"MPF\0" + b" " * 82 + b"\xff\xe2" + + struct.pack(">H", 6 + ifd_length) + + b"MPF\0" + + b" " * ifd_length ) exif = im_frame.encoderinfo.get("exif") if isinstance(exif, Image.Exif): From 5a04b9581b16a7f1e1109f1e31a206a6550f314c Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 28 May 2025 08:20:35 +1000 Subject: [PATCH 153/268] Run slow tests on valgrind, but without timeout (#8975) --- Tests/helper.py | 6 ++++++ Tests/test_file_eps.py | 3 ++- Tests/test_file_fli.py | 9 +++++++-- Tests/test_file_jpeg.py | 3 ++- Tests/test_file_pdf.py | 10 +++++++--- Tests/test_file_tiff.py | 5 +++-- Tests/test_image.py | 6 ++---- Tests/test_imagefontpil.py | 4 ++-- 8 files changed, 31 insertions(+), 15 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 909fff879..ec61cd263 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -161,6 +161,12 @@ def assert_tuple_approx_equal( pytest.fail(msg + ": " + repr(actuals) + " != " + repr(targets)) +def timeout_unless_slower_valgrind(timeout: float) -> pytest.MarkDecorator: + if "PILLOW_VALGRIND_TEST" in os.environ: + return pytest.mark.pil_noop_mark() + return pytest.mark.timeout(timeout) + + def skip_unless_feature(feature: str) -> pytest.MarkDecorator: reason = f"{feature} not available" return pytest.mark.skipif(not features.check(feature), reason=reason) diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index b484a8cfa..d94de7287 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -15,6 +15,7 @@ from .helper import ( is_win32, mark_if_feature_version, skip_unless_feature, + timeout_unless_slower_valgrind, ) HAS_GHOSTSCRIPT = EpsImagePlugin.has_ghostscript() @@ -398,7 +399,7 @@ def test_emptyline() -> None: assert image.format == "EPS" -@pytest.mark.timeout(timeout=5) +@timeout_unless_slower_valgrind(5) @pytest.mark.parametrize( "test_file", ["Tests/images/eps/timeout-d675703545fee17acab56e5fec644c19979175de.eps"], diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index 81df1ab0b..0fadd01d0 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -7,7 +7,12 @@ import pytest from PIL import FliImagePlugin, Image, ImageFile -from .helper import assert_image_equal, assert_image_equal_tofile, is_pypy +from .helper import ( + assert_image_equal, + assert_image_equal_tofile, + is_pypy, + timeout_unless_slower_valgrind, +) # created as an export of a palette image from Gimp2.6 # save as...-> hopper.fli, default options. @@ -189,7 +194,7 @@ def test_seek() -> None: "Tests/images/timeout-bff0a9dc7243a8e6ede2408d2ffa6a9964698b87.fli", ], ) -@pytest.mark.timeout(timeout=3) +@timeout_unless_slower_valgrind(3) def test_timeouts(test_file: str) -> None: with open(test_file, "rb") as f: with Image.open(f) as im: diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 79f0ec1a8..b9eec591d 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -32,6 +32,7 @@ from .helper import ( is_win32, mark_if_feature_version, skip_unless_feature, + timeout_unless_slower_valgrind, ) ElementTree: ModuleType | None @@ -1033,7 +1034,7 @@ class TestFileJpeg: with pytest.raises(ValueError): im.save(f, xmp=b"1" * 65505) - @pytest.mark.timeout(timeout=1) + @timeout_unless_slower_valgrind(1) def test_eof(self, monkeypatch: pytest.MonkeyPatch) -> None: # Even though this decoder never says that it is finished # the image should still end when there is no new data diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index bde1e3ab8..a2218673b 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -13,7 +13,12 @@ import pytest from PIL import Image, PdfParser, features -from .helper import hopper, mark_if_feature_version, skip_unless_feature +from .helper import ( + hopper, + mark_if_feature_version, + skip_unless_feature, + timeout_unless_slower_valgrind, +) def helper_save_as_pdf(tmp_path: Path, mode: str, **kwargs: Any) -> str: @@ -339,8 +344,7 @@ def test_pdf_append_to_bytesio() -> None: assert len(f.getvalue()) > initial_size -@pytest.mark.timeout(1) -@pytest.mark.skipif("PILLOW_VALGRIND_TEST" in os.environ, reason="Valgrind is slower") +@timeout_unless_slower_valgrind(1) @pytest.mark.parametrize("newline", (b"\r", b"\n")) def test_redos(newline: bytes) -> None: malicious = b" trailer<<>>" + newline * 3456 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 502d9df9a..d0d394aa9 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -26,6 +26,7 @@ from .helper import ( hopper, is_pypy, is_win32, + timeout_unless_slower_valgrind, ) ElementTree: ModuleType | None @@ -988,7 +989,7 @@ class TestFileTiff: with pytest.raises(OSError): im.load() - @pytest.mark.timeout(6) + @timeout_unless_slower_valgrind(6) @pytest.mark.filterwarnings("ignore:Truncated File Read") def test_timeout(self, monkeypatch: pytest.MonkeyPatch) -> None: with Image.open("Tests/images/timeout-6646305047838720") as im: @@ -1001,7 +1002,7 @@ class TestFileTiff: "Tests/images/oom-225817ca0f8c663be7ab4b9e717b02c661e66834.tif", ], ) - @pytest.mark.timeout(2) + @timeout_unless_slower_valgrind(2) def test_oom(self, test_file: str) -> None: with pytest.raises(UnidentifiedImageError): with pytest.warns(UserWarning): diff --git a/Tests/test_image.py b/Tests/test_image.py index 7e6118d52..14a067127 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -34,6 +34,7 @@ from .helper import ( is_win32, mark_if_feature_version, skip_unless_feature, + timeout_unless_slower_valgrind, ) ElementTree: ModuleType | None @@ -572,10 +573,7 @@ class TestImage: i = Image.new("RGB", [1, 1]) assert isinstance(i.size, tuple) - @pytest.mark.timeout(0.75) - @pytest.mark.skipif( - "PILLOW_VALGRIND_TEST" in os.environ, reason="Valgrind is slower" - ) + @timeout_unless_slower_valgrind(0.75) @pytest.mark.parametrize("size", ((0, 100000000), (100000000, 0))) def test_empty_image(self, size: tuple[int, int]) -> None: Image.new("RGB", size) diff --git a/Tests/test_imagefontpil.py b/Tests/test_imagefontpil.py index 695aecbde..3eb98d379 100644 --- a/Tests/test_imagefontpil.py +++ b/Tests/test_imagefontpil.py @@ -7,7 +7,7 @@ import pytest from PIL import Image, ImageDraw, ImageFont, _util, features -from .helper import assert_image_equal_tofile +from .helper import assert_image_equal_tofile, timeout_unless_slower_valgrind fonts = [ImageFont.load_default_imagefont()] if not features.check_module("freetype2"): @@ -72,7 +72,7 @@ def test_decompression_bomb() -> None: font.getmask("A" * 1_000_000) -@pytest.mark.timeout(4) +@timeout_unless_slower_valgrind(4) def test_oom() -> None: glyph = struct.pack( ">hhhhhhhhhh", 1, 0, -32767, -32767, 32767, 32767, -32767, -32767, 32767, 32767 From 5000c83bcc1514d371be53b52b50aaf7237506d5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 28 May 2025 23:50:18 +1000 Subject: [PATCH 154/268] Use multi-phase initialization --- src/_avif.c | 24 ++++++++++-------------- src/_imaging.c | 25 ++++++++++--------------- src/_imagingcms.c | 26 +++++++++++--------------- src/_imagingft.c | 24 ++++++++++-------------- src/_imagingmath.c | 24 ++++++++++-------------- src/_imagingmorph.c | 19 +++++++++---------- src/_imagingtk.c | 22 ++++++++++------------ src/_webp.c | 24 ++++++++++-------------- 8 files changed, 80 insertions(+), 108 deletions(-) diff --git a/src/_avif.c b/src/_avif.c index 7e7bee703..3585297fe 100644 --- a/src/_avif.c +++ b/src/_avif.c @@ -881,26 +881,22 @@ setup_module(PyObject *m) { return 0; } +static PyModuleDef_Slot slots[] = { + {Py_mod_exec, setup_module}, +#ifdef Py_GIL_DISABLED + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} +}; + PyMODINIT_FUNC PyInit__avif(void) { - PyObject *m; - static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, .m_name = "_avif", - .m_size = -1, .m_methods = avifMethods, + .m_slots = slots }; - m = PyModule_Create(&module_def); - if (setup_module(m) < 0) { - Py_DECREF(m); - return NULL; - } - -#ifdef Py_GIL_DISABLED - PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); -#endif - - return m; + return PyModuleDef_Init(&module_def); } diff --git a/src/_imaging.c b/src/_imaging.c index 72f122143..0c93a96bc 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -4460,27 +4460,22 @@ setup_module(PyObject *m) { return 0; } +static PyModuleDef_Slot slots[] = { + {Py_mod_exec, setup_module}, +#ifdef Py_GIL_DISABLED + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} +}; + PyMODINIT_FUNC PyInit__imaging(void) { - PyObject *m; - static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, .m_name = "_imaging", - .m_size = -1, .m_methods = functions, + .m_slots = slots }; - m = PyModule_Create(&module_def); - - if (setup_module(m) < 0) { - Py_DECREF(m); - return NULL; - } - -#ifdef Py_GIL_DISABLED - PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); -#endif - - return m; + return PyModuleDef_Init(&module_def); } diff --git a/src/_imagingcms.c b/src/_imagingcms.c index f93c1613b..e2f29d1b7 100644 --- a/src/_imagingcms.c +++ b/src/_imagingcms.c @@ -1463,28 +1463,24 @@ setup_module(PyObject *m) { return 0; } +static PyModuleDef_Slot slots[] = { + {Py_mod_exec, setup_module}, +#ifdef Py_GIL_DISABLED + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} +}; + PyMODINIT_FUNC PyInit__imagingcms(void) { - PyObject *m; + PyDateTime_IMPORT; static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, .m_name = "_imagingcms", - .m_size = -1, .m_methods = pyCMSdll_methods, + .m_slots = slots }; - m = PyModule_Create(&module_def); - - if (setup_module(m) < 0) { - return NULL; - } - - PyDateTime_IMPORT; - -#ifdef Py_GIL_DISABLED - PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); -#endif - - return m; + return PyModuleDef_Init(&module_def); } diff --git a/src/_imagingft.c b/src/_imagingft.c index 62dab73e5..c3e6e2f39 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -1599,26 +1599,22 @@ setup_module(PyObject *m) { return 0; } +static PyModuleDef_Slot slots[] = { + {Py_mod_exec, setup_module}, +#ifdef Py_GIL_DISABLED + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} +}; + PyMODINIT_FUNC PyInit__imagingft(void) { - PyObject *m; - static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, .m_name = "_imagingft", - .m_size = -1, .m_methods = _functions, + .m_slots = slots }; - m = PyModule_Create(&module_def); - - if (setup_module(m) < 0) { - return NULL; - } - -#ifdef Py_GIL_DISABLED - PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); -#endif - - return m; + return PyModuleDef_Init(&module_def); } diff --git a/src/_imagingmath.c b/src/_imagingmath.c index 4b9bf08ba..48c395900 100644 --- a/src/_imagingmath.c +++ b/src/_imagingmath.c @@ -302,26 +302,22 @@ setup_module(PyObject *m) { return 0; } +static PyModuleDef_Slot slots[] = { + {Py_mod_exec, setup_module}, +#ifdef Py_GIL_DISABLED + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} +}; + PyMODINIT_FUNC PyInit__imagingmath(void) { - PyObject *m; - static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, .m_name = "_imagingmath", - .m_size = -1, .m_methods = _functions, + .m_slots = slots }; - m = PyModule_Create(&module_def); - - if (setup_module(m) < 0) { - return NULL; - } - -#ifdef Py_GIL_DISABLED - PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); -#endif - - return m; + return PyModuleDef_Init(&module_def); } diff --git a/src/_imagingmorph.c b/src/_imagingmorph.c index a20888294..5995f9d42 100644 --- a/src/_imagingmorph.c +++ b/src/_imagingmorph.c @@ -246,23 +246,22 @@ static PyMethodDef functions[] = { {NULL, NULL, 0, NULL} }; +static PyModuleDef_Slot slots[] = { +#ifdef Py_GIL_DISABLED + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} +}; + PyMODINIT_FUNC PyInit__imagingmorph(void) { - PyObject *m; - static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, .m_name = "_imagingmorph", .m_doc = "A module for doing image morphology", - .m_size = -1, .m_methods = functions, + .m_slots = slots }; - m = PyModule_Create(&module_def); - -#ifdef Py_GIL_DISABLED - PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); -#endif - - return m; + return PyModuleDef_Init(&module_def); } diff --git a/src/_imagingtk.c b/src/_imagingtk.c index 4e06fe9b8..68d7bf4cd 100644 --- a/src/_imagingtk.c +++ b/src/_imagingtk.c @@ -46,24 +46,22 @@ static PyMethodDef functions[] = { {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot slots[] = { + {Py_mod_exec, load_tkinter_funcs}, +#ifdef Py_GIL_DISABLED + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} +}; + PyMODINIT_FUNC PyInit__imagingtk(void) { static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, .m_name = "_imagingtk", - .m_size = -1, .m_methods = functions, + .m_slots = slots }; - PyObject *m; - m = PyModule_Create(&module_def); - if (load_tkinter_funcs() != 0) { - Py_DECREF(m); - return NULL; - } -#ifdef Py_GIL_DISABLED - PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); -#endif - - return m; + return PyModuleDef_Init(&module_def); } diff --git a/src/_webp.c b/src/_webp.c index 3aa4c408b..0dff9f6dd 100644 --- a/src/_webp.c +++ b/src/_webp.c @@ -777,26 +777,22 @@ setup_module(PyObject *m) { return 0; } +static PyModuleDef_Slot slots[] = { + {Py_mod_exec, setup_module}, +#ifdef Py_GIL_DISABLED + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} +}; + PyMODINIT_FUNC PyInit__webp(void) { - PyObject *m; - static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, .m_name = "_webp", - .m_size = -1, .m_methods = webpMethods, + .m_slots = slots }; - m = PyModule_Create(&module_def); - if (setup_module(m) < 0) { - Py_DECREF(m); - return NULL; - } - -#ifdef Py_GIL_DISABLED - PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); -#endif - - return m; + return PyModuleDef_Init(&module_def); } From 2ee2a1496d9d4b2cc1f8455342d0e2f5da8f542c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 21 May 2025 22:06:27 +1000 Subject: [PATCH 155/268] Simplified code --- src/PIL/ImageGrab.py | 5 +---- src/PIL/JpegImagePlugin.py | 9 +++------ src/libImaging/Arrow.c | 6 +++--- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index c29350b7a..d11609483 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -134,10 +134,7 @@ def grabclipboard() -> Image.Image | list[str] | None: import struct o = struct.unpack_from("I", data)[0] - if data[16] != 0: - files = data[o:].decode("utf-16le").split("\0") - else: - files = data[o:].decode("mbcs").split("\0") + files = data[o:].decode("mbcs" if data[16] == 0 else "utf-16le").split("\0") return files[: files.index("")] if isinstance(data, bytes): data = io.BytesIO(data) diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index 969528841..defe9f773 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -762,8 +762,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: extra = info.get("extra", b"") MAX_BYTES_IN_MARKER = 65533 - xmp = info.get("xmp") - if xmp: + if xmp := info.get("xmp"): overhead_len = 29 # b"http://ns.adobe.com/xap/1.0/\x00" max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len if len(xmp) > max_data_bytes_in_marker: @@ -772,8 +771,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: size = o16(2 + overhead_len + len(xmp)) extra += b"\xff\xe1" + size + b"http://ns.adobe.com/xap/1.0/\x00" + xmp - icc_profile = info.get("icc_profile") - if icc_profile: + if icc_profile := info.get("icc_profile"): overhead_len = 14 # b"ICC_PROFILE\0" + o8(i) + o8(len(markers)) max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len markers = [] @@ -831,7 +829,6 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is # channels*size, this is a value that's been used in a django patch. # https://github.com/matthewwithanm/django-imagekit/issues/50 - bufsize = 0 if optimize or progressive: # CMYK can be bigger if im.mode == "CMYK": @@ -848,7 +845,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: else: # The EXIF info needs to be written as one block, + APP1, + one spare byte. # Ensure that our buffer is big enough. Same with the icc_profile block. - bufsize = max(bufsize, len(exif) + 5, len(extra) + 1) + bufsize = max(len(exif) + 5, len(extra) + 1) ImageFile._save( im, fp, [ImageFile._Tile("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize diff --git a/src/libImaging/Arrow.c b/src/libImaging/Arrow.c index 33ff2ce77..3d34076dc 100644 --- a/src/libImaging/Arrow.c +++ b/src/libImaging/Arrow.c @@ -98,7 +98,7 @@ export_imaging_schema(Imaging im, struct ArrowSchema *schema) { } /* for now, single block images */ - if (!(im->blocks_count == 0 || im->blocks_count == 1)) { + if (im->blocks_count > 1) { return IMAGING_ARROW_MEMORY_LAYOUT; } @@ -157,7 +157,7 @@ export_single_channel_array(Imaging im, struct ArrowArray *array) { int length = im->xsize * im->ysize; /* for now, single block images */ - if (!(im->blocks_count == 0 || im->blocks_count == 1)) { + if (im->blocks_count > 1) { return IMAGING_ARROW_MEMORY_LAYOUT; } @@ -200,7 +200,7 @@ export_fixed_pixel_array(Imaging im, struct ArrowArray *array) { int length = im->xsize * im->ysize; /* for now, single block images */ - if (!(im->blocks_count == 0 || im->blocks_count == 1)) { + if (im->blocks_count > 1) { return IMAGING_ARROW_MEMORY_LAYOUT; } From fcac6e78966f7cac4813731dc2303f80f844b320 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 29 May 2025 18:27:17 +1000 Subject: [PATCH 156/268] Removed hasAlpha argument --- src/libImaging/Draw.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index d5aff8709..046293379 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -439,9 +439,7 @@ draw_horizontal_lines( * Filled polygon draw function using scan line algorithm. */ static inline int -polygon_generic( - Imaging im, int n, Edge *e, int ink, int eofill, hline_handler hline, int hasAlpha -) { +polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, hline_handler hline) { Edge **edge_table; float *xx; int edge_count = 0; @@ -461,6 +459,7 @@ polygon_generic( return -1; } + int hasAlpha = hline == hline32rgba; for (i = 0; i < n; i++) { if (ymin > e[i].ymin) { ymin = e[i].ymin; @@ -592,17 +591,17 @@ polygon_generic( static inline int polygon8(Imaging im, int n, Edge *e, int ink, int eofill) { - return polygon_generic(im, n, e, ink, eofill, hline8, 0); + return polygon_generic(im, n, e, ink, eofill, hline8); } static inline int polygon32(Imaging im, int n, Edge *e, int ink, int eofill) { - return polygon_generic(im, n, e, ink, eofill, hline32, 0); + return polygon_generic(im, n, e, ink, eofill, hline32); } static inline int polygon32rgba(Imaging im, int n, Edge *e, int ink, int eofill) { - return polygon_generic(im, n, e, ink, eofill, hline32rgba, 1); + return polygon_generic(im, n, e, ink, eofill, hline32rgba); } static inline void From 62da23bf83a568079cd514cbac6a99bf37009820 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 29 May 2025 18:22:49 +1000 Subject: [PATCH 157/268] Removed polygon from DRAW struct --- src/libImaging/Draw.c | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 046293379..4c08e9855 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -589,21 +589,6 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, hline_handler h return 0; } -static inline int -polygon8(Imaging im, int n, Edge *e, int ink, int eofill) { - return polygon_generic(im, n, e, ink, eofill, hline8); -} - -static inline int -polygon32(Imaging im, int n, Edge *e, int ink, int eofill) { - return polygon_generic(im, n, e, ink, eofill, hline32); -} - -static inline int -polygon32rgba(Imaging im, int n, Edge *e, int ink, int eofill) { - return polygon_generic(im, n, e, ink, eofill, hline32rgba); -} - static inline void add_edge(Edge *e, int x0, int y0, int x1, int y1) { /* printf("edge %d %d %d %d\n", x0, y0, x1, y1); */ @@ -640,12 +625,11 @@ typedef struct { void (*point)(Imaging im, int x, int y, int ink); void (*hline)(Imaging im, int x0, int y0, int x1, int ink); void (*line)(Imaging im, int x0, int y0, int x1, int y1, int ink); - int (*polygon)(Imaging im, int n, Edge *e, int ink, int eofill); } DRAW; -DRAW draw8 = {point8, hline8, line8, polygon8}; -DRAW draw32 = {point32, hline32, line32, polygon32}; -DRAW draw32rgba = {point32rgba, hline32rgba, line32rgba, polygon32rgba}; +DRAW draw8 = {point8, hline8, line8}; +DRAW draw32 = {point32, hline32, line32}; +DRAW draw32rgba = {point32rgba, hline32rgba, line32rgba}; /* -------------------------------------------------------------------- */ /* Interface */ @@ -730,7 +714,7 @@ ImagingDrawWideLine( add_edge(e + 2, vertices[2][0], vertices[2][1], vertices[3][0], vertices[3][1]); add_edge(e + 3, vertices[3][0], vertices[3][1], vertices[0][0], vertices[0][1]); - draw->polygon(im, 4, e, ink, 0); + polygon_generic(im, 4, e, ink, 0, draw->hline); } return 0; } @@ -838,7 +822,7 @@ ImagingDrawPolygon( if (xy[i * 2] != xy[0] || xy[i * 2 + 1] != xy[1]) { add_edge(&e[n++], xy[i * 2], xy[i * 2 + 1], xy[0], xy[1]); } - draw->polygon(im, n, e, ink, 0); + polygon_generic(im, n, e, ink, 0, draw->hline); free(e); } else { @@ -1988,7 +1972,7 @@ ImagingDrawOutline( DRAWINIT(); - draw->polygon(im, outline->count, outline->edges, ink, 0); + polygon_generic(im, outline->count, outline->edges, ink, 0, draw->hline); return 0; } From 6a60b2e6dd0909f627d093cbc431891a79d2b987 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 May 2025 10:27:11 +0100 Subject: [PATCH 158/268] Remove Tests/ path arg, this is already configured --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index a56fe8fec..1f9d2ce13 100644 --- a/Makefile +++ b/Makefile @@ -95,12 +95,12 @@ sdist: .PHONY: test test: python3 -c "import pytest" > /dev/null 2>&1 || python3 -m pip install pytest - python3 -m pytest -qq Tests/ + python3 -m pytest -qq .PHONY: test-p test-p: python3 -c "import xdist" > /dev/null 2>&1 || python3 -m pip install pytest-xdist - python3 -m pytest -qq -n auto Tests/ + python3 -m pytest -qq -n auto .PHONY: valgrind From 98cf15e9e487cbc53b101498d43cc0cc141ee7e7 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 May 2025 10:35:13 +0100 Subject: [PATCH 159/268] Update depends/docker-test-valgrind-memory.sh Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- depends/docker-test-valgrind-memory.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/docker-test-valgrind-memory.sh b/depends/docker-test-valgrind-memory.sh index 5f7805421..f0d1d851d 100755 --- a/depends/docker-test-valgrind-memory.sh +++ b/depends/docker-test-valgrind-memory.sh @@ -1,7 +1,7 @@ #!/bin/bash -## Run this as the test script in the docker valgrind image. -## Note -- can be included directly into the docker image, +## Run this as the test script in the Docker valgrind image. +## Note -- can be included directly into the Docker image, ## but requires the current python.supp. source /vpy3/bin/activate From 399b6c1045ff2387e7db8206e72baec33f996030 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 May 2025 10:40:07 +0100 Subject: [PATCH 160/268] Update Makefile Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4f63cfe02..27d70dcb7 100644 --- a/Makefile +++ b/Makefile @@ -110,7 +110,7 @@ valgrind-leak: PILLOW_VALGRIND_TEST=true PYTHONMALLOC=malloc valgrind --suppressions=Tests/oss-fuzz/python.supp \ --leak-check=full --show-leak-kinds=definite --errors-for-leak-kinds=definite \ --log-file=/tmp/valgrind-output \ - python3 -m pytest -vv --valgrind --valgrind-log=/tmp/valgrind-output Tests/ + python3 -m pytest -vv --valgrind --valgrind-log=/tmp/valgrind-output .PHONY: readme readme: From 506691729a2f9d33228f8693cdbe90418e1b321a Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 30 May 2025 10:40:35 +0100 Subject: [PATCH 161/268] Apply suggestions from code review Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Tests/test_pyarrow.py | 4 ++-- src/libImaging/Storage.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/test_pyarrow.py b/Tests/test_pyarrow.py index 2029f96f5..8dad94fe0 100644 --- a/Tests/test_pyarrow.py +++ b/Tests/test_pyarrow.py @@ -29,7 +29,7 @@ def _test_img_equals_pyarray( px = img.load() assert px is not None if elts_per_pixel > 1 and mask is None: - # have to do element wise comparison when we're comparing + # have to do element-wise comparison when we're comparing # flattened r,g,b,a to a pixel. mask = list(range(elts_per_pixel)) for x in range(0, img.size[0], int(img.size[0] / 10)): @@ -56,7 +56,7 @@ def _test_img_equals_int32_pyarray( px = img.load() assert px is not None if mask is None: - # have to do element wise comparison when we're comparing + # have to do element-wise comparison when we're comparing # flattened rgba in an uint32 to a pixel. mask = list(range(elts_per_pixel)) for x in range(0, img.size[0], int(img.size[0] / 10)): diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 1a9171a0c..6f0a1bfa3 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -757,7 +757,7 @@ ImagingNewArrow( if (strcmp(schema->format, "C") == 0 // uint8 && im->pixelsize == 4 // storage as 32 bpc && schema->n_children == 0 // make sure schema is well formed. - && strcmp(im->arrow_band_format, "C") == 0 // Expected Format + && strcmp(im->arrow_band_format, "C") == 0 // expected format && 4 * pixels == external_array->length) { // expected length // single flat array, interleaved storage. if (ImagingBorrowArrow(im, external_array, 1, array_capsule)) { From 3944db288a5b54ea6171fd1334e517fbcc3c9136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=93=E9=BC=A0?= Date: Sat, 31 May 2025 09:10:45 +0800 Subject: [PATCH 162/268] Update MinGW package names (#8987) --- docs/installation/building-from-source.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/installation/building-from-source.rst b/docs/installation/building-from-source.rst index c72568b20..8988a92ce 100644 --- a/docs/installation/building-from-source.rst +++ b/docs/installation/building-from-source.rst @@ -194,9 +194,9 @@ Many of Pillow's features require external libraries: pacman -S \ mingw-w64-x86_64-gcc \ - mingw-w64-x86_64-python3 \ - mingw-w64-x86_64-python3-pip \ - mingw-w64-x86_64-python3-setuptools + mingw-w64-x86_64-python \ + mingw-w64-x86_64-python-pip \ + mingw-w64-x86_64-python-setuptools Prerequisites are installed on **MSYS2 MinGW 64-bit** with:: From bc4138f1692d718ec9fe7b3b7449dc20d0e2d85e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 31 May 2025 11:48:49 +1000 Subject: [PATCH 163/268] ubuntu-latest now uses Ubuntu 24.04 --- docs/installation/platform-support.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/installation/platform-support.rst b/docs/installation/platform-support.rst index 93486d034..1071380fd 100644 --- a/docs/installation/platform-support.rst +++ b/docs/installation/platform-support.rst @@ -42,11 +42,13 @@ These platforms are built and tested for every change. | macOS 14 Sonoma | 3.10, 3.11, 3.12, 3.13, | arm64 | | | PyPy3 | | +----------------------------------+----------------------------+---------------------+ -| Ubuntu Linux 22.04 LTS (Jammy) | 3.9, 3.10, 3.11, | x86-64 | -| | 3.12, 3.13, PyPy3 | | +| Ubuntu Linux 22.04 LTS (Jammy) | 3.10 | x86-64 | +----------------------------------+----------------------------+---------------------+ -| Ubuntu Linux 24.04 LTS (Noble) | 3.12 | x86-64, arm64v8, | -| | | ppc64le, s390x | +| Ubuntu Linux 24.04 LTS (Noble) | 3.9, 3.10, 3.11, | x86-64 | +| | 3.12, 3.13, PyPy3 | | +| +----------------------------+---------------------+ +| | 3.12 | arm64v8, ppc64le, | +| | | s390x | +----------------------------------+----------------------------+---------------------+ | Windows Server 2019 | 3.9 | x86 | +----------------------------------+----------------------------+---------------------+ From 9327e425ba77523ec9d98eb9558806ecf29b9365 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 31 May 2025 12:02:16 +1000 Subject: [PATCH 164/268] Stop testing deprecated Windows Server 2019 --- .github/workflows/test-windows.yml | 5 ++--- docs/installation/platform-support.rst | 6 +++--- winbuild/README.md | 3 +-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index bfa4c7cd3..6b76351b0 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -31,16 +31,15 @@ env: jobs: build: - runs-on: ${{ matrix.os }} + runs-on: windows-latest strategy: fail-fast: false matrix: python-version: ["pypy3.11", "pypy3.10", "3.10", "3.11", "3.12", "3.13", "3.14"] architecture: ["x64"] - os: ["windows-latest"] include: # Test the oldest Python on 32-bit - - { python-version: "3.9", architecture: "x86", os: "windows-2019" } + - { python-version: "3.9", architecture: "x86" } timeout-minutes: 45 diff --git a/docs/installation/platform-support.rst b/docs/installation/platform-support.rst index 93486d034..f262d861c 100644 --- a/docs/installation/platform-support.rst +++ b/docs/installation/platform-support.rst @@ -48,9 +48,9 @@ These platforms are built and tested for every change. | Ubuntu Linux 24.04 LTS (Noble) | 3.12 | x86-64, arm64v8, | | | | ppc64le, s390x | +----------------------------------+----------------------------+---------------------+ -| Windows Server 2019 | 3.9 | x86 | -+----------------------------------+----------------------------+---------------------+ -| Windows Server 2022 | 3.10, 3.11, 3.12, 3.13, | x86-64 | +| Windows Server 2022 | 3.9 | x86 | +| +----------------------------+---------------------+ +| | 3.10, 3.11, 3.12, 3.13, | x86-64 | | | PyPy3 | | | +----------------------------+---------------------+ | | 3.12 (MinGW) | x86-64 | diff --git a/winbuild/README.md b/winbuild/README.md index c474f12ce..0d3ec8d8a 100644 --- a/winbuild/README.md +++ b/winbuild/README.md @@ -11,8 +11,7 @@ For more extensive info, see the [Windows build instructions](build.rst). * Requires Microsoft Visual Studio 2017 or newer with C++ component. * Requires NASM for libjpeg-turbo, a required dependency when using this script. * Requires CMake 3.15 or newer (available as Visual Studio component). -* Tested on Windows Server 2022 with Visual Studio 2022 Enterprise and Windows Server - 2019 with Visual Studio 2019 Enterprise (GitHub Actions). +* Tested on Windows Server 2022 with Visual Studio 2022 Enterprise (GitHub Actions). Here's an example script to build on Windows: From 892fd2c2affa4980121a059bc2b7875834571804 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sun, 1 Jun 2025 15:41:48 +1000 Subject: [PATCH 165/268] Removed unreachable code (#8918) --- src/PIL/MpegImagePlugin.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/PIL/MpegImagePlugin.py b/src/PIL/MpegImagePlugin.py index 5aa00d05b..47ebe9d62 100644 --- a/src/PIL/MpegImagePlugin.py +++ b/src/PIL/MpegImagePlugin.py @@ -33,11 +33,7 @@ class BitStream: def peek(self, bits: int) -> int: while self.bits < bits: - c = self.next() - if c < 0: - self.bits = 0 - continue - self.bitbuffer = (self.bitbuffer << 8) + c + self.bitbuffer = (self.bitbuffer << 8) + self.next() self.bits += 8 return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 From 95603e9717c81d3492933c3a8d094bfbb7e90340 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:14:11 +1000 Subject: [PATCH 166/268] Use ImageFile.MAXBLOCK in tobytes() (#8906) --- src/PIL/Image.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index aaa3332ee..ed2f728aa 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -802,7 +802,9 @@ class Image: e = _getencoder(self.mode, encoder_name, encoder_args) e.setimage(self.im) - bufsize = max(65536, self.size[0] * 4) # see RawEncode.c + from . import ImageFile + + bufsize = max(ImageFile.MAXBLOCK, self.size[0] * 4) # see RawEncode.c output = [] while True: From 070e1eba626736a5cfa4a90a8a97dfbbf6278b91 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 14:08:24 +1000 Subject: [PATCH 167/268] [pre-commit.ci] pre-commit autoupdate (#8993) --- .pre-commit-config.yaml | 8 ++++---- src/_imaging.c | 9 +++++---- src/display.c | 8 ++++---- src/libImaging/Fill.c | 5 +++-- src/libImaging/Filter.c | 6 ++++-- src/libImaging/Jpeg2KEncode.c | 8 ++++---- src/libImaging/Point.c | 5 +++-- src/libImaging/Resample.c | 6 ++++-- src/libImaging/Storage.c | 5 +++-- src/libImaging/TiffDecode.c | 3 ++- 10 files changed, 36 insertions(+), 27 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e15e6f639..a1a054e00 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.8 + rev: v0.11.12 hooks: - id: ruff args: [--exit-non-zero-on-fix] @@ -24,7 +24,7 @@ repos: exclude: (Makefile$|\.bat$|\.cmake$|\.eps$|\.fits$|\.gd$|\.opt$) - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v20.1.3 + rev: v20.1.5 hooks: - id: clang-format types: [c] @@ -58,7 +58,7 @@ repos: - id: check-renovate - repo: https://github.com/woodruffw/zizmor-pre-commit - rev: v1.6.0 + rev: v1.9.0 hooks: - id: zizmor @@ -68,7 +68,7 @@ repos: - id: sphinx-lint - repo: https://github.com/tox-dev/pyproject-fmt - rev: v2.5.1 + rev: v2.6.0 hooks: - id: pyproject-fmt diff --git a/src/_imaging.c b/src/_imaging.c index 79e0a2b23..9213ba13d 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -308,9 +308,9 @@ _new_arrow(PyObject *self, PyObject *args) { } // ImagingBorrowArrow is responsible for retaining the array_capsule - ret = - PyImagingNew(ImagingNewArrow(mode, xsize, ysize, schema_capsule, array_capsule) - ); + ret = PyImagingNew( + ImagingNewArrow(mode, xsize, ysize, schema_capsule, array_capsule) + ); if (!ret) { return ImagingError_ValueError("Invalid Arrow array mode or size mismatch"); } @@ -1665,7 +1665,8 @@ _putdata(ImagingObject *self, PyObject *args) { int bigendian = 0; if (image->type == IMAGING_TYPE_SPECIAL) { // I;16* - if (strcmp(image->mode, "I;16B") == 0 + if ( + strcmp(image->mode, "I;16B") == 0 #ifdef WORDS_BIGENDIAN || strcmp(image->mode, "I;16N") == 0 #endif diff --git a/src/display.c b/src/display.c index 11742a895..3215f6691 100644 --- a/src/display.c +++ b/src/display.c @@ -327,11 +327,11 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) { // added in Windows 10 (1607) // loaded dynamically to avoid link errors user32 = LoadLibraryA("User32.dll"); - SetThreadDpiAwarenessContext_function = (Func_SetThreadDpiAwarenessContext - )GetProcAddress(user32, "SetThreadDpiAwarenessContext"); + SetThreadDpiAwarenessContext_function = (Func_SetThreadDpiAwarenessContext) + GetProcAddress(user32, "SetThreadDpiAwarenessContext"); if (SetThreadDpiAwarenessContext_function != NULL) { - GetWindowDpiAwarenessContext_function = (Func_GetWindowDpiAwarenessContext - )GetProcAddress(user32, "GetWindowDpiAwarenessContext"); + GetWindowDpiAwarenessContext_function = (Func_GetWindowDpiAwarenessContext) + GetProcAddress(user32, "GetWindowDpiAwarenessContext"); if (screens == -1 && GetWindowDpiAwarenessContext_function != NULL) { dpiAwareness = GetWindowDpiAwarenessContext_function(wnd); } diff --git a/src/libImaging/Fill.c b/src/libImaging/Fill.c index 8fb481e7e..28f427370 100644 --- a/src/libImaging/Fill.c +++ b/src/libImaging/Fill.c @@ -118,8 +118,9 @@ ImagingFillRadialGradient(const char *mode) { for (y = 0; y < 256; y++) { for (x = 0; x < 256; x++) { - d = (int - )sqrt((double)((x - 128) * (x - 128) + (y - 128) * (y - 128)) * 2.0); + d = (int)sqrt( + (double)((x - 128) * (x - 128) + (y - 128) * (y - 128)) * 2.0 + ); if (d >= 255) { d = 255; } diff --git a/src/libImaging/Filter.c b/src/libImaging/Filter.c index 7b7b2e429..c46dd3cd1 100644 --- a/src/libImaging/Filter.c +++ b/src/libImaging/Filter.c @@ -155,7 +155,8 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float *kernel, float offset) { } else { int bigendian = 0; if (im->type == IMAGING_TYPE_SPECIAL) { - if (strcmp(im->mode, "I;16B") == 0 + if ( + strcmp(im->mode, "I;16B") == 0 #ifdef WORDS_BIGENDIAN || strcmp(im->mode, "I;16N") == 0 #endif @@ -308,7 +309,8 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float *kernel, float offset) { } else { int bigendian = 0; if (im->type == IMAGING_TYPE_SPECIAL) { - if (strcmp(im->mode, "I;16B") == 0 + if ( + strcmp(im->mode, "I;16B") == 0 #ifdef WORDS_BIGENDIAN || strcmp(im->mode, "I;16N") == 0 #endif diff --git a/src/libImaging/Jpeg2KEncode.c b/src/libImaging/Jpeg2KEncode.c index 34d1a2294..61e095ad6 100644 --- a/src/libImaging/Jpeg2KEncode.c +++ b/src/libImaging/Jpeg2KEncode.c @@ -207,8 +207,8 @@ j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) { if (params->cp_cinema == OPJ_CINEMA4K_24) { float max_rate = - ((float)(components * im->xsize * im->ysize * 8) / (CINEMA_24_CS_LENGTH * 8) - ); + ((float)(components * im->xsize * im->ysize * 8) / + (CINEMA_24_CS_LENGTH * 8)); params->POC[0].tile = 1; params->POC[0].resno0 = 0; @@ -243,8 +243,8 @@ j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) { params->max_comp_size = COMP_24_CS_MAX_LENGTH; } else { float max_rate = - ((float)(components * im->xsize * im->ysize * 8) / (CINEMA_48_CS_LENGTH * 8) - ); + ((float)(components * im->xsize * im->ysize * 8) / + (CINEMA_48_CS_LENGTH * 8)); for (n = 0; n < params->tcp_numlayers; ++n) { rate = 0; diff --git a/src/libImaging/Point.c b/src/libImaging/Point.c index 6a4060b4b..b11ea62ed 100644 --- a/src/libImaging/Point.c +++ b/src/libImaging/Point.c @@ -197,8 +197,9 @@ ImagingPoint(Imaging imIn, const char *mode, const void *table) { return imOut; mode_mismatch: - return (Imaging - )ImagingError_ValueError("point operation not supported for this mode"); + return (Imaging)ImagingError_ValueError( + "point operation not supported for this mode" + ); } Imaging diff --git a/src/libImaging/Resample.c b/src/libImaging/Resample.c index f5e386dc2..b114e0023 100644 --- a/src/libImaging/Resample.c +++ b/src/libImaging/Resample.c @@ -470,7 +470,8 @@ ImagingResampleHorizontal_16bpc( double *k; int bigendian = 0; - if (strcmp(imIn->mode, "I;16N") == 0 + if ( + strcmp(imIn->mode, "I;16N") == 0 #ifdef WORDS_BIGENDIAN || strcmp(imIn->mode, "I;16B") == 0 #endif @@ -509,7 +510,8 @@ ImagingResampleVertical_16bpc( double *k; int bigendian = 0; - if (strcmp(imIn->mode, "I;16N") == 0 + if ( + strcmp(imIn->mode, "I;16N") == 0 #ifdef WORDS_BIGENDIAN || strcmp(imIn->mode, "I;16B") == 0 #endif diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 6f0a1bfa3..11d6c06cc 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -602,8 +602,9 @@ ImagingBorrowArrow( } if (!borrowed_buffer) { - return (Imaging - )ImagingError_ValueError("Arrow Array, exactly 2 buffers required"); + return (Imaging)ImagingError_ValueError( + "Arrow Array, exactly 2 buffers required" + ); } for (y = i = 0; y < im->ysize; y++) { diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 173eca160..2e83fb847 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -557,7 +557,8 @@ _decodeStrip( (tdata_t)state->buffer, strip_size ) == -1) { - TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0)) + TRACE( + ("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0)) ); state->errcode = IMAGING_CODEC_BROKEN; return -1; From fa7413904b4eee630401c31994eeb5bcda2441a5 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 3 Jun 2025 14:13:22 +1000 Subject: [PATCH 168/268] Updated ruff ID --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a1a054e00..1b8fa7199 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.11.12 hooks: - - id: ruff + - id: ruff-check args: [--exit-non-zero-on-fix] - repo: https://github.com/psf/black-pre-commit-mirror From eb0256acc082e362b4172f3256a551a412ef4b09 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 3 Jun 2025 22:44:26 +1000 Subject: [PATCH 169/268] Fixed test --- Tests/test_deprecate.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_deprecate.py b/Tests/test_deprecate.py index 82ff14181..88479ff0d 100644 --- a/Tests/test_deprecate.py +++ b/Tests/test_deprecate.py @@ -47,7 +47,6 @@ def test_unknown_version() -> None: ], ) def test_old_version(deprecated: str, plural: bool, expected: str) -> None: - expected = r"" with pytest.raises(RuntimeError, match=expected): _deprecate.deprecate(deprecated, 1, plural=plural) From cb077a16c80e9d23bb3976182acae7fc090aa5dc Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 4 Jun 2025 20:07:13 +1000 Subject: [PATCH 170/268] Handle UNDEFINED XMP data --- Tests/test_file_tiff.py | 24 ++++++++++++++++++++++++ src/PIL/TiffImagePlugin.py | 5 ++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index d0d394aa9..73046eb5f 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -14,6 +14,7 @@ from PIL import ( ImageFile, JpegImagePlugin, TiffImagePlugin, + TiffTags, UnidentifiedImageError, ) from PIL.TiffImagePlugin import RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION @@ -900,6 +901,29 @@ class TestFileTiff: assert description[0]["format"] == "image/tiff" assert description[3]["BitsPerSample"]["Seq"]["li"] == ["8", "8", "8"] + def test_getxmp_undefined(self, tmp_path: Path) -> None: + tmpfile = tmp_path / "temp.tif" + im = Image.new("L", (1, 1)) + ifd = TiffImagePlugin.ImageFileDirectory_v2() + ifd.tagtype[700] = TiffTags.UNDEFINED + with Image.open("Tests/images/lab.tif") as im_xmp: + ifd[700] = im_xmp.info["xmp"] + im.save(tmpfile, tiffinfo=ifd) + + with Image.open(tmpfile) as im_reloaded: + if ElementTree is None: + with pytest.warns( + UserWarning, + match="XMP data cannot be read without defusedxml dependency", + ): + assert im_reloaded.getxmp() == {} + else: + assert "xmp" in im_reloaded.info + xmp = im_reloaded.getxmp() + + description = xmp["xmpmeta"]["RDF"]["Description"] + assert description[0]["format"] == "image/tiff" + def test_get_photoshop_blocks(self) -> None: with Image.open("Tests/images/lab.tif") as im: assert isinstance(im, TiffImagePlugin.TiffImageFile) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 88af9162e..22c5208e2 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1259,7 +1259,10 @@ class TiffImageFile(ImageFile.ImageFile): self.fp.seek(self._frame_pos[frame]) self.tag_v2.load(self.fp) if XMP in self.tag_v2: - self.info["xmp"] = self.tag_v2[XMP] + xmp = self.tag_v2[XMP] + if isinstance(xmp, tuple) and len(xmp) == 1: + xmp = xmp[0] + self.info["xmp"] = xmp elif "xmp" in self.info: del self.info["xmp"] self._reload_exif() From f03c23683ed83a9d8f73e73073ac28f1ab2b74ea Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 4 Jun 2025 20:08:58 +1000 Subject: [PATCH 171/268] Trim whitespace from end when parsing XMP data --- Tests/test_image.py | 2 +- src/PIL/Image.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 14a067127..ac358f5bf 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -989,7 +989,7 @@ class TestImage: im = Image.new("RGB", (1, 1)) im.info["xmp"] = ( b'\n' - b'\n\x00\x00' + b'\n\x00\x00 ' ) if ElementTree is None: with pytest.warns( diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ed2f728aa..e03e9cc8a 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1511,7 +1511,7 @@ class Image: return {} if "xmp" not in self.info: return {} - root = ElementTree.fromstring(self.info["xmp"].rstrip(b"\x00")) + root = ElementTree.fromstring(self.info["xmp"].rstrip(b"\x00 ")) return {get_name(root.tag): get_value(root)} def getexif(self) -> Exif: From 9d5ea827e4ac401b85ec0ed61b7d2e97a101b05a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 5 Jun 2025 18:16:05 +1000 Subject: [PATCH 172/268] Call startswith once with a tuple --- setup.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index ab36c6b17..3716a7b9f 100644 --- a/setup.py +++ b/setup.py @@ -163,7 +163,7 @@ def _find_library_dirs_ldconfig() -> list[str]: args: list[str] env: dict[str, str] expr: str - if sys.platform.startswith("linux") or sys.platform.startswith("gnu"): + if sys.platform.startswith(("linux", "gnu")): if struct.calcsize("l") == 4: machine = os.uname()[4] + "-32" else: @@ -623,11 +623,7 @@ class pil_build_ext(build_ext): for extension in self.extensions: extension.extra_compile_args = ["-Wno-nullability-completeness"] - elif ( - sys.platform.startswith("linux") - or sys.platform.startswith("gnu") - or sys.platform.startswith("freebsd") - ): + elif sys.platform.startswith(("linux", "gnu", "freebsd")): for dirname in _find_library_dirs_ldconfig(): _add_directory(library_dirs, dirname) if sys.platform.startswith("linux") and os.environ.get("ANDROID_ROOT"): From f3b05d6fab2a8fb0db033fc507d0d6f19ed2330e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 7 Jun 2025 11:07:21 +1000 Subject: [PATCH 173/268] Update dependency mypy to v1.16.0 (#8991) Co-authored-by: Andrew Murray --- .ci/requirements-mypy.txt | 2 +- Tests/test_file_jpeg.py | 10 ++++++---- Tests/test_image.py | 1 + src/PIL/GifImagePlugin.py | 9 ++++++--- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.ci/requirements-mypy.txt b/.ci/requirements-mypy.txt index 86ac2e0b2..a9c18ae2b 100644 --- a/.ci/requirements-mypy.txt +++ b/.ci/requirements-mypy.txt @@ -1,4 +1,4 @@ -mypy==1.15.0 +mypy==1.16.0 IceSpringPySideStubs-PyQt6 IceSpringPySideStubs-PySide6 ipython diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index b9eec591d..2827937cf 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -145,14 +145,16 @@ class TestFileJpeg: assert k > 0.9 # roundtrip, and check again im = self.roundtrip(im) - c, m, y, k = (x / 255.0 for x in im.getpixel((0, 0))) + cmyk = im.getpixel((0, 0)) + assert isinstance(cmyk, tuple) + c, m, y, k = (x / 255.0 for x in cmyk) assert c == 0.0 assert m > 0.8 assert y > 0.8 assert k == 0.0 - c, m, y, k = ( - x / 255.0 for x in im.getpixel((im.size[0] - 1, im.size[1] - 1)) - ) + cmyk = im.getpixel((im.size[0] - 1, im.size[1] - 1)) + assert isinstance(cmyk, tuple) + k = cmyk[3] / 255.0 assert k > 0.9 def test_rgb(self) -> None: diff --git a/Tests/test_image.py b/Tests/test_image.py index 14a067127..4cc841603 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -671,6 +671,7 @@ class TestImage: im_remapped = im.remap_palette(list(range(256))) assert_image_equal(im, im_remapped) assert im.palette is not None + assert im_remapped.palette is not None assert im.palette.palette == im_remapped.palette.palette # Test illegal image mode diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 4392c4cb9..c98e02f69 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -31,7 +31,7 @@ import os import subprocess from enum import IntEnum from functools import cached_property -from typing import IO, Any, Literal, NamedTuple, Union +from typing import IO, Any, Literal, NamedTuple, Union, cast from . import ( Image, @@ -350,12 +350,15 @@ class GifImageFile(ImageFile.ImageFile): if self._frame_palette: if color * 3 + 3 > len(self._frame_palette.palette): color = 0 - return tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]) + return cast( + tuple[int, int, int], + tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]), + ) else: return (color, color, color) self.dispose = None - self.dispose_extent = frame_dispose_extent + self.dispose_extent: tuple[int, int, int, int] | None = frame_dispose_extent if self.dispose_extent and self.disposal_method >= 2: try: if self.disposal_method == 2: From 0d1edba311ffdc9683c6541a5133c60d425debe8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Apr 2025 14:16:49 +1000 Subject: [PATCH 174/268] Assert tile args is tuple --- Tests/test_file_gif.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 20d58a9dd..2712e683c 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -1422,7 +1422,9 @@ def test_getdata(monkeypatch: pytest.MonkeyPatch) -> None: def test_lzw_bits() -> None: # see https://github.com/python-pillow/Pillow/issues/2811 with Image.open("Tests/images/issue_2811.gif") as im: - assert im.tile[0][3][0] == 11 # LZW bits + args = im.tile[0][3] + assert isinstance(args, tuple) + assert args[0] == 11 # LZW bits # codec error prepatch im.load() From 33460d2f82ee148eff2451cfe7e8bc4b6f33b66a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Apr 2025 14:22:02 +1000 Subject: [PATCH 175/268] Assert _getmp() does not return None --- Tests/test_file_mpo.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 73838ef44..462c95535 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -156,6 +156,7 @@ def test_reload_exif_after_seek() -> None: def test_mp(test_file: str) -> None: with Image.open(test_file) as im: mpinfo = im._getmp() + assert mpinfo is not None assert mpinfo[45056] == b"0100" assert mpinfo[45057] == 2 @@ -165,6 +166,7 @@ def test_mp_offset() -> None: # in APP2 data, in contrast to normal 8 with Image.open("Tests/images/sugarshack_ifd_offset.mpo") as im: mpinfo = im._getmp() + assert mpinfo is not None assert mpinfo[45056] == b"0100" assert mpinfo[45057] == 2 @@ -181,6 +183,7 @@ def test_mp_no_data() -> None: def test_mp_attribute(test_file: str) -> None: with Image.open(test_file) as im: mpinfo = im._getmp() + assert mpinfo is not None for frame_number, mpentry in enumerate(mpinfo[0xB002]): mpattr = mpentry["Attribute"] if frame_number: From cba096b4a99f92eb865c7fb127b9783dbd38643e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 7 Jun 2025 11:13:12 +1000 Subject: [PATCH 176/268] Assert pixel data is tuple --- Tests/test_file_gif.py | 8 ++++++-- Tests/test_file_jpeg.py | 10 ++++++---- Tests/test_file_tga.py | 8 ++++++-- Tests/test_file_webp.py | 2 ++ 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 2712e683c..f46a28971 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -540,7 +540,9 @@ def test_dispose_background_transparency() -> None: img.seek(2) px = img.load() assert px is not None - assert px[35, 30][3] == 0 + value = px[35, 30] + assert isinstance(value, tuple) + assert value[3] == 0 @pytest.mark.parametrize( @@ -1479,7 +1481,9 @@ def test_saving_rgba(tmp_path: Path) -> None: with Image.open(out) as reloaded: reloaded_rgba = reloaded.convert("RGBA") - assert reloaded_rgba.load()[0, 0][3] == 0 + value = reloaded_rgba.load()[0, 0] + assert isinstance(value, tuple) + assert value[3] == 0 @pytest.mark.parametrize("params", ({}, {"disposal": 2, "optimize": False})) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 2827937cf..50ee04611 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -133,15 +133,17 @@ class TestFileJpeg: f = "Tests/images/pil_sample_cmyk.jpg" with Image.open(f) as im: # the source image has red pixels in the upper left corner. - c, m, y, k = (x / 255.0 for x in im.getpixel((0, 0))) + cmyk = im.getpixel((0, 0)) + assert isinstance(cmyk, tuple) + c, m, y, k = (x / 255.0 for x in cmyk) assert c == 0.0 assert m > 0.8 assert y > 0.8 assert k == 0.0 # the opposite corner is black - c, m, y, k = ( - x / 255.0 for x in im.getpixel((im.size[0] - 1, im.size[1] - 1)) - ) + cmyk = im.getpixel((im.size[0] - 1, im.size[1] - 1)) + assert isinstance(cmyk, tuple) + k = cmyk[3] / 255.0 assert k > 0.9 # roundtrip, and check again im = self.roundtrip(im) diff --git a/Tests/test_file_tga.py b/Tests/test_file_tga.py index 8b6ed3ed2..d3cceb37f 100644 --- a/Tests/test_file_tga.py +++ b/Tests/test_file_tga.py @@ -220,12 +220,16 @@ def test_horizontal_orientations() -> None: with Image.open("Tests/images/rgb32rle_top_right.tga") as im: px = im.load() assert px is not None - assert px[90, 90][:3] == (0, 0, 0) + value = px[90, 90] + assert isinstance(value, tuple) + assert value[:3] == (0, 0, 0) with Image.open("Tests/images/rgb32rle_bottom_right.tga") as im: px = im.load() assert px is not None - assert px[90, 90][:3] == (0, 255, 0) + value = px[90, 90] + assert isinstance(value, tuple) + assert value[:3] == (0, 255, 0) def test_save_rle(tmp_path: Path) -> None: diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index f61e2c82e..4ea7629d1 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -219,6 +219,7 @@ class TestFileWebp: # Save P mode GIF with background with Image.open("Tests/images/chi.gif") as im: original_value = im.convert("RGB").getpixel((1, 1)) + assert isinstance(original_value, tuple) # Save as WEBP im.save(out_webp, save_all=True) @@ -230,6 +231,7 @@ class TestFileWebp: with Image.open(out_gif) as reread: reread_value = reread.convert("RGB").getpixel((1, 1)) + assert isinstance(reread_value, tuple) difference = sum(abs(original_value[i] - reread_value[i]) for i in range(3)) assert difference < 5 From a3da70e76e14da1bc0e5b1c2331d746e4a095a6b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Apr 2025 14:23:58 +1000 Subject: [PATCH 177/268] Assert load() does not return None --- Tests/test_file_gif.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index f46a28971..e418af45c 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -1481,7 +1481,9 @@ def test_saving_rgba(tmp_path: Path) -> None: with Image.open(out) as reloaded: reloaded_rgba = reloaded.convert("RGBA") - value = reloaded_rgba.load()[0, 0] + px = reloaded_rgba.load() + assert px is not None + value = px[0, 0] assert isinstance(value, tuple) assert value[3] == 0 From 89c38258dc33fd410858c6b760d533789578e15e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Apr 2025 14:24:20 +1000 Subject: [PATCH 178/268] Assert getcolors() does not return None --- Tests/test_file_avif.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_avif.py b/Tests/test_file_avif.py index b2e586637..6d0cc74f9 100644 --- a/Tests/test_file_avif.py +++ b/Tests/test_file_avif.py @@ -254,7 +254,9 @@ class TestFileAvif: assert_image(im, "RGBA", (64, 64)) # image has 876 transparent pixels - assert im.getchannel("A").getcolors()[0] == (876, 0) + colors = im.getchannel("A").getcolors() + assert colors is not None + assert colors[0] == (876, 0) def test_save_transparent(self, tmp_path: Path) -> None: im = Image.new("RGBA", (10, 10), (0, 0, 0, 0)) From 04c984f2f202639479a161dc44ba378b9ebee931 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 7 Jun 2025 11:29:11 +1000 Subject: [PATCH 179/268] Removed duplicate code --- Tests/test_file_jpeg.py | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 50ee04611..00f2c004d 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -130,9 +130,7 @@ class TestFileJpeg: def test_cmyk(self) -> None: # Test CMYK handling. Thanks to Tim and Charlie for test data, # Michael for getting me to look one more time. - f = "Tests/images/pil_sample_cmyk.jpg" - with Image.open(f) as im: - # the source image has red pixels in the upper left corner. + def check(im: ImageFile.ImageFile) -> None: cmyk = im.getpixel((0, 0)) assert isinstance(cmyk, tuple) c, m, y, k = (x / 255.0 for x in cmyk) @@ -145,19 +143,13 @@ class TestFileJpeg: assert isinstance(cmyk, tuple) k = cmyk[3] / 255.0 assert k > 0.9 + + with Image.open("Tests/images/pil_sample_cmyk.jpg") as im: + # the source image has red pixels in the upper left corner. + check(im) + # roundtrip, and check again - im = self.roundtrip(im) - cmyk = im.getpixel((0, 0)) - assert isinstance(cmyk, tuple) - c, m, y, k = (x / 255.0 for x in cmyk) - assert c == 0.0 - assert m > 0.8 - assert y > 0.8 - assert k == 0.0 - cmyk = im.getpixel((im.size[0] - 1, im.size[1] - 1)) - assert isinstance(cmyk, tuple) - k = cmyk[3] / 255.0 - assert k > 0.9 + check(self.roundtrip(im)) def test_rgb(self) -> None: def getchannels(im: JpegImagePlugin.JpegImageFile) -> tuple[int, ...]: From 0bb99e5561e1e2b87f94d6ae30f07eba1744421c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 7 Jun 2025 15:08:16 +1000 Subject: [PATCH 180/268] Use save parameters as encoderinfo defaults --- Tests/test_file_mpo.py | 22 ++++++++++++++++------ Tests/test_file_tiff.py | 13 +++++++++---- src/PIL/Image.py | 9 ++++++++- src/PIL/MpoImagePlugin.py | 1 + src/PIL/TiffImagePlugin.py | 3 +-- 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 73838ef44..c192f017f 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -312,10 +312,20 @@ def test_save_all() -> None: def test_save_xmp() -> None: im = Image.new("RGB", (1, 1)) im2 = Image.new("RGB", (1, 1), "#f00") + + def roundtrip_xmp(): + im_reloaded = roundtrip(im, xmp=b"Default", save_all=True, append_images=[im2]) + xmp = [im_reloaded.info["xmp"]] + im_reloaded.seek(1) + return xmp + [im_reloaded.info["xmp"]] + + # Use the save parameters for all frames by default + assert roundtrip_xmp() == [b"Default", b"Default"] + + # Specify a value for the first frame + im.encoderinfo = {"xmp": b"First frame"} + assert roundtrip_xmp() == [b"First frame", b"Default"] + + # Specify value for the second frame im2.encoderinfo = {"xmp": b"Second frame"} - im_reloaded = roundtrip(im, xmp=b"First frame", save_all=True, append_images=[im2]) - - assert im_reloaded.info["xmp"] == b"First frame" - - im_reloaded.seek(1) - assert im_reloaded.info["xmp"] == b"Second frame" + assert roundtrip_xmp() == [b"Default", b"Second frame"] diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index d0d394aa9..d192e9685 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -695,16 +695,21 @@ class TestFileTiff: assert im.tag_v2[278] == 256 im = hopper() + im.encoderinfo = {"tiffinfo": {278: 100}} im2 = Image.new("L", (128, 128)) - im2.encoderinfo = {"tiffinfo": {278: 256}} - im.save(outfile, save_all=True, append_images=[im2]) + im3 = im2.copy() + im3.encoderinfo = {"tiffinfo": {278: 300}} + im.save(outfile, save_all=True, tiffinfo={278: 200}, append_images=[im2, im3]) with Image.open(outfile) as im: assert isinstance(im, TiffImagePlugin.TiffImageFile) - assert im.tag_v2[278] == 128 + assert im.tag_v2[278] == 100 im.seek(1) - assert im.tag_v2[278] == 256 + assert im.tag_v2[278] == 200 + + im.seek(2) + assert im.tag_v2[278] == 300 def test_strip_raw(self) -> None: infile = "Tests/images/tiff_strip_raw.tif" diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ed2f728aa..7a8d93793 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2555,7 +2555,8 @@ class Image: self.load() save_all = params.pop("save_all", None) - self.encoderinfo = {**getattr(self, "encoderinfo", {}), **params} + self._default_encoderinfo = params + self._attach_default_encoderinfo(self) self.encoderconfig: tuple[Any, ...] = () if format.upper() not in SAVE: @@ -2600,6 +2601,12 @@ class Image: if open_fp: fp.close() + def _attach_default_encoderinfo(self, im: Image) -> Any: + self.encoderinfo = { + **im._default_encoderinfo, + **getattr(self, "encoderinfo", {}), + } + def seek(self, frame: int) -> None: """ Seeks to the given frame in this sequence file. If you seek diff --git a/src/PIL/MpoImagePlugin.py b/src/PIL/MpoImagePlugin.py index f7393eac0..f1f44c0ff 100644 --- a/src/PIL/MpoImagePlugin.py +++ b/src/PIL/MpoImagePlugin.py @@ -64,6 +64,7 @@ def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: JpegImagePlugin._save(im_frame, fp, filename) offsets.append(fp.tell()) else: + im_frame._attach_default_encoderinfo(im) im_frame.save(fp, "JPEG") offsets.append(fp.tell() - offsets[-1]) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 88af9162e..e1b10fea5 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -2310,8 +2310,7 @@ def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: try: with AppendingTiffWriter(fp) as tf: for ims in [im] + append_images: - if not hasattr(ims, "encoderinfo"): - ims.encoderinfo = {} + ims._attach_default_encoderinfo(im) if not hasattr(ims, "encoderconfig"): ims.encoderconfig = () nfr = getattr(ims, "n_frames", 1) From ef1f90fe1c92ec4d038ddf4d03638f467ba94181 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 9 Jun 2025 09:06:08 +1000 Subject: [PATCH 181/268] Check for equality rather than inequality Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- src/PIL/ImageGrab.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index d11609483..1eb450734 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -134,7 +134,10 @@ def grabclipboard() -> Image.Image | list[str] | None: import struct o = struct.unpack_from("I", data)[0] - files = data[o:].decode("mbcs" if data[16] == 0 else "utf-16le").split("\0") + if data[16] == 0: + files = data[o:].decode("mbcs").split("\0") + else: + files = data[o:].decode("utf-16le").split("\0") return files[: files.index("")] if isinstance(data, bytes): data = io.BytesIO(data) From 313969cf0bcf6b6185d486830478d2864eb56fe1 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 9 Jun 2025 12:21:49 +1000 Subject: [PATCH 182/268] Removed unnecessary seek --- src/PIL/PcxImagePlugin.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index 299405ae0..47b6e80e2 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -66,6 +66,8 @@ class PcxImageFile(ImageFile.ImageFile): raise SyntaxError(msg) logger.debug("BBox: %s %s %s %s", *bbox) + offset = self.fp.tell() + # format version = s[1] bits = s[3] @@ -102,7 +104,6 @@ class PcxImageFile(ImageFile.ImageFile): break if mode == "P": self.palette = ImagePalette.raw("RGB", s[1:]) - self.fp.seek(128) elif version == 5 and bits == 8 and planes == 3: mode = "RGB" @@ -128,9 +129,7 @@ class PcxImageFile(ImageFile.ImageFile): bbox = (0, 0) + self.size logger.debug("size: %sx%s", *self.size) - self.tile = [ - ImageFile._Tile("pcx", bbox, self.fp.tell(), (rawmode, planes * stride)) - ] + self.tile = [ImageFile._Tile("pcx", bbox, offset, (rawmode, planes * stride))] # -------------------------------------------------------------------- From 7341e70f6be9c3e910c81f563bb7900167873c02 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 9 Jun 2025 12:20:52 +1000 Subject: [PATCH 183/268] Reduced number of bytes read for header --- src/PIL/PcxImagePlugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index 47b6e80e2..458d586c4 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -54,7 +54,7 @@ class PcxImageFile(ImageFile.ImageFile): # header assert self.fp is not None - s = self.fp.read(128) + s = self.fp.read(68) if not _accept(s): msg = "not a PCX file" raise SyntaxError(msg) @@ -66,7 +66,7 @@ class PcxImageFile(ImageFile.ImageFile): raise SyntaxError(msg) logger.debug("BBox: %s %s %s %s", *bbox) - offset = self.fp.tell() + offset = self.fp.tell() + 60 # format version = s[1] From 7b163cc35d3ef9bb0204613add92f05eda65ab63 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:46:12 +1000 Subject: [PATCH 184/268] Use mask in C when drawing wide polygon lines (#8984) --- src/PIL/ImageDraw.py | 16 +----- src/_imaging.c | 20 +++++-- src/libImaging/Draw.c | 113 ++++++++++++++++++++++++++++----------- src/libImaging/Imaging.h | 19 ++++++- 4 files changed, 116 insertions(+), 52 deletions(-) diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index e6c7b0298..98ae67539 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -365,22 +365,10 @@ class ImageDraw: # use the fill as a mask mask = Image.new("1", self.im.size) mask_ink = self._getink(1)[0] - - fill_im = mask.copy() - draw = Draw(fill_im) + draw = Draw(mask) draw.draw.draw_polygon(xy, mask_ink, 1) - ink_im = mask.copy() - draw = Draw(ink_im) - width = width * 2 - 1 - draw.draw.draw_polygon(xy, mask_ink, 0, width) - - mask.paste(ink_im, mask=fill_im) - - im = Image.new(self.mode, self.im.size) - draw = Draw(im) - draw.draw.draw_polygon(xy, ink, 0, width) - self.im.paste(im.im, (0, 0) + im.size, mask.im) + self.draw.draw_polygon(xy, ink, 0, width * 2 - 1, mask.im) def regular_polygon( self, diff --git a/src/_imaging.c b/src/_imaging.c index 9213ba13d..2a7bc8d3f 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3220,7 +3220,8 @@ _draw_lines(ImagingDrawObject *self, PyObject *args) { (int)p[3], &ink, width, - self->blend + self->blend, + NULL ) < 0) { free(xy); return NULL; @@ -3358,7 +3359,10 @@ _draw_polygon(ImagingDrawObject *self, PyObject *args) { int ink; int fill = 0; int width = 0; - if (!PyArg_ParseTuple(args, "Oi|ii", &data, &ink, &fill, &width)) { + ImagingObject *maskp = NULL; + if (!PyArg_ParseTuple( + args, "Oi|iiO!", &data, &ink, &fill, &width, &Imaging_Type, &maskp + )) { return NULL; } @@ -3388,8 +3392,16 @@ _draw_polygon(ImagingDrawObject *self, PyObject *args) { free(xy); - if (ImagingDrawPolygon(self->image->image, n, ixy, &ink, fill, width, self->blend) < - 0) { + if (ImagingDrawPolygon( + self->image->image, + n, + ixy, + &ink, + fill, + width, + self->blend, + maskp ? maskp->image : NULL + ) < 0) { free(ixy); return NULL; } diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 4c08e9855..70f267ae4 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -63,7 +63,7 @@ typedef struct { } Edge; /* Type used in "polygon*" functions */ -typedef void (*hline_handler)(Imaging, int, int, int, int); +typedef void (*hline_handler)(Imaging, int, int, int, int, Imaging); static inline void point8(Imaging im, int x, int y, int ink) { @@ -103,7 +103,7 @@ point32rgba(Imaging im, int x, int y, int ink) { } static inline void -hline8(Imaging im, int x0, int y0, int x1, int ink) { +hline8(Imaging im, int x0, int y0, int x1, int ink, Imaging mask) { int pixelwidth; if (y0 >= 0 && y0 < im->ysize) { @@ -119,15 +119,30 @@ hline8(Imaging im, int x0, int y0, int x1, int ink) { } if (x0 <= x1) { pixelwidth = strncmp(im->mode, "I;16", 4) == 0 ? 2 : 1; - memset( - im->image8[y0] + x0 * pixelwidth, (UINT8)ink, (x1 - x0 + 1) * pixelwidth - ); + if (mask == NULL) { + memset( + im->image8[y0] + x0 * pixelwidth, + (UINT8)ink, + (x1 - x0 + 1) * pixelwidth + ); + } else { + UINT8 *p = im->image8[y0]; + while (x0 <= x1) { + if (mask->image8[y0][x0]) { + p[x0 * pixelwidth] = ink; + if (pixelwidth == 2) { + p[x0 * pixelwidth + 1] = ink; + } + } + x0++; + } + } } } } static inline void -hline32(Imaging im, int x0, int y0, int x1, int ink) { +hline32(Imaging im, int x0, int y0, int x1, int ink, Imaging mask) { INT32 *p; if (y0 >= 0 && y0 < im->ysize) { @@ -143,13 +158,16 @@ hline32(Imaging im, int x0, int y0, int x1, int ink) { } p = im->image32[y0]; while (x0 <= x1) { - p[x0++] = ink; + if (mask == NULL || mask->image8[y0][x0]) { + p[x0] = ink; + } + x0++; } } } static inline void -hline32rgba(Imaging im, int x0, int y0, int x1, int ink) { +hline32rgba(Imaging im, int x0, int y0, int x1, int ink, Imaging mask) { unsigned int tmp; if (y0 >= 0 && y0 < im->ysize) { @@ -167,9 +185,11 @@ hline32rgba(Imaging im, int x0, int y0, int x1, int ink) { UINT8 *out = (UINT8 *)im->image[y0] + x0 * 4; UINT8 *in = (UINT8 *)&ink; while (x0 <= x1) { - out[0] = BLEND(in[3], out[0], in[0], tmp); - out[1] = BLEND(in[3], out[1], in[1], tmp); - out[2] = BLEND(in[3], out[2], in[2], tmp); + if (mask == NULL || mask->image8[y0][x0]) { + out[0] = BLEND(in[3], out[0], in[0], tmp); + out[1] = BLEND(in[3], out[1], in[1], tmp); + out[2] = BLEND(in[3], out[2], in[2], tmp); + } x0++; out += 4; } @@ -407,7 +427,14 @@ x_cmp(const void *x0, const void *x1) { static void draw_horizontal_lines( - Imaging im, int n, Edge *e, int ink, int *x_pos, int y, hline_handler hline + Imaging im, + int n, + Edge *e, + int ink, + int *x_pos, + int y, + hline_handler hline, + Imaging mask ) { int i; for (i = 0; i < n; i++) { @@ -429,7 +456,7 @@ draw_horizontal_lines( } } - (*hline)(im, xmin, e[i].ymin, xmax, ink); + (*hline)(im, xmin, e[i].ymin, xmax, ink, mask); *x_pos = xmax + 1; } } @@ -439,7 +466,9 @@ draw_horizontal_lines( * Filled polygon draw function using scan line algorithm. */ static inline int -polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, hline_handler hline) { +polygon_generic( + Imaging im, int n, Edge *e, int ink, int eofill, hline_handler hline, Imaging mask +) { Edge **edge_table; float *xx; int edge_count = 0; @@ -469,7 +498,7 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, hline_handler h } if (e[i].ymin == e[i].ymax) { if (hasAlpha != 1) { - (*hline)(im, e[i].xmin, e[i].ymin, e[i].xmax, ink); + (*hline)(im, e[i].xmin, e[i].ymin, e[i].xmax, ink, mask); } continue; } @@ -557,7 +586,7 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, hline_handler h // Line would be before the current position continue; } - draw_horizontal_lines(im, n, e, ink, &x_pos, ymin, hline); + draw_horizontal_lines(im, n, e, ink, &x_pos, ymin, hline, mask); if (x_end < x_pos) { // Line would be before the current position continue; @@ -573,13 +602,13 @@ polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, hline_handler h continue; } } - (*hline)(im, x_start, ymin, x_end, ink); + (*hline)(im, x_start, ymin, x_end, ink, mask); x_pos = x_end + 1; } - draw_horizontal_lines(im, n, e, ink, &x_pos, ymin, hline); + draw_horizontal_lines(im, n, e, ink, &x_pos, ymin, hline, mask); } else { for (i = 1; i < j; i += 2) { - (*hline)(im, ROUND_UP(xx[i - 1]), ymin, ROUND_DOWN(xx[i]), ink); + (*hline)(im, ROUND_UP(xx[i - 1]), ymin, ROUND_DOWN(xx[i]), ink, mask); } } } @@ -623,7 +652,7 @@ add_edge(Edge *e, int x0, int y0, int x1, int y1) { typedef struct { void (*point)(Imaging im, int x, int y, int ink); - void (*hline)(Imaging im, int x0, int y0, int x1, int ink); + void (*hline)(Imaging im, int x0, int y0, int x1, int ink, Imaging mask); void (*line)(Imaging im, int x0, int y0, int x1, int y1, int ink); } DRAW; @@ -674,7 +703,15 @@ ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void *ink_, in int ImagingDrawWideLine( - Imaging im, int x0, int y0, int x1, int y1, const void *ink_, int width, int op + Imaging im, + int x0, + int y0, + int x1, + int y1, + const void *ink_, + int width, + int op, + Imaging mask ) { DRAW *draw; INT32 ink; @@ -714,7 +751,7 @@ ImagingDrawWideLine( add_edge(e + 2, vertices[2][0], vertices[2][1], vertices[3][0], vertices[3][1]); add_edge(e + 3, vertices[3][0], vertices[3][1], vertices[0][0], vertices[0][1]); - polygon_generic(im, 4, e, ink, 0, draw->hline); + polygon_generic(im, 4, e, ink, 0, draw->hline, mask); } return 0; } @@ -757,7 +794,7 @@ ImagingDrawRectangle( } for (y = y0; y <= y1; y++) { - draw->hline(im, x0, y, x1, ink); + draw->hline(im, x0, y, x1, ink, NULL); } } else { @@ -766,8 +803,8 @@ ImagingDrawRectangle( width = 1; } for (i = 0; i < width; i++) { - draw->hline(im, x0, y0 + i, x1, ink); - draw->hline(im, x0, y1 - i, x1, ink); + draw->hline(im, x0, y0 + i, x1, ink, NULL); + draw->hline(im, x0, y1 - i, x1, ink, NULL); draw->line(im, x1 - i, y0 + width, x1 - i, y1 - width + 1, ink); draw->line(im, x0 + i, y0 + width, x0 + i, y1 - width + 1, ink); } @@ -778,7 +815,14 @@ ImagingDrawRectangle( int ImagingDrawPolygon( - Imaging im, int count, int *xy, const void *ink_, int fill, int width, int op + Imaging im, + int count, + int *xy, + const void *ink_, + int fill, + int width, + int op, + Imaging mask ) { int i, n, x0, y0, x1, y1; DRAW *draw; @@ -822,7 +866,7 @@ ImagingDrawPolygon( if (xy[i * 2] != xy[0] || xy[i * 2 + 1] != xy[1]) { add_edge(&e[n++], xy[i * 2], xy[i * 2 + 1], xy[0], xy[1]); } - polygon_generic(im, n, e, ink, 0, draw->hline); + polygon_generic(im, n, e, ink, 0, draw->hline, mask); free(e); } else { @@ -844,11 +888,12 @@ ImagingDrawPolygon( xy[i * 2 + 3], ink_, width, - op + op, + mask ); } ImagingDrawWideLine( - im, xy[i * 2], xy[i * 2 + 1], xy[0], xy[1], ink_, width, op + im, xy[i * 2], xy[i * 2 + 1], xy[0], xy[1], ink_, width, op, mask ); } } @@ -1519,7 +1564,9 @@ ellipseNew( ellipse_init(&st, a, b, width); int32_t X0, Y, X1; while (ellipse_next(&st, &X0, &Y, &X1) != -1) { - draw->hline(im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink); + draw->hline( + im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink, NULL + ); } return 0; } @@ -1554,7 +1601,9 @@ clipEllipseNew( int32_t X0, Y, X1; int next_code; while ((next_code = clip_ellipse_next(&st, &X0, &Y, &X1)) >= 0) { - draw->hline(im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink); + draw->hline( + im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink, NULL + ); } clip_ellipse_free(&st); return next_code == -1 ? 0 : -1; @@ -1972,7 +2021,7 @@ ImagingDrawOutline( DRAWINIT(); - polygon_generic(im, outline->count, outline->edges, ink, 0, draw->hline); + polygon_generic(im, outline->count, outline->edges, ink, 0, draw->hline, NULL); return 0; } diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index 234f9943c..39ecdbff6 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -510,7 +510,15 @@ extern int ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void *ink, int op); extern int ImagingDrawWideLine( - Imaging im, int x0, int y0, int x1, int y1, const void *ink, int width, int op + Imaging im, + int x0, + int y0, + int x1, + int y1, + const void *ink, + int width, + int op, + Imaging mask ); extern int ImagingDrawPieslice( @@ -530,7 +538,14 @@ extern int ImagingDrawPoint(Imaging im, int x, int y, const void *ink, int op); extern int ImagingDrawPolygon( - Imaging im, int points, int *xy, const void *ink, int fill, int width, int op + Imaging im, + int points, + int *xy, + const void *ink, + int fill, + int width, + int op, + Imaging mask ); extern int ImagingDrawRectangle( From 6bd55684e0d172749a74dd2098ebc18ce5f34fdd Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 10 Jun 2025 16:00:08 +1000 Subject: [PATCH 185/268] Only accept missing tkinter when building wheels on Windows (#8981) --- Tests/check_wheel.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Tests/check_wheel.py b/Tests/check_wheel.py index 8ba40ba3f..9602410da 100644 --- a/Tests/check_wheel.py +++ b/Tests/check_wheel.py @@ -11,13 +11,14 @@ from .helper import is_pypy def test_wheel_modules() -> None: expected_modules = {"pil", "tkinter", "freetype2", "littlecms2", "webp"} - # tkinter is not available in cibuildwheel installed CPython on Windows - try: - import tkinter + if sys.platform == "win32": + # tkinter is not available in cibuildwheel installed CPython on Windows + try: + import tkinter - assert tkinter - except ImportError: - expected_modules.remove("tkinter") + assert tkinter + except ImportError: + expected_modules.remove("tkinter") assert set(features.get_supported_modules()) == expected_modules From e65e5bea45e92a118590c69c022d6e6741e3b101 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 10 Jun 2025 20:30:18 +1000 Subject: [PATCH 186/268] Start decoding with a zero-initialized array of previously seen pixels --- Tests/images/op_index.qoi | Bin 0 -> 15 bytes Tests/test_file_qoi.py | 6 ++++++ src/PIL/QoiImagePlugin.py | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Tests/images/op_index.qoi diff --git a/Tests/images/op_index.qoi b/Tests/images/op_index.qoi new file mode 100644 index 0000000000000000000000000000000000000000..e626aafe6a433487cbacb4bdbcbbe5e66e8d07db GIT binary patch literal 15 TcmXTS&rD-rU| None: with pytest.raises(SyntaxError): QoiImagePlugin.QoiImageFile(invalid_file) + + +def test_op_index() -> None: + # QOI_OP_INDEX as the first chunk + with Image.open("Tests/images/op_index.qoi") as im: + assert im.getpixel((0, 0)) == (0, 0, 0, 0) diff --git a/src/PIL/QoiImagePlugin.py b/src/PIL/QoiImagePlugin.py index df552243e..75070abd7 100644 --- a/src/PIL/QoiImagePlugin.py +++ b/src/PIL/QoiImagePlugin.py @@ -51,7 +51,7 @@ class QoiDecoder(ImageFile.PyDecoder): assert self.fd is not None self._previously_seen_pixels = {} - self._add_to_previous_pixels(bytearray((0, 0, 0, 255))) + self._previous_pixel = bytearray((0, 0, 0, 255)) data = bytearray() bands = Image.getmodebands(self.mode) From 646885e546ecd02a8162d91b51d32eed9da67b7a Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 10 Jun 2025 21:06:28 +1000 Subject: [PATCH 187/268] Parse XMP tag bytes without decoding to string (#8960) Co-authored-by: Andrew Murray --- Tests/test_image.py | 5 +++++ src/PIL/Image.py | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 4cc841603..512a52433 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -974,6 +974,11 @@ class TestImage: assert tag not in exif.get_ifd(0x8769) assert exif.get_ifd(0xA005) + def test_exif_from_xmp_bytes(self) -> None: + im = Image.new("RGB", (1, 1)) + im.info["xmp"] = b'\xff tiff:Orientation="2"' + assert im.getexif()[274] == 2 + def test_empty_xmp(self) -> None: with Image.open("Tests/images/hopper.gif") as im: if ElementTree is None: diff --git a/src/PIL/Image.py b/src/PIL/Image.py index ed2f728aa..216022565 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -1542,10 +1542,11 @@ class Image: # XMP tags if ExifTags.Base.Orientation not in self._exif: xmp_tags = self.info.get("XML:com.adobe.xmp") + pattern: str | bytes = r'tiff:Orientation(="|>)([0-9])' if not xmp_tags and (xmp_tags := self.info.get("xmp")): - xmp_tags = xmp_tags.decode("utf-8") + pattern = rb'tiff:Orientation(="|>)([0-9])' if xmp_tags: - match = re.search(r'tiff:Orientation(="|>)([0-9])', xmp_tags) + match = re.search(pattern, xmp_tags) if match: self._exif[ExifTags.Base.Orientation] = int(match[2]) From 36cea1953231d71f1184ef1396c1f01ff11c939a Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 10 Jun 2025 21:08:29 +1000 Subject: [PATCH 188/268] Do not decode bytes in PPM error message (#8958) --- Tests/test_file_ppm.py | 7 ++++--- src/PIL/PpmImagePlugin.py | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index 41e2b5416..c7d1f4df4 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -288,12 +288,13 @@ def test_non_integer_token(tmp_path: Path) -> None: pass -def test_header_token_too_long(tmp_path: Path) -> None: +@pytest.mark.parametrize("data", (b"P3\x0cAAAAAAAAAA\xee", b"P6\n 01234567890")) +def test_header_token_too_long(tmp_path: Path, data: bytes) -> None: path = tmp_path / "temp.ppm" with open(path, "wb") as f: - f.write(b"P6\n 01234567890") + f.write(data) - with pytest.raises(ValueError, match="Token too long in file header: 01234567890"): + with pytest.raises(ValueError, match="Token too long in file header: "): with Image.open(path): pass diff --git a/src/PIL/PpmImagePlugin.py b/src/PIL/PpmImagePlugin.py index 03afa2d2e..db34d107a 100644 --- a/src/PIL/PpmImagePlugin.py +++ b/src/PIL/PpmImagePlugin.py @@ -94,8 +94,8 @@ class PpmImageFile(ImageFile.ImageFile): msg = "Reached EOF while reading header" raise ValueError(msg) elif len(token) > 10: - msg = f"Token too long in file header: {token.decode()}" - raise ValueError(msg) + msg_too_long = b"Token too long in file header: %s" % token + raise ValueError(msg_too_long) return token def _open(self) -> None: From d7a45cc250f8ae35ee8095753eff0cad1c9f8216 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 10 Jun 2025 21:57:37 +1000 Subject: [PATCH 189/268] ImageFont does not handle multiline text (#9000) --- docs/reference/ImageFont.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/reference/ImageFont.rst b/docs/reference/ImageFont.rst index 8b2f92323..aac55fe6b 100644 --- a/docs/reference/ImageFont.rst +++ b/docs/reference/ImageFont.rst @@ -18,6 +18,9 @@ OpenType fonts (as well as other font formats supported by the FreeType library). For earlier versions, TrueType support is only available as part of the imToolkit package. +When measuring text sizes, this module will not break at newline characters. For +multiline text, see the :py:mod:`~PIL.ImageDraw` module. + .. warning:: To protect against potential DOS attacks when using arbitrary strings as text input, Pillow will raise a :py:exc:`ValueError` if the number of characters From 056dc89a3c85cbd6d6c960cbfc5aaa52f996bd3d Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 10 Jun 2025 22:12:40 +1000 Subject: [PATCH 190/268] Correct drawing I;16 horizontal lines (#8985) --- Tests/images/imagedraw_rectangle_I.tiff | Bin 20122 -> 20122 bytes Tests/test_imagedraw.py | 3 ++- src/libImaging/Draw.c | 34 +++++++++++++++--------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/Tests/images/imagedraw_rectangle_I.tiff b/Tests/images/imagedraw_rectangle_I.tiff index 9b9eda883a371d9cc88b4677b09d2e351c42e609..f0cb534b63e47c940ecb6c3323cb9de3dce573d4 100644 GIT binary patch literal 20122 zcmeI&F%AJy7=_V)j0hbKjY4fF8mq7hdz`h*7CbV=ls6F~a){*Rweqr`|14bRhJA-KYQ None: draw = ImageDraw.Draw(im) # Act - draw.rectangle(bbox, outline=0xFFFF) + draw.rectangle(bbox, outline=0xCDEF) # Assert + assert im.getpixel((X0, Y0)) == 0xCDEF assert_image_equal_tofile(im, "Tests/images/imagedraw_rectangle_I.tiff") diff --git a/src/libImaging/Draw.c b/src/libImaging/Draw.c index 70f267ae4..27cac687e 100644 --- a/src/libImaging/Draw.c +++ b/src/libImaging/Draw.c @@ -104,8 +104,6 @@ point32rgba(Imaging im, int x, int y, int ink) { static inline void hline8(Imaging im, int x0, int y0, int x1, int ink, Imaging mask) { - int pixelwidth; - if (y0 >= 0 && y0 < im->ysize) { if (x0 < 0) { x0 = 0; @@ -118,20 +116,30 @@ hline8(Imaging im, int x0, int y0, int x1, int ink, Imaging mask) { x1 = im->xsize - 1; } if (x0 <= x1) { - pixelwidth = strncmp(im->mode, "I;16", 4) == 0 ? 2 : 1; - if (mask == NULL) { - memset( - im->image8[y0] + x0 * pixelwidth, - (UINT8)ink, - (x1 - x0 + 1) * pixelwidth - ); + int bigendian = -1; + if (strncmp(im->mode, "I;16", 4) == 0) { + bigendian = + ( +#ifdef WORDS_BIGENDIAN + strcmp(im->mode, "I;16") == 0 || strcmp(im->mode, "I;16L") == 0 +#else + strcmp(im->mode, "I;16B") == 0 +#endif + ) + ? 1 + : 0; + } + if (mask == NULL && bigendian == -1) { + memset(im->image8[y0] + x0, (UINT8)ink, (x1 - x0 + 1)); } else { UINT8 *p = im->image8[y0]; while (x0 <= x1) { - if (mask->image8[y0][x0]) { - p[x0 * pixelwidth] = ink; - if (pixelwidth == 2) { - p[x0 * pixelwidth + 1] = ink; + if (mask == NULL || mask->image8[y0][x0]) { + if (bigendian == -1) { + p[x0] = ink; + } else { + p[x0 * 2 + (bigendian ? 1 : 0)] = ink; + p[x0 * 2 + (bigendian ? 0 : 1)] = ink >> 8; } } x0++; From 3eb893f0c16c958962758c03a597454aacac8f84 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 11 Jun 2025 20:56:28 +1000 Subject: [PATCH 191/268] Updated libjpeg-turbo to 3.1.1 (#9009) --- .github/workflows/wheels-dependencies.sh | 2 +- winbuild/build_prepare.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index 1583435c1..b46811f5a 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -40,7 +40,7 @@ ARCHIVE_SDIR=pillow-depends-main FREETYPE_VERSION=2.13.3 HARFBUZZ_VERSION=11.2.1 LIBPNG_VERSION=1.6.48 -JPEGTURBO_VERSION=3.1.0 +JPEGTURBO_VERSION=3.1.1 OPENJPEG_VERSION=2.5.3 XZ_VERSION=5.8.1 TIFF_VERSION=4.7.0 diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 6e176e29c..0cc383733 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -114,7 +114,7 @@ V = { "FREETYPE": "2.13.3", "FRIBIDI": "1.0.16", "HARFBUZZ": "11.2.1", - "JPEGTURBO": "3.1.0", + "JPEGTURBO": "3.1.1", "LCMS2": "2.17", "LIBAVIF": "1.3.0", "LIBIMAGEQUANT": "4.3.4", From 8ccdc399df1254c89bdb4e8fda6d6daf98943ab6 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 11 Jun 2025 23:19:09 +1000 Subject: [PATCH 192/268] Remove padding between interleaved PCX palette data (#9005) --- Tests/images/p_4_planes.pcx | Bin 0 -> 136 bytes Tests/test_file_pcx.py | 5 +++++ src/libImaging/PcxDecode.c | 22 ++++++++++++++++------ 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 Tests/images/p_4_planes.pcx diff --git a/Tests/images/p_4_planes.pcx b/Tests/images/p_4_planes.pcx new file mode 100644 index 0000000000000000000000000000000000000000..8c5743a98554c89fa46188308332461a4aa87f91 GIT binary patch literal 136 ocmd;LWn^T4f)s`n7?XkFKZ1#u#lpnE2!?o7;goD(XaLIr0O6ei;s5{u literal 0 HcmV?d00001 diff --git a/Tests/test_file_pcx.py b/Tests/test_file_pcx.py index 5d7fd1c1b..2e999eff6 100644 --- a/Tests/test_file_pcx.py +++ b/Tests/test_file_pcx.py @@ -37,6 +37,11 @@ def test_sanity(tmp_path: Path) -> None: im.save(f) +def test_p_4_planes() -> None: + with Image.open("Tests/images/p_4_planes.pcx") as im: + assert im.getpixel((0, 0)) == 3 + + def test_bad_image_size() -> None: with open("Tests/images/pil184.pcx", "rb") as fp: data = fp.read() diff --git a/src/libImaging/PcxDecode.c b/src/libImaging/PcxDecode.c index 942c8dc22..a65952fb1 100644 --- a/src/libImaging/PcxDecode.c +++ b/src/libImaging/PcxDecode.c @@ -60,15 +60,25 @@ ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt } if (state->x >= state->bytes) { - if (state->bytes % state->xsize && state->bytes > state->xsize) { - int bands = state->bytes / state->xsize; - int stride = state->bytes / bands; + int bands; + int xsize = 0; + int stride = 0; + if (state->bits == 2 || state->bits == 4) { + xsize = (state->xsize + 7) / 8; + bands = state->bits; + stride = state->bytes / state->bits; + } else { + xsize = state->xsize; + bands = state->bytes / state->xsize; + if (bands != 0) { + stride = state->bytes / bands; + } + } + if (stride > xsize) { int i; for (i = 1; i < bands; i++) { // note -- skipping first band memmove( - &state->buffer[i * state->xsize], - &state->buffer[i * stride], - state->xsize + &state->buffer[i * xsize], &state->buffer[i * stride], xsize ); } } From b65a7acf259682c9d02d7ab6bef57bd4ca596c74 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 13:20:34 +0000 Subject: [PATCH 193/268] Update dependency cibuildwheel to v3 --- .ci/requirements-cibw.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/requirements-cibw.txt b/.ci/requirements-cibw.txt index 0e314b8bf..520b6e320 100644 --- a/.ci/requirements-cibw.txt +++ b/.ci/requirements-cibw.txt @@ -1 +1 @@ -cibuildwheel==2.23.3 +cibuildwheel==3.0.0 From d2295c0843e828816af892da53b03d1698a3a616 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 12 Jun 2025 18:53:35 +1000 Subject: [PATCH 194/268] Do not activate virtualenv --- .github/workflows/wheels-test.ps1 | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/wheels-test.ps1 b/.github/workflows/wheels-test.ps1 index a1edc14ef..256e84edf 100644 --- a/.github/workflows/wheels-test.ps1 +++ b/.github/workflows/wheels-test.ps1 @@ -9,17 +9,16 @@ if ("$venv" -like "*\cibw-run-*\pp*-win_amd64\*") { C:\vc_redist.x64.exe /install /quiet /norestart | Out-Null } $env:path += ";$pillow\winbuild\build\bin\" -& "$venv\Scripts\activate.ps1" & reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\python.exe" /v "GlobalFlag" /t REG_SZ /d "0x02000000" /f if ("$venv" -like "*\cibw-run-*-win_amd64\*") { - & python -m pip install numpy + & $venv\Scripts\python.exe -m pip install numpy } cd $pillow -& python -VV +& $venv\Scripts\python.exe -VV if (!$?) { exit $LASTEXITCODE } -& python selftest.py +& $venv\Scripts\python.exe selftest.py if (!$?) { exit $LASTEXITCODE } -& python -m pytest -vx Tests\check_wheel.py +& $venv\Scripts\python.exe -m pytest -vx Tests\check_wheel.py if (!$?) { exit $LASTEXITCODE } -& python -m pytest -vx Tests +& $venv\Scripts\python.exe -m pytest -vx Tests if (!$?) { exit $LASTEXITCODE } From b9aac77003cda8c4af13fcf7f4fd712506374951 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 12 Jun 2025 22:48:27 +1000 Subject: [PATCH 195/268] Test Python 3.14t --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 006d574f3..b4b516228 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -43,6 +43,7 @@ jobs: python-version: [ "pypy3.11", "pypy3.10", + "3.14t", "3.14", "3.13t", "3.13", @@ -55,6 +56,7 @@ jobs: - { python-version: "3.11", PYTHONOPTIMIZE: 1, REVERSE: "--reverse" } - { python-version: "3.10", PYTHONOPTIMIZE: 2 } # Free-threaded + - { python-version: "3.14t", disable-gil: true } - { python-version: "3.13t", disable-gil: true } # M1 only available for 3.10+ - { os: "macos-13", python-version: "3.9" } From 9bffc015e6d97151cf49e71eed31deb20548652f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 12 Jun 2025 23:52:51 +1000 Subject: [PATCH 196/268] Use pypy.exe if it exists --- .github/workflows/wheels-test.ps1 | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/wheels-test.ps1 b/.github/workflows/wheels-test.ps1 index 256e84edf..54e7fbbfc 100644 --- a/.github/workflows/wheels-test.ps1 +++ b/.github/workflows/wheels-test.ps1 @@ -9,16 +9,21 @@ if ("$venv" -like "*\cibw-run-*\pp*-win_amd64\*") { C:\vc_redist.x64.exe /install /quiet /norestart | Out-Null } $env:path += ";$pillow\winbuild\build\bin\" +if (Test-Path $venv\Scripts\pypy.exe) { + $python = "pypy.exe" +} else { + $python = "python.exe" +} & reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\python.exe" /v "GlobalFlag" /t REG_SZ /d "0x02000000" /f if ("$venv" -like "*\cibw-run-*-win_amd64\*") { - & $venv\Scripts\python.exe -m pip install numpy + & $venv\Scripts\$python -m pip install numpy } cd $pillow -& $venv\Scripts\python.exe -VV +& $venv\Scripts\$python -VV if (!$?) { exit $LASTEXITCODE } -& $venv\Scripts\python.exe selftest.py +& $venv\Scripts\$python selftest.py if (!$?) { exit $LASTEXITCODE } -& $venv\Scripts\python.exe -m pytest -vx Tests\check_wheel.py +& $venv\Scripts\$python -m pytest -vx Tests\check_wheel.py if (!$?) { exit $LASTEXITCODE } -& $venv\Scripts\python.exe -m pytest -vx Tests +& $venv\Scripts\$python -m pytest -vx Tests if (!$?) { exit $LASTEXITCODE } From 4a1eea84669dec76e573db2fc25e9b0ec3ea58e3 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 9 Jun 2025 13:15:49 +0300 Subject: [PATCH 197/268] Add Python 3.14 beta wheels --- docs/releasenotes/11.3.0.rst | 56 ++++++++++++++++++++++++++++++++++++ docs/releasenotes/index.rst | 1 + tox.ini | 2 +- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 docs/releasenotes/11.3.0.rst diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst new file mode 100644 index 000000000..b0595def9 --- /dev/null +++ b/docs/releasenotes/11.3.0.rst @@ -0,0 +1,56 @@ +11.3.0 +------ + +Security +======== + +TODO +^^^^ + +TODO + +:cve:`YYYY-XXXXX`: TODO +^^^^^^^^^^^^^^^^^^^^^^^ + +TODO + +Backwards incompatible changes +============================== + +TODO +^^^^ + +Deprecations +============ + +TODO +^^^^ + +TODO + +API changes +=========== + +TODO +^^^^ + +TODO + +API additions +============= + +TODO +^^^^ + +TODO + +Other changes +============= + +Python 3.14 beta +^^^^^^^^^^^^^^^^ + +To help other projects prepare for Python 3.14, wheels are now built for the +3.14 beta as a preview. This is not official support for Python 3.14, but rather +an opportunity for you to test how Pillow works with the beta and report any +problems. diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index 5d7b21d59..a85f1e075 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -14,6 +14,7 @@ expected to be backported to earlier versions. .. toctree:: :maxdepth: 2 + 11.3.0 11.2.1 11.1.0 11.0.0 diff --git a/tox.ini b/tox.ini index 4065245ee..967d4b537 100644 --- a/tox.ini +++ b/tox.ini @@ -3,7 +3,7 @@ requires = tox>=4.2 env_list = lint - py{py3, 313, 312, 311, 310, 39} + py{py3, 314, 313, 312, 311, 310, 39} [testenv] deps = From aca0e57126ce5938dfd3cd57eed1a668cac5abc7 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Thu, 12 Jun 2025 19:22:35 +0300 Subject: [PATCH 198/268] Add 3.14 to CI targets --- docs/installation/platform-support.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/installation/platform-support.rst b/docs/installation/platform-support.rst index 57a2298f8..a56f94316 100644 --- a/docs/installation/platform-support.rst +++ b/docs/installation/platform-support.rst @@ -40,12 +40,12 @@ These platforms are built and tested for every change. | macOS 13 Ventura | 3.9 | x86-64 | +----------------------------------+----------------------------+---------------------+ | macOS 14 Sonoma | 3.10, 3.11, 3.12, 3.13, | arm64 | -| | PyPy3 | | +| | 3.14, PyPy3 | | +----------------------------------+----------------------------+---------------------+ | Ubuntu Linux 22.04 LTS (Jammy) | 3.10 | x86-64 | +----------------------------------+----------------------------+---------------------+ | Ubuntu Linux 24.04 LTS (Noble) | 3.9, 3.10, 3.11, | x86-64 | -| | 3.12, 3.13, PyPy3 | | +| | 3.12, 3.13, 3.14, PyPy3 | | | +----------------------------+---------------------+ | | 3.12 | arm64v8, ppc64le, | | | | s390x | @@ -53,7 +53,7 @@ These platforms are built and tested for every change. | Windows Server 2022 | 3.9 | x86 | | +----------------------------+---------------------+ | | 3.10, 3.11, 3.12, 3.13, | x86-64 | -| | PyPy3 | | +| | 3.14, PyPy3 | | | +----------------------------+---------------------+ | | 3.12 (MinGW) | x86-64 | | +----------------------------+---------------------+ From 3841db0252cc2dfd485eae96363dc91cffd65c0c Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Fri, 13 Jun 2025 00:08:52 +0300 Subject: [PATCH 199/268] Fix: Invalid skip selector: 'pp39-*' --- .github/workflows/wheels.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 33e1976f0..72516651f 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -110,7 +110,6 @@ jobs: CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: ${{ matrix.manylinux }} CIBW_MANYLINUX_PYPY_X86_64_IMAGE: ${{ matrix.manylinux }} CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux }} - CIBW_SKIP: pp39-* MACOSX_DEPLOYMENT_TARGET: ${{ matrix.macosx_deployment_target }} - uses: actions/upload-artifact@v4 @@ -188,7 +187,6 @@ jobs: CIBW_BEFORE_ALL: "{package}\\winbuild\\build\\build_dep_all.cmd" CIBW_CACHE_PATH: "C:\\cibw" CIBW_ENABLE: cpython-prerelease cpython-freethreading pypy - CIBW_SKIP: pp39-* CIBW_TEST_SKIP: "*-win_arm64" CIBW_TEST_COMMAND: 'docker run --rm -v {project}:C:\pillow From a3d91cb0ce30bc5c8418956ab9dd32d1b7a13f00 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 14 Jun 2025 05:21:31 +0300 Subject: [PATCH 200/268] CI: Require Python >= 3.13.5 on Windows (#9017) --- .github/workflows/test-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 6b76351b0..6d8acc44f 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -35,7 +35,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["pypy3.11", "pypy3.10", "3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["pypy3.11", "pypy3.10", "3.10", "3.11", "3.12", ">=3.13.5", "3.14"] architecture: ["x64"] include: # Test the oldest Python on 32-bit From a219e96fd3e0d4be53b2dad9dfa08bed993c6f80 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 13 Jun 2025 21:03:08 +1000 Subject: [PATCH 201/268] Fixed warning --- Tests/test_file_ppm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index c7d1f4df4..68f2f9468 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -294,9 +294,10 @@ def test_header_token_too_long(tmp_path: Path, data: bytes) -> None: with open(path, "wb") as f: f.write(data) - with pytest.raises(ValueError, match="Token too long in file header: "): + with pytest.raises(ValueError) as e: with Image.open(path): pass + assert "Token too long in file header: " in repr(e) def test_truncated_file(tmp_path: Path) -> None: From 4ba97d13276f7406c6355e9f81df3255ad392f92 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 13 Jun 2025 19:36:31 +1000 Subject: [PATCH 202/268] Removed entries for non-existent modes --- src/PIL/TiffImagePlugin.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 946fbd531..4c0ed01ef 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1680,7 +1680,6 @@ SAVE_INFO = { "PA": ("PA", II, 3, 1, (8, 8), 2), "I": ("I;32S", II, 1, 2, (32,), None), "I;16": ("I;16", II, 1, 1, (16,), None), - "I;16S": ("I;16S", II, 1, 2, (16,), None), "F": ("F;32F", II, 1, 3, (32,), None), "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), @@ -1688,10 +1687,7 @@ SAVE_INFO = { "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), - "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), "I;16B": ("I;16B", MM, 1, 1, (16,), None), - "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), - "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), } From 925fe519043a5056384b2eb4caa4cab792c92780 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 13 Jun 2025 19:41:20 +1000 Subject: [PATCH 203/268] Support saving I;16L images --- Tests/test_file_tiff.py | 23 ++++------------------- src/PIL/TiffImagePlugin.py | 3 ++- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 73046eb5f..e92b97c8a 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -49,25 +49,10 @@ class TestFileTiff: assert im.size == (128, 128) assert im.format == "TIFF" - hopper("1").save(filename) - with Image.open(filename): - pass - - hopper("L").save(filename) - with Image.open(filename): - pass - - hopper("P").save(filename) - with Image.open(filename): - pass - - hopper("RGB").save(filename) - with Image.open(filename): - pass - - hopper("I").save(filename) - with Image.open(filename): - pass + for mode in ("1", "L", "P", "RGB", "I", "I;16", "I;16L"): + hopper(mode).save(filename) + with Image.open(filename): + pass @pytest.mark.skipif(is_pypy(), reason="Requires CPython") def test_unclosed_file(self) -> None: diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 4c0ed01ef..146b01e5f 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1680,6 +1680,7 @@ SAVE_INFO = { "PA": ("PA", II, 3, 1, (8, 8), 2), "I": ("I;32S", II, 1, 2, (32,), None), "I;16": ("I;16", II, 1, 1, (16,), None), + "I;16L": ("I;16L", II, 1, 1, (16,), None), "F": ("F;32F", II, 1, 3, (32,), None), "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), @@ -1963,7 +1964,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: # we're storing image byte order. So, if the rawmode # contains I;16, we need to convert from native to image # byte order. - if im.mode in ("I;16B", "I;16"): + if im.mode in ("I;16", "I;16B", "I;16L"): rawmode = "I;16N" # Pass tags as sorted list so that the tags are set in a fixed order. From 5aa09cd1078440578b6cd040f86977358c7983b9 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 13 Jun 2025 14:56:18 +1000 Subject: [PATCH 204/268] Updated libpng to 1.6.49 --- .github/workflows/wheels-dependencies.sh | 2 +- winbuild/build_prepare.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index b46811f5a..996d32bc2 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -39,7 +39,7 @@ ARCHIVE_SDIR=pillow-depends-main # Package versions for fresh source builds FREETYPE_VERSION=2.13.3 HARFBUZZ_VERSION=11.2.1 -LIBPNG_VERSION=1.6.48 +LIBPNG_VERSION=1.6.49 JPEGTURBO_VERSION=3.1.1 OPENJPEG_VERSION=2.5.3 XZ_VERSION=5.8.1 diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 0cc383733..098716b60 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -118,7 +118,7 @@ V = { "LCMS2": "2.17", "LIBAVIF": "1.3.0", "LIBIMAGEQUANT": "4.3.4", - "LIBPNG": "1.6.48", + "LIBPNG": "1.6.49", "LIBWEBP": "1.5.0", "OPENJPEG": "2.5.3", "TIFF": "4.7.0", From e6af31e709eb61c553d13fb8648772379211f250 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Jun 2025 16:09:11 +1000 Subject: [PATCH 205/268] Deprecate fromarray mode argument --- Tests/test_image_array.py | 6 ++++-- docs/deprecations.rst | 8 ++++++++ docs/releasenotes/11.3.0.rst | 7 ++++--- src/PIL/Image.py | 3 ++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Tests/test_image_array.py b/Tests/test_image_array.py index eb2309e0f..2c71dceb8 100644 --- a/Tests/test_image_array.py +++ b/Tests/test_image_array.py @@ -101,7 +101,8 @@ def test_fromarray_strides_without_tobytes() -> None: with pytest.raises(ValueError): wrapped = Wrapper({"shape": (1, 1), "strides": (1, 1)}) - Image.fromarray(wrapped, "L") + with pytest.warns(DeprecationWarning): + Image.fromarray(wrapped, "L") def test_fromarray_palette() -> None: @@ -110,7 +111,8 @@ def test_fromarray_palette() -> None: a = numpy.array(i) # Act - out = Image.fromarray(a, "P") + with pytest.warns(DeprecationWarning): + out = Image.fromarray(a, "P") # Assert that the Python and C palettes match assert out.palette is not None diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 0490ba439..a5d89408b 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -193,6 +193,14 @@ Image.Image.get_child_images() method uses an image's file pointer, and so child images could only be retrieved from an :py:class:`PIL.ImageFile.ImageFile` instance. +Image.fromarray mode parameter +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 11.3.0 + +The ``mode`` parameter in :py:meth:`~PIL.Image.fromarray()` has been deprecated. The +mode can be automatically determined from the object's shape and type instead. + Removed features ---------------- diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index b0595def9..f0fa8c858 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -23,10 +23,11 @@ TODO Deprecations ============ -TODO -^^^^ +Image.fromarray mode parameter +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -TODO +The ``mode`` parameter in :py:meth:`~PIL.Image.fromarray()` has been deprecated. The +mode can be automatically determined from the object's shape and type instead. API changes =========== diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 7e9540e48..0be9e8ce4 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3272,7 +3272,7 @@ def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: :param obj: Object with array interface :param mode: Optional mode to use when reading ``obj``. Will be determined from - type if ``None``. + type if ``None``. Deprecated. This will not be used to convert the data after reading, but will be used to change how the data is read:: @@ -3307,6 +3307,7 @@ def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: msg = f"Cannot handle this data type: {typekey_shape}, {typestr}" raise TypeError(msg) from e else: + deprecate("'mode' parameter", 13) rawmode = mode if mode in ["1", "L", "I", "P", "F"]: ndmax = 2 From 27ce12bb7a4b5e7d8f662d7eb3a6e39fe636b7c8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Jun 2025 16:44:42 +1000 Subject: [PATCH 206/268] Added release notes for #8969 --- docs/releasenotes/11.3.0.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index b0595def9..bf9506a3b 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -47,6 +47,13 @@ TODO Other changes ============= +Do not build against libavif < 1 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pillow only supports libavif 1.0.0 or later. In order to prevent errors when building +from source, if a user happens to have an earlier libavif on their system, Pillow will +now ignore it. + Python 3.14 beta ^^^^^^^^^^^^^^^^ From 3ac1edf6dafddd26ecfae1dbf041e678d4eda97c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Jun 2025 17:13:02 +1000 Subject: [PATCH 207/268] Added release notes for #8912 --- docs/releasenotes/11.3.0.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index bf9506a3b..ea22a9c8e 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -47,6 +47,12 @@ TODO Other changes ============= +Support using grim with ImageGrab on Linux +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:py:meth:`~PIL.ImageGrab.grab` is now able to use ``gnome-screenshot``, ``grim`` or +``spectacle`` on Linux in order to take a snapshot of the screen. + Do not build against libavif < 1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 59667bbec54c7e37887ba1dfd0a3389c2d5bc413 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Jun 2025 18:39:30 +1000 Subject: [PATCH 208/268] Use *_tofile helpers --- Tests/test_file_blp.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Tests/test_file_blp.py b/Tests/test_file_blp.py index 9f50df22d..f64a9d420 100644 --- a/Tests/test_file_blp.py +++ b/Tests/test_file_blp.py @@ -7,9 +7,8 @@ import pytest from PIL import BlpImagePlugin, Image from .helper import ( - assert_image_equal, assert_image_equal_tofile, - assert_image_similar, + assert_image_similar_tofile, hopper, ) @@ -52,15 +51,13 @@ def test_save(tmp_path: Path) -> None: im = hopper("P") im.save(f, blp_version=version) - with Image.open(f) as reloaded: - assert_image_equal(im.convert("RGB"), reloaded) + assert_image_equal_tofile(im.convert("RGB"), f) with Image.open("Tests/images/transparent.png") as im: f = tmp_path / "temp.blp" im.convert("P").save(f, blp_version=version) - with Image.open(f) as reloaded: - assert_image_similar(im, reloaded, 8) + assert_image_similar_tofile(im, f, 8) im = hopper() with pytest.raises(ValueError): From ce8083e0d871899294142e09c88d249409334aaf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 14 Jun 2025 18:40:03 +1000 Subject: [PATCH 209/268] Match error message --- Tests/test_file_blp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_blp.py b/Tests/test_file_blp.py index f64a9d420..5f6b263a1 100644 --- a/Tests/test_file_blp.py +++ b/Tests/test_file_blp.py @@ -60,7 +60,7 @@ def test_save(tmp_path: Path) -> None: assert_image_similar_tofile(im, f, 8) im = hopper() - with pytest.raises(ValueError): + with pytest.raises(ValueError, match="Unsupported BLP image mode"): im.save(f) From cb433ad00ad4ad6eeaed8e70c191ea94e8087298 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 16 Jun 2025 08:15:08 +1000 Subject: [PATCH 210/268] Replaced ImagingError_Clear with PyErr_Clear --- src/_imaging.c | 5 ----- src/libImaging/Imaging.h | 2 -- src/libImaging/Storage.c | 2 +- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 2a7bc8d3f..2e8c8b0ad 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -369,11 +369,6 @@ ImagingError_ValueError(const char *message) { return NULL; } -void -ImagingError_Clear(void) { - PyErr_Clear(); -} - /* -------------------------------------------------------------------- */ /* HELPERS */ /* -------------------------------------------------------------------- */ diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index 39ecdbff6..29e21c551 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -280,8 +280,6 @@ extern void * ImagingError_Mismatch(void); /* maps to ValueError by default */ extern void * ImagingError_ValueError(const char *message); -extern void -ImagingError_Clear(void); /* Transform callbacks */ /* ------------------- */ diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 11d6c06cc..6fe26e1bd 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -645,7 +645,7 @@ ImagingNewInternal(const char *mode, int xsize, int ysize, int dirty) { return im; } - ImagingError_Clear(); + PyErr_Clear(); // Try to allocate the image once more with smallest possible block size MUTEX_LOCK(&ImagingDefaultArena.mutex); From 8309962926f8e4f77c9899c4c5b763e9f5966311 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 16 Jun 2025 08:19:27 +1000 Subject: [PATCH 211/268] Replaced ImagingError_OSError with PyErr_SetString --- src/_imaging.c | 6 ------ src/libImaging/File.c | 2 +- src/libImaging/Imaging.h | 2 -- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index 2e8c8b0ad..6241dc3ca 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -338,12 +338,6 @@ static const char *no_palette = "image has no palette"; static const char *readonly = "image is readonly"; /* static const char* no_content = "image has no content"; */ -void * -ImagingError_OSError(void) { - PyErr_SetString(PyExc_OSError, "error when accessing file"); - return NULL; -} - void * ImagingError_MemoryError(void) { return PyErr_NoMemory(); diff --git a/src/libImaging/File.c b/src/libImaging/File.c index 76d0abccc..901fe83ad 100644 --- a/src/libImaging/File.c +++ b/src/libImaging/File.c @@ -54,7 +54,7 @@ ImagingSavePPM(Imaging im, const char *outfile) { fp = fopen(outfile, "wb"); if (!fp) { - (void)ImagingError_OSError(); + PyErr_SetString(PyExc_OSError, "error when accessing file"); return 0; } diff --git a/src/libImaging/Imaging.h b/src/libImaging/Imaging.h index 29e21c551..bfe67d462 100644 --- a/src/libImaging/Imaging.h +++ b/src/libImaging/Imaging.h @@ -270,8 +270,6 @@ ImagingSectionLeave(ImagingSectionCookie *cookie); /* Exceptions */ /* ---------- */ -extern void * -ImagingError_OSError(void); extern void * ImagingError_MemoryError(void); extern void * From c19afb94301de3980ea0a6fd7c26aa9ab3c05065 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 16 Jun 2025 20:05:34 +1000 Subject: [PATCH 212/268] Use names Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- docs/releasenotes/11.3.0.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index ea22a9c8e..45dff04de 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -50,8 +50,8 @@ Other changes Support using grim with ImageGrab on Linux ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:py:meth:`~PIL.ImageGrab.grab` is now able to use ``gnome-screenshot``, ``grim`` or -``spectacle`` on Linux in order to take a snapshot of the screen. +:py:meth:`~PIL.ImageGrab.grab` is now able to use GNOME Screenshot, grim or +Spectacle on Linux in order to take a snapshot of the screen. Do not build against libavif < 1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 7b5e11deb7441cab16df247f1f0890cd0d303372 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 16 Jun 2025 20:06:53 +1000 Subject: [PATCH 213/268] Updated heading --- docs/releasenotes/11.3.0.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index 45dff04de..ba091fa2c 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -47,11 +47,11 @@ TODO Other changes ============= -Support using grim with ImageGrab on Linux -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Support using more screenshot utilities with ImageGrab on Linux +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:py:meth:`~PIL.ImageGrab.grab` is now able to use GNOME Screenshot, grim or -Spectacle on Linux in order to take a snapshot of the screen. +:py:meth:`~PIL.ImageGrab.grab` is now able to use GNOME Screenshot, grim or Spectacle +on Linux in order to take a snapshot of the screen. Do not build against libavif < 1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From d23d56e195d34734b42452995682e4a9649e5332 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 17 Jun 2025 23:10:15 +1000 Subject: [PATCH 214/268] Deprecate saving I mode images as PNG --- Tests/test_file_png.py | 14 ++++++++++++-- docs/deprecations.rst | 14 ++++++++++++++ docs/releasenotes/11.3.0.rst | 13 ++++++++++--- src/PIL/PngImagePlugin.py | 3 +++ 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 0f0886ab8..15f67385a 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -100,11 +100,11 @@ class TestFilePng: assert im.format == "PNG" assert im.get_format_mimetype() == "image/png" - for mode in ["1", "L", "P", "RGB", "I", "I;16", "I;16B"]: + for mode in ["1", "L", "P", "RGB", "I;16", "I;16B"]: im = hopper(mode) im.save(test_file) with Image.open(test_file) as reloaded: - if mode in ("I", "I;16B"): + if mode == "I;16B": reloaded = reloaded.convert(mode) assert_image_equal(reloaded, im) @@ -801,6 +801,16 @@ class TestFilePng: with Image.open("Tests/images/truncated_end_chunk.png") as im: assert_image_equal_tofile(im, "Tests/images/hopper.png") + def test_deprecation(self, tmp_path: Path) -> None: + test_file = tmp_path / "out.png" + + im = hopper("I") + with pytest.warns(DeprecationWarning): + im.save(test_file) + + with Image.open(test_file) as reloaded: + assert_image_equal(im, reloaded.convert("I")) + @pytest.mark.skipif(is_win32(), reason="Requires Unix or macOS") @skip_unless_feature("zlib") diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 0490ba439..a36eb4aa7 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -193,6 +193,20 @@ Image.Image.get_child_images() method uses an image's file pointer, and so child images could only be retrieved from an :py:class:`PIL.ImageFile.ImageFile` instance. +Saving I mode images as PNG +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 11.3.0 + +In order to fit the 32 bits of I mode images into PNG, when PNG images can only contain +at most 16 bits for a channel, Pillow has been clipping the values. Rather than quietly +changing the data, this is now deprecated. Instead, the image can be converted to +another mode before saving:: + + from PIL import Image + im = Image.new("I", (1, 1)) + im.convert("I;16").save("out.png") + Removed features ---------------- diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index ba091fa2c..5dd151bf3 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -23,10 +23,17 @@ TODO Deprecations ============ -TODO -^^^^ +Saving I mode images as PNG +^^^^^^^^^^^^^^^^^^^^^^^^^^^ -TODO +In order to fit the 32 bits of I mode images into PNG, when PNG images can only contain +at most 16 bits for a channel, Pillow has been clipping the values. Rather than quietly +changing the data, this is now deprecated. Instead, the image can be converted to +another mode before saving:: + + from PIL import Image + im = Image.new("I", (1, 1)) + im.convert("I;16").save("out.png") API changes =========== diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index f3815a122..7999381a6 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -48,6 +48,7 @@ from ._binary import i32be as i32 from ._binary import o8 from ._binary import o16be as o16 from ._binary import o32be as o32 +from ._deprecate import deprecate from ._util import DeferredError TYPE_CHECKING = False @@ -1368,6 +1369,8 @@ def _save( except KeyError as e: msg = f"cannot write mode {mode} as PNG" raise OSError(msg) from e + if outmode == "I": + deprecate("Saving I mode images as PNG", 13) # # write minimal PNG file From a4e8d675b4e0eeba79d4579bca8621bea7ee68fe Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 18 Jun 2025 21:59:31 +1000 Subject: [PATCH 215/268] Only check DHT marker for libjpeg-turbo --- Tests/test_file_jpeg.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 2827937cf..614044d97 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1067,10 +1067,16 @@ class TestFileJpeg: for marker in b"\xff\xd8", b"\xff\xd9": assert marker in data[1] assert marker in data[2] - # DHT, DQT - for marker in b"\xff\xc4", b"\xff\xdb": + + # DQT + markers = [b"\xff\xdb"] + if features.check_feature("libjpeg_turbo"): + # DHT + markers.append(b"\xff\xc4") + for marker in markers: assert marker in data[1] assert marker not in data[2] + # SOF0, SOS, APP0 (JFIF header) for marker in b"\xff\xc0", b"\xff\xda", b"\xff\xe0": assert marker not in data[1] From 79e0b0b6ada86f16bf7a8cf1c878756225d85d44 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 18 Jun 2025 22:19:20 +1000 Subject: [PATCH 216/268] Allow for custom stacklevel in deprecations --- src/PIL/PngImagePlugin.py | 2 +- src/PIL/_deprecate.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 7999381a6..1b9a89aef 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -1370,7 +1370,7 @@ def _save( msg = f"cannot write mode {mode} as PNG" raise OSError(msg) from e if outmode == "I": - deprecate("Saving I mode images as PNG", 13) + deprecate("Saving I mode images as PNG", 13, stacklevel=4) # # write minimal PNG file diff --git a/src/PIL/_deprecate.py b/src/PIL/_deprecate.py index 9f9d8bbc9..170d44490 100644 --- a/src/PIL/_deprecate.py +++ b/src/PIL/_deprecate.py @@ -12,6 +12,7 @@ def deprecate( *, action: str | None = None, plural: bool = False, + stacklevel: int = 3, ) -> None: """ Deprecations helper. @@ -67,5 +68,5 @@ def deprecate( warnings.warn( f"{deprecated} {is_} deprecated and will be removed in {removed}{action}", DeprecationWarning, - stacklevel=3, + stacklevel=stacklevel, ) From 92de1db067112d5b15c034036b2216009822a3b0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 19 Jun 2025 11:12:40 +1000 Subject: [PATCH 217/268] Update dependency mypy to v1.16.1 (#9026) --- .ci/requirements-mypy.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/requirements-mypy.txt b/.ci/requirements-mypy.txt index a9c18ae2b..44b5badab 100644 --- a/.ci/requirements-mypy.txt +++ b/.ci/requirements-mypy.txt @@ -1,4 +1,4 @@ -mypy==1.16.0 +mypy==1.16.1 IceSpringPySideStubs-PyQt6 IceSpringPySideStubs-PySide6 ipython From ef0bab0c6579fd00987740a6a327603ff3886a38 Mon Sep 17 00:00:00 2001 From: thisismypassport <109758321+thisismypassport@users.noreply.github.com> Date: Thu, 19 Jun 2025 11:16:26 +0300 Subject: [PATCH 218/268] Support writing QOI images (#9007) Co-authored-by: Andrew Murray --- Tests/test_file_qoi.py | 23 +++++- docs/handbook/image-file-formats.rst | 29 +++++-- docs/releasenotes/11.3.0.rst | 7 ++ src/PIL/QoiImagePlugin.py | 119 +++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 10 deletions(-) diff --git a/Tests/test_file_qoi.py b/Tests/test_file_qoi.py index 7ce1da209..b9becb24f 100644 --- a/Tests/test_file_qoi.py +++ b/Tests/test_file_qoi.py @@ -1,10 +1,12 @@ from __future__ import annotations +from pathlib import Path + import pytest from PIL import Image, QoiImagePlugin -from .helper import assert_image_equal_tofile +from .helper import assert_image_equal_tofile, hopper def test_sanity() -> None: @@ -34,3 +36,22 @@ def test_op_index() -> None: # QOI_OP_INDEX as the first chunk with Image.open("Tests/images/op_index.qoi") as im: assert im.getpixel((0, 0)) == (0, 0, 0, 0) + + +def test_save(tmp_path: Path) -> None: + f = tmp_path / "temp.qoi" + + im = hopper() + im.save(f, colorspace="sRGB") + + assert_image_equal_tofile(im, f) + + for path in ("Tests/images/default_font.png", "Tests/images/pil123rgba.png"): + with Image.open(path) as im: + im.save(f) + + assert_image_equal_tofile(im, f) + + im = hopper("P") + with pytest.raises(ValueError, match="Unsupported QOI image mode"): + im.save(f) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 5ca549c37..a15e84574 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1082,6 +1082,26 @@ Pillow reads and writes PBM, PGM, PPM and PNM files containing ``1``, ``L``, ``I Since Pillow 9.2.0, "plain" (P1 to P3) formats can be read as well. +QOI +^^^ + +.. versionadded:: 9.5.0 + +Pillow reads and writes images in Quite OK Image format using a Python codec. If you +wish to write code specifically for this format, :pypi:`qoi` is an alternative library +that uses C to decode the image and interfaces with NumPy. + +.. _qoi-saving: + +Saving +~~~~~~ + +The :py:meth:`~PIL.Image.Image.save` method can take the following keyword arguments: + +**colorspace** + If set to "sRGB", the colorspace will be written as sRGB with linear alpha, instead + of all channels being linear. + SGI ^^^ @@ -1578,15 +1598,6 @@ PSD Pillow identifies and reads PSD files written by Adobe Photoshop 2.5 and 3.0. -QOI -^^^ - -.. versionadded:: 9.5.0 - -Pillow reads images in Quite OK Image format using a Python decoder. If you wish to -write code specifically for this format, :pypi:`qoi` is an alternative library that -uses C to decode the image and interfaces with NumPy. - SUN ^^^ diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index ba091fa2c..6bd4f7481 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -47,6 +47,13 @@ TODO Other changes ============= +Added QOI saving +^^^^^^^^^^^^^^^^ + +Support has been added for saving QOI images. ``colorspace`` can be used to specify the +colorspace as sRGB with linear alpha, e.g. ``im.save("out.qoi", colorspace="sRGB")``. +By default, all channels will be linear. + Support using more screenshot utilities with ImageGrab on Linux ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/PIL/QoiImagePlugin.py b/src/PIL/QoiImagePlugin.py index 75070abd7..dba5d809f 100644 --- a/src/PIL/QoiImagePlugin.py +++ b/src/PIL/QoiImagePlugin.py @@ -8,9 +8,12 @@ from __future__ import annotations import os +from typing import IO from . import Image, ImageFile from ._binary import i32be as i32 +from ._binary import o8 +from ._binary import o32be as o32 def _accept(prefix: bytes) -> bool: @@ -110,6 +113,122 @@ class QoiDecoder(ImageFile.PyDecoder): return -1, 0 +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode == "RGB": + channels = 3 + elif im.mode == "RGBA": + channels = 4 + else: + msg = "Unsupported QOI image mode" + raise ValueError(msg) + + colorspace = 0 if im.encoderinfo.get("colorspace") == "sRGB" else 1 + + fp.write(b"qoif") + fp.write(o32(im.size[0])) + fp.write(o32(im.size[1])) + fp.write(o8(channels)) + fp.write(o8(colorspace)) + + ImageFile._save(im, fp, [ImageFile._Tile("qoi", (0, 0) + im.size)]) + + +class QoiEncoder(ImageFile.PyEncoder): + _pushes_fd = True + _previous_pixel: tuple[int, int, int, int] | None = None + _previously_seen_pixels: dict[int, tuple[int, int, int, int]] = {} + _run = 0 + + def _write_run(self) -> bytes: + data = o8(0b11000000 | (self._run - 1)) # QOI_OP_RUN + self._run = 0 + return data + + def _delta(self, left: int, right: int) -> int: + result = (left - right) & 255 + if result >= 128: + result -= 256 + return result + + def encode(self, bufsize: int) -> tuple[int, int, bytes]: + assert self.im is not None + + self._previously_seen_pixels = {0: (0, 0, 0, 0)} + self._previous_pixel = (0, 0, 0, 255) + + data = bytearray() + w, h = self.im.size + bands = Image.getmodebands(self.mode) + + for y in range(h): + for x in range(w): + pixel = self.im.getpixel((x, y)) + if bands == 3: + pixel = (*pixel, 255) + + if pixel == self._previous_pixel: + self._run += 1 + if self._run == 62: + data += self._write_run() + else: + if self._run: + data += self._write_run() + + r, g, b, a = pixel + hash_value = (r * 3 + g * 5 + b * 7 + a * 11) % 64 + if self._previously_seen_pixels.get(hash_value) == pixel: + data += o8(hash_value) # QOI_OP_INDEX + elif self._previous_pixel: + self._previously_seen_pixels[hash_value] = pixel + + prev_r, prev_g, prev_b, prev_a = self._previous_pixel + if prev_a == a: + delta_r = self._delta(r, prev_r) + delta_g = self._delta(g, prev_g) + delta_b = self._delta(b, prev_b) + + if ( + -2 <= delta_r < 2 + and -2 <= delta_g < 2 + and -2 <= delta_b < 2 + ): + data += o8( + 0b01000000 + | (delta_r + 2) << 4 + | (delta_g + 2) << 2 + | (delta_b + 2) + ) # QOI_OP_DIFF + else: + delta_gr = self._delta(delta_r, delta_g) + delta_gb = self._delta(delta_b, delta_g) + if ( + -8 <= delta_gr < 8 + and -32 <= delta_g < 32 + and -8 <= delta_gb < 8 + ): + data += o8( + 0b10000000 | (delta_g + 32) + ) # QOI_OP_LUMA + data += o8((delta_gr + 8) << 4 | (delta_gb + 8)) + else: + data += o8(0b11111110) # QOI_OP_RGB + data += bytes(pixel[:3]) + else: + data += o8(0b11111111) # QOI_OP_RGBA + data += bytes(pixel) + + self._previous_pixel = pixel + + if self._run: + data += self._write_run() + data += bytes((0, 0, 0, 0, 0, 0, 0, 1)) # padding + + return len(data), 0, data + + Image.register_open(QoiImageFile.format, QoiImageFile, _accept) Image.register_decoder("qoi", QoiDecoder) Image.register_extension(QoiImageFile.format, ".qoi") + +Image.register_save(QoiImageFile.format, _save) +Image.register_encoder("qoi", QoiEncoder) From f937dd27cd670971b93f4bdf17abccc0338e6b4c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 20 Jun 2025 23:44:30 +1000 Subject: [PATCH 219/268] Do not call sys.executable in PyInstaller application --- src/PIL/ImageShow.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index dd240fb55..7705608e3 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -175,7 +175,9 @@ class MacViewer(Viewer): if not os.path.exists(path): raise FileNotFoundError subprocess.call(["open", "-a", "Preview.app", path]) - executable = sys.executable or shutil.which("python3") + + pyinstaller = getattr(sys, "frozen", False) and hasattr(sys, "_MEIPASS") + executable = (not pyinstaller and sys.executable) or shutil.which("python3") if executable: subprocess.Popen( [ From 216dc4ca60947b4076defa2f0565f8b74a7864e0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 21 Jun 2025 19:12:23 +1000 Subject: [PATCH 220/268] Added Python 3.14 macOS x86-64 wheels --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 72516651f..229e23ef0 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -58,7 +58,7 @@ jobs: - name: "macOS 10.13 x86_64" os: macos-13 cibw_arch: x86_64 - build: "cp3{12,13}*" + build: "cp3{12,13,14}*" macosx_deployment_target: "10.13" - name: "macOS 10.15 x86_64" os: macos-13 From ae025183148a900511e7f8866ca5c28f3efc7b5f Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sun, 22 Jun 2025 22:08:51 +1000 Subject: [PATCH 221/268] Use same AVIF URL when fetching dependency (#8871) --- winbuild/build_prepare.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 098716b60..4baa5ccef 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -385,8 +385,8 @@ DEPS: dict[str, dict[str, Any]] = { "bins": [r"*.dll"], }, "libavif": { - "url": f"https://github.com/AOMediaCodec/libavif/archive/v{V['LIBAVIF']}.zip", - "filename": f"libavif-{V['LIBAVIF']}.zip", + "url": f"https://github.com/AOMediaCodec/libavif/archive/v{V['LIBAVIF']}.tar.gz", + "filename": f"libavif-{V['LIBAVIF']}.tar.gz", "license": "LICENSE", "build": [ "rustup update", From 2954964cd2b70c463d75bd7f828c7bb7f3802bf2 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 23 Jun 2025 07:05:43 +1000 Subject: [PATCH 222/268] Removed ImageCmsProfile._set method (#9032) Co-authored-by: Luke Granger-Brown --- src/PIL/ImageCms.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index fdfbee789..a1584f111 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -248,6 +248,9 @@ class ImageCmsProfile: low-level profile object """ + self.filename = None + self.product_name = None # profile.product_name + self.product_info = None # profile.product_info if isinstance(profile, str): if sys.platform == "win32": @@ -256,23 +259,18 @@ class ImageCmsProfile: profile_bytes_path.decode("ascii") except UnicodeDecodeError: with open(profile, "rb") as f: - self._set(core.profile_frombytes(f.read())) + self.profile = core.profile_frombytes(f.read()) return - self._set(core.profile_open(profile), profile) + self.filename = profile + self.profile = core.profile_open(profile) elif hasattr(profile, "read"): - self._set(core.profile_frombytes(profile.read())) + self.profile = core.profile_frombytes(profile.read()) elif isinstance(profile, core.CmsProfile): - self._set(profile) + self.profile = profile else: msg = "Invalid type for Profile" # type: ignore[unreachable] raise TypeError(msg) - def _set(self, profile: core.CmsProfile, filename: str | None = None) -> None: - self.profile = profile - self.filename = filename - self.product_name = None # profile.product_name - self.product_info = None # profile.product_info - def tobytes(self) -> bytes: """ Returns the profile in a format suitable for embedding in From 1557585411f1f891180775dab40cfeec236d69bf Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 24 Jun 2025 20:29:38 +1000 Subject: [PATCH 223/268] Use percent formatting --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 3716a7b9f..256c78fc9 100644 --- a/setup.py +++ b/setup.py @@ -509,11 +509,11 @@ class pil_build_ext(build_ext): if root is None and pkg_config: if isinstance(lib_name, str): - _dbg(f"Looking for `{lib_name}` using pkg-config.") + _dbg("Looking for `%s` using pkg-config.", lib_name) root = pkg_config(lib_name) else: for lib_name2 in lib_name: - _dbg(f"Looking for `{lib_name2}` using pkg-config.") + _dbg("Looking for `%s` using pkg-config.", lib_name2) root = pkg_config(lib_name2) if root: break From 18f8af78d3f56639f91f4b788ab9d89ae573b72c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 24 Jun 2025 20:35:09 +1000 Subject: [PATCH 224/268] Pass strings or tuples of strings to _dbg --- setup.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 256c78fc9..f05379d6d 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,6 @@ import subprocess import sys import warnings from collections.abc import Iterator -from typing import Any from setuptools import Extension, setup from setuptools.command.build_ext import build_ext @@ -148,7 +147,7 @@ class RequiredDependencyException(Exception): PLATFORM_MINGW = os.name == "nt" and "GCC" in sys.version -def _dbg(s: str, tp: Any = None) -> None: +def _dbg(s: str, tp: str | tuple[str, ...] | None = None) -> None: if DEBUG: if tp: print(s % tp) @@ -732,7 +731,7 @@ class pil_build_ext(build_ext): best_path = os.path.join(directory, name) _dbg( "Best openjpeg version %s so far in %s", - (best_version, best_path), + (str(best_version), best_path), ) if best_version and _find_library_file(self, "openjp2"): From acd8b0c2acfa1c69f91a14d5881a7f9bf436900f Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Wed, 25 Jun 2025 09:09:31 +1000 Subject: [PATCH 225/268] Fix libtiff cleanup (#9002) --- src/libImaging/TiffDecode.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index 2e83fb847..e289ce405 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -1032,7 +1032,10 @@ ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int byt TRACE(("Encode Error, row %d\n", state->y)); state->errcode = IMAGING_CODEC_BROKEN; - if (!clientstate->fp) { + if (clientstate->fp) { + TIFFCleanup(tiff); + clientstate->tiff = NULL; + } else { free(clientstate->data); } return -1; From e1ee8afc7d1d0a1b3b91ce4caa018e4bb0a96e71 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 24 Jun 2025 18:58:29 +1000 Subject: [PATCH 226/268] Search for libtiff library file first on Windows and macOS --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index f05379d6d..354e09f85 100644 --- a/setup.py +++ b/setup.py @@ -753,12 +753,12 @@ class pil_build_ext(build_ext): if feature.want("tiff"): _dbg("Looking for tiff") if _find_include_file(self, "tiff.h"): - if _find_library_file(self, "tiff"): - feature.set("tiff", "tiff") if sys.platform in ["win32", "darwin"] and _find_library_file( self, "libtiff" ): feature.set("tiff", "libtiff") + elif _find_library_file(self, "tiff"): + feature.set("tiff", "tiff") if feature.want("freetype"): _dbg("Looking for freetype") From 3d261a210192509f2c7980f87a922b7b3f3404dc Mon Sep 17 00:00:00 2001 From: Frankie Dintino Date: Thu, 26 Jun 2025 02:21:44 -0400 Subject: [PATCH 227/268] Add AVIF to wheels using only aomenc and dav1d AVIF codecs for reduced size (#8858) Co-authored-by: Andrew Murray Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .github/workflows/wheels-dependencies.sh | 55 ++++ .github/workflows/wheels.yml | 2 +- Tests/check_wheel.py | 6 +- docs/releasenotes/11.3.0.rst | 6 + wheels/dependency_licenses/AOM.txt | 26 ++ wheels/dependency_licenses/DAV1D.txt | 23 ++ wheels/dependency_licenses/LIBAVIF.txt | 387 +++++++++++++++++++++++ wheels/dependency_licenses/LIBYUV.txt | 29 ++ winbuild/build_prepare.py | 15 +- 9 files changed, 542 insertions(+), 7 deletions(-) create mode 100644 wheels/dependency_licenses/AOM.txt create mode 100644 wheels/dependency_licenses/DAV1D.txt create mode 100644 wheels/dependency_licenses/LIBAVIF.txt create mode 100644 wheels/dependency_licenses/LIBYUV.txt diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index 996d32bc2..5384a74c0 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -51,6 +51,7 @@ LIBWEBP_VERSION=1.5.0 BZIP2_VERSION=1.0.8 LIBXCB_VERSION=1.17.0 BROTLI_VERSION=1.1.0 +LIBAVIF_VERSION=1.3.0 function build_pkg_config { if [ -e pkg-config-stamp ]; then return; fi @@ -98,6 +99,59 @@ function build_harfbuzz { touch harfbuzz-stamp } +function build_libavif { + if [ -e libavif-stamp ]; then return; fi + + python3 -m pip install meson ninja + + if [[ "$PLAT" == "x86_64" ]] || [ -n "$SANITIZER" ]; then + build_simple nasm 2.16.03 https://www.nasm.us/pub/nasm/releasebuilds/2.16.03 + fi + + local build_type=MinSizeRel + local lto=ON + + local libavif_cmake_flags + + if [ -n "$IS_MACOS" ]; then + lto=OFF + libavif_cmake_flags=( + -DCMAKE_C_FLAGS_MINSIZEREL="-Oz -DNDEBUG -flto" \ + -DCMAKE_CXX_FLAGS_MINSIZEREL="-Oz -DNDEBUG -flto" \ + -DCMAKE_SHARED_LINKER_FLAGS_INIT="-Wl,-S,-x,-dead_strip_dylibs" \ + ) + else + if [[ "$MB_ML_VER" == 2014 ]] && [[ "$PLAT" == "x86_64" ]]; then + build_type=Release + fi + libavif_cmake_flags=(-DCMAKE_SHARED_LINKER_FLAGS_INIT="-Wl,--strip-all,-z,relro,-z,now") + fi + + local out_dir=$(fetch_unpack https://github.com/AOMediaCodec/libavif/archive/refs/tags/v$LIBAVIF_VERSION.tar.gz libavif-$LIBAVIF_VERSION.tar.gz) + # CONFIG_AV1_HIGHBITDEPTH=0 is a flag for libaom (included as a subproject + # of libavif) that disables support for encoding high bit depth images. + (cd $out_dir \ + && cmake \ + -DCMAKE_INSTALL_PREFIX=$BUILD_PREFIX \ + -DCMAKE_INSTALL_LIBDIR=$BUILD_PREFIX/lib \ + -DCMAKE_INSTALL_NAME_DIR=$BUILD_PREFIX/lib \ + -DBUILD_SHARED_LIBS=ON \ + -DAVIF_LIBSHARPYUV=LOCAL \ + -DAVIF_LIBYUV=LOCAL \ + -DAVIF_CODEC_AOM=LOCAL \ + -DCONFIG_AV1_HIGHBITDEPTH=0 \ + -DAVIF_CODEC_AOM_DECODE=OFF \ + -DAVIF_CODEC_DAV1D=LOCAL \ + -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=$lto \ + -DCMAKE_C_VISIBILITY_PRESET=hidden \ + -DCMAKE_CXX_VISIBILITY_PRESET=hidden \ + -DCMAKE_BUILD_TYPE=$build_type \ + "${libavif_cmake_flags[@]}" \ + . \ + && make install) + touch libavif-stamp +} + function build { build_xz if [ -z "$IS_ALPINE" ] && [ -z "$SANITIZER" ] && [ -z "$IS_MACOS" ]; then @@ -132,6 +186,7 @@ function build { build_tiff fi + build_libavif build_libpng build_lcms2 build_openjpeg diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 229e23ef0..16c350a14 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -159,7 +159,7 @@ jobs: # Install extra test images xcopy /S /Y Tests\test-images\* Tests\images - & python.exe winbuild\build_prepare.py -v --no-imagequant --no-avif --architecture=${{ matrix.cibw_arch }} + & python.exe winbuild\build_prepare.py -v --no-imagequant --architecture=${{ matrix.cibw_arch }} shell: pwsh - name: Build wheels diff --git a/Tests/check_wheel.py b/Tests/check_wheel.py index 9602410da..a78fb09b0 100644 --- a/Tests/check_wheel.py +++ b/Tests/check_wheel.py @@ -9,7 +9,7 @@ from .helper import is_pypy def test_wheel_modules() -> None: - expected_modules = {"pil", "tkinter", "freetype2", "littlecms2", "webp"} + expected_modules = {"pil", "tkinter", "freetype2", "littlecms2", "webp", "avif"} if sys.platform == "win32": # tkinter is not available in cibuildwheel installed CPython on Windows @@ -20,6 +20,10 @@ def test_wheel_modules() -> None: except ImportError: expected_modules.remove("tkinter") + # libavif is not available on Windows for ARM64 architectures + if platform.machine() == "ARM64": + expected_modules.remove("avif") + assert set(features.get_supported_modules()) == expected_modules diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index 82e4d44b6..654a7e6b6 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -80,6 +80,12 @@ Pillow only supports libavif 1.0.0 or later. In order to prevent errors when bui from source, if a user happens to have an earlier libavif on their system, Pillow will now ignore it. +AVIF support in wheels +^^^^^^^^^^^^^^^^^^^^^^ + +Support for reading and writing AVIF images is now included in Pillow's wheels, except +for Windows ARM64. libaom is available as an encoder and dav1d as a decoder. + Python 3.14 beta ^^^^^^^^^^^^^^^^ diff --git a/wheels/dependency_licenses/AOM.txt b/wheels/dependency_licenses/AOM.txt new file mode 100644 index 000000000..3a2e46c26 --- /dev/null +++ b/wheels/dependency_licenses/AOM.txt @@ -0,0 +1,26 @@ +Copyright (c) 2016, Alliance for Open Media. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/DAV1D.txt b/wheels/dependency_licenses/DAV1D.txt new file mode 100644 index 000000000..875b138ec --- /dev/null +++ b/wheels/dependency_licenses/DAV1D.txt @@ -0,0 +1,23 @@ +Copyright © 2018-2019, VideoLAN and dav1d authors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/LIBAVIF.txt b/wheels/dependency_licenses/LIBAVIF.txt new file mode 100644 index 000000000..350eb9d15 --- /dev/null +++ b/wheels/dependency_licenses/LIBAVIF.txt @@ -0,0 +1,387 @@ +Copyright 2019 Joe Drago. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ + +Files: src/obu.c + +Copyright © 2018-2019, VideoLAN and dav1d authors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ + +Files: third_party/iccjpeg/* + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + +------------------------------------------------------------------------------ + +Files: contrib/gdk-pixbuf/* + +Copyright 2020 Emmanuel Gil Peyrot. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ + +Files: android_jni/gradlew* + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +------------------------------------------------------------------------------ + +Files: third_party/libyuv/* + +Copyright 2011 The LibYuv Project Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/wheels/dependency_licenses/LIBYUV.txt b/wheels/dependency_licenses/LIBYUV.txt new file mode 100644 index 000000000..c911747a6 --- /dev/null +++ b/wheels/dependency_licenses/LIBYUV.txt @@ -0,0 +1,29 @@ +Copyright 2011 The LibYuv Project Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/winbuild/build_prepare.py b/winbuild/build_prepare.py index 4baa5ccef..187d07b20 100644 --- a/winbuild/build_prepare.py +++ b/winbuild/build_prepare.py @@ -57,7 +57,10 @@ def cmd_nmake( def cmds_cmake( - target: str | tuple[str, ...] | list[str], *params: str, build_dir: str = "." + target: str | tuple[str, ...] | list[str], + *params: str, + build_dir: str = ".", + build_type: str = "Release", ) -> list[str]: if not isinstance(target, str): target = " ".join(target) @@ -66,7 +69,7 @@ def cmds_cmake( " ".join( [ "{cmake}", - "-DCMAKE_BUILD_TYPE=Release", + f"-DCMAKE_BUILD_TYPE={build_type}", "-DCMAKE_VERBOSE_MAKEFILE=ON", "-DCMAKE_RULE_MESSAGES:BOOL=OFF", # for NMake "-DCMAKE_C_COMPILER=cl.exe", # for Ninja @@ -397,9 +400,11 @@ DEPS: dict[str, dict[str, Any]] = { "-DAVIF_LIBSHARPYUV=LOCAL", "-DAVIF_LIBYUV=LOCAL", "-DAVIF_CODEC_AOM=LOCAL", + "-DCONFIG_AV1_HIGHBITDEPTH=0", + "-DAVIF_CODEC_AOM_DECODE=OFF", "-DAVIF_CODEC_DAV1D=LOCAL", - "-DAVIF_CODEC_RAV1E=LOCAL", - "-DAVIF_CODEC_SVT=LOCAL", + "-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON", + build_type="MinSizeRel", ), cmd_xcopy("include", "{inc_dir}"), ], @@ -755,7 +760,7 @@ def main() -> None: disabled += ["libimagequant"] if args.no_fribidi: disabled += ["fribidi"] - if args.no_avif or args.architecture != "AMD64": + if args.no_avif or args.architecture == "ARM64": disabled += ["libavif"] prefs = { From b9afe18646c5dc28efed1a74579129f8c64976e2 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:00:19 +0300 Subject: [PATCH 228/268] Bump pre-commit hooks --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a1a054e00..c64858299 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.12 + rev: v0.12.0 hooks: - id: ruff args: [--exit-non-zero-on-fix] @@ -11,7 +11,7 @@ repos: - id: black - repo: https://github.com/PyCQA/bandit - rev: 1.8.3 + rev: 1.8.5 hooks: - id: bandit args: [--severity-level=high] @@ -24,7 +24,7 @@ repos: exclude: (Makefile$|\.bat$|\.cmake$|\.eps$|\.fits$|\.gd$|\.opt$) - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v20.1.5 + rev: v20.1.6 hooks: - id: clang-format types: [c] @@ -51,7 +51,7 @@ repos: exclude: ^.github/.*TEMPLATE|^Tests/(fonts|images)/ - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.33.0 + rev: 0.33.1 hooks: - id: check-github-workflows - id: check-readthedocs From 234875bf9001037f7510769f83e281bfe6012441 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:01:14 +0300 Subject: [PATCH 229/268] Update Ruff hook from legacy --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c64858299..6abb732bb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.12.0 hooks: - - id: ruff + - id: ruff-check args: [--exit-non-zero-on-fix] - repo: https://github.com/psf/black-pre-commit-mirror From d1894dcd46c9096a91dd6ab39fe1df918ba18d6c Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Wed, 25 Jun 2025 16:47:06 +0300 Subject: [PATCH 230/268] Add match parameter to pytest.warns() --- Tests/helper.py | 2 +- Tests/test_core_resources.py | 2 +- Tests/test_features.py | 13 ++++++------- Tests/test_file_apng.py | 8 ++++---- Tests/test_file_avif.py | 4 ++-- Tests/test_file_gif.py | 6 ++++-- Tests/test_file_icns.py | 4 +++- Tests/test_file_ico.py | 2 +- Tests/test_file_iptc.py | 6 +++--- Tests/test_file_jpeg.py | 13 +++++++------ Tests/test_file_png.py | 2 +- Tests/test_file_tga.py | 4 +++- Tests/test_file_tiff.py | 4 ++-- Tests/test_file_tiff_metadata.py | 4 ++-- Tests/test_file_webp.py | 4 ++-- Tests/test_image.py | 12 ++++++------ Tests/test_image_access.py | 2 +- Tests/test_image_array.py | 6 +++--- Tests/test_image_convert.py | 5 ++++- Tests/test_image_getim.py | 4 ++-- Tests/test_image_putdata.py | 2 +- Tests/test_imagecms.py | 14 +++++++------- Tests/test_imagedraw.py | 2 +- Tests/test_imagefile.py | 2 +- Tests/test_imagefont.py | 12 ++++++------ Tests/test_imagemath_lambda_eval.py | 2 +- Tests/test_imagemath_unsafe_eval.py | 4 ++-- Tests/test_lib_pack.py | 4 +++- 28 files changed, 80 insertions(+), 69 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index ec61cd263..e71b4665b 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -272,7 +272,7 @@ def _cached_hopper(mode: str) -> Image.Image: else: im = hopper() if mode.startswith("BGR;"): - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="BGR;"): im = im.convert(mode) else: try: diff --git a/Tests/test_core_resources.py b/Tests/test_core_resources.py index 2c1de8bc3..2a22f805d 100644 --- a/Tests/test_core_resources.py +++ b/Tests/test_core_resources.py @@ -188,5 +188,5 @@ class TestEnvVars: ), ) def test_warnings(self, var: dict[str, str]) -> None: - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match=list(var)[0]): Image._apply_env_variables(var) diff --git a/Tests/test_features.py b/Tests/test_features.py index f8f7f6eec..d06fb4d84 100644 --- a/Tests/test_features.py +++ b/Tests/test_features.py @@ -19,7 +19,7 @@ def test_check() -> None: assert features.check_codec(codec) == features.check(codec) for feature in features.features: if "webp" in feature: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="webp"): assert features.check_feature(feature) == features.check(feature) else: assert features.check_feature(feature) == features.check(feature) @@ -49,24 +49,24 @@ def test_version() -> None: test(codec, features.version_codec) for feature in features.features: if "webp" in feature: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="webp"): test(feature, features.version_feature) else: test(feature, features.version_feature) def test_webp_transparency() -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="transp_webp"): assert (features.check("transp_webp") or False) == features.check_module("webp") def test_webp_mux() -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="webp_mux"): assert (features.check("webp_mux") or False) == features.check_module("webp") def test_webp_anim() -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="webp_anim"): assert (features.check("webp_anim") or False) == features.check_module("webp") @@ -95,10 +95,9 @@ def test_check_codecs(feature: str) -> None: def test_check_warns_on_nonexistent() -> None: - with pytest.warns(UserWarning) as cm: + with pytest.warns(UserWarning, match="Unknown feature 'typo'."): has_feature = features.check("typo") assert has_feature is False - assert str(cm[-1].message) == "Unknown feature 'typo'." def test_supported_modules() -> None: diff --git a/Tests/test_file_apng.py b/Tests/test_file_apng.py index a5734c202..66410b3da 100644 --- a/Tests/test_file_apng.py +++ b/Tests/test_file_apng.py @@ -303,7 +303,7 @@ def test_apng_chunk_errors() -> None: assert isinstance(im, PngImagePlugin.PngImageFile) assert not im.is_animated - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="Invalid APNG"): # noqa: PT031 with Image.open("Tests/images/apng/chunk_multi_actl.png") as im: im.load() assert isinstance(im, PngImagePlugin.PngImageFile) @@ -330,14 +330,14 @@ def test_apng_chunk_errors() -> None: def test_apng_syntax_errors() -> None: - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="Invalid APNG"): # noqa: PT031 with Image.open("Tests/images/apng/syntax_num_frames_zero.png") as im: assert isinstance(im, PngImagePlugin.PngImageFile) assert not im.is_animated with pytest.raises(OSError): im.load() - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="Invalid APNG"): # noqa: PT031 with Image.open("Tests/images/apng/syntax_num_frames_zero_default.png") as im: assert isinstance(im, PngImagePlugin.PngImageFile) assert not im.is_animated @@ -354,7 +354,7 @@ def test_apng_syntax_errors() -> None: im.seek(im.n_frames - 1) im.load() - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="Invalid APNG"): # noqa: PT031 with Image.open("Tests/images/apng/syntax_num_frames_invalid.png") as im: assert isinstance(im, PngImagePlugin.PngImageFile) assert not im.is_animated diff --git a/Tests/test_file_avif.py b/Tests/test_file_avif.py index b2e586637..e42e10291 100644 --- a/Tests/test_file_avif.py +++ b/Tests/test_file_avif.py @@ -77,8 +77,8 @@ class TestUnsupportedAvif: def test_unsupported(self, monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr(AvifImagePlugin, "SUPPORTED", False) - with pytest.warns(UserWarning): - with pytest.raises(UnidentifiedImageError): + with pytest.raises(UnidentifiedImageError): + with pytest.warns(UserWarning, match="AVIF support not installed"): with Image.open(TEST_AVIF_FILE): pass diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 20d58a9dd..29bc55ee5 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -1229,7 +1229,9 @@ def test_removed_transparency(tmp_path: Path) -> None: im.putpixel((x, 0), (x, 0, 0)) im.info["transparency"] = (255, 255, 255) - with pytest.warns(UserWarning): + with pytest.warns( + UserWarning, match="Couldn't allocate palette entry for transparency" + ): im.save(out) with Image.open(out) as reloaded: @@ -1251,7 +1253,7 @@ def test_rgb_transparency(tmp_path: Path) -> None: im = Image.new("RGB", (1, 1)) im.info["transparency"] = b"" ims = [Image.new("RGB", (1, 1))] - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="should be converted to RGBA images"): im.save(out, save_all=True, append_images=ims) with Image.open(out) as reloaded: diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 2dabfd2f3..8ff59161f 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -95,7 +95,9 @@ def test_sizes() -> None: for w, h, r in im.info["sizes"]: wr = w * r hr = h * r - with pytest.warns(DeprecationWarning): + with pytest.warns( + DeprecationWarning, match=r"Setting size to \(width, height, scale\)" + ): im.size = (w, h, r) im.load() assert im.mode == "RGBA" diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 5d2ace35e..99c312ead 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -233,7 +233,7 @@ def test_save_append_images(tmp_path: Path) -> None: def test_unexpected_size() -> None: # This image has been manually hexedited to state that it is 16x32 # while the image within is still 16x16 - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="Image was not the expected size"): with Image.open("Tests/images/hopper_unexpected.ico") as im: assert im.size == (16, 16) diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index c6c0c1aab..ffd3aad3e 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -99,7 +99,7 @@ def test_i() -> None: c = b"a" # Act - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="IptcImagePlugin.i"): ret = IptcImagePlugin.i(c) # Assert @@ -114,7 +114,7 @@ def test_dump(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr(sys, "stdout", mystdout) # Act - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="IptcImagePlugin.dump"): IptcImagePlugin.dump(c) # Assert @@ -122,5 +122,5 @@ def test_dump(monkeypatch: pytest.MonkeyPatch) -> None: def test_pad_deprecation() -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="IptcImagePlugin.PAD"): assert IptcImagePlugin.PAD == b"\0\0\0\0" diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 614044d97..0ba08aaf9 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -752,10 +752,11 @@ class TestFileJpeg: # Act # Shouldn't raise error - fn = "Tests/images/sugarshack_bad_mpo_header.jpg" - with pytest.warns(UserWarning, Image.open, fn) as im: - # Assert - assert im.format == "JPEG" + with pytest.warns(UserWarning, match="malformed MPO file"): + im = Image.open("Tests/images/sugarshack_bad_mpo_header.jpg") + + # Assert + assert im.format == "JPEG" @pytest.mark.parametrize("mode", ("1", "L", "RGB", "RGBX", "CMYK", "YCbCr")) def test_save_correct_modes(self, mode: str) -> None: @@ -1103,9 +1104,9 @@ class TestFileJpeg: def test_deprecation(self) -> None: with Image.open(TEST_FILE) as im: assert isinstance(im, JpegImagePlugin.JpegImageFile) - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="huffman_ac"): assert im.huffman_ac == {} - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="huffman_dc"): assert im.huffman_dc == {} diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 15f67385a..0a51fd493 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -805,7 +805,7 @@ class TestFilePng: test_file = tmp_path / "out.png" im = hopper("I") - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="Saving I mode images as PNG"): im.save(test_file) with Image.open(test_file) as reloaded: diff --git a/Tests/test_file_tga.py b/Tests/test_file_tga.py index 8b6ed3ed2..27ff4f1a4 100644 --- a/Tests/test_file_tga.py +++ b/Tests/test_file_tga.py @@ -190,7 +190,9 @@ def test_save_id_section(tmp_path: Path) -> None: # Save with custom id section greater than 255 characters id_section = b"Test content" * 25 - with pytest.warns(UserWarning): + with pytest.warns( + UserWarning, match="id_section has been trimmed to 255 characters" + ): im.save(out, id_section=id_section) with Image.open(out) as test_im: diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index e92b97c8a..046a9f1f1 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -221,7 +221,7 @@ class TestFileTiff: assert isinstance(im, JpegImagePlugin.JpegImageFile) # Should not raise struct.error. - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="Corrupt EXIF data"): im._getexif() def test_save_rgba(self, tmp_path: Path) -> None: @@ -1014,7 +1014,7 @@ class TestFileTiff: @timeout_unless_slower_valgrind(2) def test_oom(self, test_file: str) -> None: with pytest.raises(UnidentifiedImageError): - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="Corrupt EXIF data"): with Image.open(test_file): pass diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 884868345..36ad8cee9 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -300,7 +300,7 @@ def test_empty_metadata() -> None: head = f.read(8) info = TiffImagePlugin.ImageFileDirectory(head) # Should not raise struct.error. - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="Corrupt EXIF data"): info.load(f) @@ -481,7 +481,7 @@ def test_too_many_entries() -> None: ifd.tagtype[277] = TiffTags.SHORT # Should not raise ValueError. - with pytest.warns(UserWarning): + with pytest.warns(UserWarning, match="Metadata Warning"): assert ifd[277] == 4 diff --git a/Tests/test_file_webp.py b/Tests/test_file_webp.py index f61e2c82e..916ea56fc 100644 --- a/Tests/test_file_webp.py +++ b/Tests/test_file_webp.py @@ -33,8 +33,8 @@ class TestUnsupportedWebp: monkeypatch.setattr(WebPImagePlugin, "SUPPORTED", False) file_path = "Tests/images/hopper.webp" - with pytest.warns(UserWarning): - with pytest.raises(OSError): + with pytest.raises(OSError): + with pytest.warns(UserWarning, match="WEBP support not installed"): with Image.open(file_path): pass diff --git a/Tests/test_image.py b/Tests/test_image.py index b018b4309..069083b19 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -53,7 +53,7 @@ except ImportError: # Deprecation helper def helper_image_new(mode: str, size: tuple[int, int]) -> Image.Image: if mode.startswith("BGR;"): - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="BGR;"): return Image.new(mode, size) else: return Image.new(mode, size) @@ -141,8 +141,8 @@ class TestImage: monkeypatch.setattr(Image, "WARN_POSSIBLE_FORMATS", True) im = io.BytesIO(b"") - with pytest.warns(UserWarning): - with pytest.raises(UnidentifiedImageError): + with pytest.raises(UnidentifiedImageError): + with pytest.warns(UserWarning, match="opening failed"): with Image.open(im): pass @@ -1008,7 +1008,7 @@ class TestImage: def test_get_child_images(self) -> None: im = Image.new("RGB", (1, 1)) - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="Image.Image.get_child_images"): assert im.get_child_images() == [] @pytest.mark.parametrize("size", ((1, 0), (0, 1), (0, 0))) @@ -1139,7 +1139,7 @@ class TestImage: assert im.fp is None def test_deprecation(self) -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="Image.isImageType"): assert not Image.isImageType(None) @@ -1150,7 +1150,7 @@ class TestImageBytes: source_bytes = im.tobytes() if mode.startswith("BGR;"): - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match=mode): reloaded = Image.frombytes(mode, im.size, source_bytes) else: reloaded = Image.frombytes(mode, im.size, source_bytes) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 14a5e2e7b..66412a035 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -193,7 +193,7 @@ class TestImageGetPixel: @pytest.mark.parametrize("mode", ("BGR;15", "BGR;16", "BGR;24")) def test_deprecated(self, mode: str) -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="BGR;"): self.check(mode) def test_list(self) -> None: diff --git a/Tests/test_image_array.py b/Tests/test_image_array.py index 2c71dceb8..c27ce13d5 100644 --- a/Tests/test_image_array.py +++ b/Tests/test_image_array.py @@ -47,7 +47,7 @@ def test_toarray() -> None: with pytest.raises(OSError): numpy.array(im_truncated) else: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="__array_interface__"): numpy.array(im_truncated) @@ -101,7 +101,7 @@ def test_fromarray_strides_without_tobytes() -> None: with pytest.raises(ValueError): wrapped = Wrapper({"shape": (1, 1), "strides": (1, 1)}) - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="'mode' parameter"): Image.fromarray(wrapped, "L") @@ -111,7 +111,7 @@ def test_fromarray_palette() -> None: a = numpy.array(i) # Act - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="'mode' parameter"): out = Image.fromarray(a, "P") # Assert that the Python and C palettes match diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 7d4f78c23..33f844437 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -203,7 +203,10 @@ def test_trns_RGB(tmp_path: Path) -> None: assert "transparency" not in im_rgba.info assert im_rgba.getpixel((0, 0)) == (0, 0, 0, 0) - im_p = pytest.warns(UserWarning, im.convert, "P", palette=Image.Palette.ADAPTIVE) + with pytest.warns( + UserWarning, match="Couldn't allocate palette entry for transparency" + ): + im_p = im.convert("P", palette=Image.Palette.ADAPTIVE) assert "transparency" not in im_p.info im_p.save(f) diff --git a/Tests/test_image_getim.py b/Tests/test_image_getim.py index fa58492fc..7b5f7a589 100644 --- a/Tests/test_image_getim.py +++ b/Tests/test_image_getim.py @@ -11,9 +11,9 @@ def test_sanity() -> None: type_repr = repr(type(im.getim())) assert "PyCapsule" in type_repr - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="id property"): assert isinstance(im.im.id, int) - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="unsafe_ptrs property"): ptrs = dict(im.im.unsafe_ptrs) assert ptrs.keys() == {"image8", "image32", "image"} diff --git a/Tests/test_image_putdata.py b/Tests/test_image_putdata.py index 27cb7c59d..34c1763b8 100644 --- a/Tests/test_image_putdata.py +++ b/Tests/test_image_putdata.py @@ -81,7 +81,7 @@ def test_mode_F() -> None: @pytest.mark.parametrize("mode", ("BGR;15", "BGR;16", "BGR;24")) def test_mode_BGR(mode: str) -> None: data = [(16, 32, 49), (32, 32, 98)] - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match=mode): im = Image.new(mode, (1, 2)) im.putdata(data) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index f062651f0..b6db0ab5c 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -54,7 +54,7 @@ def skip_missing() -> None: def test_sanity() -> None: # basic smoke test. # this mostly follows the cms_test outline. - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="PIL.ImageCms.versions"): v = ImageCms.versions() # should return four strings assert v[0] == "1.0.0 pil" assert list(map(type, v)) == [str, str, str, str] @@ -679,7 +679,7 @@ def test_auxiliary_channels_isolated() -> None: def test_long_modes() -> None: p = ImageCms.getOpenProfile("Tests/icc/sGrey-v2-nano.icc") - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="ABCDEFGHI"): ImageCms.buildTransform(p, p, "ABCDEFGHI", "ABCDEFGHI") @@ -703,15 +703,15 @@ def test_cmyk_lab() -> None: def test_deprecation() -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="ImageCms.DESCRIPTION"): assert ImageCms.DESCRIPTION.strip().startswith("pyCMS") - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="ImageCms.VERSION"): assert ImageCms.VERSION == "1.0.0 pil" - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="ImageCms.FLAGS"): assert isinstance(ImageCms.FLAGS, dict) profile = ImageCmsProfile(ImageCms.createProfile("sRGB")) - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="RGBA;16B"): ImageCms.ImageCmsTransform(profile, profile, "RGBA;16B", "RGB") - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="RGBA;16B"): ImageCms.ImageCmsTransform(profile, profile, "RGB", "RGBA;16B") diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 37669a2e5..881f9c85d 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1735,5 +1735,5 @@ def test_incorrectly_ordered_coordinates(xy: tuple[int, int, int, int]) -> None: def test_getdraw() -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="'hints' parameter"): ImageDraw.getdraw(None, []) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 7622eea99..a9444c26d 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -152,7 +152,7 @@ class TestImageFile: assert reads.count(im.decodermaxblock) == 1 def test_raise_oserror(self) -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="raise_oserror"): with pytest.raises(OSError): ImageFile.raise_oserror(1) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 69533c2f8..aa8bbb339 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -1175,15 +1175,15 @@ def test_oom(test_file: str) -> None: def test_raqm_missing_warning(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr(ImageFont.core, "HAVE_RAQM", False) - with pytest.warns(UserWarning) as record: + with pytest.warns( + UserWarning, + match="Raqm layout was requested, but Raqm is not available. " + "Falling back to basic layout.", + ): font = ImageFont.truetype( FONT_PATH, FONT_SIZE, layout_engine=ImageFont.Layout.RAQM ) assert font.layout_engine == ImageFont.Layout.BASIC - assert str(record[-1].message) == ( - "Raqm layout was requested, but Raqm is not available. " - "Falling back to basic layout." - ) @pytest.mark.parametrize("size", [-1, 0]) @@ -1202,5 +1202,5 @@ def test_freetype_deprecation(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr(features, "version_module", fake_version_module) # Act / Assert - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="FreeType 2.9.0"): ImageFont.truetype(FONT_PATH, FONT_SIZE) diff --git a/Tests/test_imagemath_lambda_eval.py b/Tests/test_imagemath_lambda_eval.py index 360325780..eec76118a 100644 --- a/Tests/test_imagemath_lambda_eval.py +++ b/Tests/test_imagemath_lambda_eval.py @@ -56,7 +56,7 @@ def test_sanity() -> None: def test_options_deprecated() -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="ImageMath.lambda_eval options"): assert ImageMath.lambda_eval(lambda args: 1, images) == 1 diff --git a/Tests/test_imagemath_unsafe_eval.py b/Tests/test_imagemath_unsafe_eval.py index b7ac84691..60ad6aafa 100644 --- a/Tests/test_imagemath_unsafe_eval.py +++ b/Tests/test_imagemath_unsafe_eval.py @@ -36,12 +36,12 @@ def test_sanity() -> None: def test_eval_deprecated() -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="ImageMath.eval"): assert ImageMath.eval("1") == 1 def test_options_deprecated() -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="ImageMath.unsafe_eval options"): assert ImageMath.unsafe_eval("1", images) == 1 diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index b4a300d0c..2d6af70eb 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -362,13 +362,15 @@ class TestLibUnpack: ) def test_BGR(self) -> None: - with pytest.warns(DeprecationWarning): + with pytest.warns(DeprecationWarning, match="BGR;15"): self.assert_unpack( "BGR;15", "BGR;15", 3, (8, 131, 0), (24, 0, 8), (41, 131, 8) ) + with pytest.warns(DeprecationWarning, match="BGR;16"): self.assert_unpack( "BGR;16", "BGR;16", 3, (8, 64, 0), (24, 129, 0), (41, 194, 0) ) + with pytest.warns(DeprecationWarning, match="BGR;24"): self.assert_unpack("BGR;24", "BGR;24", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) def test_RGBA(self) -> None: From a61a23d7ae054581db05d7eb94817685bc3ab3e4 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 27 Jun 2025 13:00:48 +1000 Subject: [PATCH 231/268] Fixed PT031 --- Tests/test_file_apng.py | 45 ++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/Tests/test_file_apng.py b/Tests/test_file_apng.py index 66410b3da..12204b5b7 100644 --- a/Tests/test_file_apng.py +++ b/Tests/test_file_apng.py @@ -303,11 +303,11 @@ def test_apng_chunk_errors() -> None: assert isinstance(im, PngImagePlugin.PngImageFile) assert not im.is_animated - with pytest.warns(UserWarning, match="Invalid APNG"): # noqa: PT031 - with Image.open("Tests/images/apng/chunk_multi_actl.png") as im: - im.load() - assert isinstance(im, PngImagePlugin.PngImageFile) - assert not im.is_animated + with pytest.warns(UserWarning, match="Invalid APNG"): + im = Image.open("Tests/images/apng/chunk_multi_actl.png") + assert isinstance(im, PngImagePlugin.PngImageFile) + assert not im.is_animated + im.close() with Image.open("Tests/images/apng/chunk_actl_after_idat.png") as im: assert isinstance(im, PngImagePlugin.PngImageFile) @@ -330,18 +330,20 @@ def test_apng_chunk_errors() -> None: def test_apng_syntax_errors() -> None: - with pytest.warns(UserWarning, match="Invalid APNG"): # noqa: PT031 - with Image.open("Tests/images/apng/syntax_num_frames_zero.png") as im: - assert isinstance(im, PngImagePlugin.PngImageFile) - assert not im.is_animated - with pytest.raises(OSError): - im.load() + with pytest.warns(UserWarning, match="Invalid APNG"): + im = Image.open("Tests/images/apng/syntax_num_frames_zero.png") + assert isinstance(im, PngImagePlugin.PngImageFile) + assert not im.is_animated + with pytest.raises(OSError): + im.load() + im.close() - with pytest.warns(UserWarning, match="Invalid APNG"): # noqa: PT031 - with Image.open("Tests/images/apng/syntax_num_frames_zero_default.png") as im: - assert isinstance(im, PngImagePlugin.PngImageFile) - assert not im.is_animated - im.load() + with pytest.warns(UserWarning, match="Invalid APNG"): + im = Image.open("Tests/images/apng/syntax_num_frames_zero_default.png") + assert isinstance(im, PngImagePlugin.PngImageFile) + assert not im.is_animated + im.load() + im.close() # we can handle this case gracefully with Image.open("Tests/images/apng/syntax_num_frames_low.png") as im: @@ -354,11 +356,12 @@ def test_apng_syntax_errors() -> None: im.seek(im.n_frames - 1) im.load() - with pytest.warns(UserWarning, match="Invalid APNG"): # noqa: PT031 - with Image.open("Tests/images/apng/syntax_num_frames_invalid.png") as im: - assert isinstance(im, PngImagePlugin.PngImageFile) - assert not im.is_animated - im.load() + with pytest.warns(UserWarning, match="Invalid APNG"): + im = Image.open("Tests/images/apng/syntax_num_frames_invalid.png") + assert isinstance(im, PngImagePlugin.PngImageFile) + assert not im.is_animated + im.load() + im.close() @pytest.mark.parametrize( From e783aff6885c8b5d92f819bd9a7bc1566f1b5318 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Fri, 27 Jun 2025 22:32:30 +1000 Subject: [PATCH 232/268] Improve SgiImagePlugin test coverage (#8896) --- Tests/test_file_sgi.py | 18 ++++++++++++++++++ src/PIL/SgiImagePlugin.py | 30 +++++++----------------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/Tests/test_file_sgi.py b/Tests/test_file_sgi.py index da0965fa1..abf424dbf 100644 --- a/Tests/test_file_sgi.py +++ b/Tests/test_file_sgi.py @@ -1,5 +1,6 @@ from __future__ import annotations +from io import BytesIO from pathlib import Path import pytest @@ -71,6 +72,15 @@ def test_invalid_file() -> None: SgiImagePlugin.SgiImageFile(invalid_file) +def test_unsupported_image_mode() -> None: + with open("Tests/images/hopper.rgb", "rb") as fp: + data = fp.read() + data = data[:3] + b"\x03" + data[4:] + with pytest.raises(ValueError, match="Unsupported SGI image mode"): + with Image.open(BytesIO(data)): + pass + + def roundtrip(img: Image.Image, tmp_path: Path) -> None: out = tmp_path / "temp.sgi" img.save(out, format="sgi") @@ -109,3 +119,11 @@ def test_unsupported_mode(tmp_path: Path) -> None: with pytest.raises(ValueError): im.save(out, format="sgi") + + +def test_unsupported_number_of_bytes_per_pixel(tmp_path: Path) -> None: + im = hopper() + out = tmp_path / "temp.sgi" + + with pytest.raises(ValueError, match="Unsupported number of bytes per pixel"): + im.save(out, bpc=3) diff --git a/src/PIL/SgiImagePlugin.py b/src/PIL/SgiImagePlugin.py index 44254b7a4..853022150 100644 --- a/src/PIL/SgiImagePlugin.py +++ b/src/PIL/SgiImagePlugin.py @@ -82,17 +82,10 @@ class SgiImageFile(ImageFile.ImageFile): # zsize : channels count zsize = i16(s, 10) - # layout - layout = bpc, dimension, zsize - # determine mode from bits/zsize - rawmode = "" try: - rawmode = MODES[layout] + rawmode = MODES[(bpc, dimension, zsize)] except KeyError: - pass - - if rawmode == "": msg = "Unsupported SGI image mode" raise ValueError(msg) @@ -156,24 +149,15 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: # Run-Length Encoding Compression - Unsupported at this time rle = 0 - # Number of dimensions (x,y,z) - dim = 3 # X Dimension = width / Y Dimension = height x, y = im.size - if im.mode == "L" and y == 1: - dim = 1 - elif im.mode == "L": - dim = 2 # Z Dimension: Number of channels z = len(im.mode) - - if dim in {1, 2}: - z = 1 - - # assert we've got the right number of bands. - if len(im.getbands()) != z: - msg = f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}" - raise ValueError(msg) + # Number of dimensions (x,y,z) + if im.mode == "L": + dimension = 1 if y == 1 else 2 + else: + dimension = 3 # Minimum Byte value pinmin = 0 @@ -188,7 +172,7 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: fp.write(struct.pack(">h", magic_number)) fp.write(o8(rle)) fp.write(o8(bpc)) - fp.write(struct.pack(">H", dim)) + fp.write(struct.pack(">H", dimension)) fp.write(struct.pack(">H", x)) fp.write(struct.pack(">H", y)) fp.write(struct.pack(">H", z)) From 958c449b988e49aa88a412990bebdb799a97a39f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Fri, 27 Jun 2025 16:17:20 +0300 Subject: [PATCH 233/268] Close image after assert Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- Tests/test_file_jpeg.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index c0e6b467e..6dab418bf 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -752,6 +752,8 @@ class TestFileJpeg: # Assert assert im.format == "JPEG" + im.close() + @pytest.mark.parametrize("mode", ("1", "L", "RGB", "RGBX", "CMYK", "YCbCr")) def test_save_correct_modes(self, mode: str) -> None: out = BytesIO() From ef98b3510e3e4f14b547762764813d7e5ca3c5a4 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 28 Jun 2025 00:29:58 +1000 Subject: [PATCH 234/268] Fix buffer overflow when saving compressed DDS images (#9041) Co-authored-by: Eric Soroos --- Tests/test_file_dds.py | 17 +++++++++++++++++ src/libImaging/BcnEncode.c | 4 ++++ 2 files changed, 21 insertions(+) diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 3388fce16..5c7a943b1 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -511,3 +511,20 @@ def test_save_dx10_bc5(tmp_path: Path) -> None: im = hopper("L") with pytest.raises(OSError, match="only RGB mode can be written as BC5"): im.save(out, pixel_format="BC5") + + +@pytest.mark.parametrize( + "pixel_format, mode", + ( + ("DXT1", "RGBA"), + ("DXT3", "RGBA"), + ("DXT5", "RGBA"), + ("BC2", "RGBA"), + ("BC3", "RGBA"), + ("BC5", "RGB"), + ), +) +def test_save_large_file(tmp_path: Path, pixel_format: str, mode: str) -> None: + im = hopper(mode).resize((440, 440)) + # should not error in valgrind + im.save(tmp_path / "img.dds", pixel_format=pixel_format) diff --git a/src/libImaging/BcnEncode.c b/src/libImaging/BcnEncode.c index 2bad73b92..7a5072dde 100644 --- a/src/libImaging/BcnEncode.c +++ b/src/libImaging/BcnEncode.c @@ -258,6 +258,10 @@ ImagingBcnEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { UINT8 *dst = buf; for (;;) { + // Loop writes a max of 16 bytes per iteration + if (dst + 16 >= bytes + buf) { + break; + } if (n == 5) { encode_bc3_alpha(im, state, dst, 0); dst += 8; From d07aa6fd17d356b8f09f89a5c485fc8b1532635f Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 28 Jun 2025 00:30:22 +1000 Subject: [PATCH 235/268] Added release notes for #9041 (#9042) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- docs/releasenotes/11.3.0.rst | 38 +++++++++++------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index 654a7e6b6..2d35d8228 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -4,21 +4,21 @@ Security ======== -TODO -^^^^ +:cve:`2025-48379`: Write buffer overflow on BCn encoding +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -TODO +There is a heap buffer overflow when writing a sufficiently large (>64k encoded with +default settings) image in the DDS format due to writing into a buffer without checking +for available space. -:cve:`YYYY-XXXXX`: TODO -^^^^^^^^^^^^^^^^^^^^^^^ +This only affects users who save untrusted data as a compressed DDS image. -TODO +* Unclear how large the potential write could be. It is likely limited by process + segfault, so it's not necessarily deterministic. It may be practically unbounded. +* Unclear if there's a restriction on the bytes that could be emitted. It's likely that + the only restriction is that the bytes would be emitted in chunks of 8 or 16. -Backwards incompatible changes -============================== - -TODO -^^^^ +This was introduced in Pillow 11.2.0 when the feature was added. Deprecations ============ @@ -41,22 +41,6 @@ another mode before saving:: im = Image.new("I", (1, 1)) im.convert("I;16").save("out.png") -API changes -=========== - -TODO -^^^^ - -TODO - -API additions -============= - -TODO -^^^^ - -TODO - Other changes ============= From 41129ce1cb88ae6f7733b40f3f6a9f1a5662d2af Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 28 Jun 2025 01:20:02 +1000 Subject: [PATCH 236/268] Use list Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- Tests/test_file_mpo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index adfa61962..840202214 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -294,7 +294,7 @@ def test_save_all() -> None: im = Image.new("RGB", (1, 1)) for colors in (("#f00",), ("#f00", "#0f0")): - append_images = (Image.new("RGB", (1, 1), color) for color in colors) + append_images = [Image.new("RGB", (1, 1), color) for color in colors] im_reloaded = roundtrip(im, save_all=True, append_images=append_images) assert_image_equal(im, im_reloaded) From 69c0c422c86b1b1a8a7f5fca5e2f464cadfcf7f2 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 28 Jun 2025 10:29:01 +1000 Subject: [PATCH 237/268] Increase pytest verbosity (#9040) Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- .ci/test.cmd | 2 +- .ci/test.sh | 2 +- .github/workflows/wheels-test.ps1 | 4 ++-- .github/workflows/wheels-test.sh | 4 ++-- winbuild/README.md | 2 +- winbuild/build.rst | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.ci/test.cmd b/.ci/test.cmd index aafc9290c..acfac3d1a 100644 --- a/.ci/test.cmd +++ b/.ci/test.cmd @@ -1,3 +1,3 @@ python.exe -c "from PIL import Image" IF ERRORLEVEL 1 EXIT /B -python.exe -bb -m pytest -v -x -W always --cov PIL --cov Tests --cov-report term --cov-report xml Tests +python.exe -bb -m pytest -vv -x -W always --cov PIL --cov Tests --cov-report term --cov-report xml Tests diff --git a/.ci/test.sh b/.ci/test.sh index 3f0ddc350..87a605d84 100755 --- a/.ci/test.sh +++ b/.ci/test.sh @@ -4,4 +4,4 @@ set -e python3 -c "from PIL import Image" -python3 -bb -m pytest -v -x -W always --cov PIL --cov Tests --cov-report term --cov-report xml Tests $REVERSE +python3 -bb -m pytest -vv -x -W always --cov PIL --cov Tests --cov-report term --cov-report xml Tests $REVERSE diff --git a/.github/workflows/wheels-test.ps1 b/.github/workflows/wheels-test.ps1 index 54e7fbbfc..9f5561c46 100644 --- a/.github/workflows/wheels-test.ps1 +++ b/.github/workflows/wheels-test.ps1 @@ -23,7 +23,7 @@ cd $pillow if (!$?) { exit $LASTEXITCODE } & $venv\Scripts\$python selftest.py if (!$?) { exit $LASTEXITCODE } -& $venv\Scripts\$python -m pytest -vx Tests\check_wheel.py +& $venv\Scripts\$python -m pytest -vv -x Tests\check_wheel.py if (!$?) { exit $LASTEXITCODE } -& $venv\Scripts\$python -m pytest -vx Tests +& $venv\Scripts\$python -m pytest -vv -x Tests if (!$?) { exit $LASTEXITCODE } diff --git a/.github/workflows/wheels-test.sh b/.github/workflows/wheels-test.sh index ce83a4278..94dbb4679 100755 --- a/.github/workflows/wheels-test.sh +++ b/.github/workflows/wheels-test.sh @@ -35,5 +35,5 @@ fi # Runs tests python3 selftest.py -python3 -m pytest Tests/check_wheel.py -python3 -m pytest +python3 -m pytest -vv -x Tests/check_wheel.py +python3 -m pytest -vv -x diff --git a/winbuild/README.md b/winbuild/README.md index 0d3ec8d8a..62345af60 100644 --- a/winbuild/README.md +++ b/winbuild/README.md @@ -24,6 +24,6 @@ cd .. %PYTHON%\python.exe -m pip install -v -C raqm=vendor -C fribidi=vendor . path C:\Pillow\winbuild\build\bin;%PATH% %PYTHON%\python.exe selftest.py -%PYTHON%\python.exe -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests +%PYTHON%\python.exe -m pytest -vv -x --cov PIL --cov Tests --cov-report term --cov-report xml Tests %PYTHON%\python.exe -m pip wheel -v -C raqm=vendor -C fribidi=vendor . ``` diff --git a/winbuild/build.rst b/winbuild/build.rst index 3c20c7d17..aa4677ad5 100644 --- a/winbuild/build.rst +++ b/winbuild/build.rst @@ -124,5 +124,5 @@ Here's an example script to build on Windows:: %PYTHON%\python.exe -m pip install -v -C raqm=vendor -C fribidi=vendor . path C:\Pillow\winbuild\build\bin;%PATH% %PYTHON%\python.exe selftest.py - %PYTHON%\python.exe -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests + %PYTHON%\python.exe -m pytest -vv -x --cov PIL --cov Tests --cov-report term --cov-report xml Tests %PYTHON%\python.exe -m pip wheel -v -C raqm=vendor -C fribidi=vendor . From 5732a86cc6f8aad4a28a92b7c7c78748000c8d1d Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sat, 28 Jun 2025 10:52:25 +1000 Subject: [PATCH 238/268] Use snake case Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> --- src/PIL/MpoImagePlugin.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/PIL/MpoImagePlugin.py b/src/PIL/MpoImagePlugin.py index f96f658fc..784b6f208 100644 --- a/src/PIL/MpoImagePlugin.py +++ b/src/PIL/MpoImagePlugin.py @@ -46,12 +46,10 @@ def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: mpf_offset = 28 offsets: list[int] = [] - total = 0 - imSequences = [im] + list(append_images) - for imSequence in imSequences: - total += getattr(imSequence, "n_frames", 1) - for imSequence in imSequences: - for im_frame in ImageSequence.Iterator(imSequence): + im_sequences = [im, *append_images] + total = sum(getattr(seq, "n_frames", 1) for seq in im_sequences) + for im_sequence in im_sequences: + for im_frame in ImageSequence.Iterator(im_sequence): if not offsets: # APP2 marker ifd_length = 66 + 16 * total From ed82f4d235eb6a739699e8485748204818393442 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Jun 2025 10:57:23 +1000 Subject: [PATCH 239/268] Use unpacking --- src/PIL/ImageMath.py | 2 +- src/PIL/McIdasImagePlugin.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PIL/ImageMath.py b/src/PIL/ImageMath.py index 484797f91..c33809ced 100644 --- a/src/PIL/ImageMath.py +++ b/src/PIL/ImageMath.py @@ -308,7 +308,7 @@ def unsafe_eval( # build execution namespace args: dict[str, Any] = ops.copy() - for k in list(options.keys()) + list(kw.keys()): + for k in [*options, *kw]: if "__" in k or hasattr(builtins, k): msg = f"'{k}' not allowed" raise ValueError(msg) diff --git a/src/PIL/McIdasImagePlugin.py b/src/PIL/McIdasImagePlugin.py index b4460a9a5..4c34dd7e5 100644 --- a/src/PIL/McIdasImagePlugin.py +++ b/src/PIL/McIdasImagePlugin.py @@ -44,7 +44,7 @@ class McIdasImageFile(ImageFile.ImageFile): raise SyntaxError(msg) self.area_descriptor_raw = s - self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) + self.area_descriptor = w = [0, *struct.unpack("!64i", s)] # get mode if w[11] == 1: From 4ac24035320cb213d1f0175f9b0e53fcab6d3445 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 28 Jun 2025 15:48:44 +1000 Subject: [PATCH 240/268] Read 16-bit images into I;16B mode to allow for memory mapping --- .../cmx3g8_wv_1998.260_0745_mcidas.tiff | Bin 2880134 -> 1440122 bytes Tests/test_file_mcidas.py | 2 +- src/PIL/McIdasImagePlugin.py | 4 +--- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Tests/images/cmx3g8_wv_1998.260_0745_mcidas.tiff b/Tests/images/cmx3g8_wv_1998.260_0745_mcidas.tiff index b72509cc4b3c57c901fb02c24c2b201e94d99fa3..2ebb287e26d6901319b9a05900212b9a65536ce7 100644 GIT binary patch literal 1440122 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

_J#pltRA!g1U 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 z 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

+`seb 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%0A@LyZ-@ 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 z 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

hlB=^ERxexAz?HReN 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
(dINmri3yrq(IA0HJC#h4K-zTb1 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l$HvYpg) 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 diff --git a/Tests/test_file_mcidas.py b/Tests/test_file_mcidas.py index e11e6bb52..7e236028d 100644 --- a/Tests/test_file_mcidas.py +++ b/Tests/test_file_mcidas.py @@ -27,6 +27,6 @@ def test_valid_file() -> None: # Assert assert im.format == "MCIDAS" - assert im.mode == "I" + assert im.mode == "I;16B" assert im.size == (1800, 400) assert_image_equal_tofile(im, saved_file) diff --git a/src/PIL/McIdasImagePlugin.py b/src/PIL/McIdasImagePlugin.py index b4460a9a5..a1214ad50 100644 --- a/src/PIL/McIdasImagePlugin.py +++ b/src/PIL/McIdasImagePlugin.py @@ -50,9 +50,7 @@ class McIdasImageFile(ImageFile.ImageFile): if w[11] == 1: mode = rawmode = "L" elif w[11] == 2: - # FIXME: add memory map support - mode = "I" - rawmode = "I;16B" + mode = rawmode = "I;16B" elif w[11] == 4: # FIXME: add memory map support mode = "I" From d4162f85056223098fef0ba3f87e58519ba2955f Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 30 Jun 2025 18:27:49 +1000 Subject: [PATCH 241/268] Updated return type --- Tests/test_file_mpo.py | 2 +- src/PIL/Image.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index 682fc7361..6c9c541f1 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -316,7 +316,7 @@ def test_save_xmp() -> None: im = Image.new("RGB", (1, 1)) im2 = Image.new("RGB", (1, 1), "#f00") - def roundtrip_xmp(): + def roundtrip_xmp() -> list[Any]: im_reloaded = roundtrip(im, xmp=b"Default", save_all=True, append_images=[im2]) xmp = [im_reloaded.info["xmp"]] im_reloaded.seek(1) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 7b1b575a0..9fc1c7067 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2600,7 +2600,7 @@ class Image: if open_fp: fp.close() - def _attach_default_encoderinfo(self, im: Image) -> Any: + def _attach_default_encoderinfo(self, im: Image) -> dict[str, Any]: encoderinfo = getattr(self, "encoderinfo", {}) self.encoderinfo = {**im._default_encoderinfo, **encoderinfo} return encoderinfo From be2b4e78644fdc85e63f08a22514e4d32072439f Mon Sep 17 00:00:00 2001 From: Kylian Ronfleux--Corail <35237015+Kyliroco@users.noreply.github.com> Date: Mon, 30 Jun 2025 12:46:40 +0200 Subject: [PATCH 242/268] Fix qtables and quality scaling (#8879) Co-authored-by: Andrew Murray --- Tests/test_file_jpeg.py | 18 ++++++++++++++++++ docs/handbook/image-file-formats.rst | 7 +++++++ src/libImaging/JpegEncode.c | 15 +++++++++++---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 6dab418bf..5afae0412 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -611,6 +611,24 @@ class TestFileJpeg: None ) ] + + for quality in range(101): + qtable_from_qtable_quality = self.roundtrip( + im, + qtables={0: standard_l_qtable, 1: standard_chrominance_qtable}, + quality=quality, + ).quantization + + qtable_from_quality = self.roundtrip(im, quality=quality).quantization + + if features.check_feature("libjpeg_turbo"): + assert qtable_from_qtable_quality == qtable_from_quality + else: + assert qtable_from_qtable_quality[0] == qtable_from_quality[0] + assert ( + qtable_from_qtable_quality[1][1:] == qtable_from_quality[1][1:] + ) + # list of qtable lists assert_image_similar( im, diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 83df2bd5c..03ee96c0f 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -557,6 +557,8 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: hardly any gain in image quality. The value ``keep`` is only valid for JPEG files and will retain the original image quality level, subsampling, and qtables. + For more information on how qtables are modified based on the quality parameter, + see the qtables section. **optimize** If present and true, indicates that the encoder should make an extra pass @@ -622,6 +624,11 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: range(len(keys))) of lists of 64 integers. There must be between 2 and 4 tables. + If a quality parameter is provided, the qtables will be adjusted accordingly. + By default, the qtables are based on a standard JPEG table with a quality of 50. + The qtable values will be reduced if the quality is higher than 50 and increased + if the quality is lower than 50. + .. versionadded:: 2.5.0 **streamtype** diff --git a/src/libImaging/JpegEncode.c b/src/libImaging/JpegEncode.c index 79a38e12f..972435ee1 100644 --- a/src/libImaging/JpegEncode.c +++ b/src/libImaging/JpegEncode.c @@ -175,18 +175,21 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { /* Use custom quantization tables */ if (context->qtables) { int i; - int quality = 100; + int quality = 50; int last_q = 0; + boolean force_baseline = FALSE; if (context->quality != -1) { quality = context->quality; + force_baseline = TRUE; } + int scale_factor = jpeg_quality_scaling(quality); for (i = 0; i < context->qtablesLen; i++) { jpeg_add_quant_table( &context->cinfo, i, &context->qtables[i * DCTSIZE2], - quality, - FALSE + scale_factor, + force_baseline ); context->cinfo.comp_info[i].quant_tbl_no = i; last_q = i; @@ -195,7 +198,11 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) { // jpeg_set_defaults created two qtables internally, but we only // wanted one. jpeg_add_quant_table( - &context->cinfo, 1, &context->qtables[0], quality, FALSE + &context->cinfo, + 1, + &context->qtables[0], + scale_factor, + force_baseline ); } for (i = last_q; i < context->cinfo.num_components; i++) { From da10ed1cf3c4123a98a2f765d3beaf830d47d113 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Mon, 30 Jun 2025 21:46:07 +1000 Subject: [PATCH 243/268] Add support for iOS (#9030) Co-authored-by: Andrew Murray --- .github/workflows/wheels-dependencies.sh | 207 ++++++++++++++---- .github/workflows/wheels-test.ps1 | 5 +- .github/workflows/wheels-test.sh | 4 +- .github/workflows/wheels.yml | 23 +- .pre-commit-config.yaml | 6 +- MANIFEST.in | 2 + Tests/oss-fuzz/test_fuzzers.py | 5 +- Tests/test_main.py | 1 + Tests/test_pyroma.py | 4 +- {Tests => checks}/32bit_segfault_check.py | 0 {Tests => checks}/check_fli_oob.py | 0 {Tests => checks}/check_fli_overflow.py | 0 {Tests => checks}/check_icns_dos.py | 0 {Tests => checks}/check_imaging_leaks.py | 0 {Tests => checks}/check_j2k_dos.py | 0 {Tests => checks}/check_j2k_leaks.py | 0 {Tests => checks}/check_j2k_overflow.py | 0 {Tests => checks}/check_jp2_overflow.py | 0 {Tests => checks}/check_jpeg_leaks.py | 0 {Tests => checks}/check_large_memory.py | 0 {Tests => checks}/check_large_memory_numpy.py | 0 {Tests => checks}/check_libtiff_segfault.py | 0 {Tests => checks}/check_png_dos.py | 0 {Tests => checks}/check_release_notes.py | 0 {Tests => checks}/check_wheel.py | 12 +- docs/releasenotes/11.3.0.rst | 8 +- patches/README.md | 14 ++ patches/iOS/brotli-1.1.0.tar.gz.patch | 46 ++++ patches/iOS/libwebp-1.5.0.tar.gz.patch | 42 ++++ pyproject.toml | 46 +++- setup.py | 39 ++++ 31 files changed, 406 insertions(+), 58 deletions(-) rename {Tests => checks}/32bit_segfault_check.py (100%) rename {Tests => checks}/check_fli_oob.py (100%) rename {Tests => checks}/check_fli_overflow.py (100%) rename {Tests => checks}/check_icns_dos.py (100%) rename {Tests => checks}/check_imaging_leaks.py (100%) rename {Tests => checks}/check_j2k_dos.py (100%) rename {Tests => checks}/check_j2k_leaks.py (100%) rename {Tests => checks}/check_j2k_overflow.py (100%) rename {Tests => checks}/check_jp2_overflow.py (100%) rename {Tests => checks}/check_jpeg_leaks.py (100%) rename {Tests => checks}/check_large_memory.py (100%) rename {Tests => checks}/check_large_memory_numpy.py (100%) rename {Tests => checks}/check_libtiff_segfault.py (100%) rename {Tests => checks}/check_png_dos.py (100%) rename {Tests => checks}/check_release_notes.py (100%) rename {Tests => checks}/check_wheel.py (75%) create mode 100644 patches/README.md create mode 100644 patches/iOS/brotli-1.1.0.tar.gz.patch create mode 100644 patches/iOS/libwebp-1.5.0.tar.gz.patch diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index 5384a74c0..d761d93b6 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -1,42 +1,98 @@ #!/bin/bash -# Setup that needs to be done before multibuild utils are invoked -PROJECTDIR=$(pwd) -if [[ "$(uname -s)" == "Darwin" ]]; then - # Safety check - macOS builds require that CIBW_ARCHS is set, and that it - # only contains a single value (even though cibuildwheel allows multiple - # values in CIBW_ARCHS). +# Safety check - Pillow builds require that CIBW_ARCHS is set, and that it only +# contains a single value (even though cibuildwheel allows multiple values in +# CIBW_ARCHS). This check doesn't work on Linux because of how the CIBW_ARCHS +# variable is exposed. +function check_cibw_archs { if [[ -z "$CIBW_ARCHS" ]]; then - echo "ERROR: Pillow macOS builds require CIBW_ARCHS be defined." + echo "ERROR: Pillow builds require CIBW_ARCHS be defined." exit 1 fi if [[ "$CIBW_ARCHS" == *" "* ]]; then - echo "ERROR: Pillow macOS builds only support a single architecture in CIBW_ARCHS." + echo "ERROR: Pillow builds only support a single architecture in CIBW_ARCHS." exit 1 fi +} +# Setup that needs to be done before multibuild utils are invoked. Process +# potential cross-build platforms before native platforms to ensure that we pick +# up the cross environment. +PROJECTDIR=$(pwd) +if [[ "$CIBW_PLATFORM" == "ios" ]]; then + check_cibw_archs + # On iOS, CIBW_ARCHS is actually a multi-arch - arm64_iphoneos, + # arm64_iphonesimulator or x86_64_iphonesimulator. Split into the CPU + # platform, and the iOS SDK. + PLAT=$(echo $CIBW_ARCHS | sed "s/\(.*\)_\(.*\)/\1/") + IOS_SDK=$(echo $CIBW_ARCHS | sed "s/\(.*\)_\(.*\)/\2/") + + # Build iOS builds in `build/iphoneos` or `build/iphonesimulator` + # (depending on the build target). Install them into `build/deps/iphoneos` + # or `build/deps/iphonesimulator` + WORKDIR=$(pwd)/build/$IOS_SDK + BUILD_PREFIX=$(pwd)/build/deps/$IOS_SDK + PATCH_DIR=$(pwd)/patches/iOS + + # GNU tooling insists on using aarch64 rather than arm64 + if [[ $PLAT == "arm64" ]]; then + GNU_ARCH=aarch64 + else + GNU_ARCH=x86_64 + fi + + IOS_SDK_PATH=$(xcrun --sdk $IOS_SDK --show-sdk-path) + CMAKE_SYSTEM_NAME=iOS + IOS_HOST_TRIPLE=$PLAT-apple-ios$IPHONEOS_DEPLOYMENT_TARGET + if [[ "$IOS_SDK" == "iphonesimulator" ]]; then + IOS_HOST_TRIPLE=$IOS_HOST_TRIPLE-simulator + fi + + # GNU Autotools doesn't recognize the existence of arm64-apple-ios-simulator + # as a valid host. However, the only difference between arm64-apple-ios and + # arm64-apple-ios-simulator is the choice of sysroot, and that is + # coordinated by CC, CFLAGS etc. From the perspective of configure, the two + # platforms are identical, so we can use arm64-apple-ios consistently. + # This (mostly) avoids us needing to patch config.sub in dependency sources. + HOST_CONFIGURE_FLAGS="--disable-shared --enable-static --host=$GNU_ARCH-apple-ios --build=$GNU_ARCH-apple-darwin" + + # CMake has native support for iOS. However, most of that support is based + # on using the Xcode builder, which isn't very helpful for most of Pillow's + # dependencies. Therefore, we lean on the OSX configurations, plus CC, CFLAGS + # etc. to ensure the right sysroot is selected. + HOST_CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=$CMAKE_SYSTEM_NAME -DCMAKE_SYSTEM_PROCESSOR=$GNU_ARCH -DCMAKE_OSX_DEPLOYMENT_TARGET=$IPHONEOS_DEPLOYMENT_TARGET -DCMAKE_OSX_SYSROOT=$IOS_SDK_PATH -DBUILD_SHARED_LIBS=NO" + + # Meson needs to be pointed at a cross-platform configuration file + # This will be generated once CC etc. have been evaluated. + HOST_MESON_FLAGS="--cross-file $WORKDIR/meson-cross.txt -Dprefer_static=true -Ddefault_library=static" + +elif [[ "$(uname -s)" == "Darwin" ]]; then + check_cibw_archs # Build macOS dependencies in `build/darwin` # Install them into `build/deps/darwin` + PLAT=$CIBW_ARCHS WORKDIR=$(pwd)/build/darwin BUILD_PREFIX=$(pwd)/build/deps/darwin else # Build prefix will default to /usr/local + PLAT="${CIBW_ARCHS:-$AUDITWHEEL_ARCH}" WORKDIR=$(pwd)/build MB_ML_LIBC=${AUDITWHEEL_POLICY::9} MB_ML_VER=${AUDITWHEEL_POLICY:9} fi -PLAT="${CIBW_ARCHS:-$AUDITWHEEL_ARCH}" # Define custom utilities source wheels/multibuild/common_utils.sh source wheels/multibuild/library_builders.sh -if [ -z "$IS_MACOS" ]; then +if [[ -z "$IS_MACOS" ]]; then source wheels/multibuild/manylinux_utils.sh fi ARCHIVE_SDIR=pillow-depends-main -# Package versions for fresh source builds +# Package versions for fresh source builds. Version numbers with "Patched" +# annotations have a source code patch that is required for some platforms. If +# you change those versions, ensure the patch is also updated. FREETYPE_VERSION=2.13.3 HARFBUZZ_VERSION=11.2.1 LIBPNG_VERSION=1.6.49 @@ -47,32 +103,58 @@ TIFF_VERSION=4.7.0 LCMS2_VERSION=2.17 ZLIB_VERSION=1.3.1 ZLIB_NG_VERSION=2.2.4 -LIBWEBP_VERSION=1.5.0 +LIBWEBP_VERSION=1.5.0 # Patched; next release won't need patching. See patch file. BZIP2_VERSION=1.0.8 LIBXCB_VERSION=1.17.0 -BROTLI_VERSION=1.1.0 +BROTLI_VERSION=1.1.0 # Patched; next release won't need patching. See patch file. LIBAVIF_VERSION=1.3.0 function build_pkg_config { if [ -e pkg-config-stamp ]; then return; fi - # This essentially duplicates the Homebrew recipe - CFLAGS="$CFLAGS -Wno-int-conversion" build_simple pkg-config 0.29.2 https://pkg-config.freedesktop.org/releases tar.gz \ + # This essentially duplicates the Homebrew recipe. + # On iOS, we need a binary that can be executed on the build machine; but we + # can create a host-specific pc-path to store iOS .pc files. To ensure a + # macOS-compatible build, we temporarily clear environment flags that set + # iOS-specific values. + if [[ -n "$IOS_SDK" ]]; then + ORIGINAL_HOST_CONFIGURE_FLAGS=$HOST_CONFIGURE_FLAGS + ORIGINAL_IPHONEOS_DEPLOYMENT_TARGET=$IPHONEOS_DEPLOYMENT_TARGET + unset HOST_CONFIGURE_FLAGS + unset IPHONEOS_DEPLOYMENT_TARGET + fi + + CFLAGS="$CFLAGS -Wno-int-conversion" CPPFLAGS="" build_simple pkg-config 0.29.2 https://pkg-config.freedesktop.org/releases tar.gz \ --disable-debug --disable-host-tool --with-internal-glib \ --with-pc-path=$BUILD_PREFIX/share/pkgconfig:$BUILD_PREFIX/lib/pkgconfig \ --with-system-include-path=$(xcrun --show-sdk-path --sdk macosx)/usr/include + + if [[ -n "$IOS_SDK" ]]; then + HOST_CONFIGURE_FLAGS=$ORIGINAL_HOST_CONFIGURE_FLAGS + IPHONEOS_DEPLOYMENT_TARGET=$ORIGINAL_IPHONEOS_DEPLOYMENT_TARGET + fi; + export PKG_CONFIG=$BUILD_PREFIX/bin/pkg-config touch pkg-config-stamp } function build_zlib_ng { if [ -e zlib-stamp ]; then return; fi + # zlib-ng uses a "configure" script, but it's not a GNU autotools script, so + # it doesn't honor the usual flags. Temporarily disable any + # cross-compilation flags. + ORIGINAL_HOST_CONFIGURE_FLAGS=$HOST_CONFIGURE_FLAGS + unset HOST_CONFIGURE_FLAGS + build_github zlib-ng/zlib-ng $ZLIB_NG_VERSION --zlib-compat - if [ -n "$IS_MACOS" ]; then + HOST_CONFIGURE_FLAGS=$ORIGINAL_HOST_CONFIGURE_FLAGS + + if [[ -n "$IS_MACOS" ]] && [[ -z "$IOS_SDK" ]]; then # Ensure that on macOS, the library name is an absolute path, not an # @rpath, so that delocate picks up the right library (and doesn't need # DYLD_LIBRARY_PATH to be set). The default Makefile doesn't have an - # option to control the install_name. + # option to control the install_name. This isn't needed on iOS, as iOS + # only builds the static library. install_name_tool -id $BUILD_PREFIX/lib/libz.1.dylib $BUILD_PREFIX/lib/libz.1.dylib fi touch zlib-stamp @@ -82,7 +164,7 @@ function build_brotli { if [ -e brotli-stamp ]; then return; fi local out_dir=$(fetch_unpack https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz brotli-$BROTLI_VERSION.tar.gz) (cd $out_dir \ - && cmake -DCMAKE_INSTALL_PREFIX=$BUILD_PREFIX -DCMAKE_INSTALL_LIBDIR=$BUILD_PREFIX/lib -DCMAKE_INSTALL_NAME_DIR=$BUILD_PREFIX/lib . \ + && cmake -DCMAKE_INSTALL_PREFIX=$BUILD_PREFIX -DCMAKE_INSTALL_LIBDIR=$BUILD_PREFIX/lib -DCMAKE_INSTALL_NAME_DIR=$BUILD_PREFIX/lib $HOST_CMAKE_FLAGS . \ && make install) touch brotli-stamp } @@ -93,7 +175,7 @@ function build_harfbuzz { local out_dir=$(fetch_unpack https://github.com/harfbuzz/harfbuzz/releases/download/$HARFBUZZ_VERSION/harfbuzz-$HARFBUZZ_VERSION.tar.xz harfbuzz-$HARFBUZZ_VERSION.tar.xz) (cd $out_dir \ - && meson setup build --prefix=$BUILD_PREFIX --libdir=$BUILD_PREFIX/lib --buildtype=minsize -Dfreetype=enabled -Dglib=disabled -Dtests=disabled) + && meson setup build --prefix=$BUILD_PREFIX --libdir=$BUILD_PREFIX/lib --buildtype=minsize -Dfreetype=enabled -Dglib=disabled -Dtests=disabled $HOST_MESON_FLAGS) (cd $out_dir/build \ && meson install) touch harfbuzz-stamp @@ -164,19 +246,19 @@ function build { fi build_simple xcb-proto 1.17.0 https://xorg.freedesktop.org/archive/individual/proto - if [ -n "$IS_MACOS" ]; then + if [[ -n "$IS_MACOS" ]]; then build_simple xorgproto 2024.1 https://www.x.org/pub/individual/proto build_simple libXau 1.0.12 https://www.x.org/pub/individual/lib build_simple libpthread-stubs 0.5 https://xcb.freedesktop.org/dist else - sed s/\${pc_sysrootdir\}// $BUILD_PREFIX/share/pkgconfig/xcb-proto.pc > $BUILD_PREFIX/lib/pkgconfig/xcb-proto.pc + sed "s/\${pc_sysrootdir\}//" $BUILD_PREFIX/share/pkgconfig/xcb-proto.pc > $BUILD_PREFIX/lib/pkgconfig/xcb-proto.pc fi build_simple libxcb $LIBXCB_VERSION https://www.x.org/releases/individual/lib build_libjpeg_turbo - if [ -n "$IS_MACOS" ]; then + if [[ -n "$IS_MACOS" ]]; then # Custom tiff build to include jpeg; by default, configure won't include - # headers/libs in the custom macOS prefix. Explicitly disable webp, + # headers/libs in the custom macOS/iOS prefix. Explicitly disable webp, # libdeflate and zstd, because on x86_64 macs, it will pick up the # Homebrew versions of those libraries from /usr/local. build_simple tiff $TIFF_VERSION https://download.osgeo.org/libtiff tar.gz \ @@ -186,7 +268,10 @@ function build { build_tiff fi - build_libavif + if [[ -z "$IOS_SDK" ]]; then + # Short term workaround; don't build libavif on iOS + build_libavif + fi build_libpng build_lcms2 build_openjpeg @@ -201,14 +286,44 @@ function build { build_brotli - if [ -n "$IS_MACOS" ]; then + if [[ -n "$IS_MACOS" ]]; then # Custom freetype build build_simple freetype $FREETYPE_VERSION https://download.savannah.gnu.org/releases/freetype tar.gz --with-harfbuzz=no else build_freetype fi - build_harfbuzz + if [[ -z "$IOS_SDK" ]]; then + # On iOS, there's no vendor-provided raqm, and we can't ship it due to + # licensing, so there's no point building harfbuzz. + build_harfbuzz + fi +} + +function create_meson_cross_config { + cat << EOF > $WORKDIR/meson-cross.txt +[binaries] +pkg-config = '$BUILD_PREFIX/bin/pkg-config' +cmake = '$(which cmake)' +c = '$CC' +cpp = '$CXX' +strip = '$STRIP' + +[built-in options] +c_args = '$CFLAGS -I$BUILD_PREFIX/include' +cpp_args = '$CXXFLAGS -I$BUILD_PREFIX/include' +c_link_args = '$CFLAGS -L$BUILD_PREFIX/lib' +cpp_link_args = '$CFLAGS -L$BUILD_PREFIX/lib' + +[host_machine] +system = 'darwin' +subsystem = 'ios' +kernel = 'xnu' +cpu_family = '$(uname -m)' +cpu = '$(uname -m)' +endian = 'little' + +EOF } # Perform all dependency builds in the build subfolder. @@ -227,24 +342,40 @@ if [[ ! -d $WORKDIR/pillow-depends-main ]]; then fi if [[ -n "$IS_MACOS" ]]; then - # Homebrew (or similar packaging environments) install can contain some of - # the libraries that we're going to build. However, they may be compiled - # with a MACOSX_DEPLOYMENT_TARGET that doesn't match what we want to use, - # and they may bring in other dependencies that we don't want. The same will - # be true of any other locations on the path. To avoid conflicts, strip the - # path down to the bare minimum (which, on macOS, won't include any - # development dependencies). - export PATH="$BUILD_PREFIX/bin:$(dirname $(which python3)):/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin" - export CMAKE_PREFIX_PATH=$BUILD_PREFIX - # Ensure the basic structure of the build prefix directory exists. mkdir -p "$BUILD_PREFIX/bin" mkdir -p "$BUILD_PREFIX/lib" - # Ensure pkg-config is available + # Ensure pkg-config is available. This is done *before* setting CC, CFLAGS + # etc. to ensure that the build is *always* a macOS build, even when building + # for iOS. build_pkg_config - # Ensure cmake is available + + # Ensure cmake is available, and that the default prefix used by CMake is + # the build prefix python3 -m pip install cmake + export CMAKE_PREFIX_PATH=$BUILD_PREFIX + + if [[ -n "$IOS_SDK" ]]; then + export AR="$(xcrun --find --sdk $IOS_SDK ar)" + export CPP="$(xcrun --find --sdk $IOS_SDK clang) -E" + export CC=$(xcrun --find --sdk $IOS_SDK clang) + export CXX=$(xcrun --find --sdk $IOS_SDK clang++) + export LD=$(xcrun --find --sdk $IOS_SDK ld) + export STRIP=$(xcrun --find --sdk $IOS_SDK strip) + + CPPFLAGS="$CPPFLAGS --sysroot=$IOS_SDK_PATH" + CFLAGS="-target $IOS_HOST_TRIPLE --sysroot=$IOS_SDK_PATH -mios-version-min=$IPHONEOS_DEPLOYMENT_TARGET" + CXXFLAGS="-target $IOS_HOST_TRIPLE --sysroot=$IOS_SDK_PATH -mios-version-min=$IPHONEOS_DEPLOYMENT_TARGET" + + # Having IPHONEOS_DEPLOYMENT_TARGET in the environment causes problems + # with some cross-building toolchains, because it introduces implicit + # behavior into clang. + unset IPHONEOS_DEPLOYMENT_TARGET + + # Now that we know CC etc., we can create a meson cross-configuration file + create_meson_cross_config + fi fi wrap_wheel_builder build diff --git a/.github/workflows/wheels-test.ps1 b/.github/workflows/wheels-test.ps1 index 9f5561c46..e6453d091 100644 --- a/.github/workflows/wheels-test.ps1 +++ b/.github/workflows/wheels-test.ps1 @@ -15,15 +15,12 @@ if (Test-Path $venv\Scripts\pypy.exe) { $python = "python.exe" } & reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\python.exe" /v "GlobalFlag" /t REG_SZ /d "0x02000000" /f -if ("$venv" -like "*\cibw-run-*-win_amd64\*") { - & $venv\Scripts\$python -m pip install numpy -} cd $pillow & $venv\Scripts\$python -VV if (!$?) { exit $LASTEXITCODE } & $venv\Scripts\$python selftest.py if (!$?) { exit $LASTEXITCODE } -& $venv\Scripts\$python -m pytest -vv -x Tests\check_wheel.py +& $venv\Scripts\$python -m pytest -vv -x checks\check_wheel.py if (!$?) { exit $LASTEXITCODE } & $venv\Scripts\$python -m pytest -vv -x Tests if (!$?) { exit $LASTEXITCODE } diff --git a/.github/workflows/wheels-test.sh b/.github/workflows/wheels-test.sh index 94dbb4679..d73b6be58 100755 --- a/.github/workflows/wheels-test.sh +++ b/.github/workflows/wheels-test.sh @@ -25,8 +25,6 @@ else yum install -y fribidi fi -python3 -m pip install numpy - if [ ! -d "test-images-main" ]; then curl -fsSL -o pillow-test-images.zip https://github.com/python-pillow/test-images/archive/main.zip unzip pillow-test-images.zip @@ -35,5 +33,5 @@ fi # Runs tests python3 selftest.py -python3 -m pytest -vv -x Tests/check_wheel.py +python3 -m pytest -vv -x checks/check_wheel.py python3 -m pytest -vv -x diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 16c350a14..52a3f2cdb 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -51,40 +51,60 @@ jobs: matrix: include: - name: "macOS 10.10 x86_64" + platform: macos os: macos-13 cibw_arch: x86_64 build: "cp3{9,10,11}*" macosx_deployment_target: "10.10" - name: "macOS 10.13 x86_64" + platform: macos os: macos-13 cibw_arch: x86_64 build: "cp3{12,13,14}*" macosx_deployment_target: "10.13" - name: "macOS 10.15 x86_64" + platform: macos os: macos-13 cibw_arch: x86_64 build: "pp3*" macosx_deployment_target: "10.15" - name: "macOS arm64" + platform: macos os: macos-latest cibw_arch: arm64 macosx_deployment_target: "11.0" - name: "manylinux2014 and musllinux x86_64" + platform: linux os: ubuntu-latest cibw_arch: x86_64 - name: "manylinux_2_28 x86_64" + platform: linux os: ubuntu-latest cibw_arch: x86_64 build: "*manylinux*" manylinux: "manylinux_2_28" - name: "manylinux2014 and musllinux aarch64" + platform: linux os: ubuntu-24.04-arm cibw_arch: aarch64 - name: "manylinux_2_28 aarch64" + platform: linux os: ubuntu-24.04-arm cibw_arch: aarch64 build: "*manylinux*" manylinux: "manylinux_2_28" + - name: "iOS arm64 device" + platform: ios + os: macos-latest + cibw_arch: arm64_iphoneos + - name: "iOS arm64 simulator" + platform: ios + os: macos-latest + cibw_arch: arm64_iphonesimulator + - name: "iOS x86_64 simulator" + platform: ios + os: macos-13 + cibw_arch: x86_64_iphonesimulator steps: - uses: actions/checkout@v4 with: @@ -103,6 +123,7 @@ jobs: run: | python3 -m cibuildwheel --output-dir wheelhouse env: + CIBW_PLATFORM: ${{ matrix.platform }} CIBW_ARCHS: ${{ matrix.cibw_arch }} CIBW_BUILD: ${{ matrix.build }} CIBW_ENABLE: cpython-prerelease cpython-freethreading pypy @@ -114,7 +135,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: dist-${{ matrix.os }}${{ matrix.macosx_deployment_target && format('-{0}', matrix.macosx_deployment_target) }}-${{ matrix.cibw_arch }}${{ matrix.manylinux && format('-{0}', matrix.manylinux) }} + name: dist-${{ matrix.name }} path: ./wheelhouse/*.whl windows: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6abb732bb..d5fd964f1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: rev: v1.5.5 hooks: - id: remove-tabs - exclude: (Makefile$|\.bat$|\.cmake$|\.eps$|\.fits$|\.gd$|\.opt$) + exclude: (Makefile$|\.bat$|\.cmake$|\.eps$|\.fits$|\.gd$|\.opt$|\.patch$) - repo: https://github.com/pre-commit/mirrors-clang-format rev: v20.1.6 @@ -46,9 +46,9 @@ repos: - id: check-yaml args: [--allow-multiple-documents] - id: end-of-file-fixer - exclude: ^Tests/images/ + exclude: ^Tests/images/|\.patch$ - id: trailing-whitespace - exclude: ^.github/.*TEMPLATE|^Tests/(fonts|images)/ + exclude: ^.github/.*TEMPLATE|^Tests/(fonts|images)/|\.patch$ - repo: https://github.com/python-jsonschema/check-jsonschema rev: 0.33.1 diff --git a/MANIFEST.in b/MANIFEST.in index 48085b82e..95a6b1b92 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -13,6 +13,8 @@ include LICENSE include Makefile include tox.ini graft Tests +graft checks +graft patches graft src graft depends graft winbuild diff --git a/Tests/oss-fuzz/test_fuzzers.py b/Tests/oss-fuzz/test_fuzzers.py index e42ec90aa..37d11e0ba 100644 --- a/Tests/oss-fuzz/test_fuzzers.py +++ b/Tests/oss-fuzz/test_fuzzers.py @@ -10,8 +10,9 @@ import pytest from PIL import Image, features from Tests.helper import skip_unless_feature -if sys.platform.startswith("win32"): - pytest.skip("Fuzzer is linux only", allow_module_level=True) +if sys.platform.startswith("win32") or sys.platform == "ios": + pytest.skip("Fuzzer doesn't run on Windows or iOS", allow_module_level=True) + libjpeg_turbo_version = features.version("libjpeg_turbo") if libjpeg_turbo_version is not None: version = packaging.version.parse(libjpeg_turbo_version) diff --git a/Tests/test_main.py b/Tests/test_main.py index 2582dbee3..65e7a44d8 100644 --- a/Tests/test_main.py +++ b/Tests/test_main.py @@ -7,6 +7,7 @@ import sys import pytest +@pytest.mark.skipif(sys.platform == "ios", reason="Processes not supported on iOS") @pytest.mark.parametrize( "args, report", ((["PIL"], False), (["PIL", "--report"], True), (["PIL.report"], True)), diff --git a/Tests/test_pyroma.py b/Tests/test_pyroma.py index 8235daf32..9669f485a 100644 --- a/Tests/test_pyroma.py +++ b/Tests/test_pyroma.py @@ -1,5 +1,7 @@ from __future__ import annotations +from importlib.metadata import metadata + import pytest from PIL import __version__ @@ -9,7 +11,7 @@ pyroma = pytest.importorskip("pyroma", reason="Pyroma not installed") def test_pyroma() -> None: # Arrange - data = pyroma.projectdata.get_data(".") + data = pyroma.projectdata.map_metadata_keys(metadata("Pillow")) # Act rating = pyroma.ratings.rate(data) diff --git a/Tests/32bit_segfault_check.py b/checks/32bit_segfault_check.py similarity index 100% rename from Tests/32bit_segfault_check.py rename to checks/32bit_segfault_check.py diff --git a/Tests/check_fli_oob.py b/checks/check_fli_oob.py similarity index 100% rename from Tests/check_fli_oob.py rename to checks/check_fli_oob.py diff --git a/Tests/check_fli_overflow.py b/checks/check_fli_overflow.py similarity index 100% rename from Tests/check_fli_overflow.py rename to checks/check_fli_overflow.py diff --git a/Tests/check_icns_dos.py b/checks/check_icns_dos.py similarity index 100% rename from Tests/check_icns_dos.py rename to checks/check_icns_dos.py diff --git a/Tests/check_imaging_leaks.py b/checks/check_imaging_leaks.py similarity index 100% rename from Tests/check_imaging_leaks.py rename to checks/check_imaging_leaks.py diff --git a/Tests/check_j2k_dos.py b/checks/check_j2k_dos.py similarity index 100% rename from Tests/check_j2k_dos.py rename to checks/check_j2k_dos.py diff --git a/Tests/check_j2k_leaks.py b/checks/check_j2k_leaks.py similarity index 100% rename from Tests/check_j2k_leaks.py rename to checks/check_j2k_leaks.py diff --git a/Tests/check_j2k_overflow.py b/checks/check_j2k_overflow.py similarity index 100% rename from Tests/check_j2k_overflow.py rename to checks/check_j2k_overflow.py diff --git a/Tests/check_jp2_overflow.py b/checks/check_jp2_overflow.py similarity index 100% rename from Tests/check_jp2_overflow.py rename to checks/check_jp2_overflow.py diff --git a/Tests/check_jpeg_leaks.py b/checks/check_jpeg_leaks.py similarity index 100% rename from Tests/check_jpeg_leaks.py rename to checks/check_jpeg_leaks.py diff --git a/Tests/check_large_memory.py b/checks/check_large_memory.py similarity index 100% rename from Tests/check_large_memory.py rename to checks/check_large_memory.py diff --git a/Tests/check_large_memory_numpy.py b/checks/check_large_memory_numpy.py similarity index 100% rename from Tests/check_large_memory_numpy.py rename to checks/check_large_memory_numpy.py diff --git a/Tests/check_libtiff_segfault.py b/checks/check_libtiff_segfault.py similarity index 100% rename from Tests/check_libtiff_segfault.py rename to checks/check_libtiff_segfault.py diff --git a/Tests/check_png_dos.py b/checks/check_png_dos.py similarity index 100% rename from Tests/check_png_dos.py rename to checks/check_png_dos.py diff --git a/Tests/check_release_notes.py b/checks/check_release_notes.py similarity index 100% rename from Tests/check_release_notes.py rename to checks/check_release_notes.py diff --git a/Tests/check_wheel.py b/checks/check_wheel.py similarity index 75% rename from Tests/check_wheel.py rename to checks/check_wheel.py index a78fb09b0..c89d32ed7 100644 --- a/Tests/check_wheel.py +++ b/checks/check_wheel.py @@ -4,8 +4,7 @@ import platform import sys from PIL import features - -from .helper import is_pypy +from Tests.helper import is_pypy def test_wheel_modules() -> None: @@ -24,6 +23,11 @@ def test_wheel_modules() -> None: if platform.machine() == "ARM64": expected_modules.remove("avif") + elif sys.platform == "ios": + # tkinter is not available on iOS + # libavif is not available on iOS (for now) + expected_modules -= {"tkinter", "avif"} + assert set(features.get_supported_modules()) == expected_modules @@ -50,5 +54,9 @@ def test_wheel_features() -> None: expected_features.remove("xcb") elif sys.platform == "darwin" and not is_pypy() and platform.processor() != "arm": expected_features.remove("zlib_ng") + elif sys.platform == "ios": + # Can't distribute raqm due to licensing, and there's no system version; + # fribidi and harfbuzz won't be available if raqm isn't available. + expected_features -= {"raqm", "fribidi", "harfbuzz"} assert set(features.get_supported_features()) == expected_features diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index 2d35d8228..4af1f68ed 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -68,7 +68,13 @@ AVIF support in wheels ^^^^^^^^^^^^^^^^^^^^^^ Support for reading and writing AVIF images is now included in Pillow's wheels, except -for Windows ARM64. libaom is available as an encoder and dav1d as a decoder. +for Windows ARM64 and iOS. libaom is available as an encoder and dav1d as a decoder. + +iOS +^^^ + +Pillow now provides wheels that can be used on iOS ARM64 devices, and on the iOS +simulator on ARM64 and x86_64. Currently, only Python 3.13 wheels are available. Python 3.14 beta ^^^^^^^^^^^^^^^^ diff --git a/patches/README.md b/patches/README.md new file mode 100644 index 000000000..ff4a8f099 --- /dev/null +++ b/patches/README.md @@ -0,0 +1,14 @@ +Although we try to use official sources for dependencies, sometimes the official +sources don't support a platform (especially mobile platforms), or there's a bug +fix/feature that is required to support Pillow's usage. + +This folder contains patches that must be applied to official sources, organized +by the platforms that need those patches. + +Each patch is against the root of the unpacked official tarball, and is named by +appending `.patch` to the end of the tarball that is to be patched. This +includes the full version number; so if the version is bumped, the patch will +at a minimum require a filename change. + +Wherever possible, these patches should be contributed upstream, in the hope that +future Pillow versions won't need to maintain these patches. diff --git a/patches/iOS/brotli-1.1.0.tar.gz.patch b/patches/iOS/brotli-1.1.0.tar.gz.patch new file mode 100644 index 000000000..f165a9ac1 --- /dev/null +++ b/patches/iOS/brotli-1.1.0.tar.gz.patch @@ -0,0 +1,46 @@ +# Brotli 1.1.0 doesn't have explicit support for iOS as a CMAKE_SYSTEM_NAME. +# That release was from 2023; there have been subsequent changes that allow +# Brotli to build on iOS without any patches, as long as -DBROTLI_BUILD_TOOLS=NO +# is specified on the command line. +# +diff -ru brotli-1.1.0-orig/CMakeLists.txt brotli-1.1.0/CMakeLists.txt +--- brotli-1.1.0-orig/CMakeLists.txt 2023-08-29 19:00:29 ++++ brotli-1.1.0/CMakeLists.txt 2024-11-07 10:46:26 +@@ -114,6 +114,8 @@ + add_definitions(-DOS_MACOSX) + set(CMAKE_MACOS_RPATH TRUE) + set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib") ++elseif(${CMAKE_SYSTEM_NAME} MATCHES "iOS") ++ add_definitions(-DOS_IOS) + endif() + + if(BROTLI_EMSCRIPTEN) +@@ -174,10 +176,12 @@ + + # Installation + if(NOT BROTLI_BUNDLED_MODE) +- install( +- TARGETS brotli +- RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" +- ) ++ if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "iOS") ++ install( ++ TARGETS brotli ++ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ++ ) ++ endif() + + install( + TARGETS ${BROTLI_LIBRARIES_CORE} +diff -ru brotli-1.1.0-orig/c/common/platform.h brotli-1.1.0/c/common/platform.h +--- brotli-1.1.0-orig/c/common/platform.h 2023-08-29 19:00:29 ++++ brotli-1.1.0/c/common/platform.h 2024-11-07 10:47:28 +@@ -33,7 +33,7 @@ + #include + #elif defined(OS_FREEBSD) + #include +-#elif defined(OS_MACOSX) ++#elif defined(OS_MACOSX) || defined(OS_IOS) + #include + /* Let's try and follow the Linux convention */ + #define BROTLI_X_BYTE_ORDER BYTE_ORDER diff --git a/patches/iOS/libwebp-1.5.0.tar.gz.patch b/patches/iOS/libwebp-1.5.0.tar.gz.patch new file mode 100644 index 000000000..fefb72b68 --- /dev/null +++ b/patches/iOS/libwebp-1.5.0.tar.gz.patch @@ -0,0 +1,42 @@ +# libwebp example binaries require dependencies that aren't available for iOS builds. +# There's also no easy way to invoke the build to *exclude* the example builds. +# Since we don't need the examples anyway, remove them from the Makefile. +# +# As a point of reference, libwebp provides an XCFramework build script that involves +# 7 separate invocations of make to avoid building the examples. Patching the Makefile +# to remove the examples is a simpler approach, and one that is more compatible with +# the existing multibuild infrastructure. +# +# In the next release, it should be possible to pass --disable-libwebpexamples +# instead of applying this patch. +# +diff -ur libwebp-1.5.0-orig/Makefile.am libwebp-1.5.0/Makefile.am +--- libwebp-1.5.0-orig/Makefile.am 2024-12-20 09:17:50 ++++ libwebp-1.5.0/Makefile.am 2025-01-09 11:24:17 +@@ -5,5 +5,3 @@ + if BUILD_EXTRAS + SUBDIRS += extras + endif +- +-SUBDIRS += examples +diff -ur libwebp-1.5.0-orig/Makefile.in libwebp-1.5.0/Makefile.in +--- libwebp-1.5.0-orig/Makefile.in 2024-12-20 09:52:53 ++++ libwebp-1.5.0/Makefile.in 2025-01-09 11:24:17 +@@ -156,7 +156,7 @@ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +-DIST_SUBDIRS = sharpyuv src imageio man extras examples ++DIST_SUBDIRS = sharpyuv src imageio man extras + am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/src/webp/config.h.in AUTHORS COPYING ChangeLog \ + NEWS README.md ar-lib compile config.guess config.sub \ +@@ -351,7 +351,7 @@ + top_srcdir = @top_srcdir@ + webp_libname_prefix = @webp_libname_prefix@ + ACLOCAL_AMFLAGS = -I m4 +-SUBDIRS = sharpyuv src imageio man $(am__append_1) examples ++SUBDIRS = sharpyuv src imageio man $(am__append_1) + EXTRA_DIST = COPYING autogen.sh + all: all-recursive + diff --git a/pyproject.toml b/pyproject.toml index 683ab24ef..582d742b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,15 +103,55 @@ before-all = ".github/workflows/wheels-dependencies.sh" build-verbosity = 1 config-settings = "raqm=enable raqm=vendor fribidi=vendor imagequant=disable" -# Disable platform guessing on macOS -macos.config-settings = "raqm=enable raqm=vendor fribidi=vendor imagequant=disable platform-guessing=disable" test-command = "cd {project} && .github/workflows/wheels-test.sh" test-extras = "tests" +test-requires = [ + "numpy", +] +xbuild-tools = [ ] + +[tool.cibuildwheel.macos] +# Disable platform guessing on macOS to avoid picking up Homebrew etc. +config-settings = "raqm=enable raqm=vendor fribidi=vendor imagequant=disable platform-guessing=disable" [tool.cibuildwheel.macos.environment] +# Isolate macOS build environment from Homebrew etc. PATH = "$(pwd)/build/deps/darwin/bin:$(dirname $(which python3)):/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin" +[tool.cibuildwheel.ios] +# Disable platform guessing on iOS, and disable raqm (since there won't be a +# vendor version, and we can't distribute it due to licensing) +config-settings = "raqm=disable imagequant=disable platform-guessing=disable" + +# iOS needs to be given a specific pytest invocation and list of test sources. +test-sources = [ + "checks", + "Tests", + "selftest.py", +] +test-command = [ + "python -m selftest", + "python -m pytest -vv -x -W always checks/check_wheel.py Tests", +] + +# There's no numpy wheel for iOS (yet...) +test-requires = [ ] + +[[tool.cibuildwheel.overrides]] +# iOS environment is isolated by cibuildwheel, but needs the dependencies +select = "*_iphoneos" +environment.PATH = "$(pwd)/build/deps/iphoneos/bin:$PATH" + +[[tool.cibuildwheel.overrides]] +# iOS simulator environment is isolated by cibuildwheel, but needs the dependencies +select = "*_iphonesimulator" +environment.PATH = "$(pwd)/build/deps/iphonesimulator/bin:$PATH" + +[[tool.cibuildwheel.overrides]] +select = "*-win32" +test-requires = [ ] + [tool.black] exclude = "wheels/multibuild" @@ -168,7 +208,7 @@ lint.isort.required-imports = [ max_supported_python = "3.13" [tool.pytest.ini_options] -addopts = "-ra --color=yes" +addopts = "-ra --color=auto" testpaths = [ "Tests", ] diff --git a/setup.py b/setup.py index 354e09f85..477d187a2 100644 --- a/setup.py +++ b/setup.py @@ -473,6 +473,19 @@ class pil_build_ext(build_ext): sdk_path = commandlinetools_sdk_path return sdk_path + def get_ios_sdk_path(self) -> str: + try: + sdk = sys.implementation._multiarch.split("-")[-1] + _dbg("Using %s SDK", sdk) + return ( + subprocess.check_output(["xcrun", "--show-sdk-path", "--sdk", sdk]) + .strip() + .decode("latin1") + ) + except Exception: + msg = "Unable to identify location of iOS SDK." + raise ValueError(msg) + def build_extensions(self) -> None: library_dirs: list[str] = [] include_dirs: list[str] = [] @@ -622,6 +635,18 @@ class pil_build_ext(build_ext): for extension in self.extensions: extension.extra_compile_args = ["-Wno-nullability-completeness"] + + elif sys.platform == "ios": + # Add the iOS SDK path. + sdk_path = self.get_ios_sdk_path() + + # Add the iOS SDK path. + _add_directory(library_dirs, os.path.join(sdk_path, "usr", "lib")) + _add_directory(include_dirs, os.path.join(sdk_path, "usr", "include")) + + for extension in self.extensions: + extension.extra_compile_args = ["-Wno-nullability-completeness"] + elif sys.platform.startswith(("linux", "gnu", "freebsd")): for dirname in _find_library_dirs_ldconfig(): _add_directory(library_dirs, dirname) @@ -877,6 +902,9 @@ class pil_build_ext(build_ext): # so we have to guess; by default it is defined in all Windows builds. # See #4237, #5243, #5359 for more information. defs.append(("USE_WIN32_FILEIO", None)) + elif sys.platform == "ios": + # Ensure transitive dependencies are linked. + libs.append("lzma") if feature.get("jpeg"): libs.append(feature.get("jpeg")) defs.append(("HAVE_LIBJPEG", None)) @@ -893,6 +921,9 @@ class pil_build_ext(build_ext): defs.append(("HAVE_LIBIMAGEQUANT", None)) if feature.get("xcb"): libs.append(feature.get("xcb")) + if sys.platform == "ios": + # Ensure transitive dependencies are linked. + libs.append("Xau") defs.append(("HAVE_XCB", None)) if sys.platform == "win32": libs.extend(["kernel32", "user32", "gdi32"]) @@ -924,6 +955,11 @@ class pil_build_ext(build_ext): libs.append(feature.get("fribidi")) else: # building FriBiDi shim from src/thirdparty srcs.append("src/thirdparty/fribidi-shim/fribidi.c") + + if sys.platform == "ios": + # Ensure transitive dependencies are linked. + libs.extend(["z", "bz2", "brotlicommon", "brotlidec", "png"]) + self._update_extension("PIL._imagingft", libs, defs, srcs) else: @@ -940,6 +976,9 @@ class pil_build_ext(build_ext): webp = feature.get("webp") if isinstance(webp, str): libs = [webp, webp + "mux", webp + "demux"] + if sys.platform == "ios": + # Ensure transitive dependencies are linked. + libs.append("sharpyuv") self._update_extension("PIL._webp", libs) else: self._remove_extension("PIL._webp") From 204d11d4da15879946c1120c43e6f75b2a338d5b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 30 Jun 2025 22:29:24 +1000 Subject: [PATCH 244/268] Raise FileNotFoundError when opening an empty path --- Tests/test_image.py | 4 ++++ src/PIL/Image.py | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 069083b19..6b8b6d42b 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -160,6 +160,10 @@ class TestImage: with pytest.raises(AttributeError): im.mode = "P" # type: ignore[misc] + def test_empty_path(self) -> None: + with pytest.raises(FileNotFoundError): + Image.open("") + def test_invalid_image(self) -> None: im = io.BytesIO(b"") with pytest.raises(UnidentifiedImageError): diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 9fc1c7067..d209405c4 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -3510,8 +3510,6 @@ def open( filename: str | bytes = "" if is_path(fp): filename = os.fspath(fp) - - if filename: fp = builtins.open(filename, "rb") exclusive_fp = True else: From f2de251c769ed76acfe94b54cc87c2aee77bdadf Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 1 Jul 2025 15:17:56 +1000 Subject: [PATCH 245/268] Updated check script paths (#9052) --- .coveragerc | 3 +-- Makefile | 2 +- checks/check_jpeg_leaks.py | 2 +- codecov.yml | 3 +-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.coveragerc b/.coveragerc index a94a25678..1f474015e 100644 --- a/.coveragerc +++ b/.coveragerc @@ -18,6 +18,5 @@ exclude_also = [run] omit = - Tests/32bit_segfault_check.py - Tests/check_*.py + checks/*.py Tests/createfontdatachunk.py diff --git a/Makefile b/Makefile index ce780acbc..6e050c715 100644 --- a/Makefile +++ b/Makefile @@ -75,7 +75,7 @@ debug: .PHONY: release-test release-test: - python3 Tests/check_release_notes.py + python3 checks/check_release_notes.py python3 -m pip install -e .[tests] python3 selftest.py python3 -m pytest Tests diff --git a/checks/check_jpeg_leaks.py b/checks/check_jpeg_leaks.py index 5f290c6cd..2f42ad734 100644 --- a/checks/check_jpeg_leaks.py +++ b/checks/check_jpeg_leaks.py @@ -13,7 +13,7 @@ iterations = 5000 When run on a system without the jpeg leak fixes, the valgrind runs look like this. -valgrind --tool=massif python test-installed.py -s -v Tests/check_jpeg_leaks.py +valgrind --tool=massif python test-installed.py -s -v checks/check_jpeg_leaks.py """ diff --git a/codecov.yml b/codecov.yml index 84920238f..c29b4bc90 100644 --- a/codecov.yml +++ b/codecov.yml @@ -16,6 +16,5 @@ coverage: # Matches 'omit:' in .coveragerc ignore: - - "Tests/32bit_segfault_check.py" - - "Tests/check_*.py" + - "checks/*.py" - "Tests/createfontdatachunk.py" From 89f1f4626a2aaf5f3d5ca6437f41def2998fbe09 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 17:41:24 +1000 Subject: [PATCH 246/268] 11.3.0 version bump --- src/PIL/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/_version.py b/src/PIL/_version.py index ac678c7d2..74e63356c 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,4 +1,4 @@ # Master version for Pillow from __future__ import annotations -__version__ = "11.3.0.dev0" +__version__ = "11.3.0" From 37cd041e5e9041b0708551c02655328e8761226d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 19:25:23 +1000 Subject: [PATCH 247/268] 12.0.0.dev0 version bump --- src/PIL/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PIL/_version.py b/src/PIL/_version.py index 74e63356c..6a3c01f26 100644 --- a/src/PIL/_version.py +++ b/src/PIL/_version.py @@ -1,4 +1,4 @@ # Master version for Pillow from __future__ import annotations -__version__ = "11.3.0" +__version__ = "12.0.0.dev0" From 0cd2d3b24b32d458ad47f885314e20faaab548a1 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Tue, 1 Jul 2025 09:10:20 -0400 Subject: [PATCH 248/268] Setup nit: "fork" should be lowercased --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 582d742b4..abab61e6b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ backend-path = [ [project] name = "pillow" -description = "Python Imaging Library (Fork)" +description = "Python Imaging Library (fork)" readme = "README.md" keywords = [ "Imaging", From d4ef93150f055c342baccd01e079eb70a9e7f189 Mon Sep 17 00:00:00 2001 From: "Jeffrey A. Clark" Date: Tue, 1 Jul 2025 09:25:32 -0400 Subject: [PATCH 249/268] Thanks, folks! As a general rule I think we should acknowledge when significant contribtions come from outside the core team. We know the core team does a lot of work (thank you!) but it's not always obvious when significant contributions come from outside the core team. In the old change log, we had ACKs via `[radarhere]` syntax which I miss. I don't expect we'll start using the old change log again but maybe we can make a note in the release notes to include such ACKs as needed and appropriate. --- docs/releasenotes/11.3.0.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/releasenotes/11.3.0.rst b/docs/releasenotes/11.3.0.rst index 4af1f68ed..409d50295 100644 --- a/docs/releasenotes/11.3.0.rst +++ b/docs/releasenotes/11.3.0.rst @@ -69,12 +69,14 @@ AVIF support in wheels Support for reading and writing AVIF images is now included in Pillow's wheels, except for Windows ARM64 and iOS. libaom is available as an encoder and dav1d as a decoder. +(Thank you Frankie Dintino and Andrew Murray!) iOS ^^^ Pillow now provides wheels that can be used on iOS ARM64 devices, and on the iOS simulator on ARM64 and x86_64. Currently, only Python 3.13 wheels are available. +(Thank you Russell Keith-Magee and Andrew Murray!) Python 3.14 beta ^^^^^^^^^^^^^^^^ From 583f0a50d50107bf7857548efa5c990d1a7cb362 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 23:57:46 +1000 Subject: [PATCH 250/268] Removed BGR;15, BGR;16 and BGR;24 modes --- Tests/helper.py | 18 +++---- Tests/test_image.py | 32 +++-------- Tests/test_image_access.py | 16 +----- Tests/test_image_putdata.py | 10 ---- Tests/test_image_resize.py | 2 +- Tests/test_lib_pack.py | 12 ----- docs/deprecations.rst | 15 +++--- docs/reference/arrow_support.rst | 4 +- src/PIL/Image.py | 11 +--- src/PIL/ImageMode.py | 7 --- src/_imaging.c | 91 ++++++++------------------------ src/libImaging/Access.c | 38 ------------- src/libImaging/Convert.c | 35 ------------ src/libImaging/Pack.c | 9 ---- src/libImaging/Storage.c | 30 ----------- src/libImaging/Unpack.c | 10 ---- 16 files changed, 50 insertions(+), 290 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index e71b4665b..34e4d6e75 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -271,17 +271,13 @@ def _cached_hopper(mode: str) -> Image.Image: im = hopper("L") else: im = hopper() - if mode.startswith("BGR;"): - with pytest.warns(DeprecationWarning, match="BGR;"): - im = im.convert(mode) - else: - try: - im = im.convert(mode) - except ImportError: - if mode == "LAB": - im = Image.open("Tests/images/hopper.Lab.tif") - else: - raise + try: + im = im.convert(mode) + except ImportError: + if mode == "LAB": + im = Image.open("Tests/images/hopper.Lab.tif") + else: + raise return im diff --git a/Tests/test_image.py b/Tests/test_image.py index 6b8b6d42b..1aa810e22 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -30,7 +30,6 @@ from .helper import ( assert_image_similar_tofile, assert_not_all_same, hopper, - is_big_endian, is_win32, mark_if_feature_version, skip_unless_feature, @@ -50,19 +49,10 @@ except ImportError: PrettyPrinter = None -# Deprecation helper -def helper_image_new(mode: str, size: tuple[int, int]) -> Image.Image: - if mode.startswith("BGR;"): - with pytest.warns(DeprecationWarning, match="BGR;"): - return Image.new(mode, size) - else: - return Image.new(mode, size) - - class TestImage: - @pytest.mark.parametrize("mode", Image.MODES + ["BGR;15", "BGR;16", "BGR;24"]) + @pytest.mark.parametrize("mode", Image.MODES) def test_image_modes_success(self, mode: str) -> None: - helper_image_new(mode, (1, 1)) + Image.new(mode, (1, 1)) @pytest.mark.parametrize("mode", ("", "bad", "very very long")) def test_image_modes_fail(self, mode: str) -> None: @@ -1148,33 +1138,27 @@ class TestImage: class TestImageBytes: - @pytest.mark.parametrize("mode", Image.MODES + ["BGR;15", "BGR;16", "BGR;24"]) + @pytest.mark.parametrize("mode", Image.MODES) def test_roundtrip_bytes_constructor(self, mode: str) -> None: im = hopper(mode) source_bytes = im.tobytes() - if mode.startswith("BGR;"): - with pytest.warns(DeprecationWarning, match=mode): - reloaded = Image.frombytes(mode, im.size, source_bytes) - else: - reloaded = Image.frombytes(mode, im.size, source_bytes) + reloaded = Image.frombytes(mode, im.size, source_bytes) assert reloaded.tobytes() == source_bytes - @pytest.mark.parametrize("mode", Image.MODES + ["BGR;15", "BGR;16", "BGR;24"]) + @pytest.mark.parametrize("mode", Image.MODES) def test_roundtrip_bytes_method(self, mode: str) -> None: im = hopper(mode) source_bytes = im.tobytes() - reloaded = helper_image_new(mode, im.size) + reloaded = Image.new(mode, im.size) reloaded.frombytes(source_bytes) assert reloaded.tobytes() == source_bytes - @pytest.mark.parametrize("mode", Image.MODES + ["BGR;15", "BGR;16", "BGR;24"]) + @pytest.mark.parametrize("mode", Image.MODES) def test_getdata_putdata(self, mode: str) -> None: - if is_big_endian() and mode == "BGR;15": - pytest.xfail("Known failure of BGR;15 on big-endian") im = hopper(mode) - reloaded = helper_image_new(mode, im.size) + reloaded = Image.new(mode, im.size) reloaded.putdata(im.getdata()) assert_image_equal(im, reloaded) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 66412a035..b3de5c13d 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -123,10 +123,6 @@ class TestImageGetPixel: bands = Image.getmodebands(mode) if bands == 1: return 1 - if mode in ("BGR;15", "BGR;16"): - # These modes have less than 8 bits per band, - # so (1, 2, 3) cannot be roundtripped. - return (16, 32, 49) return tuple(range(1, bands + 1)) def check(self, mode: str, expected_color_int: int | None = None) -> None: @@ -191,11 +187,6 @@ class TestImageGetPixel: def test_basic(self, mode: str) -> None: self.check(mode) - @pytest.mark.parametrize("mode", ("BGR;15", "BGR;16", "BGR;24")) - def test_deprecated(self, mode: str) -> None: - with pytest.warns(DeprecationWarning, match="BGR;"): - self.check(mode) - def test_list(self) -> None: im = hopper() assert im.getpixel([0, 0]) == (20, 20, 70) @@ -218,7 +209,7 @@ class TestImageGetPixel: class TestImagePutPixelError: - IMAGE_MODES1 = ["LA", "RGB", "RGBA", "BGR;15"] + IMAGE_MODES1 = ["LA", "RGB", "RGBA"] IMAGE_MODES2 = ["L", "I", "I;16"] INVALID_TYPES = ["foo", 1.0, None] @@ -234,11 +225,6 @@ class TestImagePutPixelError: ( ("L", (0, 2), "color must be int or single-element tuple"), ("LA", (0, 3), "color must be int, or tuple of one or two elements"), - ( - "BGR;15", - (0, 2), - "color must be int, or tuple of one or three elements", - ), ( "RGB", (0, 2, 5), diff --git a/Tests/test_image_putdata.py b/Tests/test_image_putdata.py index 34c1763b8..bf8e89b53 100644 --- a/Tests/test_image_putdata.py +++ b/Tests/test_image_putdata.py @@ -78,16 +78,6 @@ def test_mode_F() -> None: assert list(im.getdata()) == target -@pytest.mark.parametrize("mode", ("BGR;15", "BGR;16", "BGR;24")) -def test_mode_BGR(mode: str) -> None: - data = [(16, 32, 49), (32, 32, 98)] - with pytest.warns(DeprecationWarning, match=mode): - im = Image.new(mode, (1, 2)) - im.putdata(data) - - assert list(im.getdata()) == data - - def test_array_B() -> None: # shouldn't segfault # see https://github.com/python-pillow/Pillow/issues/1008 diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index f700d20c0..270500a44 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -324,7 +324,7 @@ class TestImageResize: im = hopper(mode) assert im.resize((20, 20), Image.Resampling.BICUBIC) == im.resize((20, 20)) - @pytest.mark.parametrize("mode", ("1", "P", "BGR;15", "BGR;16")) + @pytest.mark.parametrize("mode", ("1", "P")) def test_default_filter_nearest(self, mode: str) -> None: im = hopper(mode) assert im.resize((20, 20), Image.Resampling.NEAREST) == im.resize((20, 20)) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 2d6af70eb..da6157d4e 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -361,18 +361,6 @@ class TestLibUnpack: "RGB", "CMYK", 4, (250, 249, 248), (242, 241, 240), (234, 233, 233) ) - def test_BGR(self) -> None: - with pytest.warns(DeprecationWarning, match="BGR;15"): - self.assert_unpack( - "BGR;15", "BGR;15", 3, (8, 131, 0), (24, 0, 8), (41, 131, 8) - ) - with pytest.warns(DeprecationWarning, match="BGR;16"): - self.assert_unpack( - "BGR;16", "BGR;16", 3, (8, 64, 0), (24, 129, 0), (41, 194, 0) - ) - with pytest.warns(DeprecationWarning, match="BGR;24"): - self.assert_unpack("BGR;24", "BGR;24", 3, (1, 2, 3), (4, 5, 6), (7, 8, 9)) - def test_RGBA(self) -> None: self.assert_unpack("RGBA", "LA", 2, (1, 1, 1, 2), (3, 3, 3, 4), (5, 5, 5, 6)) self.assert_unpack( diff --git a/docs/deprecations.rst b/docs/deprecations.rst index def98b80a..b4eb1fa4c 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -78,13 +78,6 @@ ImageMath eval() ``ImageMath.eval()`` has been deprecated. Use :py:meth:`~PIL.ImageMath.lambda_eval` or :py:meth:`~PIL.ImageMath.unsafe_eval` instead. -BGR;15, BGR 16 and BGR;24 -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.4.0 - -The experimental BGR;15, BGR;16 and BGR;24 modes have been deprecated. - Non-image modes in ImageCms ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -221,6 +214,14 @@ Removed features Deprecated features are only removed in major releases after an appropriate period of deprecation has passed. +BGR;15, BGR 16 and BGR;24 +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +The experimental BGR;15, BGR;16 and BGR;24 modes have been removed. + TiffImagePlugin IFD_LEGACY_API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/reference/arrow_support.rst b/docs/reference/arrow_support.rst index 063046d8c..8e8b86c8e 100644 --- a/docs/reference/arrow_support.rst +++ b/docs/reference/arrow_support.rst @@ -21,9 +21,7 @@ with any Arrow provider or consumer in the Python ecosystem. Data formats ============ -Pillow currently supports exporting Arrow images in all modes -**except** for ``BGR;15``, ``BGR;16`` and ``BGR;24``. This is due to -line-length packing in these modes making for non-continuous memory. +Pillow currently supports exporting Arrow images in all modes. For single-band images, the exported array is width*height elements, with each pixel corresponding to the appropriate Arrow type. diff --git a/src/PIL/Image.py b/src/PIL/Image.py index d209405c4..9df253498 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -980,9 +980,6 @@ class Image: :returns: An :py:class:`~PIL.Image.Image` object. """ - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - self.load() has_transparency = "transparency" in self.info @@ -2229,8 +2226,6 @@ class Image: :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. If the image has mode "1" or "P", it is always set to - :py:data:`Resampling.NEAREST`. If the image mode is "BGR;15", - "BGR;16" or "BGR;24", then the default filter is :py:data:`Resampling.NEAREST`. Otherwise, the default filter is :py:data:`Resampling.BICUBIC`. See: :ref:`concept-filters`. :param box: An optional 4-tuple of floats providing @@ -2253,8 +2248,7 @@ class Image: """ if resample is None: - bgr = self.mode.startswith("BGR;") - resample = Resampling.NEAREST if bgr else Resampling.BICUBIC + resample = Resampling.BICUBIC elif resample not in ( Resampling.NEAREST, Resampling.BILINEAR, @@ -3085,9 +3079,6 @@ def new( :returns: An :py:class:`~PIL.Image.Image` object. """ - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - _check_size(size) if color is None: diff --git a/src/PIL/ImageMode.py b/src/PIL/ImageMode.py index 92a08d2cb..b7c6c8636 100644 --- a/src/PIL/ImageMode.py +++ b/src/PIL/ImageMode.py @@ -18,8 +18,6 @@ import sys from functools import lru_cache from typing import NamedTuple -from ._deprecate import deprecate - class ModeDescriptor(NamedTuple): """Wrapper for mode strings.""" @@ -57,16 +55,11 @@ def getmode(mode: str) -> ModeDescriptor: "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), # extra experimental modes "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), - "BGR;15": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;16": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;24": ("RGB", "L", ("B", "G", "R"), "|u1"), "LA": ("L", "L", ("L", "A"), "|u1"), "La": ("L", "L", ("L", "a"), "|u1"), "PA": ("RGB", "L", ("P", "A"), "|u1"), } if mode in modes: - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) base_mode, base_type, bands, type_str = modes[mode] return ModeDescriptor(mode, bands, base_mode, base_type, type_str) diff --git a/src/_imaging.c b/src/_imaging.c index 6f13834a9..7cc1fb1a4 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -681,30 +681,6 @@ getink(PyObject *color, Imaging im, char *ink) { } else if (!PyArg_ParseTuple(color, "iiL", &b, &g, &r)) { return NULL; } - if (!strcmp(im->mode, "BGR;15")) { - UINT16 v = ((((UINT16)r) << 7) & 0x7c00) + - ((((UINT16)g) << 2) & 0x03e0) + - ((((UINT16)b) >> 3) & 0x001f); - - ink[0] = (UINT8)v; - ink[1] = (UINT8)(v >> 8); - ink[2] = ink[3] = 0; - return ink; - } else if (!strcmp(im->mode, "BGR;16")) { - UINT16 v = ((((UINT16)r) << 8) & 0xf800) + - ((((UINT16)g) << 3) & 0x07e0) + - ((((UINT16)b) >> 3) & 0x001f); - ink[0] = (UINT8)v; - ink[1] = (UINT8)(v >> 8); - ink[2] = ink[3] = 0; - return ink; - } else if (!strcmp(im->mode, "BGR;24")) { - ink[0] = (UINT8)b; - ink[1] = (UINT8)g; - ink[2] = (UINT8)r; - ink[3] = 0; - return ink; - } } } @@ -1650,54 +1626,33 @@ _putdata(ImagingObject *self, PyObject *args) { return NULL; } double value; - if (image->bands == 1) { - int bigendian = 0; - if (image->type == IMAGING_TYPE_SPECIAL) { - // I;16* - if ( - strcmp(image->mode, "I;16B") == 0 + int bigendian = 0; + if (image->type == IMAGING_TYPE_SPECIAL) { + // I;16* + if ( + strcmp(image->mode, "I;16B") == 0 #ifdef WORDS_BIGENDIAN - || strcmp(image->mode, "I;16N") == 0 + || strcmp(image->mode, "I;16N") == 0 #endif - ) { - bigendian = 1; - } + ) { + bigendian = 1; } - for (i = x = y = 0; i < n; i++) { - set_value_to_item(seq, i); - if (scale != 1.0 || offset != 0.0) { - value = value * scale + offset; - } - if (image->type == IMAGING_TYPE_SPECIAL) { - image->image8[y][x * 2 + (bigendian ? 1 : 0)] = - CLIP8((int)value % 256); - image->image8[y][x * 2 + (bigendian ? 0 : 1)] = - CLIP8((int)value >> 8); - } else { - image->image8[y][x] = (UINT8)CLIP8(value); - } - if (++x >= (int)image->xsize) { - x = 0, y++; - } + } + for (i = x = y = 0; i < n; i++) { + set_value_to_item(seq, i); + if (scale != 1.0 || offset != 0.0) { + value = value * scale + offset; } - } else { - // BGR;* - int b; - for (i = x = y = 0; i < n; i++) { - char ink[4]; - - op = PySequence_Fast_GET_ITEM(seq, i); - if (!op || !getink(op, image, ink)) { - Py_DECREF(seq); - return NULL; - } - /* FIXME: what about scale and offset? */ - for (b = 0; b < image->pixelsize; b++) { - image->image8[y][x * image->pixelsize + b] = ink[b]; - } - if (++x >= (int)image->xsize) { - x = 0, y++; - } + if (image->type == IMAGING_TYPE_SPECIAL) { + image->image8[y][x * 2 + (bigendian ? 1 : 0)] = + CLIP8((int)value % 256); + image->image8[y][x * 2 + (bigendian ? 0 : 1)] = + CLIP8((int)value >> 8); + } else { + image->image8[y][x] = (UINT8)CLIP8(value); + } + if (++x >= (int)image->xsize) { + x = 0, y++; } } PyErr_Clear(); /* Avoid weird exceptions */ diff --git a/src/libImaging/Access.c b/src/libImaging/Access.c index 1c1937105..3db52377e 100644 --- a/src/libImaging/Access.c +++ b/src/libImaging/Access.c @@ -82,31 +82,6 @@ get_pixel_16B(Imaging im, int x, int y, void *color) { #endif } -static void -get_pixel_BGR15(Imaging im, int x, int y, void *color) { - UINT8 *in = (UINT8 *)&im->image8[y][x * 2]; - UINT16 pixel = in[0] + (in[1] << 8); - char *out = color; - out[0] = (pixel & 31) * 255 / 31; - out[1] = ((pixel >> 5) & 31) * 255 / 31; - out[2] = ((pixel >> 10) & 31) * 255 / 31; -} - -static void -get_pixel_BGR16(Imaging im, int x, int y, void *color) { - UINT8 *in = (UINT8 *)&im->image8[y][x * 2]; - UINT16 pixel = in[0] + (in[1] << 8); - char *out = color; - out[0] = (pixel & 31) * 255 / 31; - out[1] = ((pixel >> 5) & 63) * 255 / 63; - out[2] = ((pixel >> 11) & 31) * 255 / 31; -} - -static void -get_pixel_BGR24(Imaging im, int x, int y, void *color) { - memcpy(color, &im->image8[y][x * 3], sizeof(UINT8) * 3); -} - static void get_pixel_32(Imaging im, int x, int y, void *color) { memcpy(color, &im->image32[y][x], sizeof(INT32)); @@ -154,16 +129,6 @@ put_pixel_16B(Imaging im, int x, int y, const void *color) { out[1] = in[0]; } -static void -put_pixel_BGR1516(Imaging im, int x, int y, const void *color) { - memcpy(&im->image8[y][x * 2], color, 2); -} - -static void -put_pixel_BGR24(Imaging im, int x, int y, const void *color) { - memcpy(&im->image8[y][x * 3], color, 3); -} - static void put_pixel_32L(Imaging im, int x, int y, const void *color) { memcpy(&im->image8[y][x * 4], color, 4); @@ -212,9 +177,6 @@ ImagingAccessInit(void) { ADD("F", get_pixel_32, put_pixel_32); ADD("P", get_pixel_8, put_pixel_8); ADD("PA", get_pixel_32_2bands, put_pixel_32); - ADD("BGR;15", get_pixel_BGR15, put_pixel_BGR1516); - ADD("BGR;16", get_pixel_BGR16, put_pixel_BGR1516); - ADD("BGR;24", get_pixel_BGR24, put_pixel_BGR24); ADD("RGB", get_pixel_32, put_pixel_32); ADD("RGBA", get_pixel_32, put_pixel_32); ADD("RGBa", get_pixel_32, put_pixel_32); diff --git a/src/libImaging/Convert.c b/src/libImaging/Convert.c index c8f234261..9a2c9ff16 100644 --- a/src/libImaging/Convert.c +++ b/src/libImaging/Convert.c @@ -277,38 +277,6 @@ rgb2f(UINT8 *out_, const UINT8 *in, int xsize) { } } -static void -rgb2bgr15(UINT8 *out_, const UINT8 *in, int xsize) { - int x; - for (x = 0; x < xsize; x++, in += 4, out_ += 2) { - UINT16 v = ((((UINT16)in[0]) << 7) & 0x7c00) + - ((((UINT16)in[1]) << 2) & 0x03e0) + - ((((UINT16)in[2]) >> 3) & 0x001f); - memcpy(out_, &v, sizeof(v)); - } -} - -static void -rgb2bgr16(UINT8 *out_, const UINT8 *in, int xsize) { - int x; - for (x = 0; x < xsize; x++, in += 4, out_ += 2) { - UINT16 v = ((((UINT16)in[0]) << 8) & 0xf800) + - ((((UINT16)in[1]) << 3) & 0x07e0) + - ((((UINT16)in[2]) >> 3) & 0x001f); - memcpy(out_, &v, sizeof(v)); - } -} - -static void -rgb2bgr24(UINT8 *out, const UINT8 *in, int xsize) { - int x; - for (x = 0; x < xsize; x++, in += 4) { - *out++ = in[2]; - *out++ = in[1]; - *out++ = in[0]; - } -} - static void rgb2hsv_row(UINT8 *out, const UINT8 *in) { // following colorsys.py float h, s, rc, gc, bc, cr; @@ -971,9 +939,6 @@ static struct { {"RGB", "I;16N", rgb2i16l}, #endif {"RGB", "F", rgb2f}, - {"RGB", "BGR;15", rgb2bgr15}, - {"RGB", "BGR;16", rgb2bgr16}, - {"RGB", "BGR;24", rgb2bgr24}, {"RGB", "RGBA", rgb2rgba}, {"RGB", "RGBa", rgb2rgba}, {"RGB", "RGBX", rgb2rgba}, diff --git a/src/libImaging/Pack.c b/src/libImaging/Pack.c index c29473d90..7f8a50d19 100644 --- a/src/libImaging/Pack.c +++ b/src/libImaging/Pack.c @@ -471,12 +471,6 @@ copy2(UINT8 *out, const UINT8 *in, int pixels) { memcpy(out, in, pixels * 2); } -static void -copy3(UINT8 *out, const UINT8 *in, int pixels) { - /* BGR;24, etc */ - memcpy(out, in, pixels * 3); -} - static void copy4(UINT8 *out, const UINT8 *in, int pixels) { /* RGBA, CMYK quadruples */ @@ -657,9 +651,6 @@ static struct { {"I;16", "I;16N", 16, packI16N_I16}, // LibTiff native->image endian. {"I;16L", "I;16N", 16, packI16N_I16}, {"I;16B", "I;16N", 16, packI16N_I16B}, - {"BGR;15", "BGR;15", 16, copy2}, - {"BGR;16", "BGR;16", 16, copy2}, - {"BGR;24", "BGR;24", 24, copy3}, {NULL} /* sentinel */ }; diff --git a/src/libImaging/Storage.c b/src/libImaging/Storage.c index 6fe26e1bd..4640f078a 100644 --- a/src/libImaging/Storage.c +++ b/src/libImaging/Storage.c @@ -151,36 +151,6 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) { strcpy(im->band_names[2], "B"); strcpy(im->band_names[3], "X"); - } else if (strcmp(mode, "BGR;15") == 0) { - /* EXPERIMENTAL */ - /* 15-bit reversed true colour */ - im->bands = 3; - im->pixelsize = 2; - im->linesize = (xsize * 2 + 3) & -4; - im->type = IMAGING_TYPE_SPECIAL; - /* not allowing arrow due to line length packing */ - strcpy(im->arrow_band_format, ""); - - } else if (strcmp(mode, "BGR;16") == 0) { - /* EXPERIMENTAL */ - /* 16-bit reversed true colour */ - im->bands = 3; - im->pixelsize = 2; - im->linesize = (xsize * 2 + 3) & -4; - im->type = IMAGING_TYPE_SPECIAL; - /* not allowing arrow due to line length packing */ - strcpy(im->arrow_band_format, ""); - - } else if (strcmp(mode, "BGR;24") == 0) { - /* EXPERIMENTAL */ - /* 24-bit reversed true colour */ - im->bands = 3; - im->pixelsize = 3; - im->linesize = (xsize * 3 + 3) & -4; - im->type = IMAGING_TYPE_SPECIAL; - /* not allowing arrow due to line length packing */ - strcpy(im->arrow_band_format, ""); - } else if (strcmp(mode, "RGBX") == 0) { /* 32-bit true colour images with padding */ im->bands = im->pixelsize = 4; diff --git a/src/libImaging/Unpack.c b/src/libImaging/Unpack.c index 9c3ee2665..976baa726 100644 --- a/src/libImaging/Unpack.c +++ b/src/libImaging/Unpack.c @@ -1284,12 +1284,6 @@ copy2(UINT8 *out, const UINT8 *in, int pixels) { memcpy(out, in, pixels * 2); } -static void -copy3(UINT8 *out, const UINT8 *in, int pixels) { - /* BGR;24 */ - memcpy(out, in, pixels * 3); -} - static void copy4(UINT8 *out, const UINT8 *in, int pixels) { /* RGBA, CMYK quadruples */ @@ -1649,10 +1643,6 @@ static struct { {"RGB", "B;16B", 16, band216B}, {"RGB", "CMYK", 32, cmyk2rgb}, - {"BGR;15", "BGR;15", 16, copy2}, - {"BGR;16", "BGR;16", 16, copy2}, - {"BGR;24", "BGR;24", 24, copy3}, - /* true colour w. alpha */ {"RGBA", "LA", 16, unpackRGBALA}, {"RGBA", "LA;16B", 32, unpackRGBALA16B}, From 5d4a05465d064147951178e140520d704b1092f8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 20:06:00 +1000 Subject: [PATCH 251/268] Removed Image isImageType() --- Tests/test_image.py | 4 ---- docs/deprecations.rst | 17 +++++++++-------- src/PIL/Image.py | 17 +---------------- 3 files changed, 10 insertions(+), 28 deletions(-) diff --git a/Tests/test_image.py b/Tests/test_image.py index 1aa810e22..83b027aa2 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -1132,10 +1132,6 @@ class TestImage: assert len(caplog.records) == 0 assert im.fp is None - def test_deprecation(self) -> None: - with pytest.warns(DeprecationWarning, match="Image.isImageType"): - assert not Image.isImageType(None) - class TestImageBytes: @pytest.mark.parametrize("mode", Image.MODES) diff --git a/docs/deprecations.rst b/docs/deprecations.rst index b4eb1fa4c..5ecd7de42 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -123,14 +123,6 @@ ICNS (width, height, scale) sizes Setting an ICNS image size to ``(width, height, scale)`` before loading has been deprecated. Instead, ``load(scale)`` can be used. -Image isImageType() -^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 11.0.0 - -``Image.isImageType(im)`` has been deprecated. Use ``isinstance(im, Image.Image)`` -instead. - ImageMath.lambda_eval and ImageMath.unsafe_eval options parameter ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -222,6 +214,15 @@ BGR;15, BGR 16 and BGR;24 The experimental BGR;15, BGR;16 and BGR;24 modes have been removed. +Image isImageType() +^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 11.0.0 +.. versionremoved:: 12.0.0 + +``Image.isImageType(im)`` has been removed. Use ``isinstance(im, Image.Image)`` +instead. + TiffImagePlugin IFD_LEGACY_API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 9df253498..59168f5e3 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -115,21 +115,6 @@ except ImportError as v: raise -def isImageType(t: Any) -> TypeGuard[Image]: - """ - Checks if an object is an image object. - - .. warning:: - - This function is for internal use only. - - :param t: object to check if it's an image - :returns: True if the object is an image - """ - deprecate("Image.isImageType(im)", 12, "isinstance(im, Image.Image)") - return hasattr(t, "im") - - # # Constants @@ -219,7 +204,7 @@ if TYPE_CHECKING: from IPython.lib.pretty import PrettyPrinter from . import ImageFile, ImageFilter, ImagePalette, ImageQt, TiffImagePlugin - from ._typing import CapsuleType, NumpyArray, StrOrBytesPath, TypeGuard + from ._typing import CapsuleType, NumpyArray, StrOrBytesPath ID: list[str] = [] OPEN: dict[ str, From 1800e580d2310e5b7bb8e958d96c11691f5ce9df Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 20:07:31 +1000 Subject: [PATCH 252/268] Removed ImageFile raise_oserror() --- Tests/test_imagefile.py | 5 ----- docs/deprecations.rst | 20 ++++++++++---------- src/PIL/ImageFile.py | 11 ----------- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index a9444c26d..d4dfb1b6d 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -151,11 +151,6 @@ class TestImageFile: # Despite multiple tiles, assert only one tile caused a read of maxblock size assert reads.count(im.decodermaxblock) == 1 - def test_raise_oserror(self) -> None: - with pytest.warns(DeprecationWarning, match="raise_oserror"): - with pytest.raises(OSError): - ImageFile.raise_oserror(1) - def test_raise_typeerror(self) -> None: with pytest.raises(TypeError): parser = ImageFile.Parser() diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 5ecd7de42..4a208f212 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -12,16 +12,6 @@ Deprecated features Below are features which are considered deprecated. Where appropriate, a :py:exc:`DeprecationWarning` is issued. -ImageFile.raise_oserror -~~~~~~~~~~~~~~~~~~~~~~~ - -.. deprecated:: 10.2.0 - -``ImageFile.raise_oserror()`` has been deprecated and will be removed in Pillow -12.0.0 (2025-10-15). The function is undocumented and is only useful for translating -error codes returned by a codec's ``decode()`` method, which ImageFile already does -automatically. - IptcImageFile helper functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -206,6 +196,16 @@ Removed features Deprecated features are only removed in major releases after an appropriate period of deprecation has passed. +ImageFile.raise_oserror +~~~~~~~~~~~~~~~~~~~~~~~ + +.. deprecated:: 10.2.0 +.. versionremoved:: 12.0.0 + +``ImageFile.raise_oserror()`` has been removed. The function was undocumented and was +only useful for translating error codes returned by a codec's ``decode()`` method, +which ImageFile already did automatically. + BGR;15, BGR 16 and BGR;24 ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index bf556a2c6..27b27127e 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -37,7 +37,6 @@ import struct from typing import IO, Any, NamedTuple, cast from . import ExifTags, Image -from ._deprecate import deprecate from ._util import DeferredError, is_path TYPE_CHECKING = False @@ -83,16 +82,6 @@ def _get_oserror(error: int, *, encoder: bool) -> OSError: return OSError(msg) -def raise_oserror(error: int) -> OSError: - deprecate( - "raise_oserror", - 12, - action="It is only useful for translating error codes returned by a codec's " - "decode() method, which ImageFile already does automatically.", - ) - raise _get_oserror(error, encoder=False) - - def _tilesort(t: _Tile) -> int: # sort on offset return t[2] From b72b8dd84d121c919c645963a8675b82c5585dfd Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 20:04:08 +1000 Subject: [PATCH 253/268] Removed JpegImageFile.huffman_ac and JpegImageFile.huffman_dc --- Tests/test_file_jpeg.py | 8 -------- docs/deprecations.rst | 17 +++++++++-------- src/PIL/JpegImagePlugin.py | 7 ------- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 5afae0412..08e879807 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1115,14 +1115,6 @@ class TestFileJpeg: assert im._repr_jpeg_() is None - def test_deprecation(self) -> None: - with Image.open(TEST_FILE) as im: - assert isinstance(im, JpegImagePlugin.JpegImageFile) - with pytest.warns(DeprecationWarning, match="huffman_ac"): - assert im.huffman_ac == {} - with pytest.warns(DeprecationWarning, match="huffman_dc"): - assert im.huffman_dc == {} - @pytest.mark.skipif(not is_win32(), reason="Windows only") @skip_unless_feature("jpg") diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 4a208f212..8e065fa87 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -122,14 +122,6 @@ The ``options`` parameter in :py:meth:`~PIL.ImageMath.lambda_eval()` and :py:meth:`~PIL.ImageMath.unsafe_eval()` has been deprecated. One or more keyword arguments can be used instead. -JpegImageFile.huffman_ac and JpegImageFile.huffman_dc -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 11.0.0 - -The ``huffman_ac`` and ``huffman_dc`` dictionaries on JPEG images were unused. They -have been deprecated, and will be removed in Pillow 12 (2025-10-15). - Specific WebP feature checks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -223,6 +215,15 @@ Image isImageType() ``Image.isImageType(im)`` has been removed. Use ``isinstance(im, Image.Image)`` instead. +JpegImageFile.huffman_ac and JpegImageFile.huffman_dc +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 11.0.0 +.. versionremoved:: 12.0.0 + +The ``huffman_ac`` and ``huffman_dc`` dictionaries on JPEG images were unused. They +have been deprecated, and will be removed in Pillow 12 (2025-10-15). + TiffImagePlugin IFD_LEGACY_API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index defe9f773..082f3551a 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -49,7 +49,6 @@ from ._binary import i16be as i16 from ._binary import i32be as i32 from ._binary import o8 from ._binary import o16be as o16 -from ._deprecate import deprecate from .JpegPresets import presets TYPE_CHECKING = False @@ -393,12 +392,6 @@ class JpegImageFile(ImageFile.ImageFile): self._read_dpi_from_exif() - def __getattr__(self, name: str) -> Any: - if name in ("huffman_ac", "huffman_dc"): - deprecate(name, 12) - return getattr(self, "_" + name) - raise AttributeError(name) - def __getstate__(self) -> list[Any]: return super().__getstate__() + [self.layers, self.layer] From cce39084f5f0116e9c149b359223d72e3cbe9f24 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 20:09:06 +1000 Subject: [PATCH 254/268] Removed specific WebP feature checks --- Tests/test_features.py | 15 --------------- checks/check_wheel.py | 3 --- docs/deprecations.rst | 23 +++++++++++------------ docs/reference/features.rst | 3 --- src/PIL/features.py | 3 --- 5 files changed, 11 insertions(+), 36 deletions(-) diff --git a/Tests/test_features.py b/Tests/test_features.py index d06fb4d84..520c25b46 100644 --- a/Tests/test_features.py +++ b/Tests/test_features.py @@ -55,21 +55,6 @@ def test_version() -> None: test(feature, features.version_feature) -def test_webp_transparency() -> None: - with pytest.warns(DeprecationWarning, match="transp_webp"): - assert (features.check("transp_webp") or False) == features.check_module("webp") - - -def test_webp_mux() -> None: - with pytest.warns(DeprecationWarning, match="webp_mux"): - assert (features.check("webp_mux") or False) == features.check_module("webp") - - -def test_webp_anim() -> None: - with pytest.warns(DeprecationWarning, match="webp_anim"): - assert (features.check("webp_anim") or False) == features.check_module("webp") - - @skip_unless_feature("libjpeg_turbo") def test_libjpeg_turbo_version() -> None: version = features.version("libjpeg_turbo") diff --git a/checks/check_wheel.py b/checks/check_wheel.py index c89d32ed7..3d806eb71 100644 --- a/checks/check_wheel.py +++ b/checks/check_wheel.py @@ -39,9 +39,6 @@ def test_wheel_codecs() -> None: def test_wheel_features() -> None: expected_features = { - "webp_anim", - "webp_mux", - "transp_webp", "raqm", "fribidi", "harfbuzz", diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 8e065fa87..78c6f1092 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -122,16 +122,6 @@ The ``options`` parameter in :py:meth:`~PIL.ImageMath.lambda_eval()` and :py:meth:`~PIL.ImageMath.unsafe_eval()` has been deprecated. One or more keyword arguments can be used instead. -Specific WebP feature checks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 11.0.0 - -``features.check("transp_webp")``, ``features.check("webp_mux")`` and -``features.check("webp_anim")`` are now deprecated. They will always return -``True`` if the WebP module is installed, until they are removed in Pillow -12.0.0 (2025-10-15). - Get internal pointers to objects ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -222,14 +212,23 @@ JpegImageFile.huffman_ac and JpegImageFile.huffman_dc .. versionremoved:: 12.0.0 The ``huffman_ac`` and ``huffman_dc`` dictionaries on JPEG images were unused. They -have been deprecated, and will be removed in Pillow 12 (2025-10-15). +have been removed. + +Specific WebP feature checks +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 11.0.0 +.. versionremoved:: 12.0.0 + +``features.check("transp_webp")``, ``features.check("webp_mux")`` and +``features.check("webp_anim")`` have been removed. TiffImagePlugin IFD_LEGACY_API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. versionremoved:: 11.0.0 -``TiffImagePlugin.IFD_LEGACY_API`` was removed, as it was an unused setting. +``TiffImagePlugin.IFD_LEGACY_API`` has been removed, as it was an unused setting. PSFile ~~~~~~ diff --git a/docs/reference/features.rst b/docs/reference/features.rst index 381d7830a..45067ba35 100644 --- a/docs/reference/features.rst +++ b/docs/reference/features.rst @@ -60,9 +60,6 @@ Support for the following features can be checked: * ``raqm``: Raqm library, required for ``ImageFont.Layout.RAQM`` in :py:func:`PIL.ImageFont.truetype`. Run-time version number is available for Raqm 0.7.0 or newer. * ``libimagequant``: (compile time) ImageQuant quantization support in :py:func:`PIL.Image.Image.quantize`. Run-time version number is available. * ``xcb``: (compile time) Support for X11 in :py:func:`PIL.ImageGrab.grab` via the XCB library. -* ``transp_webp``: Deprecated. Always ``True`` if WebP module is installed. -* ``webp_mux``: Deprecated. Always ``True`` if WebP module is installed. -* ``webp_anim``: Deprecated. Always ``True`` if WebP module is installed. .. autofunction:: PIL.features.check_feature .. autofunction:: PIL.features.version_feature diff --git a/src/PIL/features.py b/src/PIL/features.py index 573f1d412..984f7532c 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -121,9 +121,6 @@ def get_supported_codecs() -> list[str]: features: dict[str, tuple[str, str | bool, str | None]] = { - "webp_anim": ("PIL._webp", True, None), - "webp_mux": ("PIL._webp", True, None), - "transp_webp": ("PIL._webp", True, None), "raqm": ("PIL._imagingft", "HAVE_RAQM", "raqm_version"), "fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"), "harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"), From 88018c1c2d42f4554da4733aeec3b06c3740dde8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 20:12:19 +1000 Subject: [PATCH 255/268] Removed id and unsafe_ptrs --- Tests/test_image_getim.py | 9 --------- docs/deprecations.rst | 21 +++++++++++---------- src/_imaging.c | 35 ----------------------------------- 3 files changed, 11 insertions(+), 54 deletions(-) diff --git a/Tests/test_image_getim.py b/Tests/test_image_getim.py index 7b5f7a589..07612e587 100644 --- a/Tests/test_image_getim.py +++ b/Tests/test_image_getim.py @@ -1,7 +1,5 @@ from __future__ import annotations -import pytest - from .helper import hopper @@ -10,10 +8,3 @@ def test_sanity() -> None: type_repr = repr(type(im.getim())) assert "PyCapsule" in type_repr - - with pytest.warns(DeprecationWarning, match="id property"): - assert isinstance(im.im.id, int) - - with pytest.warns(DeprecationWarning, match="unsafe_ptrs property"): - ptrs = dict(im.im.unsafe_ptrs) - assert ptrs.keys() == {"image8", "image32", "image"} diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 78c6f1092..3225b6d52 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -122,16 +122,6 @@ The ``options`` parameter in :py:meth:`~PIL.ImageMath.lambda_eval()` and :py:meth:`~PIL.ImageMath.unsafe_eval()` has been deprecated. One or more keyword arguments can be used instead. -Get internal pointers to objects -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 11.0.0 - -``Image.core.ImagingCore.id`` and ``Image.core.ImagingCore.unsafe_ptrs`` have been -deprecated and will be removed in Pillow 12 (2025-10-15). They were used for obtaining -raw pointers to ``ImagingCore`` internals. To interact with C code, you can use -``Image.Image.getim()``, which returns a ``Capsule`` object. - ExifTags.IFD.Makernote ^^^^^^^^^^^^^^^^^^^^^^ @@ -223,6 +213,17 @@ Specific WebP feature checks ``features.check("transp_webp")``, ``features.check("webp_mux")`` and ``features.check("webp_anim")`` have been removed. +Get internal pointers to objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 11.0.0 +.. versionremoved:: 12.0.0 + +``Image.core.ImagingCore.id`` and ``Image.core.ImagingCore.unsafe_ptrs`` have been +removed. They were used for obtaining raw pointers to ``ImagingCore`` internals. To +interact with C code, you can use ``Image.Image.getim()``, which returns a ``Capsule`` +object. + TiffImagePlugin IFD_LEGACY_API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/_imaging.c b/src/_imaging.c index 7cc1fb1a4..8ba2a2908 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -3724,18 +3724,6 @@ _getattr_bands(ImagingObject *self, void *closure) { return PyLong_FromLong(self->image->bands); } -static PyObject * -_getattr_id(ImagingObject *self, void *closure) { - if (PyErr_WarnEx( - PyExc_DeprecationWarning, - "id property is deprecated and will be removed in Pillow 12 (2025-10-15)", - 1 - ) < 0) { - return NULL; - } - return PyLong_FromSsize_t((Py_ssize_t)self->image); -} - static void _ptr_destructor(PyObject *capsule) { PyObject *self = (PyObject *)PyCapsule_GetContext(capsule); @@ -3750,27 +3738,6 @@ _getattr_ptr(ImagingObject *self, void *closure) { return capsule; } -static PyObject * -_getattr_unsafe_ptrs(ImagingObject *self, void *closure) { - if (PyErr_WarnEx( - PyExc_DeprecationWarning, - "unsafe_ptrs property is deprecated and will be removed in Pillow 12 " - "(2025-10-15)", - 1 - ) < 0) { - return NULL; - } - return Py_BuildValue( - "(sn)(sn)(sn)", - "image8", - self->image->image8, - "image32", - self->image->image32, - "image", - self->image->image - ); -} - static PyObject * _getattr_readonly(ImagingObject *self, void *closure) { return PyLong_FromLong(self->image->read_only); @@ -3780,9 +3747,7 @@ static struct PyGetSetDef getsetters[] = { {"mode", (getter)_getattr_mode}, {"size", (getter)_getattr_size}, {"bands", (getter)_getattr_bands}, - {"id", (getter)_getattr_id}, {"ptr", (getter)_getattr_ptr}, - {"unsafe_ptrs", (getter)_getattr_unsafe_ptrs}, {"readonly", (getter)_getattr_readonly}, {NULL} }; From a7e00fba8bfd6c254682ebe3c25faddb8459655c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 20:14:26 +1000 Subject: [PATCH 256/268] Removed ImageDraw.getdraw hints parameter --- Tests/test_imagedraw.py | 5 ----- docs/deprecations.rst | 8 ++++++++ src/PIL/ImageDraw.py | 8 +------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index 881f9c85d..e1dcbc52c 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1732,8 +1732,3 @@ def test_incorrectly_ordered_coordinates(xy: tuple[int, int, int, int]) -> None: draw.rectangle(xy) with pytest.raises(ValueError): draw.rounded_rectangle(xy) - - -def test_getdraw() -> None: - with pytest.warns(DeprecationWarning, match="'hints' parameter"): - ImageDraw.getdraw(None, []) diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 3225b6d52..82530f93c 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -168,6 +168,14 @@ Removed features Deprecated features are only removed in major releases after an appropriate period of deprecation has passed. +ImageDraw.getdraw hints parameter +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been removed. + ImageFile.raise_oserror ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/PIL/ImageDraw.py b/src/PIL/ImageDraw.py index 6cf1ee626..e95fa91f8 100644 --- a/src/PIL/ImageDraw.py +++ b/src/PIL/ImageDraw.py @@ -38,7 +38,6 @@ from types import ModuleType from typing import Any, AnyStr, Callable, Union, cast from . import Image, ImageColor -from ._deprecate import deprecate from ._typing import Coords # experimental access to the outline API @@ -1009,16 +1008,11 @@ def Draw(im: Image.Image, mode: str | None = None) -> ImageDraw: return ImageDraw(im, mode) -def getdraw( - im: Image.Image | None = None, hints: list[str] | None = None -) -> tuple[ImageDraw2.Draw | None, ModuleType]: +def getdraw(im: Image.Image | None = None) -> tuple[ImageDraw2.Draw | None, ModuleType]: """ :param im: The image to draw in. - :param hints: An optional list of hints. Deprecated. :returns: A (drawing context, drawing resource factory) tuple. """ - if hints is not None: - deprecate("'hints' parameter", 12) from . import ImageDraw2 draw = ImageDraw2.Draw(im) if im is not None else None From 9c9449af346e6bfcbf2fa6573b7ec96a14ddc8c8 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Wed, 2 Jul 2025 00:00:16 +1000 Subject: [PATCH 257/268] Removed support for LibTIFF < 4 --- Tests/test_file_libtiff.py | 31 +++---------------------------- docs/deprecations.rst | 17 +++++++++-------- src/PIL/TiffImagePlugin.py | 7 ------- src/_imaging.c | 10 ---------- src/libImaging/TiffDecode.c | 10 +--------- 5 files changed, 13 insertions(+), 62 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 1ec39eba5..c245a5a9b 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -256,19 +256,7 @@ class TestFileLibTiff(LibTiffTestCase): im.save(out, tiffinfo=new_ifd) - @pytest.mark.parametrize( - "libtiff", - ( - pytest.param( - True, - marks=pytest.mark.skipif( - not getattr(Image.core, "libtiff_support_custom_tags", False), - reason="Custom tags not supported by older libtiff", - ), - ), - False, - ), - ) + @pytest.mark.parametrize("libtiff", (True, False)) def test_custom_metadata( self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path, libtiff: bool ) -> None: @@ -724,8 +712,7 @@ class TestFileLibTiff(LibTiffTestCase): with Image.open(out) as reloaded: assert isinstance(reloaded, TiffImagePlugin.TiffImageFile) - if Image.core.libtiff_support_custom_tags: - assert reloaded.tag_v2[34665] == 125456 + assert reloaded.tag_v2[34665] == 125456 def test_crashing_metadata( self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path @@ -777,19 +764,7 @@ class TestFileLibTiff(LibTiffTestCase): assert icc_libtiff is not None assert icc == icc_libtiff - @pytest.mark.parametrize( - "libtiff", - ( - pytest.param( - True, - marks=pytest.mark.skipif( - not getattr(Image.core, "libtiff_support_custom_tags", False), - reason="Custom tags not supported by older libtiff", - ), - ), - False, - ), - ) + @pytest.mark.parametrize("libtiff", (True, False)) def test_write_icc( self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path, libtiff: bool ) -> None: diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 82530f93c..5973038e3 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -77,14 +77,6 @@ The use in :py:mod:`.ImageCms` of input modes and output modes that are not Pill image modes has been deprecated. Defaulting to "L" or "1" if the mode cannot be mapped is also deprecated. -Support for LibTIFF earlier than 4 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.4.0 - -Support for LibTIFF earlier than version 4 has been deprecated. -Upgrade to a newer version of LibTIFF instead. - ImageDraw.getdraw hints parameter ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -194,6 +186,15 @@ BGR;15, BGR 16 and BGR;24 The experimental BGR;15, BGR;16 and BGR;24 modes have been removed. +Support for LibTIFF earlier than 4 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +Support for LibTIFF earlier than version 4 has been removed. +Upgrade to a newer version of LibTIFF instead. + Image isImageType() ^^^^^^^^^^^^^^^^^^^ diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index daf20f2e8..c1850f084 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -56,7 +56,6 @@ from . import ExifTags, Image, ImageFile, ImageOps, ImagePalette, TiffTags from ._binary import i16be as i16 from ._binary import i32be as i32 from ._binary import o8 -from ._deprecate import deprecate from ._typing import StrOrBytesPath from ._util import DeferredError, is_path from .TiffTags import TYPES @@ -284,9 +283,6 @@ PREFIXES = [ b"II\x2b\x00", # BigTIFF with little-endian byte order ] -if not getattr(Image.core, "libtiff_support_custom_tags", True): - deprecate("Support for LibTIFF earlier than version 4", 12) - def _accept(prefix: bytes) -> bool: return prefix.startswith(tuple(PREFIXES)) @@ -1934,9 +1930,6 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: # Custom items are supported for int, float, unicode, string and byte # values. Other types and tuples require a tagtype. if tag not in TiffTags.LIBTIFF_CORE: - if not getattr(Image.core, "libtiff_support_custom_tags", False): - continue - if tag in TiffTags.TAGS_V2_GROUPS: types[tag] = TiffTags.LONG8 elif tag in ifd.tagtype: diff --git a/src/_imaging.c b/src/_imaging.c index 8ba2a2908..fbfc0e41a 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -4352,16 +4352,6 @@ setup_module(PyObject *m) { PyObject *v = PyUnicode_FromString(ImagingTiffVersion()); PyDict_SetItemString(d, "libtiff_version", v ? v : Py_None); Py_XDECREF(v); - - // Test for libtiff 4.0 or later, excluding libtiff 3.9.6 and 3.9.7 - PyObject *support_custom_tags; -#if TIFFLIB_VERSION >= 20111221 && TIFFLIB_VERSION != 20120218 && \ - TIFFLIB_VERSION != 20120922 - support_custom_tags = Py_True; -#else - support_custom_tags = Py_False; -#endif - PyDict_SetItemString(d, "libtiff_support_custom_tags", support_custom_tags); } #endif diff --git a/src/libImaging/TiffDecode.c b/src/libImaging/TiffDecode.c index e289ce405..71516fd1b 100644 --- a/src/libImaging/TiffDecode.c +++ b/src/libImaging/TiffDecode.c @@ -884,7 +884,6 @@ ImagingLibTiffMergeFieldInfo( // Refer to libtiff docs (http://www.simplesystems.org/libtiff/addingtags.html) TIFFSTATE *clientstate = (TIFFSTATE *)state->context; uint32_t n; - int status = 0; // custom fields added with ImagingLibTiffMergeFieldInfo are only used for // decoding, ignore readcount; @@ -907,14 +906,7 @@ ImagingLibTiffMergeFieldInfo( n = sizeof(info) / sizeof(info[0]); - // Test for libtiff 4.0 or later, excluding libtiff 3.9.6 and 3.9.7 -#if TIFFLIB_VERSION >= 20111221 && TIFFLIB_VERSION != 20120218 && \ - TIFFLIB_VERSION != 20120922 - status = TIFFMergeFieldInfo(clientstate->tiff, info, n); -#else - TIFFMergeFieldInfo(clientstate->tiff, info, n); -#endif - return status; + return TIFFMergeFieldInfo(clientstate->tiff, info, n); } int From 0a29d6392afeaf6c7e8354dbfa67a1f9268028df Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 20:29:45 +1000 Subject: [PATCH 258/268] Removed IptcImageFile helper functions --- Tests/test_file_iptc.py | 37 +--------------------- docs/deprecations.rst | 64 +++++++++++++++++++------------------- src/PIL/IptcImagePlugin.py | 24 -------------- 3 files changed, 33 insertions(+), 92 deletions(-) diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index 5dca3da21..3c4c892c8 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -1,9 +1,6 @@ from __future__ import annotations -import sys -from io import BytesIO, StringIO - -import pytest +from io import BytesIO from PIL import Image, IptcImagePlugin, TiffImagePlugin, TiffTags @@ -101,35 +98,3 @@ def test_getiptcinfo_tiff_none() -> None: # Assert assert iptc is None - - -def test_i() -> None: - # Arrange - c = b"a" - - # Act - with pytest.warns(DeprecationWarning, match="IptcImagePlugin.i"): - ret = IptcImagePlugin.i(c) - - # Assert - assert ret == 97 - - -def test_dump(monkeypatch: pytest.MonkeyPatch) -> None: - # Arrange - c = b"abc" - # Temporarily redirect stdout - mystdout = StringIO() - monkeypatch.setattr(sys, "stdout", mystdout) - - # Act - with pytest.warns(DeprecationWarning, match="IptcImagePlugin.dump"): - IptcImagePlugin.dump(c) - - # Assert - assert mystdout.getvalue() == "61 62 63 \n" - - -def test_pad_deprecation() -> None: - with pytest.warns(DeprecationWarning, match="IptcImagePlugin.PAD"): - assert IptcImagePlugin.PAD == b"\0\0\0\0" diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 5973038e3..06767c20b 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -12,17 +12,6 @@ Deprecated features Below are features which are considered deprecated. Where appropriate, a :py:exc:`DeprecationWarning` is issued. -IptcImageFile helper functions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. deprecated:: 10.2.0 - -The functions ``IptcImageFile.dump`` and ``IptcImageFile.i``, and the constant -``IptcImageFile.PAD`` have been deprecated and will be removed in Pillow -12.0.0 (2025-10-15). These are undocumented helper functions intended -for internal use, so there is no replacement. They can each be replaced -by a single line of code using builtin functions in Python. - ImageCms constants and versions() function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -160,14 +149,6 @@ Removed features Deprecated features are only removed in major releases after an appropriate period of deprecation has passed. -ImageDraw.getdraw hints parameter -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.4.0 -.. versionremoved:: 12.0.0 - -The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been removed. - ImageFile.raise_oserror ~~~~~~~~~~~~~~~~~~~~~~~ @@ -178,22 +159,16 @@ ImageFile.raise_oserror only useful for translating error codes returned by a codec's ``decode()`` method, which ImageFile already did automatically. -BGR;15, BGR 16 and BGR;24 -^^^^^^^^^^^^^^^^^^^^^^^^^ +IptcImageFile helper functions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. deprecated:: 10.4.0 +.. deprecated:: 10.2.0 .. versionremoved:: 12.0.0 -The experimental BGR;15, BGR;16 and BGR;24 modes have been removed. - -Support for LibTIFF earlier than 4 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.4.0 -.. versionremoved:: 12.0.0 - -Support for LibTIFF earlier than version 4 has been removed. -Upgrade to a newer version of LibTIFF instead. +The functions ``IptcImageFile.dump`` and ``IptcImageFile.i``, and the constant +``IptcImageFile.PAD`` have been removed. These were undocumented helper functions +intended for internal use, so there is no replacement. They can each be replaced by a +single line of code using builtin functions in Python. Image isImageType() ^^^^^^^^^^^^^^^^^^^ @@ -233,6 +208,31 @@ removed. They were used for obtaining raw pointers to ``ImagingCore`` internals. interact with C code, you can use ``Image.Image.getim()``, which returns a ``Capsule`` object. +BGR;15, BGR 16 and BGR;24 +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +The experimental BGR;15, BGR;16 and BGR;24 modes have been removed. + +Support for LibTIFF earlier than 4 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +Support for LibTIFF earlier than version 4 has been removed. +Upgrade to a newer version of LibTIFF instead. + +ImageDraw.getdraw hints parameter +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been removed. + TiffImagePlugin IFD_LEGACY_API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index fc024d668..b1fbb1bf1 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -16,26 +16,16 @@ # from __future__ import annotations -from collections.abc import Sequence from io import BytesIO from typing import cast from . import Image, ImageFile from ._binary import i16be as i16 from ._binary import i32be as i32 -from ._deprecate import deprecate COMPRESSION = {1: "raw", 5: "jpeg"} -def __getattr__(name: str) -> bytes: - if name == "PAD": - deprecate("IptcImagePlugin.PAD", 12) - return b"\0\0\0\0" - msg = f"module '{__name__}' has no attribute '{name}'" - raise AttributeError(msg) - - # # Helpers @@ -48,20 +38,6 @@ def _i8(c: int | bytes) -> int: return c if isinstance(c, int) else c[0] -def i(c: bytes) -> int: - """.. deprecated:: 10.2.0""" - deprecate("IptcImagePlugin.i", 12) - return _i(c) - - -def dump(c: Sequence[int | bytes]) -> None: - """.. deprecated:: 10.2.0""" - deprecate("IptcImagePlugin.dump", 12) - for i in c: - print(f"{_i8(i):02x}", end=" ") - print() - - ## # Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields # from TIFF and JPEG files, use the getiptcinfo function. From 4301c1fde63e96a32d27f4b2884131506886a415 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 20:35:12 +1000 Subject: [PATCH 259/268] Removed ImageMath eval and options parameters --- Tests/test_imagemath_lambda_eval.py | 7 ---- Tests/test_imagemath_unsafe_eval.py | 10 ----- docs/deprecations.rst | 36 ++++++++-------- src/PIL/ImageMath.py | 64 ++--------------------------- 4 files changed, 22 insertions(+), 95 deletions(-) diff --git a/Tests/test_imagemath_lambda_eval.py b/Tests/test_imagemath_lambda_eval.py index eec76118a..26c04b9a0 100644 --- a/Tests/test_imagemath_lambda_eval.py +++ b/Tests/test_imagemath_lambda_eval.py @@ -2,8 +2,6 @@ from __future__ import annotations from typing import Any -import pytest - from PIL import Image, ImageMath @@ -55,11 +53,6 @@ def test_sanity() -> None: ) -def test_options_deprecated() -> None: - with pytest.warns(DeprecationWarning, match="ImageMath.lambda_eval options"): - assert ImageMath.lambda_eval(lambda args: 1, images) == 1 - - def test_ops() -> None: assert pixel(ImageMath.lambda_eval(lambda args: args["A"] * -1, **images)) == "I -1" diff --git a/Tests/test_imagemath_unsafe_eval.py b/Tests/test_imagemath_unsafe_eval.py index 60ad6aafa..5e141a55b 100644 --- a/Tests/test_imagemath_unsafe_eval.py +++ b/Tests/test_imagemath_unsafe_eval.py @@ -35,16 +35,6 @@ def test_sanity() -> None: assert pixel(ImageMath.unsafe_eval("int(float(A)+B)", **images)) == "I 3" -def test_eval_deprecated() -> None: - with pytest.warns(DeprecationWarning, match="ImageMath.eval"): - assert ImageMath.eval("1") == 1 - - -def test_options_deprecated() -> None: - with pytest.warns(DeprecationWarning, match="ImageMath.unsafe_eval options"): - assert ImageMath.unsafe_eval("1", images) == 1 - - def test_ops() -> None: assert pixel(ImageMath.unsafe_eval("-A", **images)) == "I -1" assert pixel(ImageMath.unsafe_eval("+B", **images)) == "L 2" diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 06767c20b..9eb9650b2 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -49,14 +49,6 @@ Deprecated Use instead :py:data:`sys.version_info`, and ``PIL.__version__`` ============================================ ==================================================== -ImageMath eval() -^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.3.0 - -``ImageMath.eval()`` has been deprecated. Use :py:meth:`~PIL.ImageMath.lambda_eval` or -:py:meth:`~PIL.ImageMath.unsafe_eval` instead. - Non-image modes in ImageCms ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -94,15 +86,6 @@ ICNS (width, height, scale) sizes Setting an ICNS image size to ``(width, height, scale)`` before loading has been deprecated. Instead, ``load(scale)`` can be used. -ImageMath.lambda_eval and ImageMath.unsafe_eval options parameter -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 11.0.0 - -The ``options`` parameter in :py:meth:`~PIL.ImageMath.lambda_eval()` and -:py:meth:`~PIL.ImageMath.unsafe_eval()` has been deprecated. One or more keyword -arguments can be used instead. - ExifTags.IFD.Makernote ^^^^^^^^^^^^^^^^^^^^^^ @@ -179,6 +162,16 @@ Image isImageType() ``Image.isImageType(im)`` has been removed. Use ``isinstance(im, Image.Image)`` instead. +ImageMath.lambda_eval and ImageMath.unsafe_eval options parameter +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 11.0.0 +.. versionremoved:: 12.0.0 + +The ``options`` parameter in :py:meth:`~PIL.ImageMath.lambda_eval()` and +:py:meth:`~PIL.ImageMath.unsafe_eval()` has been removed. One or more keyword +arguments can be used instead. + JpegImageFile.huffman_ac and JpegImageFile.huffman_dc ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -208,6 +201,15 @@ removed. They were used for obtaining raw pointers to ``ImagingCore`` internals. interact with C code, you can use ``Image.Image.getim()``, which returns a ``Capsule`` object. +ImageMath eval() +^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.3.0 +.. versionremoved:: 12.0.0 + +``ImageMath.eval()`` has been removed. Use :py:meth:`~PIL.ImageMath.lambda_eval` or +:py:meth:`~PIL.ImageMath.unsafe_eval` instead. + BGR;15, BGR 16 and BGR;24 ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/PIL/ImageMath.py b/src/PIL/ImageMath.py index c33809ced..d2504b1ae 100644 --- a/src/PIL/ImageMath.py +++ b/src/PIL/ImageMath.py @@ -21,7 +21,6 @@ from types import CodeType from typing import Any, Callable from . import Image, _imagingmath -from ._deprecate import deprecate class _Operand: @@ -233,11 +232,7 @@ ops = { } -def lambda_eval( - expression: Callable[[dict[str, Any]], Any], - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: +def lambda_eval(expression: Callable[[dict[str, Any]], Any], **kw: Any) -> Any: """ Returns the result of an image function. @@ -246,23 +241,13 @@ def lambda_eval( :py:func:`~PIL.Image.merge` function. :param expression: A function that receives a dictionary. - :param options: Values to add to the function's dictionary. Deprecated. - You can instead use one or more keyword arguments. :param **kw: Values to add to the function's dictionary. :return: The expression result. This is usually an image object, but can also be an integer, a floating point value, or a pixel tuple, depending on the expression. """ - if options: - deprecate( - "ImageMath.lambda_eval options", - 12, - "ImageMath.lambda_eval keyword arguments", - ) - args: dict[str, Any] = ops.copy() - args.update(options) args.update(kw) for k, v in args.items(): if isinstance(v, Image.Image): @@ -275,11 +260,7 @@ def lambda_eval( return out -def unsafe_eval( - expression: str, - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: +def unsafe_eval(expression: str, **kw: Any) -> Any: """ Evaluates an image expression. This uses Python's ``eval()`` function to process the expression string, and carries the security risks of doing so. It is not @@ -291,29 +272,19 @@ def unsafe_eval( :py:func:`~PIL.Image.merge` function. :param expression: A string containing a Python-style expression. - :param options: Values to add to the evaluation context. Deprecated. - You can instead use one or more keyword arguments. :param **kw: Values to add to the evaluation context. :return: The evaluated expression. This is usually an image object, but can also be an integer, a floating point value, or a pixel tuple, depending on the expression. """ - if options: - deprecate( - "ImageMath.unsafe_eval options", - 12, - "ImageMath.unsafe_eval keyword arguments", - ) - # build execution namespace args: dict[str, Any] = ops.copy() - for k in [*options, *kw]: + for k in kw: if "__" in k or hasattr(builtins, k): msg = f"'{k}' not allowed" raise ValueError(msg) - args.update(options) args.update(kw) for k, v in args.items(): if isinstance(v, Image.Image): @@ -337,32 +308,3 @@ def unsafe_eval( return out.im except AttributeError: return out - - -def eval( - expression: str, - _dict: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Evaluates an image expression. - - Deprecated. Use lambda_eval() or unsafe_eval() instead. - - :param expression: A string containing a Python-style expression. - :param _dict: Values to add to the evaluation context. You - can either use a dictionary, or one or more keyword - arguments. - :return: The evaluated expression. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - - .. deprecated:: 10.3.0 - """ - - deprecate( - "ImageMath.eval", - 12, - "ImageMath.lambda_eval or ImageMath.unsafe_eval", - ) - return unsafe_eval(expression, _dict, **kw) From b4bc43fed2215418d85c022e6fc4eff31bb33ca7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 21:43:42 +1000 Subject: [PATCH 260/268] Removed ImageCms constants and versions() --- Tests/test_imagecms.py | 11 --- docs/deprecations.rst | 143 ++++++++++++++++++------------------ docs/reference/ImageCms.rst | 1 - src/PIL/ImageCms.py | 27 ------- 4 files changed, 72 insertions(+), 110 deletions(-) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index b6db0ab5c..8d463d0eb 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -54,10 +54,6 @@ def skip_missing() -> None: def test_sanity() -> None: # basic smoke test. # this mostly follows the cms_test outline. - with pytest.warns(DeprecationWarning, match="PIL.ImageCms.versions"): - v = ImageCms.versions() # should return four strings - assert v[0] == "1.0.0 pil" - assert list(map(type, v)) == [str, str, str, str] # internal version number version = features.version_module("littlecms2") @@ -703,13 +699,6 @@ def test_cmyk_lab() -> None: def test_deprecation() -> None: - with pytest.warns(DeprecationWarning, match="ImageCms.DESCRIPTION"): - assert ImageCms.DESCRIPTION.strip().startswith("pyCMS") - with pytest.warns(DeprecationWarning, match="ImageCms.VERSION"): - assert ImageCms.VERSION == "1.0.0 pil" - with pytest.warns(DeprecationWarning, match="ImageCms.FLAGS"): - assert isinstance(ImageCms.FLAGS, dict) - profile = ImageCmsProfile(ImageCms.createProfile("sRGB")) with pytest.warns(DeprecationWarning, match="RGBA;16B"): ImageCms.ImageCmsTransform(profile, profile, "RGBA;16B", "RGB") diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 9eb9650b2..183abea09 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -12,43 +12,6 @@ Deprecated features Below are features which are considered deprecated. Where appropriate, a :py:exc:`DeprecationWarning` is issued. -ImageCms constants and versions() function -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. deprecated:: 10.3.0 - -A number of constants and a function in :py:mod:`.ImageCms` have been deprecated. -This includes a table of flags based on LittleCMS version 1 which has been -replaced with a new class :py:class:`.ImageCms.Flags` based on LittleCMS 2 flags. - -============================================ ==================================================== -Deprecated Use instead -============================================ ==================================================== -``ImageCms.DESCRIPTION`` No replacement -``ImageCms.VERSION`` ``PIL.__version__`` -``ImageCms.FLAGS["MATRIXINPUT"]`` :py:attr:`.ImageCms.Flags.CLUT_POST_LINEARIZATION` -``ImageCms.FLAGS["MATRIXOUTPUT"]`` :py:attr:`.ImageCms.Flags.FORCE_CLUT` -``ImageCms.FLAGS["MATRIXONLY"]`` No replacement -``ImageCms.FLAGS["NOWHITEONWHITEFIXUP"]`` :py:attr:`.ImageCms.Flags.NOWHITEONWHITEFIXUP` -``ImageCms.FLAGS["NOPRELINEARIZATION"]`` :py:attr:`.ImageCms.Flags.CLUT_PRE_LINEARIZATION` -``ImageCms.FLAGS["GUESSDEVICECLASS"]`` :py:attr:`.ImageCms.Flags.GUESSDEVICECLASS` -``ImageCms.FLAGS["NOTCACHE"]`` :py:attr:`.ImageCms.Flags.NOCACHE` -``ImageCms.FLAGS["NOTPRECALC"]`` :py:attr:`.ImageCms.Flags.NOOPTIMIZE` -``ImageCms.FLAGS["NULLTRANSFORM"]`` :py:attr:`.ImageCms.Flags.NULLTRANSFORM` -``ImageCms.FLAGS["HIGHRESPRECALC"]`` :py:attr:`.ImageCms.Flags.HIGHRESPRECALC` -``ImageCms.FLAGS["LOWRESPRECALC"]`` :py:attr:`.ImageCms.Flags.LOWRESPRECALC` -``ImageCms.FLAGS["GAMUTCHECK"]`` :py:attr:`.ImageCms.Flags.GAMUTCHECK` -``ImageCms.FLAGS["WHITEBLACKCOMPENSATION"]`` :py:attr:`.ImageCms.Flags.BLACKPOINTCOMPENSATION` -``ImageCms.FLAGS["BLACKPOINTCOMPENSATION"]`` :py:attr:`.ImageCms.Flags.BLACKPOINTCOMPENSATION` -``ImageCms.FLAGS["SOFTPROOFING"]`` :py:attr:`.ImageCms.Flags.SOFTPROOFING` -``ImageCms.FLAGS["PRESERVEBLACK"]`` :py:attr:`.ImageCms.Flags.NONEGATIVES` -``ImageCms.FLAGS["NODEFAULTRESOURCEDEF"]`` :py:attr:`.ImageCms.Flags.NODEFAULTRESOURCEDEF` -``ImageCms.FLAGS["GRIDPOINTS"]`` :py:attr:`.ImageCms.Flags.GRIDPOINTS()` -``ImageCms.versions()`` :py:func:`PIL.features.version_module` with - ``feature="littlecms2"``, :py:data:`sys.version` or - :py:data:`sys.version_info`, and ``PIL.__version__`` -============================================ ==================================================== - Non-image modes in ImageCms ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -153,6 +116,78 @@ The functions ``IptcImageFile.dump`` and ``IptcImageFile.i``, and the constant intended for internal use, so there is no replacement. They can each be replaced by a single line of code using builtin functions in Python. +ImageCms constants and versions() function +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. deprecated:: 10.3.0 +.. versionremoved:: 12.0.0 + +A number of constants and a function in :py:mod:`.ImageCms` have been removed. This +includes a table of flags based on LittleCMS version 1 which has been replaced with a +new class :py:class:`.ImageCms.Flags` based on LittleCMS 2 flags. + +============================================ ==================================================== +Deprecated Use instead +============================================ ==================================================== +``ImageCms.DESCRIPTION`` No replacement +``ImageCms.VERSION`` ``PIL.__version__`` +``ImageCms.FLAGS["MATRIXINPUT"]`` :py:attr:`.ImageCms.Flags.CLUT_POST_LINEARIZATION` +``ImageCms.FLAGS["MATRIXOUTPUT"]`` :py:attr:`.ImageCms.Flags.FORCE_CLUT` +``ImageCms.FLAGS["MATRIXONLY"]`` No replacement +``ImageCms.FLAGS["NOWHITEONWHITEFIXUP"]`` :py:attr:`.ImageCms.Flags.NOWHITEONWHITEFIXUP` +``ImageCms.FLAGS["NOPRELINEARIZATION"]`` :py:attr:`.ImageCms.Flags.CLUT_PRE_LINEARIZATION` +``ImageCms.FLAGS["GUESSDEVICECLASS"]`` :py:attr:`.ImageCms.Flags.GUESSDEVICECLASS` +``ImageCms.FLAGS["NOTCACHE"]`` :py:attr:`.ImageCms.Flags.NOCACHE` +``ImageCms.FLAGS["NOTPRECALC"]`` :py:attr:`.ImageCms.Flags.NOOPTIMIZE` +``ImageCms.FLAGS["NULLTRANSFORM"]`` :py:attr:`.ImageCms.Flags.NULLTRANSFORM` +``ImageCms.FLAGS["HIGHRESPRECALC"]`` :py:attr:`.ImageCms.Flags.HIGHRESPRECALC` +``ImageCms.FLAGS["LOWRESPRECALC"]`` :py:attr:`.ImageCms.Flags.LOWRESPRECALC` +``ImageCms.FLAGS["GAMUTCHECK"]`` :py:attr:`.ImageCms.Flags.GAMUTCHECK` +``ImageCms.FLAGS["WHITEBLACKCOMPENSATION"]`` :py:attr:`.ImageCms.Flags.BLACKPOINTCOMPENSATION` +``ImageCms.FLAGS["BLACKPOINTCOMPENSATION"]`` :py:attr:`.ImageCms.Flags.BLACKPOINTCOMPENSATION` +``ImageCms.FLAGS["SOFTPROOFING"]`` :py:attr:`.ImageCms.Flags.SOFTPROOFING` +``ImageCms.FLAGS["PRESERVEBLACK"]`` :py:attr:`.ImageCms.Flags.NONEGATIVES` +``ImageCms.FLAGS["NODEFAULTRESOURCEDEF"]`` :py:attr:`.ImageCms.Flags.NODEFAULTRESOURCEDEF` +``ImageCms.FLAGS["GRIDPOINTS"]`` :py:attr:`.ImageCms.Flags.GRIDPOINTS()` +``ImageCms.versions()`` :py:func:`PIL.features.version_module` with + ``feature="littlecms2"``, :py:data:`sys.version` or + :py:data:`sys.version_info`, and ``PIL.__version__`` +============================================ ==================================================== + +ImageMath eval() +^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.3.0 +.. versionremoved:: 12.0.0 + +``ImageMath.eval()`` has been removed. Use :py:meth:`~PIL.ImageMath.lambda_eval` or +:py:meth:`~PIL.ImageMath.unsafe_eval` instead. + +BGR;15, BGR 16 and BGR;24 +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +The experimental BGR;15, BGR;16 and BGR;24 modes have been removed. + +Support for LibTIFF earlier than 4 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +Support for LibTIFF earlier than version 4 has been removed. +Upgrade to a newer version of LibTIFF instead. + +ImageDraw.getdraw hints parameter +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been removed. + Image isImageType() ^^^^^^^^^^^^^^^^^^^ @@ -201,40 +236,6 @@ removed. They were used for obtaining raw pointers to ``ImagingCore`` internals. interact with C code, you can use ``Image.Image.getim()``, which returns a ``Capsule`` object. -ImageMath eval() -^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.3.0 -.. versionremoved:: 12.0.0 - -``ImageMath.eval()`` has been removed. Use :py:meth:`~PIL.ImageMath.lambda_eval` or -:py:meth:`~PIL.ImageMath.unsafe_eval` instead. - -BGR;15, BGR 16 and BGR;24 -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.4.0 -.. versionremoved:: 12.0.0 - -The experimental BGR;15, BGR;16 and BGR;24 modes have been removed. - -Support for LibTIFF earlier than 4 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.4.0 -.. versionremoved:: 12.0.0 - -Support for LibTIFF earlier than version 4 has been removed. -Upgrade to a newer version of LibTIFF instead. - -ImageDraw.getdraw hints parameter -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.4.0 -.. versionremoved:: 12.0.0 - -The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been removed. - TiffImagePlugin IFD_LEGACY_API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/reference/ImageCms.rst b/docs/reference/ImageCms.rst index 238390e75..4a2123677 100644 --- a/docs/reference/ImageCms.rst +++ b/docs/reference/ImageCms.rst @@ -56,7 +56,6 @@ Functions .. autofunction:: get_display_profile .. autofunction:: isIntentSupported .. autofunction:: profileToProfile -.. autofunction:: versions CmsProfile ---------- diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index a1584f111..a90efaeb6 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -108,20 +108,6 @@ pyCMS _VERSION = "1.0.0 pil" -def __getattr__(name: str) -> Any: - if name == "DESCRIPTION": - deprecate("PIL.ImageCms.DESCRIPTION", 12) - return _DESCRIPTION - elif name == "VERSION": - deprecate("PIL.ImageCms.VERSION", 12) - return _VERSION - elif name == "FLAGS": - deprecate("PIL.ImageCms.FLAGS", 12, "PIL.ImageCms.Flags") - return _FLAGS - msg = f"module '{__name__}' has no attribute '{name}'" - raise AttributeError(msg) - - # --------------------------------------------------------------------. @@ -1108,16 +1094,3 @@ def isIntentSupported( return -1 except (AttributeError, OSError, TypeError, ValueError) as v: raise PyCMSError(v) from v - - -def versions() -> tuple[str, str | None, str, str]: - """ - (pyCMS) Fetches versions. - """ - - deprecate( - "PIL.ImageCms.versions()", - 12, - '(PIL.features.version("littlecms2"), sys.version, PIL.__version__)', - ) - return _VERSION, core.littlecms_version, sys.version.split()[0], __version__ From 9fbc255ce56c355573fc81dffc73741411fb2d5a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 20:47:58 +1000 Subject: [PATCH 261/268] Removed non-image modes in ImageCms --- Tests/test_imagecms.py | 14 -------------- docs/deprecations.rst | 19 ++++++++++--------- src/PIL/ImageCms.py | 30 ++---------------------------- 3 files changed, 12 insertions(+), 51 deletions(-) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 8d463d0eb..55a4a87fb 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -673,12 +673,6 @@ def test_auxiliary_channels_isolated() -> None: assert_image_equal(test_image.convert(dst_format[2]), reference_image) -def test_long_modes() -> None: - p = ImageCms.getOpenProfile("Tests/icc/sGrey-v2-nano.icc") - with pytest.warns(DeprecationWarning, match="ABCDEFGHI"): - ImageCms.buildTransform(p, p, "ABCDEFGHI", "ABCDEFGHI") - - @pytest.mark.parametrize("mode", ("RGB", "RGBA", "RGBX")) def test_rgb_lab(mode: str) -> None: im = Image.new(mode, (1, 1)) @@ -696,11 +690,3 @@ def test_cmyk_lab() -> None: im = Image.new("CMYK", (1, 1)) converted_im = im.convert("LAB") assert converted_im.getpixel((0, 0)) == (255, 128, 128) - - -def test_deprecation() -> None: - profile = ImageCmsProfile(ImageCms.createProfile("sRGB")) - with pytest.warns(DeprecationWarning, match="RGBA;16B"): - ImageCms.ImageCmsTransform(profile, profile, "RGBA;16B", "RGB") - with pytest.warns(DeprecationWarning, match="RGBA;16B"): - ImageCms.ImageCmsTransform(profile, profile, "RGB", "RGBA;16B") diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 183abea09..772e88147 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -12,15 +12,6 @@ Deprecated features Below are features which are considered deprecated. Where appropriate, a :py:exc:`DeprecationWarning` is issued. -Non-image modes in ImageCms -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 10.4.0 - -The use in :py:mod:`.ImageCms` of input modes and output modes that are not Pillow -image modes has been deprecated. Defaulting to "L" or "1" if the mode cannot be mapped -is also deprecated. - ImageDraw.getdraw hints parameter ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -171,6 +162,16 @@ BGR;15, BGR 16 and BGR;24 The experimental BGR;15, BGR;16 and BGR;24 modes have been removed. +Non-image modes in ImageCms +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 10.4.0 +.. versionremoved:: 12.0.0 + +The use in :py:mod:`.ImageCms` of input modes and output modes that are not Pillow +image modes has been removed. Defaulting to "L" or "1" if the mode cannot be mapped has +also been removed. + Support for LibTIFF earlier than 4 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index a90efaeb6..d3555694a 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -23,10 +23,9 @@ import operator import sys from enum import IntEnum, IntFlag from functools import reduce -from typing import Any, Literal, SupportsFloat, SupportsInt, Union +from typing import Literal, SupportsFloat, SupportsInt, Union -from . import Image, __version__ -from ._deprecate import deprecate +from . import Image from ._typing import SupportsRead try: @@ -287,31 +286,6 @@ class ImageCmsTransform(Image.ImagePointHandler): proof_intent: Intent = Intent.ABSOLUTE_COLORIMETRIC, flags: Flags = Flags.NONE, ): - supported_modes = ( - "RGB", - "RGBA", - "RGBX", - "CMYK", - "I;16", - "I;16L", - "I;16B", - "YCbCr", - "LAB", - "L", - "1", - ) - for mode in (input_mode, output_mode): - if mode not in supported_modes: - deprecate( - mode, - 12, - { - "L;16": "I;16 or I;16L", - "L:16B": "I;16B", - "YCCA": "YCbCr", - "YCC": "YCbCr", - }.get(mode), - ) if proof is None: self.transform = core.buildTransform( input.profile, output.profile, input_mode, output_mode, intent, flags From aaf217cea0888a8f07d3c7ccbbf200114c5c0012 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 21:15:08 +1000 Subject: [PATCH 262/268] Removed ICNS (width, height, scale) sizes --- Tests/test_file_icns.py | 12 +----------- docs/deprecations.rst | 16 ++++++++-------- src/PIL/IcnsImagePlugin.py | 32 +++++++++++--------------------- 3 files changed, 20 insertions(+), 40 deletions(-) diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py index 8ff59161f..b9b818506 100644 --- a/Tests/test_file_icns.py +++ b/Tests/test_file_icns.py @@ -93,21 +93,11 @@ def test_sizes() -> None: with Image.open(TEST_FILE) as im: assert isinstance(im, IcnsImagePlugin.IcnsImageFile) for w, h, r in im.info["sizes"]: - wr = w * r - hr = h * r - with pytest.warns( - DeprecationWarning, match=r"Setting size to \(width, height, scale\)" - ): - im.size = (w, h, r) - im.load() - assert im.mode == "RGBA" - assert im.size == (wr, hr) - # Test using load() with scale im.size = (w, h) im.load(scale=r) assert im.mode == "RGBA" - assert im.size == (wr, hr) + assert im.size == (w * r, h * r) # Check that we cannot load an incorrect size with pytest.raises(ValueError): diff --git a/docs/deprecations.rst b/docs/deprecations.rst index 772e88147..e2c74f2a2 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -32,14 +32,6 @@ vulnerability introduced in FreeType 2.6 (:cve:`2020-15999`). .. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ -ICNS (width, height, scale) sizes -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. deprecated:: 11.0.0 - -Setting an ICNS image size to ``(width, height, scale)`` before loading has been -deprecated. Instead, ``load(scale)`` can be used. - ExifTags.IFD.Makernote ^^^^^^^^^^^^^^^^^^^^^^ @@ -189,6 +181,14 @@ ImageDraw.getdraw hints parameter The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been removed. +ICNS (width, height, scale) sizes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. deprecated:: 11.0.0 + +Setting an ICNS image size to ``(width, height, scale)`` before loading has been +removed. Instead, ``load(scale)`` can be used. + Image isImageType() ^^^^^^^^^^^^^^^^^^^ diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 5a88429e5..197ea7a2b 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -25,7 +25,6 @@ import sys from typing import IO from . import Image, ImageFile, PngImagePlugin, features -from ._deprecate import deprecate enable_jpeg2k = features.check_codec("jpg_2000") if enable_jpeg2k: @@ -275,34 +274,25 @@ class IcnsImageFile(ImageFile.ImageFile): self.best_size[1] * self.best_size[2], ) - @property # type: ignore[override] - def size(self) -> tuple[int, int] | tuple[int, int, int]: + @property + def size(self) -> tuple[int, int]: return self._size @size.setter - def size(self, value: tuple[int, int] | tuple[int, int, int]) -> None: - if len(value) == 3: - deprecate("Setting size to (width, height, scale)", 12, "load(scale)") - if value in self.info["sizes"]: - self._size = value # type: ignore[assignment] + def size(self, value: tuple[int, int]) -> None: + # Check that a matching size exists, + # or that there is a scale that would create a size that matches + for size in self.info["sizes"]: + simple_size = size[0] * size[2], size[1] * size[2] + scale = simple_size[0] // value[0] + if simple_size[1] / value[1] == scale: + self._size = value return - else: - # Check that a matching size exists, - # or that there is a scale that would create a size that matches - for size in self.info["sizes"]: - simple_size = size[0] * size[2], size[1] * size[2] - scale = simple_size[0] // value[0] - if simple_size[1] / value[1] == scale: - self._size = value - return msg = "This is not one of the allowed sizes of this image" raise ValueError(msg) def load(self, scale: int | None = None) -> Image.core.PixelAccess | None: - if scale is not None or len(self.size) == 3: - if scale is None and len(self.size) == 3: - scale = self.size[2] - assert scale is not None + if scale is not None: width, height = self.size[:2] self.size = width * scale, height * scale self.best_size = width, height, scale From 92bafe6b88d903d06f0eeba2f1dd26dd0eea52bb Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 21:44:33 +1000 Subject: [PATCH 263/268] Removed support for FreeType <= 2.9.0 --- Tests/test_imagefont.py | 39 --------------------------------------- docs/deprecations.rst | 33 +++++++++++++++++---------------- src/PIL/ImageFont.py | 17 +---------------- 3 files changed, 18 insertions(+), 71 deletions(-) diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 9334d30e4..4565d35ba 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -11,7 +11,6 @@ from pathlib import Path from typing import Any, BinaryIO import pytest -from packaging.version import parse as parse_version from PIL import Image, ImageDraw, ImageFont, features from PIL._typing import StrOrBytesPath @@ -691,16 +690,6 @@ def test_complex_font_settings() -> None: def test_variation_get(font: ImageFont.FreeTypeFont) -> None: - version = features.version_module("freetype2") - assert version is not None - freetype = parse_version(version) - if freetype < parse_version("2.9.1"): - with pytest.raises(NotImplementedError): - font.get_variation_names() - with pytest.raises(NotImplementedError): - font.get_variation_axes() - return - with pytest.raises(OSError): font.get_variation_names() with pytest.raises(OSError): @@ -763,14 +752,6 @@ def _check_text(font: ImageFont.FreeTypeFont, path: str, epsilon: float) -> None def test_variation_set_by_name(font: ImageFont.FreeTypeFont) -> None: - version = features.version_module("freetype2") - assert version is not None - freetype = parse_version(version) - if freetype < parse_version("2.9.1"): - with pytest.raises(NotImplementedError): - font.set_variation_by_name("Bold") - return - with pytest.raises(OSError): font.set_variation_by_name("Bold") @@ -790,14 +771,6 @@ def test_variation_set_by_name(font: ImageFont.FreeTypeFont) -> None: def test_variation_set_by_axes(font: ImageFont.FreeTypeFont) -> None: - version = features.version_module("freetype2") - assert version is not None - freetype = parse_version(version) - if freetype < parse_version("2.9.1"): - with pytest.raises(NotImplementedError): - font.set_variation_by_axes([100]) - return - with pytest.raises(OSError): font.set_variation_by_axes([500, 50]) @@ -1209,15 +1182,3 @@ def test_invalid_truetype_sizes_raise_valueerror( ) -> None: with pytest.raises(ValueError): ImageFont.truetype(FONT_PATH, size, layout_engine=layout_engine) - - -def test_freetype_deprecation(monkeypatch: pytest.MonkeyPatch) -> None: - # Arrange: mock features.version_module to return fake FreeType version - def fake_version_module(module: str) -> str: - return "2.9.0" - - monkeypatch.setattr(features, "version_module", fake_version_module) - - # Act / Assert - with pytest.warns(DeprecationWarning, match="FreeType 2.9.0"): - ImageFont.truetype(FONT_PATH, FONT_SIZE) diff --git a/docs/deprecations.rst b/docs/deprecations.rst index e2c74f2a2..236554565 100644 --- a/docs/deprecations.rst +++ b/docs/deprecations.rst @@ -19,19 +19,6 @@ ImageDraw.getdraw hints parameter The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been deprecated. -FreeType 2.9.0 -^^^^^^^^^^^^^^ - -.. deprecated:: 11.0.0 - -Support for FreeType 2.9.0 is deprecated and will be removed in Pillow 12.0.0 -(2025-10-15), when FreeType 2.9.1 will be the minimum supported. - -We recommend upgrading to at least FreeType `2.10.4`_, which fixed a severe -vulnerability introduced in FreeType 2.6 (:cve:`2020-15999`). - -.. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ - ExifTags.IFD.Makernote ^^^^^^^^^^^^^^^^^^^^^^ @@ -79,7 +66,7 @@ Deprecated features are only removed in major releases after an appropriate period of deprecation has passed. ImageFile.raise_oserror -~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^ .. deprecated:: 10.2.0 .. versionremoved:: 12.0.0 @@ -89,7 +76,7 @@ only useful for translating error codes returned by a codec's ``decode()`` metho which ImageFile already did automatically. IptcImageFile helper functions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. deprecated:: 10.2.0 .. versionremoved:: 12.0.0 @@ -100,7 +87,7 @@ intended for internal use, so there is no replacement. They can each be replaced single line of code using builtin functions in Python. ImageCms constants and versions() function -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. deprecated:: 10.3.0 .. versionremoved:: 12.0.0 @@ -181,6 +168,20 @@ ImageDraw.getdraw hints parameter The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been removed. +FreeType 2.9.0 +^^^^^^^^^^^^^^ + +.. deprecated:: 11.0.0 +.. versionremoved:: 12.0.0 + +Support for FreeType 2.9.0 has been removed. FreeType 2.9.1 is the minimum version +supported. + +We recommend upgrading to at least FreeType `2.10.4`_, which fixed a severe +vulnerability introduced in FreeType 2.6 (:cve:`2020-15999`). + +.. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ + ICNS (width, height, scale) sizes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 329c463ff..bf3f471f5 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -36,7 +36,7 @@ from io import BytesIO from types import ModuleType from typing import IO, Any, BinaryIO, TypedDict, cast -from . import Image, features +from . import Image from ._typing import StrOrBytesPath from ._util import DeferredError, is_path @@ -236,21 +236,6 @@ class FreeTypeFont: self.index = index self.encoding = encoding - try: - from packaging.version import parse as parse_version - except ImportError: - pass - else: - if freetype_version := features.version_module("freetype2"): - if parse_version(freetype_version) < parse_version("2.9.1"): - warnings.warn( - "Support for FreeType 2.9.0 is deprecated and will be removed " - "in Pillow 12 (2025-10-15). Please upgrade to FreeType 2.9.1 " - "or newer, preferably FreeType 2.10.4 which fixes " - "CVE-2020-15999.", - DeprecationWarning, - ) - if layout_engine not in (Layout.BASIC, Layout.RAQM): layout_engine = Layout.BASIC if core.HAVE_RAQM: From 0e3aac1ed18e5fa55a9fa7ef1956eccbc4b32ed7 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 21:19:30 +1000 Subject: [PATCH 264/268] Updated deprecation timeline --- Tests/test_deprecate.py | 20 ++++++++++---------- src/PIL/_deprecate.py | 2 -- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Tests/test_deprecate.py b/Tests/test_deprecate.py index 88479ff0d..1e98ecfff 100644 --- a/Tests/test_deprecate.py +++ b/Tests/test_deprecate.py @@ -9,9 +9,9 @@ from PIL import _deprecate "version, expected", [ ( - 12, - "Old thing is deprecated and will be removed in Pillow 12 " - r"\(2025-10-15\)\. Use new thing instead\.", + 13, + "Old thing is deprecated and will be removed in Pillow 13 " + r"\(2026-10-15\)\. Use new thing instead\.", ), ( None, @@ -53,18 +53,18 @@ def test_old_version(deprecated: str, plural: bool, expected: str) -> None: def test_plural() -> None: expected = ( - r"Old things are deprecated and will be removed in Pillow 12 \(2025-10-15\)\. " + r"Old things are deprecated and will be removed in Pillow 13 \(2026-10-15\)\. " r"Use new thing instead\." ) with pytest.warns(DeprecationWarning, match=expected): - _deprecate.deprecate("Old things", 12, "new thing", plural=True) + _deprecate.deprecate("Old things", 13, "new thing", plural=True) def test_replacement_and_action() -> None: expected = "Use only one of 'replacement' and 'action'" with pytest.raises(ValueError, match=expected): _deprecate.deprecate( - "Old thing", 12, replacement="new thing", action="Upgrade to new thing" + "Old thing", 13, replacement="new thing", action="Upgrade to new thing" ) @@ -77,16 +77,16 @@ def test_replacement_and_action() -> None: ) def test_action(action: str) -> None: expected = ( - r"Old thing is deprecated and will be removed in Pillow 12 \(2025-10-15\)\. " + r"Old thing is deprecated and will be removed in Pillow 13 \(2026-10-15\)\. " r"Upgrade to new thing\." ) with pytest.warns(DeprecationWarning, match=expected): - _deprecate.deprecate("Old thing", 12, action=action) + _deprecate.deprecate("Old thing", 13, action=action) def test_no_replacement_or_action() -> None: expected = ( - r"Old thing is deprecated and will be removed in Pillow 12 \(2025-10-15\)" + r"Old thing is deprecated and will be removed in Pillow 13 \(2026-10-15\)" ) with pytest.warns(DeprecationWarning, match=expected): - _deprecate.deprecate("Old thing", 12) + _deprecate.deprecate("Old thing", 13) diff --git a/src/PIL/_deprecate.py b/src/PIL/_deprecate.py index 170d44490..616a9aace 100644 --- a/src/PIL/_deprecate.py +++ b/src/PIL/_deprecate.py @@ -46,8 +46,6 @@ def deprecate( elif when <= int(__version__.split(".")[0]): msg = f"{deprecated} {is_} deprecated and should be removed." raise RuntimeError(msg) - elif when == 12: - removed = "Pillow 12 (2025-10-15)" elif when == 13: removed = "Pillow 13 (2026-10-15)" else: From f2417d8b390b3205a01795491dd45ebacd88800b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 1 Jul 2025 21:42:32 +1000 Subject: [PATCH 265/268] Added release notes --- docs/releasenotes/12.0.0.rst | 140 +++++++++++++++++++++++++++++++++ docs/releasenotes/index.rst | 1 + docs/releasenotes/template.rst | 2 + 3 files changed, 143 insertions(+) create mode 100644 docs/releasenotes/12.0.0.rst diff --git a/docs/releasenotes/12.0.0.rst b/docs/releasenotes/12.0.0.rst new file mode 100644 index 000000000..68b664443 --- /dev/null +++ b/docs/releasenotes/12.0.0.rst @@ -0,0 +1,140 @@ +12.0.0 +------ + +Security +======== + +TODO +^^^^ + +TODO + +:cve:`YYYY-XXXXX`: TODO +^^^^^^^^^^^^^^^^^^^^^^^ + +TODO + +Backwards incompatible changes +============================== + +ImageFile.raise_oserror +^^^^^^^^^^^^^^^^^^^^^^^ + +``ImageFile.raise_oserror()`` has been removed. The function was undocumented and was +only useful for translating error codes returned by a codec's ``decode()`` method, +which ImageFile already did automatically. + +IptcImageFile helper functions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The functions ``IptcImageFile.dump`` and ``IptcImageFile.i``, and the constant +``IptcImageFile.PAD`` have been removed. These were undocumented helper functions +intended for internal use, so there is no replacement. They can each be replaced by a +single line of code using builtin functions in Python. + +ImageCms constants and versions() function +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A number of constants and a function in :py:mod:`.ImageCms` have been removed. This +includes a table of flags based on LittleCMS version 1 which has been replaced with a +new class :py:class:`.ImageCms.Flags` based on LittleCMS 2 flags. + +============================================ ==================================================== +Deprecated Use instead +============================================ ==================================================== +``ImageCms.DESCRIPTION`` No replacement +``ImageCms.VERSION`` ``PIL.__version__`` +``ImageCms.FLAGS["MATRIXINPUT"]`` :py:attr:`.ImageCms.Flags.CLUT_POST_LINEARIZATION` +``ImageCms.FLAGS["MATRIXOUTPUT"]`` :py:attr:`.ImageCms.Flags.FORCE_CLUT` +``ImageCms.FLAGS["MATRIXONLY"]`` No replacement +``ImageCms.FLAGS["NOWHITEONWHITEFIXUP"]`` :py:attr:`.ImageCms.Flags.NOWHITEONWHITEFIXUP` +``ImageCms.FLAGS["NOPRELINEARIZATION"]`` :py:attr:`.ImageCms.Flags.CLUT_PRE_LINEARIZATION` +``ImageCms.FLAGS["GUESSDEVICECLASS"]`` :py:attr:`.ImageCms.Flags.GUESSDEVICECLASS` +``ImageCms.FLAGS["NOTCACHE"]`` :py:attr:`.ImageCms.Flags.NOCACHE` +``ImageCms.FLAGS["NOTPRECALC"]`` :py:attr:`.ImageCms.Flags.NOOPTIMIZE` +``ImageCms.FLAGS["NULLTRANSFORM"]`` :py:attr:`.ImageCms.Flags.NULLTRANSFORM` +``ImageCms.FLAGS["HIGHRESPRECALC"]`` :py:attr:`.ImageCms.Flags.HIGHRESPRECALC` +``ImageCms.FLAGS["LOWRESPRECALC"]`` :py:attr:`.ImageCms.Flags.LOWRESPRECALC` +``ImageCms.FLAGS["GAMUTCHECK"]`` :py:attr:`.ImageCms.Flags.GAMUTCHECK` +``ImageCms.FLAGS["WHITEBLACKCOMPENSATION"]`` :py:attr:`.ImageCms.Flags.BLACKPOINTCOMPENSATION` +``ImageCms.FLAGS["BLACKPOINTCOMPENSATION"]`` :py:attr:`.ImageCms.Flags.BLACKPOINTCOMPENSATION` +``ImageCms.FLAGS["SOFTPROOFING"]`` :py:attr:`.ImageCms.Flags.SOFTPROOFING` +``ImageCms.FLAGS["PRESERVEBLACK"]`` :py:attr:`.ImageCms.Flags.NONEGATIVES` +``ImageCms.FLAGS["NODEFAULTRESOURCEDEF"]`` :py:attr:`.ImageCms.Flags.NODEFAULTRESOURCEDEF` +``ImageCms.FLAGS["GRIDPOINTS"]`` :py:attr:`.ImageCms.Flags.GRIDPOINTS()` +``ImageCms.versions()`` :py:func:`PIL.features.version_module` with + ``feature="littlecms2"``, :py:data:`sys.version` or + :py:data:`sys.version_info`, and ``PIL.__version__`` +============================================ ==================================================== + +ImageMath eval() +^^^^^^^^^^^^^^^^ + +``ImageMath.eval()`` has been removed. Use :py:meth:`~PIL.ImageMath.lambda_eval` or +:py:meth:`~PIL.ImageMath.unsafe_eval` instead. + +BGR;15, BGR 16 and BGR;24 +^^^^^^^^^^^^^^^^^^^^^^^^^ + +The experimental BGR;15, BGR;16 and BGR;24 modes have been removed. + +Non-image modes in ImageCms +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The use in :py:mod:`.ImageCms` of input modes and output modes that are not Pillow +image modes has been removed. Defaulting to "L" or "1" if the mode cannot be mapped has +also been removed. + +Support for LibTIFF earlier than 4 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Support for LibTIFF earlier than version 4 has been removed. +Upgrade to a newer version of LibTIFF instead. + +ImageDraw.getdraw hints parameter +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been removed. + +FreeType 2.9.0 +^^^^^^^^^^^^^^ + +Support for FreeType 2.9.0 has been removed. FreeType 2.9.1 is the minimum version +supported. + +We recommend upgrading to at least FreeType `2.10.4`_, which fixed a severe +vulnerability introduced in FreeType 2.6 (:cve:`2020-15999`). + +.. _2.10.4: https://sourceforge.net/projects/freetype/files/freetype2/2.10.4/ + +Deprecations +============ + +TODO +^^^^ + +TODO + +API changes +=========== + +TODO +^^^^ + +TODO + +API additions +============= + +TODO +^^^^ + +TODO + +Other changes +============= + +TODO +^^^^ + +TODO diff --git a/docs/releasenotes/index.rst b/docs/releasenotes/index.rst index a85f1e075..f66240c89 100644 --- a/docs/releasenotes/index.rst +++ b/docs/releasenotes/index.rst @@ -14,6 +14,7 @@ expected to be backported to earlier versions. .. toctree:: :maxdepth: 2 + 12.0.0 11.3.0 11.2.1 11.1.0 diff --git a/docs/releasenotes/template.rst b/docs/releasenotes/template.rst index a453d2a43..b603a9938 100644 --- a/docs/releasenotes/template.rst +++ b/docs/releasenotes/template.rst @@ -20,6 +20,8 @@ Backwards incompatible changes TODO ^^^^ +TODO + Deprecations ============ From 1ee91f22ba4ecf8fabf7b2de4ac9b3eafe5c168e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 5 Jul 2025 22:51:02 +1000 Subject: [PATCH 266/268] Updated macOS tested Pillow versions --- docs/installation/platform-support.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/platform-support.rst b/docs/installation/platform-support.rst index a56f94316..c2227f1d2 100644 --- a/docs/installation/platform-support.rst +++ b/docs/installation/platform-support.rst @@ -75,7 +75,7 @@ These platforms have been reported to work at the versions mentioned. | Operating system | | Tested Python | | Latest tested | | Tested | | | | versions | | Pillow version | | processors | +==================================+============================+==================+==============+ -| macOS 15 Sequoia | 3.9, 3.10, 3.11, 3.12, 3.13| 11.2.1 |arm | +| macOS 15 Sequoia | 3.9, 3.10, 3.11, 3.12, 3.13| 11.3.0 |arm | | +----------------------------+------------------+ | | | 3.8 | 10.4.0 | | +----------------------------------+----------------------------+------------------+--------------+ From a84458ffbd56d59d59e0f6d750ba771e71596b4c Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 5 Jul 2025 11:45:02 +1000 Subject: [PATCH 267/268] Revert "Work around pyroma test" This reverts commit d8a0cb5db104cc5d9acc6b4ba1ba871636132f51. --- Tests/test_pyroma.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Tests/test_pyroma.py b/Tests/test_pyroma.py index 9669f485a..a161d3f05 100644 --- a/Tests/test_pyroma.py +++ b/Tests/test_pyroma.py @@ -25,11 +25,5 @@ def test_pyroma() -> None: ) else: - # Should have a perfect score, but pyroma does not support PEP 639 yet. - assert rating == ( - 9, - [ - "Your package does neither have a license field " - "nor any license classifiers." - ], - ) + # Should have a perfect score + assert rating == (10, []) From 14b0cebfc1c1acb0de44520c63de7294be1d59a5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 17:16:48 +0000 Subject: [PATCH 268/268] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.12.0 → v0.12.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.0...v0.12.2) - [github.com/PyCQA/bandit: 1.8.5 → 1.8.6](https://github.com/PyCQA/bandit/compare/1.8.5...1.8.6) - [github.com/pre-commit/mirrors-clang-format: v20.1.6 → v20.1.7](https://github.com/pre-commit/mirrors-clang-format/compare/v20.1.6...v20.1.7) - [github.com/python-jsonschema/check-jsonschema: 0.33.1 → 0.33.2](https://github.com/python-jsonschema/check-jsonschema/compare/0.33.1...0.33.2) - [github.com/woodruffw/zizmor-pre-commit: v1.9.0 → v1.11.0](https://github.com/woodruffw/zizmor-pre-commit/compare/v1.9.0...v1.11.0) --- .pre-commit-config.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d5fd964f1..75c7d3632 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.0 + rev: v0.12.2 hooks: - id: ruff-check args: [--exit-non-zero-on-fix] @@ -11,7 +11,7 @@ repos: - id: black - repo: https://github.com/PyCQA/bandit - rev: 1.8.5 + rev: 1.8.6 hooks: - id: bandit args: [--severity-level=high] @@ -24,7 +24,7 @@ repos: exclude: (Makefile$|\.bat$|\.cmake$|\.eps$|\.fits$|\.gd$|\.opt$|\.patch$) - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v20.1.6 + rev: v20.1.7 hooks: - id: clang-format types: [c] @@ -51,14 +51,14 @@ repos: exclude: ^.github/.*TEMPLATE|^Tests/(fonts|images)/|\.patch$ - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.33.1 + rev: 0.33.2 hooks: - id: check-github-workflows - id: check-readthedocs - id: check-renovate - repo: https://github.com/woodruffw/zizmor-pre-commit - rev: v1.9.0 + rev: v1.11.0 hooks: - id: zizmor