diff --git a/.ci/install.sh b/.ci/install.sh index d5cbd82488b..4748feb3d49 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 python3-tk\ ghostscript libffi-dev libjpeg-turbo-progs libopenjp2-7-dev\ cmake meson imagemagick libharfbuzz-dev libfribidi-dev\ - sway wl-clipboard + sway wl-clipboard libopenblas-dev fi python3 -m pip install --upgrade pip @@ -38,8 +38,7 @@ python3 -m pip install -U pytest-timeout python3 -m pip install pyroma if [[ $(uname) != CYGWIN* ]]; then - # TODO Remove condition when NumPy supports 3.12 - if ! [ "$GHA_PYTHON_VERSION" == "3.12-dev" ]; then python3 -m pip install numpy ; fi + python3 -m pip install numpy # PyQt6 doesn't support PyPy3 if [[ $GHA_PYTHON_VERSION == 3.* ]]; then diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index 1fc6262f4fe..a20838a1507 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -3,6 +3,7 @@ set -e brew install libtiff libjpeg openjpeg libimagequant webp little-cms2 freetype libraqm +export PKG_CONFIG_PATH="/usr/local/opt/openblas/lib/pkgconfig" PYTHONOPTIMIZE=0 python3 -m pip install cffi python3 -m pip install coverage @@ -13,8 +14,7 @@ python3 -m pip install -U pytest-cov python3 -m pip install -U pytest-timeout python3 -m pip install pyroma -# TODO Remove condition when NumPy supports 3.12 -if ! [ "$GHA_PYTHON_VERSION" == "3.12-dev" ]; then python3 -m pip install numpy ; fi +python3 -m pip install numpy # extra test images pushd depends && ./install_extra_test_images.sh && popd diff --git a/.github/workflows/test-cygwin.yml b/.github/workflows/test-cygwin.yml index 949da636069..5071e5bd442 100644 --- a/.github/workflows/test-cygwin.yml +++ b/.github/workflows/test-cygwin.yml @@ -102,10 +102,10 @@ jobs: run: | bash.exe .ci/install.sh - - name: Install latest NumPy + - name: Upgrade NumPy shell: dash.exe -l "{0}" run: | - python3 -m pip install -U numpy + python3 -m pip install -U "numpy<1.26" - name: Build shell: bash.exe -eo pipefail -o igncr "{0}" diff --git a/CHANGES.rst b/CHANGES.rst index 9cdd4cf2524..d1dce8e0d90 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ Changelog (Pillow) 10.1.0 (unreleased) ------------------- +- Fixed bug when reading BC5S DDS images #7401 + [radarhere] + - Prevent TIFF orientation from being applied more than once #7383 [radarhere] diff --git a/Tests/images/bc5s.png b/Tests/images/bc5s.png index 39d7811bf2e..657d723053a 100644 Binary files a/Tests/images/bc5s.png and b/Tests/images/bc5s.png differ diff --git a/docs/reference/Image.rst b/docs/reference/Image.rst index 41d3b8fcec0..66e6b2a0c97 100644 --- a/docs/reference/Image.rst +++ b/docs/reference/Image.rst @@ -93,10 +93,14 @@ Generating images Registering plugins ^^^^^^^^^^^^^^^^^^^ +.. autofunction:: preinit +.. autofunction:: init + .. note:: - These functions are for use by plugin authors. Application authors can - ignore them. + These functions are for use by plugin authors. They are called when a + plugin is loaded as part of :py:meth:`~preinit()` or :py:meth:`~init()`. + Application authors can ignore them. .. autofunction:: register_open .. autofunction:: register_mime diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 9bf293d13e8..2a6b4646bbd 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -298,7 +298,11 @@ def getmodebands(mode): def preinit(): - """Explicitly load standard file format drivers.""" + """ + Explicitly loads BMP, GIF, JPEG, PPM and PPM file format drivers. + + It is called when opening or saving images. + """ global _initialized if _initialized >= 1: @@ -334,11 +338,6 @@ def preinit(): assert PngImagePlugin except ImportError: pass - # try: - # import TiffImagePlugin - # assert TiffImagePlugin - # except ImportError: - # pass _initialized = 1 @@ -347,6 +346,9 @@ def init(): """ Explicitly initializes the Python Imaging Library. This function loads all available file format drivers. + + It is called when opening or saving images if :py:meth:`~preinit()` is + insufficient, and by :py:meth:`~PIL.features.pilinfo`. """ global _initialized @@ -3407,8 +3409,12 @@ def register_open(id, factory, accept=None): def register_mime(id, mimetype): """ - Registers an image MIME type. This function should not be used - in application code. + Registers an image MIME type by populating ``Image.MIME``. This function + should not be used in application code. + + ``Image.MIME`` provides a mapping from image format identifiers to mime + formats, but :py:meth:`~PIL.ImageFile.ImageFile.get_format_mimetype` can + provide a different result for specific images. :param id: An image format identifier. :param mimetype: The image MIME type for this format. diff --git a/src/libImaging/BcnDecode.c b/src/libImaging/BcnDecode.c index a57b74b61ac..dfd4b3e07a4 100644 --- a/src/libImaging/BcnDecode.c +++ b/src/libImaging/BcnDecode.c @@ -118,8 +118,8 @@ decode_bc3_alpha(char *dst, const UINT8 *src, int stride, int o, int sign) { if (sign == 1) { bc5s_alpha b; memcpy(&b, src, sizeof(bc5s_alpha)); - a0 = (b.a0 + 255) / 2; - a1 = (b.a1 + 255) / 2; + a0 = b.a0 + 128; + a1 = b.a1 + 128; lut1 = b.lut[0] | (b.lut[1] << 8) | (b.lut[2] << 16); lut2 = b.lut[3] | (b.lut[4] << 8) | (b.lut[5] << 16); } else {