Merge branch 'main' into buffer-updates
| 
						 | 
					@ -10,29 +10,29 @@ environment:
 | 
				
			||||||
  TEST_OPTIONS:
 | 
					  TEST_OPTIONS:
 | 
				
			||||||
  DEPLOY: YES
 | 
					  DEPLOY: YES
 | 
				
			||||||
  matrix:
 | 
					  matrix:
 | 
				
			||||||
  - PYTHON: C:/Python39
 | 
					  - PYTHON: C:/Python310
 | 
				
			||||||
    ARCHITECTURE: x86
 | 
					    ARCHITECTURE: x86
 | 
				
			||||||
    APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
 | 
					    APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
 | 
				
			||||||
  - PYTHON: C:/Python36-x64
 | 
					  - PYTHON: C:/Python37-x64
 | 
				
			||||||
    ARCHITECTURE: x64
 | 
					    ARCHITECTURE: x64
 | 
				
			||||||
    APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
 | 
					    APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
- curl -fsSL -o pillow-depends.zip https://github.com/python-pillow/pillow-depends/archive/master.zip
 | 
					- '%PYTHON%\%EXECUTABLE% --version'
 | 
				
			||||||
 | 
					- curl -fsSL -o pillow-depends.zip https://github.com/python-pillow/pillow-depends/archive/main.zip
 | 
				
			||||||
- 7z x pillow-depends.zip -oc:\
 | 
					- 7z x pillow-depends.zip -oc:\
 | 
				
			||||||
- mv c:\pillow-depends-master c:\pillow-depends
 | 
					- mv c:\pillow-depends-main c:\pillow-depends
 | 
				
			||||||
- xcopy /S /Y c:\pillow-depends\test_images\* c:\pillow\tests\images
 | 
					- xcopy /S /Y c:\pillow-depends\test_images\* c:\pillow\tests\images
 | 
				
			||||||
- 7z x ..\pillow-depends\nasm-2.14.02-win64.zip -oc:\
 | 
					- 7z x ..\pillow-depends\nasm-2.15.05-win64.zip -oc:\
 | 
				
			||||||
- ..\pillow-depends\gs9533w32.exe /S
 | 
					- ..\pillow-depends\gs9561w32.exe /S
 | 
				
			||||||
- path c:\nasm-2.14.02;C:\Program Files (x86)\gs\gs9.53.3\bin;%PATH%
 | 
					- path c:\nasm-2.15.05;C:\Program Files (x86)\gs\gs9.56.1\bin;%PATH%
 | 
				
			||||||
- cd c:\pillow\winbuild\
 | 
					- cd c:\pillow\winbuild\
 | 
				
			||||||
- ps: |
 | 
					- ps: |
 | 
				
			||||||
        c:\python37\python.exe c:\pillow\winbuild\build_prepare.py -v --depends=C:\pillow-depends\
 | 
					        c:\python37\python.exe c:\pillow\winbuild\build_prepare.py -v --depends=C:\pillow-depends\
 | 
				
			||||||
        c:\pillow\winbuild\build\build_dep_all.cmd
 | 
					        c:\pillow\winbuild\build\build_dep_all.cmd
 | 
				
			||||||
        $host.SetShouldExit(0)
 | 
					        $host.SetShouldExit(0)
 | 
				
			||||||
- path C:\pillow\winbuild\build\bin;%PATH%
 | 
					- path C:\pillow\winbuild\build\bin;%PATH%
 | 
				
			||||||
- '%PYTHON%\%EXECUTABLE% -m pip install -U setuptools'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
build_script:
 | 
					build_script:
 | 
				
			||||||
- ps: |
 | 
					- ps: |
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,7 @@ build_script:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test_script:
 | 
					test_script:
 | 
				
			||||||
- cd c:\pillow
 | 
					- cd c:\pillow
 | 
				
			||||||
- '%PYTHON%\%EXECUTABLE% -m pip install pytest pytest-cov'
 | 
					- '%PYTHON%\%EXECUTABLE% -m pip install pytest pytest-cov pytest-timeout'
 | 
				
			||||||
- c:\"Program Files (x86)"\"Windows Kits"\10\Debuggers\x86\gflags.exe /p /enable %PYTHON%\%EXECUTABLE%
 | 
					- c:\"Program Files (x86)"\"Windows Kits"\10\Debuggers\x86\gflags.exe /p /enable %PYTHON%\%EXECUTABLE%
 | 
				
			||||||
- '%PYTHON%\%EXECUTABLE% -c "from PIL import Image"'
 | 
					- '%PYTHON%\%EXECUTABLE% -c "from PIL import Image"'
 | 
				
			||||||
- '%PYTHON%\%EXECUTABLE% -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests'
 | 
					- '%PYTHON%\%EXECUTABLE% -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests'
 | 
				
			||||||
| 
						 | 
					@ -84,7 +84,7 @@ deploy:
 | 
				
			||||||
  artifact: /.*egg|wheel/
 | 
					  artifact: /.*egg|wheel/
 | 
				
			||||||
  on:
 | 
					  on:
 | 
				
			||||||
    APPVEYOR_REPO_NAME: python-pillow/Pillow
 | 
					    APPVEYOR_REPO_NAME: python-pillow/Pillow
 | 
				
			||||||
    branch: master
 | 
					    branch: main
 | 
				
			||||||
    deploy: YES
 | 
					    deploy: YES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,9 @@
 | 
				
			||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# gather the coverage data
 | 
					# gather the coverage data
 | 
				
			||||||
pip3 install codecov
 | 
					python3 -m pip install codecov
 | 
				
			||||||
if [[ $MATRIX_DOCKER ]]; then
 | 
					if [[ $MATRIX_DOCKER ]]; then
 | 
				
			||||||
  coverage xml --ignore-errors
 | 
					  python3 -m coverage xml --ignore-errors
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
  coverage xml
 | 
					  python3 -m coverage xml
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -e
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
coverage erase
 | 
					python3 -m coverage erase
 | 
				
			||||||
if [ $(uname) == "Darwin" ]; then
 | 
					if [ $(uname) == "Darwin" ]; then
 | 
				
			||||||
    export CPPFLAGS="-I/usr/local/miniconda/include";
 | 
					    export CPPFLAGS="-I/usr/local/miniconda/include";
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,47 +13,51 @@ aptget_update()
 | 
				
			||||||
        return 1
 | 
					        return 1
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
aptget_update || aptget_update retry || aptget_update retry
 | 
					if [[ $(uname) != CYGWIN* ]]; then
 | 
				
			||||||
 | 
					    aptget_update || aptget_update retry || aptget_update retry
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -e
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sudo apt-get -qq install libfreetype6-dev liblcms2-dev python3-tk\
 | 
					if [[ $(uname) != CYGWIN* ]]; then
 | 
				
			||||||
                         ghostscript libffi-dev libjpeg-turbo-progs libopenjp2-7-dev\
 | 
					    sudo apt-get -qq install libfreetype6-dev liblcms2-dev python3-tk\
 | 
				
			||||||
                         cmake imagemagick libharfbuzz-dev libfribidi-dev
 | 
					                             ghostscript libffi-dev libjpeg-turbo-progs libopenjp2-7-dev\
 | 
				
			||||||
 | 
					                             cmake meson imagemagick libharfbuzz-dev libfribidi-dev
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
python3 -m pip install --upgrade pip
 | 
					python3 -m pip install --upgrade pip
 | 
				
			||||||
 | 
					python3 -m pip install --upgrade wheel
 | 
				
			||||||
PYTHONOPTIMIZE=0 python3 -m pip install cffi
 | 
					PYTHONOPTIMIZE=0 python3 -m pip install cffi
 | 
				
			||||||
python3 -m pip install coverage
 | 
					python3 -m pip install coverage
 | 
				
			||||||
 | 
					python3 -m pip install defusedxml
 | 
				
			||||||
python3 -m pip install olefile
 | 
					python3 -m pip install olefile
 | 
				
			||||||
python3 -m pip install -U pytest
 | 
					python3 -m pip install -U pytest
 | 
				
			||||||
python3 -m pip install -U pytest-cov
 | 
					python3 -m pip install -U pytest-cov
 | 
				
			||||||
python3 -m pip install -U pytest-timeout
 | 
					python3 -m pip install -U pytest-timeout
 | 
				
			||||||
python3 -m pip install pyroma
 | 
					python3 -m pip install pyroma
 | 
				
			||||||
python3 -m pip install test-image-results
 | 
					python3 -m pip install test-image-results
 | 
				
			||||||
# TODO Remove condition when numpy supports 3.10
 | 
					 | 
				
			||||||
if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then python3 -m pip install numpy ; fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+:
 | 
					if [[ $(uname) != CYGWIN* ]]; then
 | 
				
			||||||
if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi
 | 
					    # TODO Remove condition when NumPy supports 3.11
 | 
				
			||||||
if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi
 | 
					    if ! [ "$GHA_PYTHON_VERSION" == "3.11-dev" ]; then python3 -m pip install numpy ; fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# PyQt5 doesn't support PyPy3
 | 
					    # PyQt6 doesn't support PyPy3
 | 
				
			||||||
# Wheel doesn't yet support 3.10
 | 
					    if [[ $GHA_PYTHON_VERSION == 3.* ]]; then
 | 
				
			||||||
if [[ $GHA_PYTHON_VERSION == 3.* && $GHA_PYTHON_VERSION != "3.10-dev" ]]; then
 | 
					        sudo apt-get -qq install libegl1 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxkbcommon-x11-0
 | 
				
			||||||
  # arm64, ppc64le, s390x CPUs:
 | 
					        python3 -m pip install pyqt6
 | 
				
			||||||
  # "ERROR: Could not find a version that satisfies the requirement pyqt5"
 | 
					    fi
 | 
				
			||||||
    sudo apt-get -qq install libxcb-xinerama0 pyqt5-dev-tools
 | 
					
 | 
				
			||||||
    python3 -m pip install pyqt5
 | 
					    # webp
 | 
				
			||||||
 | 
					    pushd depends && ./install_webp.sh && popd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # libimagequant
 | 
				
			||||||
 | 
					    pushd depends && ./install_imagequant.sh && popd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # raqm
 | 
				
			||||||
 | 
					    pushd depends && ./install_raqm.sh && popd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # extra test images
 | 
				
			||||||
 | 
					    pushd depends && ./install_extra_test_images.sh && popd
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    cd depends && ./install_extra_test_images.sh && cd ..
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					 | 
				
			||||||
# webp
 | 
					 | 
				
			||||||
pushd depends && ./install_webp.sh && popd
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# libimagequant
 | 
					 | 
				
			||||||
pushd depends && ./install_imagequant.sh && popd
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# raqm
 | 
					 | 
				
			||||||
pushd depends && ./install_raqm.sh && popd
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# extra test images
 | 
					 | 
				
			||||||
pushd depends && ./install_extra_test_images.sh && popd
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,4 +4,4 @@ set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
python3 -c "from PIL import Image"
 | 
					python3 -c "from PIL import Image"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
python3 -bb -m pytest -v -x -W always --cov PIL --cov Tests --cov-report term Tests
 | 
					python3 -bb -m pytest -v -x -W always --cov PIL --cov Tests --cov-report term Tests $REVERSE
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,6 @@ trim_trailing_whitespace = true
 | 
				
			||||||
[*.yml]
 | 
					[*.yml]
 | 
				
			||||||
# Two-space indentation
 | 
					# Two-space indentation
 | 
				
			||||||
indent_size = 2
 | 
					indent_size = 2
 | 
				
			||||||
indent_style = space
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Tab indentation (no size specified)
 | 
					# Tab indentation (no size specified)
 | 
				
			||||||
[Makefile]
 | 
					[Makefile]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								.github/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -4,13 +4,13 @@ Bug fixes, feature additions, tests, documentation and more can be contributed v
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Bug fixes, feature additions, etc.
 | 
					## Bug fixes, feature additions, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please send a pull request to the master branch. Please include [documentation](https://pillow.readthedocs.io) and [tests](../Tests/README.rst) for new features. Tests or documentation without bug fixes or feature additions are welcome too. Feel free to ask questions [via issues](https://github.com/python-pillow/Pillow/issues/new), [Gitter](https://gitter.im/python-pillow/Pillow) or irc://irc.freenode.net#pil
 | 
					Please send a pull request to the `main` branch. Please include [documentation](https://pillow.readthedocs.io) and [tests](../Tests/README.rst) for new features. Tests or documentation without bug fixes or feature additions are welcome too. Feel free to ask questions [via issues](https://github.com/python-pillow/Pillow/issues/new), [discussions](https://github.com/python-pillow/Pillow/discussions/new), [Gitter](https://gitter.im/python-pillow/Pillow) or irc://irc.freenode.net#pil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Fork the Pillow repository.
 | 
					- Fork the Pillow repository.
 | 
				
			||||||
- Create a branch from master.
 | 
					- Create a branch from `main`.
 | 
				
			||||||
- Develop bug fixes, features, tests, etc.
 | 
					- Develop bug fixes, features, tests, etc.
 | 
				
			||||||
- Run the test suite. You can enable GitHub Actions (https://github.com/MY-USERNAME/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests.
 | 
					- Run the test suite. You can enable GitHub Actions (https://github.com/MY-USERNAME/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/projects/new) on your repo to catch test failures prior to the pull request, and [Codecov](https://codecov.io/gh) to see if the changed code is covered by tests.
 | 
				
			||||||
- Create a pull request to pull the changes from your branch to the Pillow master.
 | 
					- Create a pull request to pull the changes from your branch to the Pillow `main`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Guidelines
 | 
					### Guidelines
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ Please send a pull request to the master branch. Please include [documentation](
 | 
				
			||||||
- Provide tests for any newly added code.
 | 
					- Provide tests for any newly added code.
 | 
				
			||||||
- Follow PEP 8.
 | 
					- Follow PEP 8.
 | 
				
			||||||
- When committing only documentation changes please include `[ci skip]` in the commit message to avoid running tests on AppVeyor.
 | 
					- When committing only documentation changes please include `[ci skip]` in the commit message to avoid running tests on AppVeyor.
 | 
				
			||||||
- Include [release notes](https://github.com/python-pillow/Pillow/tree/master/docs/releasenotes) as needed or appropriate with your bug fixes, feature additions and tests.
 | 
					- Include [release notes](https://github.com/python-pillow/Pillow/tree/main/docs/releasenotes) as needed or appropriate with your bug fixes, feature additions and tests.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Reporting Issues
 | 
					## Reporting Issues
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,4 +35,4 @@ The best reproductions are self-contained scripts with minimal dependencies. If
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Security vulnerabilities
 | 
					## Security vulnerabilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please see our [security policy](https://github.com/python-pillow/Pillow/blob/master/.github/SECURITY.md).
 | 
					Please see our [security policy](https://github.com/python-pillow/Pillow/blob/main/.github/SECURITY.md).
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								.github/mergify.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -7,6 +7,8 @@ pull_request_rules:
 | 
				
			||||||
      - status-success=Test Successful
 | 
					      - status-success=Test Successful
 | 
				
			||||||
      - status-success=Docker Test Successful
 | 
					      - status-success=Docker Test Successful
 | 
				
			||||||
      - status-success=Windows Test Successful
 | 
					      - status-success=Windows Test Successful
 | 
				
			||||||
 | 
					      - status-success=MinGW Test Successful
 | 
				
			||||||
 | 
					      - status-success=Cygwin Test Successful
 | 
				
			||||||
      - status-success=continuous-integration/appveyor/pr
 | 
					      - status-success=continuous-integration/appveyor/pr
 | 
				
			||||||
    actions:
 | 
					    actions:
 | 
				
			||||||
      merge:
 | 
					      merge:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								.github/workflows/cifuzz.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
name: CIFuzz
 | 
					name: CIFuzz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  push:
 | 
					  push:
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
| 
						 | 
					@ -8,6 +9,7 @@ on:
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
      - "**.c"
 | 
					      - "**.c"
 | 
				
			||||||
      - "**.h"
 | 
					      - "**.h"
 | 
				
			||||||
 | 
					  workflow_dispatch:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  Fuzzing:
 | 
					  Fuzzing:
 | 
				
			||||||
| 
						 | 
					@ -29,13 +31,13 @@ jobs:
 | 
				
			||||||
        language: python
 | 
					        language: python
 | 
				
			||||||
        dry-run: false
 | 
					        dry-run: false
 | 
				
			||||||
    - name: Upload New Crash
 | 
					    - name: Upload New Crash
 | 
				
			||||||
      uses: actions/upload-artifact@v2
 | 
					      uses: actions/upload-artifact@v3
 | 
				
			||||||
      if: failure() && steps.build.outcome == 'success'
 | 
					      if: failure() && steps.build.outcome == 'success'
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        name: artifacts
 | 
					        name: artifacts
 | 
				
			||||||
        path: ./out/artifacts
 | 
					        path: ./out/artifacts
 | 
				
			||||||
    - name: Upload Legacy Crash
 | 
					    - name: Upload Legacy Crash
 | 
				
			||||||
      uses: actions/upload-artifact@v2
 | 
					      uses: actions/upload-artifact@v3
 | 
				
			||||||
      if: steps.run.outcome == 'success'
 | 
					      if: steps.run.outcome == 'success'
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        name: crash
 | 
					        name: crash
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										22
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
name: Lint
 | 
					name: Lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on: [push, pull_request]
 | 
					on: [push, pull_request, workflow_dispatch]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
| 
						 | 
					@ -10,15 +13,7 @@ jobs:
 | 
				
			||||||
    name: Lint
 | 
					    name: Lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - uses: actions/checkout@v2
 | 
					    - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: pip cache
 | 
					 | 
				
			||||||
      uses: actions/cache@v2
 | 
					 | 
				
			||||||
      with:
 | 
					 | 
				
			||||||
        path: ~/.cache/pip
 | 
					 | 
				
			||||||
        key: lint-pip-${{ hashFiles('**/setup.py') }}
 | 
					 | 
				
			||||||
        restore-keys: |
 | 
					 | 
				
			||||||
          lint-pip-
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: pre-commit cache
 | 
					    - name: pre-commit cache
 | 
				
			||||||
      uses: actions/cache@v2
 | 
					      uses: actions/cache@v2
 | 
				
			||||||
| 
						 | 
					@ -29,9 +24,11 @@ jobs:
 | 
				
			||||||
          lint-pre-commit-
 | 
					          lint-pre-commit-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Set up Python
 | 
					    - name: Set up Python
 | 
				
			||||||
      uses: actions/setup-python@v2
 | 
					      uses: actions/setup-python@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        python-version: 3.8
 | 
					        python-version: "3.10"
 | 
				
			||||||
 | 
					        cache: pip
 | 
				
			||||||
 | 
					        cache-dependency-path: "setup.py"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Build system information
 | 
					    - name: Build system information
 | 
				
			||||||
      run: python3 .github/workflows/system-info.py
 | 
					      run: python3 .github/workflows/system-info.py
 | 
				
			||||||
| 
						 | 
					@ -45,4 +42,3 @@ jobs:
 | 
				
			||||||
      run: tox -e lint
 | 
					      run: tox -e lint
 | 
				
			||||||
      env:
 | 
					      env:
 | 
				
			||||||
        PRE_COMMIT_COLOR: always
 | 
					        PRE_COMMIT_COLOR: always
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								.github/workflows/macos-install.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -6,6 +6,7 @@ brew install libtiff libjpeg openjpeg libimagequant webp little-cms2 freetype op
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PYTHONOPTIMIZE=0 python3 -m pip install cffi
 | 
					PYTHONOPTIMIZE=0 python3 -m pip install cffi
 | 
				
			||||||
python3 -m pip install coverage
 | 
					python3 -m pip install coverage
 | 
				
			||||||
 | 
					python3 -m pip install defusedxml
 | 
				
			||||||
python3 -m pip install olefile
 | 
					python3 -m pip install olefile
 | 
				
			||||||
python3 -m pip install -U pytest
 | 
					python3 -m pip install -U pytest
 | 
				
			||||||
python3 -m pip install -U pytest-cov
 | 
					python3 -m pip install -U pytest-cov
 | 
				
			||||||
| 
						 | 
					@ -14,12 +15,8 @@ python3 -m pip install pyroma
 | 
				
			||||||
python3 -m pip install test-image-results
 | 
					python3 -m pip install test-image-results
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo -e "[openblas]\nlibraries = openblas\nlibrary_dirs = /usr/local/opt/openblas/lib" >> ~/.numpy-site.cfg
 | 
					echo -e "[openblas]\nlibraries = openblas\nlibrary_dirs = /usr/local/opt/openblas/lib" >> ~/.numpy-site.cfg
 | 
				
			||||||
# TODO Remove condition when numpy supports 3.10
 | 
					# TODO Remove condition when NumPy supports 3.11
 | 
				
			||||||
if ! [ "$GHA_PYTHON_VERSION" == "3.10-dev" ]; then python3 -m pip install numpy ; fi
 | 
					if ! [ "$GHA_PYTHON_VERSION" == "3.11-dev" ]; then python3 -m pip install numpy ; fi
 | 
				
			||||||
 | 
					 | 
				
			||||||
# TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+:
 | 
					 | 
				
			||||||
if [ "$GHA_PYTHON_VERSION" == "3.8" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi
 | 
					 | 
				
			||||||
if [ "$GHA_PYTHON_VERSION" == "3.9" ]; then python3 -m pip install -U "setuptools>=49.3.2" ; fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# extra test images
 | 
					# extra test images
 | 
				
			||||||
pushd depends && ./install_extra_test_images.sh && popd
 | 
					pushd depends && ./install_extra_test_images.sh && popd
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								.github/workflows/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -4,14 +4,21 @@ on:
 | 
				
			||||||
  push:
 | 
					  push:
 | 
				
			||||||
    # branches to consider in the event; optional, defaults to all
 | 
					    # branches to consider in the event; optional, defaults to all
 | 
				
			||||||
    branches:
 | 
					    branches:
 | 
				
			||||||
      - master
 | 
					      - main
 | 
				
			||||||
 | 
					  workflow_dispatch:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  update_release_draft:
 | 
					  update_release_draft:
 | 
				
			||||||
 | 
					    permissions:
 | 
				
			||||||
 | 
					      contents: write  # for release-drafter/release-drafter to create a github release
 | 
				
			||||||
 | 
					      pull-requests: write  # for release-drafter/release-drafter to add label to PR
 | 
				
			||||||
    if: github.repository == 'python-pillow/Pillow'
 | 
					    if: github.repository == 'python-pillow/Pillow'
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      # Drafts your next release notes as pull requests are merged into "master"
 | 
					      # Drafts your next release notes as pull requests are merged into "main"
 | 
				
			||||||
      - uses: release-drafter/release-drafter@v5
 | 
					      - uses: release-drafter/release-drafter@v5
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
					          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										27
									
								
								.github/workflows/stale.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					name: Close stale issues
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  schedule:
 | 
				
			||||||
 | 
					  - cron: "10 0 * * *"
 | 
				
			||||||
 | 
					  workflow_dispatch:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  issues: write
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  stale:
 | 
				
			||||||
 | 
					    if: github.repository_owner == 'python-pillow'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					    - name: "Check issues"
 | 
				
			||||||
 | 
					      uses: actions/stale@v5
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        repo-token: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					        only-labels: "Awaiting OP Action"
 | 
				
			||||||
 | 
					        close-issue-message: "Closing this issue as no feedback has been received."
 | 
				
			||||||
 | 
					        days-before-stale: 7
 | 
				
			||||||
 | 
					        days-before-issue-close: 0
 | 
				
			||||||
 | 
					        days-before-pr-close: -1
 | 
				
			||||||
 | 
					        labels-to-remove-when-unstale: "Awaiting OP Action"
 | 
				
			||||||
							
								
								
									
										109
									
								
								.github/workflows/test-cygwin.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,109 @@
 | 
				
			||||||
 | 
					name: Test Cygwin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on: [push, pull_request, workflow_dispatch]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  build:
 | 
				
			||||||
 | 
					    runs-on: windows-latest
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      fail-fast: false
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        python-minor-version: [7, 8, 9]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timeout-minutes: 40
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    name: Python 3.${{ matrix.python-minor-version }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Fix line endings
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          git config --global core.autocrlf input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Checkout Pillow
 | 
				
			||||||
 | 
					        uses: actions/checkout@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Install Cygwin
 | 
				
			||||||
 | 
					        uses: cygwin/cygwin-install-action@v2
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          platform: x86_64
 | 
				
			||||||
 | 
					          packages: >
 | 
				
			||||||
 | 
					            ImageMagick gcc-g++ ghostscript jpeg libfreetype-devel
 | 
				
			||||||
 | 
					            libimagequant-devel libjpeg-devel liblapack-devel
 | 
				
			||||||
 | 
					            liblcms2-devel libopenjp2-devel libraqm-devel
 | 
				
			||||||
 | 
					            libtiff-devel libwebp-devel libxcb-devel libxcb-xinerama0
 | 
				
			||||||
 | 
					            make netpbm perl
 | 
				
			||||||
 | 
					            python3${{ matrix.python-minor-version }}-cffi
 | 
				
			||||||
 | 
					            python3${{ matrix.python-minor-version }}-cython
 | 
				
			||||||
 | 
					            python3${{ matrix.python-minor-version }}-devel
 | 
				
			||||||
 | 
					            python3${{ matrix.python-minor-version }}-numpy
 | 
				
			||||||
 | 
					            python3${{ matrix.python-minor-version }}-sip
 | 
				
			||||||
 | 
					            python3${{ matrix.python-minor-version }}-tkinter
 | 
				
			||||||
 | 
					            qt5-devel-tools subversion xorg-server-extra zlib-devel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Add Lapack to PATH
 | 
				
			||||||
 | 
					        uses: egor-tensin/cleanup-path@v1
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          dirs: 'C:\cygwin\bin;C:\cygwin\lib\lapack'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: pip cache
 | 
				
			||||||
 | 
					        uses: actions/cache@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          path: 'C:\cygwin\home\runneradmin\.cache\pip'
 | 
				
			||||||
 | 
					          key: ${{ runner.os }}-cygwin-pip3.${{ matrix.python-minor-version }}-${{ hashFiles('.ci/install.sh') }}
 | 
				
			||||||
 | 
					          restore-keys: |
 | 
				
			||||||
 | 
					            ${{ runner.os }}-cygwin-pip3.${{ matrix.python-minor-version }}-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Build system information
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          dash.exe -c "python3 .github/workflows/system-info.py"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Install dependencies
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          bash.exe .ci/install.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Install a different NumPy
 | 
				
			||||||
 | 
					        shell: dash.exe -l "{0}"
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          python3 -m pip install -U 'numpy!=1.21.*'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Build
 | 
				
			||||||
 | 
					        shell: bash.exe -eo pipefail -o igncr "{0}"
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          .ci/build.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Test
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          bash.exe xvfb-run -s '-screen 0 1024x768x24' .ci/test.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Prepare to upload errors
 | 
				
			||||||
 | 
					        if: failure()
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          dash.exe -c "mkdir -p Tests/errors"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Upload errors
 | 
				
			||||||
 | 
					        uses: actions/upload-artifact@v3
 | 
				
			||||||
 | 
					        if: failure()
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          name: errors
 | 
				
			||||||
 | 
					          path: Tests/errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: After success
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          bash.exe .ci/after_success.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Upload coverage
 | 
				
			||||||
 | 
					        uses: codecov/codecov-action@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          file: ./coverage.xml
 | 
				
			||||||
 | 
					          flags: GHA_Cygwin
 | 
				
			||||||
 | 
					          name: Cygwin Python 3.${{ matrix.python-minor-version }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  success:
 | 
				
			||||||
 | 
					    permissions:
 | 
				
			||||||
 | 
					      contents: none
 | 
				
			||||||
 | 
					    needs: build
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    name: Cygwin Test Successful
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Success
 | 
				
			||||||
 | 
					        run: echo Cygwin Test Successful
 | 
				
			||||||
							
								
								
									
										33
									
								
								.github/workflows/test-docker.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
name: Test Docker
 | 
					name: Test Docker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on: [push, pull_request]
 | 
					on: [push, pull_request, workflow_dispatch]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
| 
						 | 
					@ -11,34 +14,38 @@ jobs:
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        docker: [
 | 
					        docker: [
 | 
				
			||||||
          # Run slower jobs first to give them a headstart and reduce waiting time
 | 
					          # Run slower jobs first to give them a headstart and reduce waiting time
 | 
				
			||||||
          ubuntu-20.04-focal-arm64v8,
 | 
					          ubuntu-22.04-jammy-arm64v8,
 | 
				
			||||||
          ubuntu-20.04-focal-ppc64le,
 | 
					          ubuntu-22.04-jammy-ppc64le,
 | 
				
			||||||
          ubuntu-20.04-focal-s390x,
 | 
					          ubuntu-22.04-jammy-s390x,
 | 
				
			||||||
          # Then run the remainder
 | 
					          # Then run the remainder
 | 
				
			||||||
          alpine,
 | 
					          alpine,
 | 
				
			||||||
          amazon-2-amd64,
 | 
					          amazon-2-amd64,
 | 
				
			||||||
          arch,
 | 
					          arch,
 | 
				
			||||||
          centos-7-amd64,
 | 
					          centos-7-amd64,
 | 
				
			||||||
          centos-8-amd64,
 | 
					          centos-stream-8-amd64,
 | 
				
			||||||
 | 
					          centos-stream-9-amd64,
 | 
				
			||||||
          debian-10-buster-x86,
 | 
					          debian-10-buster-x86,
 | 
				
			||||||
          fedora-32-amd64,
 | 
					          debian-11-bullseye-x86,
 | 
				
			||||||
          fedora-33-amd64,
 | 
					          fedora-35-amd64,
 | 
				
			||||||
 | 
					          fedora-36-amd64,
 | 
				
			||||||
 | 
					          gentoo,
 | 
				
			||||||
          ubuntu-18.04-bionic-amd64,
 | 
					          ubuntu-18.04-bionic-amd64,
 | 
				
			||||||
          ubuntu-20.04-focal-amd64,
 | 
					          ubuntu-20.04-focal-amd64,
 | 
				
			||||||
 | 
					          ubuntu-22.04-jammy-amd64,
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
        dockerTag: [master]
 | 
					        dockerTag: [main]
 | 
				
			||||||
        include:
 | 
					        include:
 | 
				
			||||||
          - docker: "ubuntu-20.04-focal-arm64v8"
 | 
					          - docker: "ubuntu-22.04-jammy-arm64v8"
 | 
				
			||||||
            qemu-arch: "aarch64"
 | 
					            qemu-arch: "aarch64"
 | 
				
			||||||
          - docker: "ubuntu-20.04-focal-ppc64le"
 | 
					          - docker: "ubuntu-22.04-jammy-ppc64le"
 | 
				
			||||||
            qemu-arch: "ppc64le"
 | 
					            qemu-arch: "ppc64le"
 | 
				
			||||||
          - docker: "ubuntu-20.04-focal-s390x"
 | 
					          - docker: "ubuntu-22.04-jammy-s390x"
 | 
				
			||||||
            qemu-arch: "s390x"
 | 
					            qemu-arch: "s390x"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    name: ${{ matrix.docker }}
 | 
					    name: ${{ matrix.docker }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - uses: actions/checkout@v2
 | 
					    - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Build system information
 | 
					    - name: Build system information
 | 
				
			||||||
      run: python3 .github/workflows/system-info.py
 | 
					      run: python3 .github/workflows/system-info.py
 | 
				
			||||||
| 
						 | 
					@ -78,6 +85,8 @@ jobs:
 | 
				
			||||||
        name: ${{ matrix.docker }}
 | 
					        name: ${{ matrix.docker }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  success:
 | 
					  success:
 | 
				
			||||||
 | 
					    permissions:
 | 
				
			||||||
 | 
					      contents: none
 | 
				
			||||||
    needs: build
 | 
					    needs: build
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    name: Docker Test Successful
 | 
					    name: Docker Test Successful
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										90
									
								
								.github/workflows/test-mingw.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,90 @@
 | 
				
			||||||
 | 
					name: Test MinGW
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on: [push, pull_request, workflow_dispatch]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  build:
 | 
				
			||||||
 | 
					    runs-on: windows-latest
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      fail-fast: false
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        mingw: ["MINGW32", "MINGW64"]
 | 
				
			||||||
 | 
					        include:
 | 
				
			||||||
 | 
					          - mingw: "MINGW32"
 | 
				
			||||||
 | 
					            name: "MSYS2 MinGW 32-bit"
 | 
				
			||||||
 | 
					            package: "mingw-w64-i686"
 | 
				
			||||||
 | 
					          - mingw: "MINGW64"
 | 
				
			||||||
 | 
					            name: "MSYS2 MinGW 64-bit"
 | 
				
			||||||
 | 
					            package: "mingw-w64-x86_64"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    defaults:
 | 
				
			||||||
 | 
					      run:
 | 
				
			||||||
 | 
					        shell: bash.exe --login -eo pipefail "{0}"
 | 
				
			||||||
 | 
					    env:
 | 
				
			||||||
 | 
					      MSYSTEM: ${{ matrix.mingw }}
 | 
				
			||||||
 | 
					      CHERE_INVOKING: 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timeout-minutes: 30
 | 
				
			||||||
 | 
					    name: ${{ matrix.name }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Checkout Pillow
 | 
				
			||||||
 | 
					        uses: actions/checkout@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Set up shell
 | 
				
			||||||
 | 
					        run: echo "C:\msys64\usr\bin\" >> $env:GITHUB_PATH
 | 
				
			||||||
 | 
					        shell: pwsh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Install dependencies
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          pacman -S --noconfirm \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-python3-cffi \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-python3-numpy \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-python3-olefile \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-python3-pip \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-python-pyqt6 \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-python3-setuptools \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-freetype \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-gcc \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-ghostscript \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-lcms2 \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-libimagequant \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-libjpeg-turbo \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-libraqm \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-libtiff \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-libwebp \
 | 
				
			||||||
 | 
					              ${{ matrix.package }}-openjpeg2 \
 | 
				
			||||||
 | 
					              subversion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          python3 -m pip install pyroma pytest pytest-cov pytest-timeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          pushd depends && ./install_extra_test_images.sh && popd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Build Pillow
 | 
				
			||||||
 | 
					        run: CFLAGS="-coverage" python3 -m pip install --global-option="build_ext" .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Test Pillow
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          python3 selftest.py --installed
 | 
				
			||||||
 | 
					          python3 -c "from PIL import Image"
 | 
				
			||||||
 | 
					          python3 -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Upload coverage
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          python3 -m pip install codecov
 | 
				
			||||||
 | 
					          bash <(curl -s https://codecov.io/bash) -F GHA_Windows
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          CODECOV_NAME: ${{ matrix.name }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  success:
 | 
				
			||||||
 | 
					    permissions:
 | 
				
			||||||
 | 
					      contents: none
 | 
				
			||||||
 | 
					    needs: build
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    name: MinGW Test Successful
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Success
 | 
				
			||||||
 | 
					        run: echo MinGW Test Successful
 | 
				
			||||||
							
								
								
									
										16
									
								
								.github/workflows/test-valgrind.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -11,6 +11,10 @@ on:
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
      - "**.c"
 | 
					      - "**.c"
 | 
				
			||||||
      - "**.h"
 | 
					      - "**.h"
 | 
				
			||||||
 | 
					  workflow_dispatch:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
| 
						 | 
					@ -22,12 +26,12 @@ jobs:
 | 
				
			||||||
        docker: [
 | 
					        docker: [
 | 
				
			||||||
          ubuntu-20.04-focal-amd64-valgrind,
 | 
					          ubuntu-20.04-focal-amd64-valgrind,
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
        dockerTag: [master]
 | 
					        dockerTag: [main]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    name: ${{ matrix.docker }}
 | 
					    name: ${{ matrix.docker }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - uses: actions/checkout@v2
 | 
					    - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Build system information
 | 
					    - name: Build system information
 | 
				
			||||||
      run: python3 .github/workflows/system-info.py
 | 
					      run: python3 .github/workflows/system-info.py
 | 
				
			||||||
| 
						 | 
					@ -42,11 +46,3 @@ jobs:
 | 
				
			||||||
        sudo chown -R 1000 $GITHUB_WORKSPACE
 | 
					        sudo chown -R 1000 $GITHUB_WORKSPACE
 | 
				
			||||||
        docker run --name pillow_container  -v $GITHUB_WORKSPACE:/Pillow pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }}
 | 
					        docker run --name pillow_container  -v $GITHUB_WORKSPACE:/Pillow pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }}
 | 
				
			||||||
        sudo chown -R runner $GITHUB_WORKSPACE
 | 
					        sudo chown -R runner $GITHUB_WORKSPACE
 | 
				
			||||||
 | 
					 | 
				
			||||||
  success:
 | 
					 | 
				
			||||||
    needs: build
 | 
					 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					 | 
				
			||||||
    name: Valgrind Test Successful
 | 
					 | 
				
			||||||
    steps:
 | 
					 | 
				
			||||||
      - name: Success
 | 
					 | 
				
			||||||
        run: echo Valgrind Test Successful
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										151
									
								
								.github/workflows/test-windows.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -1,78 +1,62 @@
 | 
				
			||||||
name: Test Windows
 | 
					name: Test Windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on: [push, pull_request]
 | 
					on: [push, pull_request, workflow_dispatch]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
    runs-on: windows-2019
 | 
					    runs-on: windows-latest
 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        python-version: ["pypy-3.6", "pypy-3.7", "3.6", "3.7", "3.8", "3.9", "3.10-dev"]
 | 
					        python-version: ["3.7", "3.8", "3.9", "3.10", "3.11-dev"]
 | 
				
			||||||
        architecture: ["x86", "x64"]
 | 
					        architecture: ["x86", "x64"]
 | 
				
			||||||
        include:
 | 
					        include:
 | 
				
			||||||
          - architecture: "x86"
 | 
					          # PyPy 7.3.4+ only ships 64-bit binaries for Windows
 | 
				
			||||||
            platform-vcvars: "x86"
 | 
					 | 
				
			||||||
            platform-msbuild: "Win32"
 | 
					 | 
				
			||||||
          - architecture: "x64"
 | 
					 | 
				
			||||||
            platform-vcvars: "x86_amd64"
 | 
					 | 
				
			||||||
            platform-msbuild: "x64"
 | 
					 | 
				
			||||||
        exclude:
 | 
					 | 
				
			||||||
          # PyPy does not support 64-bit on Windows
 | 
					 | 
				
			||||||
          - python-version: "pypy-3.6"
 | 
					 | 
				
			||||||
            architecture: "x64"
 | 
					 | 
				
			||||||
          - python-version: "pypy-3.7"
 | 
					          - python-version: "pypy-3.7"
 | 
				
			||||||
            architecture: "x64"
 | 
					            architecture: "x64"
 | 
				
			||||||
 | 
					          - python-version: "pypy-3.8"
 | 
				
			||||||
 | 
					            architecture: "x64"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    timeout-minutes: 30
 | 
					    timeout-minutes: 30
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    name: Python ${{ matrix.python-version }} ${{ matrix.architecture }}
 | 
					    name: Python ${{ matrix.python-version }} ${{ matrix.architecture }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - name: Checkout Pillow
 | 
					    - name: Checkout Pillow
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Checkout cached dependencies
 | 
					    - name: Checkout cached dependencies
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        repository: python-pillow/pillow-depends
 | 
					        repository: python-pillow/pillow-depends
 | 
				
			||||||
        path: winbuild\depends
 | 
					        path: winbuild\depends
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Cache pip
 | 
					 | 
				
			||||||
      uses: actions/cache@v2
 | 
					 | 
				
			||||||
      with:
 | 
					 | 
				
			||||||
        path: ~\AppData\Local\pip\Cache
 | 
					 | 
				
			||||||
        key:
 | 
					 | 
				
			||||||
          ${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.architecture }}-${{ hashFiles('**/.github/workflows/test-windows.yml') }}
 | 
					 | 
				
			||||||
        restore-keys: |
 | 
					 | 
				
			||||||
          ${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.architecture }}-
 | 
					 | 
				
			||||||
          ${{ runner.os }}-${{ matrix.python-version }}-
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # sets env: pythonLocation
 | 
					    # sets env: pythonLocation
 | 
				
			||||||
    - name: Set up Python
 | 
					    - name: Set up Python
 | 
				
			||||||
      uses: actions/setup-python@v2
 | 
					      uses: actions/setup-python@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        python-version: ${{ matrix.python-version }}
 | 
					        python-version: ${{ matrix.python-version }}
 | 
				
			||||||
        architecture: ${{ matrix.architecture }}
 | 
					        architecture: ${{ matrix.architecture }}
 | 
				
			||||||
 | 
					        cache: pip
 | 
				
			||||||
 | 
					        cache-dependency-path: ".github/workflows/test-windows.yml"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Print build system information
 | 
					    - name: Print build system information
 | 
				
			||||||
      run: python .github/workflows/system-info.py
 | 
					      run: python3 .github/workflows/system-info.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: python -m pip install wheel pytest pytest-cov pytest-timeout
 | 
					    - name: python3 -m pip install wheel pytest pytest-cov pytest-timeout defusedxml
 | 
				
			||||||
      run: python -m pip install wheel pytest pytest-cov pytest-timeout
 | 
					      run: python3 -m pip install wheel pytest pytest-cov pytest-timeout defusedxml
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # TODO Remove when 3.8 / 3.9 includes setuptools 49.3.2+:
 | 
					 | 
				
			||||||
    - name: Upgrade setuptools
 | 
					 | 
				
			||||||
      if: "contains(matrix.python-version, '3.8') || contains(matrix.python-version, '3.9')"
 | 
					 | 
				
			||||||
      run: python -m pip install -U "setuptools>=49.3.2"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Install dependencies
 | 
					    - name: Install dependencies
 | 
				
			||||||
      id: install
 | 
					      id: install
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        7z x winbuild\depends\nasm-2.14.02-win64.zip "-o$env:RUNNER_WORKSPACE\"
 | 
					        7z x winbuild\depends\nasm-2.15.05-win64.zip "-o$env:RUNNER_WORKSPACE\"
 | 
				
			||||||
        echo "$env:RUNNER_WORKSPACE\nasm-2.14.02" >> $env:GITHUB_PATH
 | 
					        echo "$env:RUNNER_WORKSPACE\nasm-2.15.05" >> $env:GITHUB_PATH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        winbuild\depends\gs9533w32.exe /S
 | 
					        winbuild\depends\gs9561w32.exe /S
 | 
				
			||||||
        echo "C:\Program Files (x86)\gs\gs9.53.3\bin" >> $env:GITHUB_PATH
 | 
					        echo "C:\Program Files (x86)\gs\gs9.56.1\bin" >> $env:GITHUB_PATH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        xcopy /S /Y winbuild\depends\test_images\* Tests\images\
 | 
					        xcopy /S /Y winbuild\depends\test_images\* Tests\images\
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,15 +135,16 @@ jobs:
 | 
				
			||||||
    - name: Build Pillow
 | 
					    - name: Build Pillow
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        $FLAGS=""
 | 
					        $FLAGS=""
 | 
				
			||||||
        if ('${{ github.event_name }}' -eq 'push') { $FLAGS="--disable-imagequant" }
 | 
					        if ('${{ github.event_name }}' -ne 'pull_request') { $FLAGS="--disable-imagequant" }
 | 
				
			||||||
        & winbuild\build\build_pillow.cmd $FLAGS install
 | 
					        & winbuild\build\build_pillow.cmd $FLAGS install
 | 
				
			||||||
        & $env:pythonLocation\python.exe selftest.py --installed
 | 
					        & $env:pythonLocation\python.exe selftest.py --installed
 | 
				
			||||||
      shell: pwsh
 | 
					      shell: pwsh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # failing with PyPy3
 | 
					    # skip PyPy for speed
 | 
				
			||||||
    - name: Enable heap verification
 | 
					    - name: Enable heap verification
 | 
				
			||||||
      if: "!contains(matrix.python-version, 'pypy')"
 | 
					      if: "!contains(matrix.python-version, 'pypy')"
 | 
				
			||||||
      run: "& 'C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x86\\gflags.exe' /p /enable $env:pythonLocation\\python.exe"
 | 
					      run: |
 | 
				
			||||||
 | 
					        & reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\python.exe" /v "GlobalFlag" /t REG_SZ /d "0x02000000" /f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Test Pillow
 | 
					    - name: Test Pillow
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
| 
						 | 
					@ -174,7 +159,7 @@ jobs:
 | 
				
			||||||
      shell: bash
 | 
					      shell: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Upload errors
 | 
					    - name: Upload errors
 | 
				
			||||||
      uses: actions/upload-artifact@v2
 | 
					      uses: actions/upload-artifact@v3
 | 
				
			||||||
      if: failure()
 | 
					      if: failure()
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        name: errors
 | 
					        name: errors
 | 
				
			||||||
| 
						 | 
					@ -194,92 +179,22 @@ jobs:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Build wheel
 | 
					    - name: Build wheel
 | 
				
			||||||
      id: wheel
 | 
					      id: wheel
 | 
				
			||||||
      if: "github.event_name == 'push'"
 | 
					      if: "github.event_name != 'pull_request'"
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        for /f "tokens=3 delims=/" %%a in ("${{ github.ref }}") do echo ::set-output name=dist::dist-%%a
 | 
					        for /f "tokens=3 delims=/" %%a in ("${{ github.ref }}") do echo ::set-output name=dist::dist-%%a
 | 
				
			||||||
        winbuild\\build\\build_pillow.cmd --disable-imagequant bdist_wheel
 | 
					        winbuild\\build\\build_pillow.cmd --disable-imagequant bdist_wheel
 | 
				
			||||||
      shell: cmd
 | 
					      shell: cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - uses: actions/upload-artifact@v2
 | 
					    - uses: actions/upload-artifact@v3
 | 
				
			||||||
      if: "github.event_name == 'push'"
 | 
					      if: "github.event_name != 'pull_request'"
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        name: ${{ steps.wheel.outputs.dist }}
 | 
					        name: ${{ steps.wheel.outputs.dist }}
 | 
				
			||||||
        path: dist\*.whl
 | 
					        path: dist\*.whl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  msys:
 | 
					 | 
				
			||||||
    runs-on: windows-2019
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    strategy:
 | 
					 | 
				
			||||||
      fail-fast: false
 | 
					 | 
				
			||||||
      matrix:
 | 
					 | 
				
			||||||
        mingw: ["MINGW32", "MINGW64"]
 | 
					 | 
				
			||||||
        include:
 | 
					 | 
				
			||||||
          - mingw: "MINGW32"
 | 
					 | 
				
			||||||
            name: "MSYS2 MinGW 32-bit"
 | 
					 | 
				
			||||||
            package: "mingw-w64-i686"
 | 
					 | 
				
			||||||
          - mingw: "MINGW64"
 | 
					 | 
				
			||||||
            name: "MSYS2 MinGW 64-bit"
 | 
					 | 
				
			||||||
            package: "mingw-w64-x86_64"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    defaults:
 | 
					 | 
				
			||||||
      run:
 | 
					 | 
				
			||||||
        shell: bash.exe --login -eo pipefail "{0}"
 | 
					 | 
				
			||||||
    env:
 | 
					 | 
				
			||||||
      MSYSTEM: ${{ matrix.mingw }}
 | 
					 | 
				
			||||||
      CHERE_INVOKING: 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    timeout-minutes: 30
 | 
					 | 
				
			||||||
    name: ${{ matrix.name }}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    steps:
 | 
					 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      - name: Set up shell
 | 
					 | 
				
			||||||
        run: echo "C:\msys64\usr\bin\" >> $env:GITHUB_PATH
 | 
					 | 
				
			||||||
        shell: pwsh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      - name: Install Dependencies
 | 
					 | 
				
			||||||
        run: |
 | 
					 | 
				
			||||||
          pacman -S --noconfirm \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-python3-cffi \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-python3-numpy \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-python3-olefile \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-python3-pip \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-python3-pyqt5 \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-python3-setuptools \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-freetype \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-ghostscript \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-lcms2 \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-libimagequant \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-libjpeg-turbo \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-libraqm \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-libtiff \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-libwebp \
 | 
					 | 
				
			||||||
              ${{ matrix.package }}-openjpeg2 \
 | 
					 | 
				
			||||||
              subversion
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          python3 -m pip install pyroma pytest pytest-cov
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          pushd depends && ./install_extra_test_images.sh && popd
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      - name: Build Pillow
 | 
					 | 
				
			||||||
        run: CFLAGS="-coverage" python3 setup.py build_ext install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      - name: Test Pillow
 | 
					 | 
				
			||||||
        run: |
 | 
					 | 
				
			||||||
          python3 selftest.py --installed
 | 
					 | 
				
			||||||
          python3 -c "from PIL import Image"
 | 
					 | 
				
			||||||
          python3 -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      - name: Upload coverage
 | 
					 | 
				
			||||||
        run: |
 | 
					 | 
				
			||||||
          python3 -m pip install codecov
 | 
					 | 
				
			||||||
          bash <(curl -s https://codecov.io/bash) -F GHA_Windows
 | 
					 | 
				
			||||||
        env:
 | 
					 | 
				
			||||||
          CODECOV_NAME: ${{ matrix.name }}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  success:
 | 
					  success:
 | 
				
			||||||
    needs: [build, msys]
 | 
					    permissions:
 | 
				
			||||||
 | 
					      contents: none
 | 
				
			||||||
 | 
					    needs: build
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    name: Windows Test Successful
 | 
					    name: Windows Test Successful
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										52
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
name: Test
 | 
					name: Test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on: [push, pull_request]
 | 
					on: [push, pull_request, workflow_dispatch]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
| 
						 | 
					@ -9,53 +12,42 @@ jobs:
 | 
				
			||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        os: [
 | 
					        os: [
 | 
				
			||||||
 | 
					          "macos-latest",
 | 
				
			||||||
          "ubuntu-latest",
 | 
					          "ubuntu-latest",
 | 
				
			||||||
          "macOS-latest",
 | 
					 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
        python-version: [
 | 
					        python-version: [
 | 
				
			||||||
 | 
					          "pypy-3.8",
 | 
				
			||||||
          "pypy-3.7",
 | 
					          "pypy-3.7",
 | 
				
			||||||
          "pypy-3.6",
 | 
					          "3.11-dev",
 | 
				
			||||||
          "3.10-dev",
 | 
					          "3.10",
 | 
				
			||||||
          "3.9",
 | 
					          "3.9",
 | 
				
			||||||
          "3.8",
 | 
					          "3.8",
 | 
				
			||||||
          "3.7",
 | 
					          "3.7",
 | 
				
			||||||
          "3.6",
 | 
					 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
        include:
 | 
					        include:
 | 
				
			||||||
        - python-version: "3.6"
 | 
					 | 
				
			||||||
          PYTHONOPTIMIZE: 1
 | 
					 | 
				
			||||||
        - python-version: "3.7"
 | 
					        - python-version: "3.7"
 | 
				
			||||||
 | 
					          PYTHONOPTIMIZE: 1
 | 
				
			||||||
 | 
					          REVERSE: "--reverse"
 | 
				
			||||||
 | 
					        - python-version: "3.8"
 | 
				
			||||||
          PYTHONOPTIMIZE: 2
 | 
					          PYTHONOPTIMIZE: 2
 | 
				
			||||||
        # Include new variables for Codecov
 | 
					        # Include new variables for Codecov
 | 
				
			||||||
        - os: ubuntu-latest
 | 
					        - os: ubuntu-latest
 | 
				
			||||||
          codecov-flag: GHA_Ubuntu
 | 
					          codecov-flag: GHA_Ubuntu
 | 
				
			||||||
        - os: macOS-latest
 | 
					        - os: macos-latest
 | 
				
			||||||
          codecov-flag: GHA_macOS
 | 
					          codecov-flag: GHA_macOS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    runs-on: ${{ matrix.os }}
 | 
					    runs-on: ${{ matrix.os }}
 | 
				
			||||||
    name: ${{ matrix.os }} Python ${{ matrix.python-version }}
 | 
					    name: ${{ matrix.os }} Python ${{ matrix.python-version }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - uses: actions/checkout@v2
 | 
					    - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Set up Python ${{ matrix.python-version }}
 | 
					    - name: Set up Python ${{ matrix.python-version }}
 | 
				
			||||||
      uses: actions/setup-python@v2
 | 
					      uses: actions/setup-python@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        python-version: ${{ matrix.python-version }}
 | 
					        python-version: ${{ matrix.python-version }}
 | 
				
			||||||
 | 
					        cache: pip
 | 
				
			||||||
    - name: Get pip cache dir
 | 
					        cache-dependency-path: ".ci/*.sh"
 | 
				
			||||||
      id: pip-cache
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        echo "::set-output name=dir::$(python3 -m pip cache dir)"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: pip cache
 | 
					 | 
				
			||||||
      uses: actions/cache@v2
 | 
					 | 
				
			||||||
      with:
 | 
					 | 
				
			||||||
        path: ${{ steps.pip-cache.outputs.dir }}
 | 
					 | 
				
			||||||
        key:
 | 
					 | 
				
			||||||
          ${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/.ci/*.sh') }}
 | 
					 | 
				
			||||||
        restore-keys: |
 | 
					 | 
				
			||||||
          ${{ matrix.os }}-${{ matrix.python-version }}-
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Build system information
 | 
					    - name: Build system information
 | 
				
			||||||
      run: python3 .github/workflows/system-info.py
 | 
					      run: python3 .github/workflows/system-info.py
 | 
				
			||||||
| 
						 | 
					@ -80,6 +72,9 @@ jobs:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Test
 | 
					    - name: Test
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
 | 
					        if [ $REVERSE ]; then
 | 
				
			||||||
 | 
					          python3 -m pip install pytest-reverse
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
        if [ "${{ matrix.os }}" = "ubuntu-latest" ]; then
 | 
					        if [ "${{ matrix.os }}" = "ubuntu-latest" ]; then
 | 
				
			||||||
          xvfb-run -s '-screen 0 1024x768x24' .ci/test.sh
 | 
					          xvfb-run -s '-screen 0 1024x768x24' .ci/test.sh
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
| 
						 | 
					@ -87,6 +82,7 @@ jobs:
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
      env:
 | 
					      env:
 | 
				
			||||||
        PYTHONOPTIMIZE: ${{ matrix.PYTHONOPTIMIZE }}
 | 
					        PYTHONOPTIMIZE: ${{ matrix.PYTHONOPTIMIZE }}
 | 
				
			||||||
 | 
					        REVERSE: ${{ matrix.REVERSE }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Prepare to upload errors
 | 
					    - name: Prepare to upload errors
 | 
				
			||||||
      if: failure()
 | 
					      if: failure()
 | 
				
			||||||
| 
						 | 
					@ -94,16 +90,16 @@ jobs:
 | 
				
			||||||
        mkdir -p Tests/errors
 | 
					        mkdir -p Tests/errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Upload errors
 | 
					    - name: Upload errors
 | 
				
			||||||
      uses: actions/upload-artifact@v2
 | 
					      uses: actions/upload-artifact@v3
 | 
				
			||||||
      if: failure()
 | 
					      if: failure()
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        name: errors
 | 
					        name: errors
 | 
				
			||||||
        path: Tests/errors
 | 
					        path: Tests/errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Docs
 | 
					    - name: Docs
 | 
				
			||||||
      if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == 3.9
 | 
					      if: startsWith(matrix.os, 'ubuntu') && matrix.python-version == 3.10
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        python3 -m pip install sphinx-issues sphinx-removed-in sphinx-rtd-theme
 | 
					        python3 -m pip install furo sphinx-copybutton sphinx-issues sphinx-removed-in sphinxext-opengraph
 | 
				
			||||||
        make doccheck
 | 
					        make doccheck
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: After success
 | 
					    - name: After success
 | 
				
			||||||
| 
						 | 
					@ -116,6 +112,8 @@ jobs:
 | 
				
			||||||
        CODECOV_NAME: ${{ matrix.os }} Python ${{ matrix.python-version }}
 | 
					        CODECOV_NAME: ${{ matrix.os }} Python ${{ matrix.python-version }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  success:
 | 
					  success:
 | 
				
			||||||
 | 
					    permissions:
 | 
				
			||||||
 | 
					      contents: none
 | 
				
			||||||
    needs: build
 | 
					    needs: build
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    name: Test Successful
 | 
					    name: Test Successful
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										31
									
								
								.github/workflows/tidelift.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					name: Tidelift Align
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  schedule:
 | 
				
			||||||
 | 
					    - cron: "30 2 * * *"  # daily at 02:30 UTC
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    paths:
 | 
				
			||||||
 | 
					      - "Pipfile*"
 | 
				
			||||||
 | 
					      - ".github/workflows/tidelift.yml"
 | 
				
			||||||
 | 
					  pull_request:
 | 
				
			||||||
 | 
					    paths:
 | 
				
			||||||
 | 
					      - "Pipfile*"
 | 
				
			||||||
 | 
					      - ".github/workflows/tidelift.yml"
 | 
				
			||||||
 | 
					  workflow_dispatch:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  build:
 | 
				
			||||||
 | 
					    if: github.repository_owner == 'python-pillow'
 | 
				
			||||||
 | 
					    name: Run Tidelift to ensure approved open source packages are in use
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Checkout
 | 
				
			||||||
 | 
					        uses: actions/checkout@v3
 | 
				
			||||||
 | 
					      - name: Scan
 | 
				
			||||||
 | 
					        uses: tidelift/alignment-action@main
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          TIDELIFT_API_KEY: ${{ secrets.TIDELIFT_API_KEY }}
 | 
				
			||||||
 | 
					          TIDELIFT_ORGANIZATION: team/aclark4life
 | 
				
			||||||
 | 
					          TIDELIFT_PROJECT: pillow
 | 
				
			||||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
					@ -83,6 +83,7 @@ docs/_build/
 | 
				
			||||||
Tests/images/README.md
 | 
					Tests/images/README.md
 | 
				
			||||||
Tests/images/crash_1.tif
 | 
					Tests/images/crash_1.tif
 | 
				
			||||||
Tests/images/crash_2.tif
 | 
					Tests/images/crash_2.tif
 | 
				
			||||||
 | 
					Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif
 | 
				
			||||||
Tests/images/string_dimension.tiff
 | 
					Tests/images/string_dimension.tiff
 | 
				
			||||||
Tests/images/jpeg2000
 | 
					Tests/images/jpeg2000
 | 
				
			||||||
Tests/images/msp
 | 
					Tests/images/msp
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,43 +1,51 @@
 | 
				
			||||||
repos:
 | 
					repos:
 | 
				
			||||||
  - repo: https://github.com/psf/black
 | 
					  - repo: https://github.com/psf/black
 | 
				
			||||||
    rev: e66be67b9b6811913470f70c28b4d50f94d05b22  # frozen: 20.8b1
 | 
					    rev: 22.6.0
 | 
				
			||||||
    hooks:
 | 
					    hooks:
 | 
				
			||||||
      - id: black
 | 
					      - id: black
 | 
				
			||||||
        args: ["--target-version", "py36"]
 | 
					        args: ["--target-version", "py37"]
 | 
				
			||||||
        # Only .py files, until https://github.com/psf/black/issues/402 resolved
 | 
					        # Only .py files, until https://github.com/psf/black/issues/402 resolved
 | 
				
			||||||
        files: \.py$
 | 
					        files: \.py$
 | 
				
			||||||
        types: []
 | 
					        types: []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - repo: https://github.com/PyCQA/isort
 | 
					  - repo: https://github.com/PyCQA/isort
 | 
				
			||||||
    rev: 377d260ffa6f746693f97b46d95025afc4bd8275  # frozen: 5.4.2
 | 
					    rev: 5.10.1
 | 
				
			||||||
    hooks:
 | 
					    hooks:
 | 
				
			||||||
      - id: isort
 | 
					      - id: isort
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - repo: https://github.com/asottile/yesqa
 | 
					  - repo: https://github.com/asottile/yesqa
 | 
				
			||||||
    rev: 7a009f3ee493c796827ee334f9058b110a0e0db8  # frozen: v1.2.1
 | 
					    rev: v1.3.0
 | 
				
			||||||
    hooks:
 | 
					    hooks:
 | 
				
			||||||
      - id: yesqa
 | 
					      - id: yesqa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - repo: https://github.com/Lucas-C/pre-commit-hooks
 | 
					  - repo: https://github.com/Lucas-C/pre-commit-hooks
 | 
				
			||||||
    rev: f30f4974a08a6b2f6a1eeaf30a4d501cf909163a  # frozen: v1.1.9
 | 
					    rev: v1.2.0
 | 
				
			||||||
    hooks:
 | 
					    hooks:
 | 
				
			||||||
      - id: remove-tabs
 | 
					      - id: remove-tabs
 | 
				
			||||||
        exclude: (Makefile$|\.bat$|\.cmake$|\.eps$|\.fits$|\.opt$)
 | 
					        exclude: (Makefile$|\.bat$|\.cmake$|\.eps$|\.fits$|\.opt$)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - repo: https://gitlab.com/pycqa/flake8
 | 
					  - repo: https://github.com/PyCQA/flake8
 | 
				
			||||||
    rev: 05f6544aef321e2fee03a1277ce2eef8880fb927  # frozen: 3.8.3
 | 
					    rev: 4.0.1
 | 
				
			||||||
    hooks:
 | 
					    hooks:
 | 
				
			||||||
      - id: flake8
 | 
					      - id: flake8
 | 
				
			||||||
        additional_dependencies: [flake8-2020, flake8-implicit-str-concat]
 | 
					        additional_dependencies: [flake8-2020, flake8-implicit-str-concat]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - repo: https://github.com/pre-commit/pygrep-hooks
 | 
					  - repo: https://github.com/pre-commit/pygrep-hooks
 | 
				
			||||||
    rev: eae6397e4c259ed3d057511f6dd5330b92867e62  # frozen: v1.6.0
 | 
					    rev: v1.9.0
 | 
				
			||||||
    hooks:
 | 
					    hooks:
 | 
				
			||||||
      - id: python-check-blanket-noqa
 | 
					      - id: python-check-blanket-noqa
 | 
				
			||||||
      - id: rst-backticks
 | 
					      - id: rst-backticks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - repo: https://github.com/pre-commit/pre-commit-hooks
 | 
					  - repo: https://github.com/pre-commit/pre-commit-hooks
 | 
				
			||||||
    rev: e1668fe86af3810fbca72b8653fe478e66a0afdc  # frozen: v3.2.0
 | 
					    rev: v4.3.0
 | 
				
			||||||
    hooks:
 | 
					    hooks:
 | 
				
			||||||
      - id: check-merge-conflict
 | 
					      - id: check-merge-conflict
 | 
				
			||||||
      - id: check-yaml
 | 
					      - id: check-yaml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - repo: https://github.com/sphinx-contrib/sphinx-lint
 | 
				
			||||||
 | 
					    rev: v0.6.1
 | 
				
			||||||
 | 
					    hooks:
 | 
				
			||||||
 | 
					      - id: sphinx-lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ci:
 | 
				
			||||||
 | 
					  autoupdate_schedule: monthly
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,2 +1,8 @@
 | 
				
			||||||
 | 
					version: 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
python:
 | 
					python:
 | 
				
			||||||
    pip_install: true
 | 
					  install:
 | 
				
			||||||
 | 
					    - method: pip
 | 
				
			||||||
 | 
					      path: .
 | 
				
			||||||
 | 
					      extra_requirements:
 | 
				
			||||||
 | 
					        - docs
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										3188
									
								
								CHANGES.rst
									
									
									
									
									
								
							
							
						
						
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						| 
						 | 
					@ -5,7 +5,7 @@ The Python Imaging Library (PIL) is
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Pillow is the friendly PIL fork. It is
 | 
					Pillow is the friendly PIL fork. It is
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Copyright © 2010-2021 by Alex Clark and contributors
 | 
					    Copyright © 2010-2022 by Alex Clark and contributors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Like PIL, Pillow is licensed under the open source HPND License:
 | 
					Like PIL, Pillow is licensed under the open source HPND License:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
include *.c
 | 
					include *.c
 | 
				
			||||||
include *.h
 | 
					include *.h
 | 
				
			||||||
include *.in
 | 
					include *.in
 | 
				
			||||||
 | 
					include *.lock
 | 
				
			||||||
include *.md
 | 
					include *.md
 | 
				
			||||||
include *.py
 | 
					include *.py
 | 
				
			||||||
include *.rst
 | 
					include *.rst
 | 
				
			||||||
| 
						 | 
					@ -9,6 +10,7 @@ include *.txt
 | 
				
			||||||
include *.yaml
 | 
					include *.yaml
 | 
				
			||||||
include LICENSE
 | 
					include LICENSE
 | 
				
			||||||
include Makefile
 | 
					include Makefile
 | 
				
			||||||
 | 
					include Pipfile
 | 
				
			||||||
include tox.ini
 | 
					include tox.ini
 | 
				
			||||||
graft Tests
 | 
					graft Tests
 | 
				
			||||||
graft src
 | 
					graft src
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										73
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						| 
						 | 
					@ -9,9 +9,11 @@ clean:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: coverage
 | 
					.PHONY: coverage
 | 
				
			||||||
coverage:
 | 
					coverage:
 | 
				
			||||||
	pytest -qq
 | 
						python3 -c "import pytest" > /dev/null 2>&1 || python3 -m pip install pytest
 | 
				
			||||||
 | 
						python3 -m pytest -qq
 | 
				
			||||||
	rm -r htmlcov || true
 | 
						rm -r htmlcov || true
 | 
				
			||||||
	coverage report
 | 
						python3 -c "import coverage" > /dev/null 2>&1 || python3 -m pip install coverage
 | 
				
			||||||
 | 
						python3 -m coverage report
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: doc
 | 
					.PHONY: doc
 | 
				
			||||||
doc:
 | 
					doc:
 | 
				
			||||||
| 
						 | 
					@ -33,33 +35,29 @@ help:
 | 
				
			||||||
	@echo "Welcome to Pillow development. Please use \`make <target>\` where <target> is one of"
 | 
						@echo "Welcome to Pillow development. Please use \`make <target>\` where <target> is one of"
 | 
				
			||||||
	@echo "  clean              remove build products"
 | 
						@echo "  clean              remove build products"
 | 
				
			||||||
	@echo "  coverage           run coverage test (in progress)"
 | 
						@echo "  coverage           run coverage test (in progress)"
 | 
				
			||||||
	@echo "  doc                make html docs"
 | 
						@echo "  doc                make HTML docs"
 | 
				
			||||||
	@echo "  docserve           run an http server on the docs directory"
 | 
						@echo "  docserve           run an HTTP server on the docs directory"
 | 
				
			||||||
	@echo "  html               to make standalone HTML files"
 | 
						@echo "  html               to make standalone HTML files"
 | 
				
			||||||
	@echo "  inplace            make inplace extension"
 | 
						@echo "  inplace            make inplace extension"
 | 
				
			||||||
	@echo "  install            make and install"
 | 
						@echo "  install            make and install"
 | 
				
			||||||
	@echo "  install-coverage   make and install with C coverage"
 | 
						@echo "  install-coverage   make and install with C coverage"
 | 
				
			||||||
	@echo "  install-req        install documentation and test dependencies"
 | 
					 | 
				
			||||||
	@echo "  install-venv       (deprecated) install in virtualenv"
 | 
					 | 
				
			||||||
	@echo "  lint               run the lint checks"
 | 
						@echo "  lint               run the lint checks"
 | 
				
			||||||
	@echo "  lint-fix           run black and isort to (mostly) fix lint issues."
 | 
						@echo "  lint-fix           run Black and isort to (mostly) fix lint issues"
 | 
				
			||||||
	@echo "  release-test       run code and package tests before release"
 | 
						@echo "  release-test       run code and package tests before release"
 | 
				
			||||||
	@echo "  test               run tests on installed pillow"
 | 
						@echo "  test               run tests on installed Pillow"
 | 
				
			||||||
	@echo "  upload             build and upload sdists to PyPI"
 | 
					 | 
				
			||||||
	@echo "  upload-test        build and upload sdists to test.pythonpackages.com"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: inplace
 | 
					.PHONY: inplace
 | 
				
			||||||
inplace: clean
 | 
					inplace: clean
 | 
				
			||||||
	python3 setup.py develop build_ext --inplace
 | 
						python3 -m pip install -e --global-option="build_ext" --global-option="--inplace" .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: install
 | 
					.PHONY: install
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
	python3 setup.py install
 | 
						python3 -m pip install .
 | 
				
			||||||
	python3 selftest.py
 | 
						python3 selftest.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: install-coverage
 | 
					.PHONY: install-coverage
 | 
				
			||||||
install-coverage:
 | 
					install-coverage:
 | 
				
			||||||
	CFLAGS="-coverage -Werror=implicit-function-declaration" python3 setup.py build_ext install
 | 
						CFLAGS="-coverage -Werror=implicit-function-declaration" python3 -m pip install --global-option="build_ext" .
 | 
				
			||||||
	python3 selftest.py
 | 
						python3 selftest.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: debug
 | 
					.PHONY: debug
 | 
				
			||||||
| 
						 | 
					@ -68,51 +66,54 @@ debug:
 | 
				
			||||||
# for our stuff, kills optimization, and redirects to dev null so we
 | 
					# for our stuff, kills optimization, and redirects to dev null so we
 | 
				
			||||||
# see any build failures.
 | 
					# see any build failures.
 | 
				
			||||||
	make clean > /dev/null
 | 
						make clean > /dev/null
 | 
				
			||||||
	CFLAGS='-g -O0' python3 setup.py build_ext install > /dev/null
 | 
						CFLAGS='-g -O0' python3 -m pip install --global-option="build_ext" . > /dev/null
 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: install-req
 | 
					 | 
				
			||||||
install-req:
 | 
					 | 
				
			||||||
	python3 -m pip install -r requirements.txt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: install-venv
 | 
					 | 
				
			||||||
install-venv:
 | 
					 | 
				
			||||||
	echo "'install-venv' is deprecated and will be removed in a future Pillow release"
 | 
					 | 
				
			||||||
	virtualenv .
 | 
					 | 
				
			||||||
	bin/pip install -r requirements.txt
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: release-test
 | 
					.PHONY: release-test
 | 
				
			||||||
release-test:
 | 
					release-test:
 | 
				
			||||||
	$(MAKE) install-req
 | 
						python3 -m pip install -e .[tests]
 | 
				
			||||||
	python3 setup.py develop
 | 
					 | 
				
			||||||
	python3 selftest.py
 | 
						python3 selftest.py
 | 
				
			||||||
	python3 -m pytest Tests
 | 
						python3 -m pytest Tests
 | 
				
			||||||
	python3 setup.py install
 | 
						python3 -m pip install .
 | 
				
			||||||
	-rm dist/*.egg
 | 
						-rm dist/*.egg
 | 
				
			||||||
	-rmdir dist
 | 
						-rmdir dist
 | 
				
			||||||
	python3 -m pytest -qq
 | 
						python3 -m pytest -qq
 | 
				
			||||||
	check-manifest
 | 
						python3 -m check_manifest
 | 
				
			||||||
	pyroma .
 | 
						python3 -m pyroma .
 | 
				
			||||||
	$(MAKE) readme
 | 
						$(MAKE) readme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: sdist
 | 
					.PHONY: sdist
 | 
				
			||||||
sdist:
 | 
					sdist:
 | 
				
			||||||
	python3 setup.py sdist --format=gztar
 | 
						python3 -m build --help > /dev/null 2>&1 || python3 -m pip install build
 | 
				
			||||||
 | 
						python3 -m build --sdist
 | 
				
			||||||
 | 
						python3 -m twine --help > /dev/null 2>&1 || python3 -m pip install twine
 | 
				
			||||||
 | 
						python3 -m twine check --strict dist/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: test
 | 
					.PHONY: test
 | 
				
			||||||
test:
 | 
					test:
 | 
				
			||||||
	pytest -qq
 | 
						python3 -c "import pytest" > /dev/null 2>&1 || python3 -m pip install pytest
 | 
				
			||||||
 | 
						python3 -m pytest -qq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.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 \
 | 
				
			||||||
 | 
					            --log-file=/tmp/valgrind-output \
 | 
				
			||||||
 | 
					            python3 -m pytest --no-memcheck -vv --valgrind --valgrind-log=/tmp/valgrind-output
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: readme
 | 
					.PHONY: readme
 | 
				
			||||||
readme:
 | 
					readme:
 | 
				
			||||||
	python3 setup.py --long-description | markdown2 > .long-description.html && open .long-description.html
 | 
						python3 -c "import markdown2" > /dev/null 2>&1 || python3 -m pip install markdown2
 | 
				
			||||||
 | 
						python3 -m markdown2 README.md > .long-description.html && open .long-description.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: lint
 | 
					.PHONY: lint
 | 
				
			||||||
lint:
 | 
					lint:
 | 
				
			||||||
	tox --help > /dev/null || python3 -m pip install tox
 | 
						python3 -c "import tox" > /dev/null 2>&1 || python3 -m pip install tox
 | 
				
			||||||
	tox -e lint
 | 
						python3 -m tox -e lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: lint-fix
 | 
					.PHONY: lint-fix
 | 
				
			||||||
lint-fix:
 | 
					lint-fix:
 | 
				
			||||||
	black --target-version py36 .
 | 
						python3 -c "import black" > /dev/null 2>&1 || python3 -m pip install black
 | 
				
			||||||
	isort .
 | 
						python3 -c "import isort" > /dev/null 2>&1 || python3 -m pip install isort
 | 
				
			||||||
 | 
						python3 -m black --target-version py37 .
 | 
				
			||||||
 | 
						python3 -m isort .
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										22
									
								
								Pipfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					[[source]]
 | 
				
			||||||
 | 
					url = "https://pypi.org/simple"
 | 
				
			||||||
 | 
					verify_ssl = true
 | 
				
			||||||
 | 
					name = "pypi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[packages]
 | 
				
			||||||
 | 
					black = "*"
 | 
				
			||||||
 | 
					check-manifest = "*"
 | 
				
			||||||
 | 
					coverage = "*"
 | 
				
			||||||
 | 
					defusedxml = "*"
 | 
				
			||||||
 | 
					packaging = "*"
 | 
				
			||||||
 | 
					markdown2 = "*"
 | 
				
			||||||
 | 
					olefile = "*"
 | 
				
			||||||
 | 
					pyroma = "*"
 | 
				
			||||||
 | 
					pytest = "*"
 | 
				
			||||||
 | 
					pytest-cov = "*"
 | 
				
			||||||
 | 
					pytest-timeout = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[dev-packages]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[requires]
 | 
				
			||||||
 | 
					python_version = "3.9"
 | 
				
			||||||
							
								
								
									
										324
									
								
								Pipfile.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,324 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    "_meta": {
 | 
				
			||||||
 | 
					        "hash": {
 | 
				
			||||||
 | 
					            "sha256": "e5cad23bf4187647d53b613a64dc4792b7064bf86b08dfb5737580e32943f54d"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pipfile-spec": 6,
 | 
				
			||||||
 | 
					        "requires": {
 | 
				
			||||||
 | 
					            "python_version": "3.9"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "sources": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "name": "pypi",
 | 
				
			||||||
 | 
					                "url": "https://pypi.org/simple",
 | 
				
			||||||
 | 
					                "verify_ssl": true
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "default": {
 | 
				
			||||||
 | 
					        "attrs": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1",
 | 
				
			||||||
 | 
					                "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
 | 
				
			||||||
 | 
					            "version": "==21.2.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "black": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3",
 | 
				
			||||||
 | 
					                "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==21.12b0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "build": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:1aaadcd69338252ade4f7ec1265e1a19184bf916d84c9b7df095f423948cb89f",
 | 
				
			||||||
 | 
					                "sha256:21b7ebbd1b22499c4dac536abc7606696ea4d909fd755e00f09f3c0f2c05e3c8"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3.6'",
 | 
				
			||||||
 | 
					            "version": "==0.7.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "certifi": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872",
 | 
				
			||||||
 | 
					                "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "version": "==2021.10.8"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "charset-normalizer": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721",
 | 
				
			||||||
 | 
					                "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3'",
 | 
				
			||||||
 | 
					            "version": "==2.0.9"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "check-manifest": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:365c94d65de4c927d9d8b505371d08ee19f9f369c86b9ac3db97c2754c827c95",
 | 
				
			||||||
 | 
					                "sha256:56dadd260a9c7d550b159796d2894b6d0bcc176a94cbc426d9bb93e5e48d12ce"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==0.47"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "click": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3",
 | 
				
			||||||
 | 
					                "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3.6'",
 | 
				
			||||||
 | 
					            "version": "==8.0.3"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "coverage": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0",
 | 
				
			||||||
 | 
					                "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd",
 | 
				
			||||||
 | 
					                "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884",
 | 
				
			||||||
 | 
					                "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48",
 | 
				
			||||||
 | 
					                "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76",
 | 
				
			||||||
 | 
					                "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0",
 | 
				
			||||||
 | 
					                "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64",
 | 
				
			||||||
 | 
					                "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685",
 | 
				
			||||||
 | 
					                "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47",
 | 
				
			||||||
 | 
					                "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d",
 | 
				
			||||||
 | 
					                "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840",
 | 
				
			||||||
 | 
					                "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f",
 | 
				
			||||||
 | 
					                "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971",
 | 
				
			||||||
 | 
					                "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c",
 | 
				
			||||||
 | 
					                "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a",
 | 
				
			||||||
 | 
					                "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de",
 | 
				
			||||||
 | 
					                "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17",
 | 
				
			||||||
 | 
					                "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4",
 | 
				
			||||||
 | 
					                "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521",
 | 
				
			||||||
 | 
					                "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57",
 | 
				
			||||||
 | 
					                "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b",
 | 
				
			||||||
 | 
					                "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282",
 | 
				
			||||||
 | 
					                "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644",
 | 
				
			||||||
 | 
					                "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475",
 | 
				
			||||||
 | 
					                "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d",
 | 
				
			||||||
 | 
					                "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da",
 | 
				
			||||||
 | 
					                "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953",
 | 
				
			||||||
 | 
					                "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2",
 | 
				
			||||||
 | 
					                "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e",
 | 
				
			||||||
 | 
					                "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c",
 | 
				
			||||||
 | 
					                "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc",
 | 
				
			||||||
 | 
					                "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64",
 | 
				
			||||||
 | 
					                "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74",
 | 
				
			||||||
 | 
					                "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617",
 | 
				
			||||||
 | 
					                "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3",
 | 
				
			||||||
 | 
					                "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d",
 | 
				
			||||||
 | 
					                "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa",
 | 
				
			||||||
 | 
					                "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739",
 | 
				
			||||||
 | 
					                "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8",
 | 
				
			||||||
 | 
					                "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8",
 | 
				
			||||||
 | 
					                "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781",
 | 
				
			||||||
 | 
					                "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58",
 | 
				
			||||||
 | 
					                "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9",
 | 
				
			||||||
 | 
					                "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c",
 | 
				
			||||||
 | 
					                "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd",
 | 
				
			||||||
 | 
					                "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e",
 | 
				
			||||||
 | 
					                "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==6.2"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "defusedxml": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69",
 | 
				
			||||||
 | 
					                "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==0.7.1"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "docutils": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c",
 | 
				
			||||||
 | 
					                "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
 | 
				
			||||||
 | 
					            "version": "==0.18.1"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "idna": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
 | 
				
			||||||
 | 
					                "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3'",
 | 
				
			||||||
 | 
					            "version": "==3.3"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "iniconfig": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3",
 | 
				
			||||||
 | 
					                "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "version": "==1.1.1"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "markdown2": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:8f4ac8d9a124ab408c67361090ed512deda746c04362c36c2ec16190c720c2b0",
 | 
				
			||||||
 | 
					                "sha256:91113caf23aa662570fe21984f08fe74f814695c0a0ea8e863a8b4c4f63f9f6e"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==2.4.2"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "mypy-extensions": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d",
 | 
				
			||||||
 | 
					                "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "version": "==0.4.3"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "olefile": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==0.46"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "packaging": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
 | 
				
			||||||
 | 
					                "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==21.3"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pathspec": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a",
 | 
				
			||||||
 | 
					                "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "version": "==0.9.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pep517": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:931378d93d11b298cf511dd634cf5ea4cb249a28ef84160b3247ee9afb4e8ab0",
 | 
				
			||||||
 | 
					                "sha256:dd884c326898e2c6e11f9e0b64940606a93eb10ea022a2e067959f3a110cf161"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "version": "==0.12.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "platformdirs": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2",
 | 
				
			||||||
 | 
					                "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3.6'",
 | 
				
			||||||
 | 
					            "version": "==2.4.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pluggy": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159",
 | 
				
			||||||
 | 
					                "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3.6'",
 | 
				
			||||||
 | 
					            "version": "==1.0.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "py": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719",
 | 
				
			||||||
 | 
					                "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
 | 
				
			||||||
 | 
					            "version": "==1.11.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pygments": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380",
 | 
				
			||||||
 | 
					                "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3.5'",
 | 
				
			||||||
 | 
					            "version": "==2.10.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pyparsing": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4",
 | 
				
			||||||
 | 
					                "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3.6'",
 | 
				
			||||||
 | 
					            "version": "==3.0.6"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pyroma": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:0fba67322913026091590e68e0d9e0d4fbd6420fcf34d315b2ad6985ab104d65",
 | 
				
			||||||
 | 
					                "sha256:f8c181e0d5d292f11791afc18f7d0218a83c85cf64d6f8fb1571ce9d29a24e4a"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==3.2"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pytest": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89",
 | 
				
			||||||
 | 
					                "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==6.2.5"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pytest-cov": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6",
 | 
				
			||||||
 | 
					                "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==3.0.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pytest-timeout": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:e6f98b54dafde8d70e4088467ff621260b641eb64895c4195b6e5c8f45638112",
 | 
				
			||||||
 | 
					                "sha256:fe9c3d5006c053bb9e062d60f641e6a76d6707aedb645350af9593e376fcc717"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "index": "pypi",
 | 
				
			||||||
 | 
					            "version": "==2.0.2"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "requests": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24",
 | 
				
			||||||
 | 
					                "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
 | 
				
			||||||
 | 
					            "version": "==2.26.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "setuptools": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:5ec2bbb534ed160b261acbbdd1b463eb3cf52a8d223d96a8ab9981f63798e85c",
 | 
				
			||||||
 | 
					                "sha256:75fd345a47ce3d79595b27bf57e6f49c2ca7904f3c7ce75f8a87012046c86b0b"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3.7'",
 | 
				
			||||||
 | 
					            "version": "==60.0.0"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "toml": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
 | 
				
			||||||
 | 
					                "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
 | 
				
			||||||
 | 
					            "version": "==0.10.2"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "tomli": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f",
 | 
				
			||||||
 | 
					                "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3.6'",
 | 
				
			||||||
 | 
					            "version": "==1.2.3"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "typing-extensions": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e",
 | 
				
			||||||
 | 
					                "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '3.6'",
 | 
				
			||||||
 | 
					            "version": "==4.0.1"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "urllib3": {
 | 
				
			||||||
 | 
					            "hashes": [
 | 
				
			||||||
 | 
					                "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece",
 | 
				
			||||||
 | 
					                "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
 | 
				
			||||||
 | 
					            "version": "==1.26.7"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "develop": {}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										40
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
<p align="center">
 | 
					<p align="center">
 | 
				
			||||||
    <img width="248" height="250" src="https://raw.githubusercontent.com/python-pillow/pillow-logo/master/pillow-logo-248x250.png" alt="Pillow logo">
 | 
					    <img width="248" height="250" src="https://raw.githubusercontent.com/python-pillow/pillow-logo/main/pillow-logo-248x250.png" alt="Pillow logo">
 | 
				
			||||||
</p>
 | 
					</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Pillow
 | 
					# Pillow
 | 
				
			||||||
| 
						 | 
					@ -24,27 +24,39 @@ As of 2019, Pillow development is
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <th>tests</th>
 | 
					        <th>tests</th>
 | 
				
			||||||
        <td>
 | 
					        <td>
 | 
				
			||||||
            <a href="https://github.com/python-pillow/Pillow/actions?query=workflow%3ALint"><img
 | 
					            <a href="https://github.com/python-pillow/Pillow/actions/workflows/lint.yml"><img
 | 
				
			||||||
                alt="GitHub Actions build status (Lint)"
 | 
					                alt="GitHub Actions build status (Lint)"
 | 
				
			||||||
                src="https://github.com/python-pillow/Pillow/workflows/Lint/badge.svg"></a>
 | 
					                src="https://github.com/python-pillow/Pillow/workflows/Lint/badge.svg"></a>
 | 
				
			||||||
            <a href="https://github.com/python-pillow/Pillow/actions?query=workflow%3ATest"><img
 | 
					            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test.yml"><img
 | 
				
			||||||
                alt="GitHub Actions build status (Test Linux and macOS)"
 | 
					                alt="GitHub Actions build status (Test Linux and macOS)"
 | 
				
			||||||
                src="https://github.com/python-pillow/Pillow/workflows/Test/badge.svg"></a>
 | 
					                src="https://github.com/python-pillow/Pillow/workflows/Test/badge.svg"></a>
 | 
				
			||||||
            <a href="https://github.com/python-pillow/Pillow/actions?query=workflow%3A%22Test+Windows%22"><img
 | 
					            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test-windows.yml"><img
 | 
				
			||||||
                alt="GitHub Actions build status (Test Windows)"
 | 
					                alt="GitHub Actions build status (Test Windows)"
 | 
				
			||||||
                src="https://github.com/python-pillow/Pillow/workflows/Test%20Windows/badge.svg"></a>
 | 
					                src="https://github.com/python-pillow/Pillow/workflows/Test%20Windows/badge.svg"></a>
 | 
				
			||||||
            <a href="https://github.com/python-pillow/Pillow/actions?query=workflow%3A%22Test+Docker%22"><img
 | 
					            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test-mingw.yml"><img
 | 
				
			||||||
 | 
					                alt="GitHub Actions build status (Test MinGW)"
 | 
				
			||||||
 | 
					                src="https://github.com/python-pillow/Pillow/workflows/Test%20MinGW/badge.svg"></a>
 | 
				
			||||||
 | 
					            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test-cygwin.yml"><img
 | 
				
			||||||
 | 
					                alt="GitHub Actions build status (Test Cygwin)"
 | 
				
			||||||
 | 
					                src="https://github.com/python-pillow/Pillow/workflows/Test%20Cygwin/badge.svg"></a>
 | 
				
			||||||
 | 
					            <a href="https://github.com/python-pillow/Pillow/actions/workflows/test-docker.yml"><img
 | 
				
			||||||
                alt="GitHub Actions build status (Test Docker)"
 | 
					                alt="GitHub Actions build status (Test Docker)"
 | 
				
			||||||
                src="https://github.com/python-pillow/Pillow/workflows/Test%20Docker/badge.svg"></a>
 | 
					                src="https://github.com/python-pillow/Pillow/workflows/Test%20Docker/badge.svg"></a>
 | 
				
			||||||
            <a href="https://ci.appveyor.com/project/python-pillow/Pillow"><img
 | 
					            <a href="https://ci.appveyor.com/project/python-pillow/Pillow"><img
 | 
				
			||||||
                alt="AppVeyor CI build status (Windows)"
 | 
					                alt="AppVeyor CI build status (Windows)"
 | 
				
			||||||
                src="https://img.shields.io/appveyor/build/python-pillow/Pillow/master.svg?label=Windows%20build"></a>
 | 
					                src="https://img.shields.io/appveyor/build/python-pillow/Pillow/main.svg?label=Windows%20build"></a>
 | 
				
			||||||
            <a href="https://travis-ci.com/github/python-pillow/pillow-wheels"><img
 | 
					            <a href="https://github.com/python-pillow/pillow-wheels/actions"><img
 | 
				
			||||||
                alt="Travis CI build status (macOS)"
 | 
					                alt="GitHub Actions wheels build status (Wheels)"
 | 
				
			||||||
                src="https://img.shields.io/travis/com/python-pillow/pillow-wheels/master.svg?label=macOS%20build"></a>
 | 
					                src="https://github.com/python-pillow/pillow-wheels/workflows/Wheels/badge.svg"></a>
 | 
				
			||||||
            <a href="https://codecov.io/gh/python-pillow/Pillow"><img
 | 
					            <a href="https://app.travis-ci.com/github/python-pillow/pillow-wheels"><img
 | 
				
			||||||
 | 
					                alt="Travis CI wheels build status (aarch64)"
 | 
				
			||||||
 | 
					                src="https://img.shields.io/travis/com/python-pillow/pillow-wheels/main.svg?label=aarch64%20wheels"></a>
 | 
				
			||||||
 | 
					            <a href="https://app.codecov.io/gh/python-pillow/Pillow"><img
 | 
				
			||||||
                alt="Code coverage"
 | 
					                alt="Code coverage"
 | 
				
			||||||
                src="https://codecov.io/gh/python-pillow/Pillow/branch/master/graph/badge.svg"></a>
 | 
					                src="https://codecov.io/gh/python-pillow/Pillow/branch/main/graph/badge.svg"></a>
 | 
				
			||||||
 | 
					            <a href="https://github.com/python-pillow/Pillow/actions/workflows/tidelift.yml"><img
 | 
				
			||||||
 | 
					                alt="Tidelift Align"
 | 
				
			||||||
 | 
					                src="https://github.com/python-pillow/Pillow/actions/workflows/tidelift.yml/badge.svg"></a>
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
| 
						 | 
					@ -90,12 +102,12 @@ The core image library is designed for fast access to data stored in a few basic
 | 
				
			||||||
- [Documentation](https://pillow.readthedocs.io/)
 | 
					- [Documentation](https://pillow.readthedocs.io/)
 | 
				
			||||||
  - [Installation](https://pillow.readthedocs.io/en/latest/installation.html)
 | 
					  - [Installation](https://pillow.readthedocs.io/en/latest/installation.html)
 | 
				
			||||||
  - [Handbook](https://pillow.readthedocs.io/en/latest/handbook/index.html)
 | 
					  - [Handbook](https://pillow.readthedocs.io/en/latest/handbook/index.html)
 | 
				
			||||||
- [Contribute](https://github.com/python-pillow/Pillow/blob/master/.github/CONTRIBUTING.md)
 | 
					- [Contribute](https://github.com/python-pillow/Pillow/blob/main/.github/CONTRIBUTING.md)
 | 
				
			||||||
  - [Issues](https://github.com/python-pillow/Pillow/issues)
 | 
					  - [Issues](https://github.com/python-pillow/Pillow/issues)
 | 
				
			||||||
  - [Pull requests](https://github.com/python-pillow/Pillow/pulls)
 | 
					  - [Pull requests](https://github.com/python-pillow/Pillow/pulls)
 | 
				
			||||||
- [Release notes](https://pillow.readthedocs.io/en/stable/releasenotes/index.html)
 | 
					- [Release notes](https://pillow.readthedocs.io/en/stable/releasenotes/index.html)
 | 
				
			||||||
- [Changelog](https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst)
 | 
					- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
 | 
				
			||||||
  - [Pre-fork](https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst#pre-fork)
 | 
					  - [Pre-fork](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst#pre-fork)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Report a Vulnerability
 | 
					## Report a Vulnerability
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										27
									
								
								RELEASING.md
									
									
									
									
									
								
							
							
						
						| 
						 | 
					@ -8,8 +8,8 @@ information about how the version numbers line up with releases.
 | 
				
			||||||
Released quarterly on January 2nd, April 1st, July 1st and October 15th.
 | 
					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
 | 
					* [ ] Open a release ticket e.g. https://github.com/python-pillow/Pillow/issues/3154
 | 
				
			||||||
* [ ] Develop and prepare release in `master` branch.
 | 
					* [ ] Develop and prepare release in `main` branch.
 | 
				
			||||||
* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in `master` branch.
 | 
					* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) and [AppVeyor](https://ci.appveyor.com/project/python-pillow/Pillow) to confirm passing tests in `main` branch.
 | 
				
			||||||
* [ ] Check that all of the wheel builds [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels) pass the tests in Travis CI and GitHub Actions.
 | 
					* [ ] Check that all of the wheel builds [Pillow Wheel Builder](https://github.com/python-pillow/pillow-wheels) pass the tests in Travis CI and GitHub Actions.
 | 
				
			||||||
* [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), update version identifier in `src/PIL/_version.py`
 | 
					* [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), update version identifier in `src/PIL/_version.py`
 | 
				
			||||||
* [ ] Update `CHANGES.rst`.
 | 
					* [ ] Update `CHANGES.rst`.
 | 
				
			||||||
| 
						 | 
					@ -24,13 +24,12 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th.
 | 
				
			||||||
* [ ] Create and check source distribution:
 | 
					* [ ] Create and check source distribution:
 | 
				
			||||||
  ```bash
 | 
					  ```bash
 | 
				
			||||||
  make sdist
 | 
					  make sdist
 | 
				
			||||||
  twine check dist/*
 | 
					 | 
				
			||||||
  ```
 | 
					  ```
 | 
				
			||||||
* [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/master/RELEASING.md#binary-distributions)
 | 
					* [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/main/RELEASING.md#binary-distributions)
 | 
				
			||||||
* [ ] Check and upload all binaries and source distributions e.g.:
 | 
					* [ ] Check and upload all binaries and source distributions e.g.:
 | 
				
			||||||
  ```bash
 | 
					  ```bash
 | 
				
			||||||
  twine check dist/*
 | 
					  python3 -m twine check --strict dist/*
 | 
				
			||||||
  twine upload dist/Pillow-5.2.0*
 | 
					  python3 -m twine upload dist/Pillow-5.2.0*
 | 
				
			||||||
  ```
 | 
					  ```
 | 
				
			||||||
* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases)
 | 
					* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases)
 | 
				
			||||||
* [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), increment and append `.dev0` to version identifier in `src/PIL/_version.py`
 | 
					* [ ] In compliance with [PEP 440](https://www.python.org/dev/peps/pep-0440/), increment and append `.dev0` to version identifier in `src/PIL/_version.py`
 | 
				
			||||||
| 
						 | 
					@ -39,13 +38,13 @@ Released quarterly on January 2nd, April 1st, July 1st and October 15th.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Released as needed for security, installation or critical bug fixes.
 | 
					Released as needed for security, installation or critical bug fixes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* [ ] Make necessary changes in `master` branch.
 | 
					* [ ] Make necessary changes in `main` branch.
 | 
				
			||||||
* [ ] Update `CHANGES.rst`.
 | 
					* [ ] Update `CHANGES.rst`.
 | 
				
			||||||
* [ ] Check out release branch e.g.:
 | 
					* [ ] Check out release branch e.g.:
 | 
				
			||||||
  ```bash
 | 
					  ```bash
 | 
				
			||||||
  git checkout -t remotes/origin/5.2.x
 | 
					  git checkout -t remotes/origin/5.2.x
 | 
				
			||||||
  ```
 | 
					  ```
 | 
				
			||||||
* [ ] Cherry pick individual commits from `master` branch to release branch e.g. `5.2.x`, then `git push`.
 | 
					* [ ] Cherry pick individual commits from `main` branch to release branch e.g. `5.2.x`, then `git push`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,13 +60,12 @@ Released as needed for security, installation or critical bug fixes.
 | 
				
			||||||
* [ ] Create and check source distribution:
 | 
					* [ ] Create and check source distribution:
 | 
				
			||||||
  ```bash
 | 
					  ```bash
 | 
				
			||||||
  make sdist
 | 
					  make sdist
 | 
				
			||||||
  twine check dist/*
 | 
					 | 
				
			||||||
  ```
 | 
					  ```
 | 
				
			||||||
* [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/master/RELEASING.md#binary-distributions)
 | 
					* [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/main/RELEASING.md#binary-distributions)
 | 
				
			||||||
* [ ] Check and upload all binaries and source distributions e.g.:
 | 
					* [ ] Check and upload all binaries and source distributions e.g.:
 | 
				
			||||||
  ```bash
 | 
					  ```bash
 | 
				
			||||||
  twine check dist/*
 | 
					  python3 -m twine check --strict dist/*
 | 
				
			||||||
  twine upload dist/Pillow-5.2.1*
 | 
					  python3 -m twine upload dist/Pillow-5.2.1*
 | 
				
			||||||
  ```
 | 
					  ```
 | 
				
			||||||
* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases)
 | 
					* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,7 +74,7 @@ Released as needed for security, installation or critical bug fixes.
 | 
				
			||||||
Released as needed privately to individual vendors for critical security-related bug fixes.
 | 
					Released as needed privately to individual vendors for critical security-related bug fixes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* [ ] Prepare patch for all versions that will get a fix. Test against local installations.
 | 
					* [ ] Prepare patch for all versions that will get a fix. Test against local installations.
 | 
				
			||||||
* [ ] Commit against master, cherry pick to affected release branches.
 | 
					* [ ] Commit against `main`, cherry pick to affected release branches.
 | 
				
			||||||
* [ ] Run local test matrix on each release & Python version.
 | 
					* [ ] Run local test matrix on each release & Python version.
 | 
				
			||||||
* [ ] Privately send to distros.
 | 
					* [ ] Privately send to distros.
 | 
				
			||||||
* [ ] Run pre-release check via `make release-test`
 | 
					* [ ] Run pre-release check via `make release-test`
 | 
				
			||||||
| 
						 | 
					@ -91,9 +89,8 @@ Released as needed privately to individual vendors for critical security-related
 | 
				
			||||||
* [ ] Create and check source distribution:
 | 
					* [ ] Create and check source distribution:
 | 
				
			||||||
  ```bash
 | 
					  ```bash
 | 
				
			||||||
  make sdist
 | 
					  make sdist
 | 
				
			||||||
  twine check dist/*
 | 
					 | 
				
			||||||
  ```
 | 
					  ```
 | 
				
			||||||
* [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/master/RELEASING.md#binary-distributions)
 | 
					* [ ] Create [binary distributions](https://github.com/python-pillow/Pillow/blob/main/RELEASING.md#binary-distributions)
 | 
				
			||||||
* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases)
 | 
					* [ ] Publish the [release on GitHub](https://github.com/python-pillow/Pillow/releases)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Binary Distributions
 | 
					## Binary Distributions
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
#!/usr/bin/env python
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from PIL import Image
 | 
					from PIL import Image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if sys.maxsize < 2 ** 32:
 | 
					if sys.maxsize < 2**32:
 | 
				
			||||||
    im = Image.new("L", (999999, 999999), 0)
 | 
					    im = Image.new("L", (999999, 999999), 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ Dependencies
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Install::
 | 
					Install::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    python3 -m pip install pytest pytest-cov
 | 
					    python3 -m pip install pytest pytest-cov pytest-timeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Execution
 | 
					Execution
 | 
				
			||||||
---------
 | 
					---------
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
#!/usr/bin/env python
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from PIL import Image
 | 
					from PIL import Image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,8 +61,8 @@ repro_copy = (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
for path in repro_ss2 + repro_lc + repro_advance + repro_brun + repro_copy:
 | 
					for path in repro_ss2 + repro_lc + repro_advance + repro_brun + repro_copy:
 | 
				
			||||||
    im = Image.open(path)
 | 
					    with Image.open(path) as im:
 | 
				
			||||||
    try:
 | 
					        try:
 | 
				
			||||||
        im.load()
 | 
					            im.load()
 | 
				
			||||||
    except Exception as msg:
 | 
					        except Exception as msg:
 | 
				
			||||||
        print(msg)
 | 
					            print(msg)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
#!/usr/bin/env python
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
import pytest
 | 
					import pytest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from PIL import Image
 | 
					from PIL import Image
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
#!/usr/bin/env python
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Reproductions/tests for OOB read errors in FliDecode.c
 | 
					# Reproductions/tests for OOB read errors in FliDecode.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,8 +19,8 @@ from PIL import Image
 | 
				
			||||||
repro = ("00r0_gray_l.jp2", "00r1_graya_la.jp2")
 | 
					repro = ("00r0_gray_l.jp2", "00r1_graya_la.jp2")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
for path in repro:
 | 
					for path in repro:
 | 
				
			||||||
    im = Image.open(path)
 | 
					    with Image.open(path) as im:
 | 
				
			||||||
    try:
 | 
					        try:
 | 
				
			||||||
        im.load()
 | 
					            im.load()
 | 
				
			||||||
    except Exception as msg:
 | 
					        except Exception as msg:
 | 
				
			||||||
        print(msg)
 | 
					            print(msg)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ YDIM = 32769
 | 
				
			||||||
XDIM = 48000
 | 
					XDIM = 48000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pytestmark = pytest.mark.skipif(sys.maxsize <= 2 ** 32, reason="requires 64-bit system")
 | 
					pytestmark = pytest.mark.skipif(sys.maxsize <= 2**32, reason="requires 64-bit system")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _write_png(tmp_path, xdim, ydim):
 | 
					def _write_png(tmp_path, xdim, ydim):
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,7 @@ def _write_png(tmp_path, xdim, ydim):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_large(tmp_path):
 | 
					def test_large(tmp_path):
 | 
				
			||||||
    """ succeeded prepatch"""
 | 
					    """succeeded prepatch"""
 | 
				
			||||||
    _write_png(tmp_path, XDIM, YDIM)
 | 
					    _write_png(tmp_path, XDIM, YDIM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ YDIM = 32769
 | 
				
			||||||
XDIM = 48000
 | 
					XDIM = 48000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pytestmark = pytest.mark.skipif(sys.maxsize <= 2 ** 32, reason="requires 64-bit system")
 | 
					pytestmark = pytest.mark.skipif(sys.maxsize <= 2**32, reason="requires 64-bit system")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _write_png(tmp_path, xdim, ydim):
 | 
					def _write_png(tmp_path, xdim, ydim):
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ def _write_png(tmp_path, xdim, ydim):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_large(tmp_path):
 | 
					def test_large(tmp_path):
 | 
				
			||||||
    """ succeeded prepatch"""
 | 
					    """succeeded prepatch"""
 | 
				
			||||||
    _write_png(tmp_path, XDIM, YDIM)
 | 
					    _write_png(tmp_path, XDIM, YDIM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,4 @@
 | 
				
			||||||
import io
 | 
					import io
 | 
				
			||||||
import warnings
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import pytest
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_report_header(config):
 | 
					def pytest_report_header(config):
 | 
				
			||||||
| 
						 | 
					@ -16,16 +13,19 @@ def pytest_report_header(config):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pytest_configure(config):
 | 
					def pytest_configure(config):
 | 
				
			||||||
 | 
					    config.addinivalue_line(
 | 
				
			||||||
 | 
					        "markers",
 | 
				
			||||||
 | 
					        "pil_noop_mark: A conditional mark where nothing special happens",
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # We're marking some tests to ignore valgrind errors and XFAIL them.
 | 
					    # We're marking some tests to ignore valgrind errors and XFAIL them.
 | 
				
			||||||
    # Ensure that the mark is defined
 | 
					    # Ensure that the mark is defined
 | 
				
			||||||
    # even in cases where pytest-valgrind isn't installed
 | 
					    # even in cases where pytest-valgrind isn't installed
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
    with warnings.catch_warnings():
 | 
					        config.addinivalue_line(
 | 
				
			||||||
        warnings.simplefilter("error")
 | 
					            "markers",
 | 
				
			||||||
        try:
 | 
					            "valgrind_known_error: Tests that have known issues with valgrind",
 | 
				
			||||||
            getattr(pytest.mark, "valgrind_known_error")
 | 
					        )
 | 
				
			||||||
        except Exception:
 | 
					    except Exception:
 | 
				
			||||||
            config.addinivalue_line(
 | 
					        # valgrind is already installed
 | 
				
			||||||
                "markers",
 | 
					        pass
 | 
				
			||||||
                "valgrind_known_error: Tests that have known issues with valgrind",
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
#!/usr/bin/env python
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
import base64
 | 
					import base64
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								Tests/fonts/10x20-ISO8859-1-fewer-characters.pcf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/fonts/oom-e8e927ba6c0d38274a37c1567560eb33baf74627.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -30,7 +30,6 @@ if os.environ.get("SHOW_ERRORS", None):
 | 
				
			||||||
            a.show()
 | 
					            a.show()
 | 
				
			||||||
            b.show()
 | 
					            b.show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
elif "GITHUB_ACTIONS" in os.environ:
 | 
					elif "GITHUB_ACTIONS" in os.environ:
 | 
				
			||||||
    HAS_UPLOADER = True
 | 
					    HAS_UPLOADER = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,7 +43,6 @@ elif "GITHUB_ACTIONS" in os.environ:
 | 
				
			||||||
            b.save(os.path.join(tmpdir, "b.png"))
 | 
					            b.save(os.path.join(tmpdir, "b.png"))
 | 
				
			||||||
            return tmpdir
 | 
					            return tmpdir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
else:
 | 
					else:
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        import test_image_results
 | 
					        import test_image_results
 | 
				
			||||||
| 
						 | 
					@ -173,6 +171,21 @@ def skip_unless_feature_version(feature, version_required, reason=None):
 | 
				
			||||||
    return pytest.mark.skipif(version_available < version_required, reason=reason)
 | 
					    return pytest.mark.skipif(version_available < version_required, reason=reason)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def mark_if_feature_version(mark, feature, version_blacklist, reason=None):
 | 
				
			||||||
 | 
					    if not features.check(feature):
 | 
				
			||||||
 | 
					        return pytest.mark.pil_noop_mark()
 | 
				
			||||||
 | 
					    if reason is None:
 | 
				
			||||||
 | 
					        reason = f"{feature} is {version_blacklist}"
 | 
				
			||||||
 | 
					    version_required = parse_version(version_blacklist)
 | 
				
			||||||
 | 
					    version_available = parse_version(features.version(feature))
 | 
				
			||||||
 | 
					    if (
 | 
				
			||||||
 | 
					        version_available.major == version_required.major
 | 
				
			||||||
 | 
					        and version_available.minor == version_required.minor
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        return mark(reason=reason)
 | 
				
			||||||
 | 
					    return pytest.mark.pil_noop_mark()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@pytest.mark.skipif(sys.platform.startswith("win32"), reason="Requires Unix or macOS")
 | 
					@pytest.mark.skipif(sys.platform.startswith("win32"), reason="Requires Unix or macOS")
 | 
				
			||||||
class PillowLeakTestCase:
 | 
					class PillowLeakTestCase:
 | 
				
			||||||
    # requires unix/macOS
 | 
					    # requires unix/macOS
 | 
				
			||||||
| 
						 | 
					@ -257,8 +270,23 @@ def netpbm_available():
 | 
				
			||||||
    return bool(shutil.which("ppmquant") and shutil.which("ppmtogif"))
 | 
					    return bool(shutil.which("ppmquant") and shutil.which("ppmtogif"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def imagemagick_available():
 | 
					def magick_command():
 | 
				
			||||||
    return bool(IMCONVERT and shutil.which(IMCONVERT))
 | 
					    if sys.platform == "win32":
 | 
				
			||||||
 | 
					        magickhome = os.environ.get("MAGICK_HOME", "")
 | 
				
			||||||
 | 
					        if magickhome:
 | 
				
			||||||
 | 
					            imagemagick = [os.path.join(magickhome, "convert.exe")]
 | 
				
			||||||
 | 
					            graphicsmagick = [os.path.join(magickhome, "gm.exe"), "convert"]
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            imagemagick = None
 | 
				
			||||||
 | 
					            graphicsmagick = None
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        imagemagick = ["convert"]
 | 
				
			||||||
 | 
					        graphicsmagick = ["gm", "convert"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if imagemagick and shutil.which(imagemagick[0]):
 | 
				
			||||||
 | 
					        return imagemagick
 | 
				
			||||||
 | 
					    elif graphicsmagick and shutil.which(graphicsmagick[0]):
 | 
				
			||||||
 | 
					        return graphicsmagick
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def on_appveyor():
 | 
					def on_appveyor():
 | 
				
			||||||
| 
						 | 
					@ -296,15 +324,7 @@ def is_mingw():
 | 
				
			||||||
    return sysconfig.get_platform() == "mingw"
 | 
					    return sysconfig.get_platform() == "mingw"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if sys.platform == "win32":
 | 
					class CachedProperty:
 | 
				
			||||||
    IMCONVERT = os.environ.get("MAGICK_HOME", "")
 | 
					 | 
				
			||||||
    if IMCONVERT:
 | 
					 | 
				
			||||||
        IMCONVERT = os.path.join(IMCONVERT, "convert.exe")
 | 
					 | 
				
			||||||
else:
 | 
					 | 
				
			||||||
    IMCONVERT = "convert"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class cached_property:
 | 
					 | 
				
			||||||
    def __init__(self, func):
 | 
					    def __init__(self, func):
 | 
				
			||||||
        self.func = func
 | 
					        self.func = func
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								Tests/images/16bit.r.tif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/200x32_p_bl_raw_origin.tga
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/balloon_eciRGBv2_aware.jp2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/bc5_snorm.dds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/bc5_typeless.dds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/bc5_unorm.dds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/bc5_unorm.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 94 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/bc5s.dds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/bc5s.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 82 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/bitmap_font_stroke_basic.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/bitmap_font_stroke_raqm.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/black_and_white.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 198 B  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/blp/blp1_jpeg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 56 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/broken_exif_dpi.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/comment_after_last_frame.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/crash-4fb027452e6988530aa5dabee76eecacb3b79f8a.j2k
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/crash-5762152299364352.fli
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/crash-7d4c83eb92150fb8f1653a697703ae06ae7c4998.j2k
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/crash-ccca68ff40171fdae983d924e127a721cab2bd50.j2k
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/crash-d2c93af851d3ab9a19e34503626368b2ecde9c03.j2k
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/cross_scan_line.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 71 B  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/cross_scan_line.tga
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/cross_scan_line_truncated.tga
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 Before Width: | Height: | Size: 58 B After Width: | Height: | Size: 198 B  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/decompression_bomb_extents.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 368 B  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/different_transparency.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/different_transparency_merged.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 333 B  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/dispose_bgnd_rgba.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/dispose_bgnd_transparency.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.5 KiB  | 
| 
		 Before Width: | Height: | Size: 17 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/dispose_none_load_end_second.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 27 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/dispose_prev_first_frame.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 530 B  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/dispose_prev_first_frame_seeked.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 208 B  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/duplicate_number_of_loops.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/dxt5-colorblock-alpha-issue-4142.dds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/exif_imagemagick_orientation.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 175 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/expected_to_read.jp2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/first_frame_transparency.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 972 B  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/hopper.dds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/hopper_16bit.pgm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										4
									
								
								Tests/images/hopper_16bit_plain.pgm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/hopper_1bit.pbm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										14
									
								
								Tests/images/hopper_1bit_plain.pbm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/hopper_8bit.pgm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										4
									
								
								Tests/images/hopper_8bit_plain.pgm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/hopper_8bit_plain.ppm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Tests/images/hopper_mask.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 262 B  | 
							
								
								
									
										
											BIN
										
									
								
								Tests/images/hopper_mask.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 208 B  |