From 3a53ef871a3701d038f9a1be0e53cfbb5c7ab16b Mon Sep 17 00:00:00 2001 From: Shrey139 Date: Fri, 2 Oct 2020 02:24:26 +0530 Subject: [PATCH] Added requirements.txt --- requirements.txt | 2 + venv/Lib/site-packages/PIL/BdfFontFile.py | 110 + venv/Lib/site-packages/PIL/BlpImagePlugin.py | 420 + venv/Lib/site-packages/PIL/BmpImagePlugin.py | 380 + .../site-packages/PIL/BufrStubImagePlugin.py | 73 + venv/Lib/site-packages/PIL/ContainerIO.py | 120 + venv/Lib/site-packages/PIL/CurImagePlugin.py | 74 + venv/Lib/site-packages/PIL/DcxImagePlugin.py | 89 + venv/Lib/site-packages/PIL/DdsImagePlugin.py | 178 + venv/Lib/site-packages/PIL/EpsImagePlugin.py | 419 + venv/Lib/site-packages/PIL/ExifTags.py | 318 + .../site-packages/PIL/FitsStubImagePlugin.py | 76 + venv/Lib/site-packages/PIL/FliImagePlugin.py | 169 + venv/Lib/site-packages/PIL/FontFile.py | 111 + venv/Lib/site-packages/PIL/FpxImagePlugin.py | 242 + venv/Lib/site-packages/PIL/FtexImagePlugin.py | 106 + venv/Lib/site-packages/PIL/GbrImagePlugin.py | 100 + venv/Lib/site-packages/PIL/GdImageFile.py | 89 + venv/Lib/site-packages/PIL/GifImagePlugin.py | 885 ++ .../Lib/site-packages/PIL/GimpGradientFile.py | 140 + venv/Lib/site-packages/PIL/GimpPaletteFile.py | 56 + .../site-packages/PIL/GribStubImagePlugin.py | 74 + .../site-packages/PIL/Hdf5StubImagePlugin.py | 73 + venv/Lib/site-packages/PIL/IcnsImagePlugin.py | 384 + venv/Lib/site-packages/PIL/IcoImagePlugin.py | 324 + venv/Lib/site-packages/PIL/ImImagePlugin.py | 377 + venv/Lib/site-packages/PIL/Image.py | 3462 +++++++ venv/Lib/site-packages/PIL/ImageChops.py | 328 + venv/Lib/site-packages/PIL/ImageCms.py | 990 ++ venv/Lib/site-packages/PIL/ImageColor.py | 300 + venv/Lib/site-packages/PIL/ImageDraw.py | 566 ++ venv/Lib/site-packages/PIL/ImageDraw2.py | 179 + venv/Lib/site-packages/PIL/ImageEnhance.py | 103 + venv/Lib/site-packages/PIL/ImageFile.py | 693 ++ venv/Lib/site-packages/PIL/ImageFilter.py | 535 ++ venv/Lib/site-packages/PIL/ImageFont.py | 860 ++ venv/Lib/site-packages/PIL/ImageGrab.py | 120 + venv/Lib/site-packages/PIL/ImageMath.py | 253 + venv/Lib/site-packages/PIL/ImageMode.py | 64 + venv/Lib/site-packages/PIL/ImageMorph.py | 245 + venv/Lib/site-packages/PIL/ImageOps.py | 551 ++ venv/Lib/site-packages/PIL/ImagePalette.py | 221 + venv/Lib/site-packages/PIL/ImagePath.py | 19 + venv/Lib/site-packages/PIL/ImageQt.py | 195 + venv/Lib/site-packages/PIL/ImageSequence.py | 75 + venv/Lib/site-packages/PIL/ImageShow.py | 238 + venv/Lib/site-packages/PIL/ImageStat.py | 147 + venv/Lib/site-packages/PIL/ImageTk.py | 300 + venv/Lib/site-packages/PIL/ImageTransform.py | 102 + venv/Lib/site-packages/PIL/ImageWin.py | 230 + venv/Lib/site-packages/PIL/ImtImagePlugin.py | 93 + venv/Lib/site-packages/PIL/IptcImagePlugin.py | 226 + .../site-packages/PIL/Jpeg2KImagePlugin.py | 314 + venv/Lib/site-packages/PIL/JpegImagePlugin.py | 809 ++ venv/Lib/site-packages/PIL/JpegPresets.py | 248 + .../site-packages/PIL/McIdasImagePlugin.py | 75 + venv/Lib/site-packages/PIL/MicImagePlugin.py | 107 + venv/Lib/site-packages/PIL/MpegImagePlugin.py | 83 + venv/Lib/site-packages/PIL/MpoImagePlugin.py | 134 + venv/Lib/site-packages/PIL/MspImagePlugin.py | 193 + venv/Lib/site-packages/PIL/PSDraw.py | 237 + venv/Lib/site-packages/PIL/PaletteFile.py | 53 + venv/Lib/site-packages/PIL/PalmImagePlugin.py | 226 + venv/Lib/site-packages/PIL/PcdImagePlugin.py | 64 + venv/Lib/site-packages/PIL/PcfFontFile.py | 244 + venv/Lib/site-packages/PIL/PcxImagePlugin.py | 206 + venv/Lib/site-packages/PIL/PdfImagePlugin.py | 243 + venv/Lib/site-packages/PIL/PdfParser.py | 995 ++ .../Lib/site-packages/PIL/PixarImagePlugin.py | 70 + venv/Lib/site-packages/PIL/PngImagePlugin.py | 1333 +++ venv/Lib/site-packages/PIL/PpmImagePlugin.py | 164 + venv/Lib/site-packages/PIL/PsdImagePlugin.py | 309 + venv/Lib/site-packages/PIL/PyAccess.py | 352 + venv/Lib/site-packages/PIL/SgiImagePlugin.py | 230 + .../site-packages/PIL/SpiderImagePlugin.py | 324 + venv/Lib/site-packages/PIL/SunImagePlugin.py | 136 + venv/Lib/site-packages/PIL/TarIO.py | 65 + venv/Lib/site-packages/PIL/TgaImagePlugin.py | 246 + venv/Lib/site-packages/PIL/TiffImagePlugin.py | 1891 ++++ venv/Lib/site-packages/PIL/TiffTags.py | 498 + venv/Lib/site-packages/PIL/WalImageFile.py | 126 + venv/Lib/site-packages/PIL/WebPImagePlugin.py | 351 + venv/Lib/site-packages/PIL/WmfImagePlugin.py | 175 + .../site-packages/PIL/XVThumbImagePlugin.py | 78 + venv/Lib/site-packages/PIL/XbmImagePlugin.py | 94 + venv/Lib/site-packages/PIL/XpmImagePlugin.py | 130 + venv/Lib/site-packages/PIL/__init__.py | 139 + venv/Lib/site-packages/PIL/__main__.py | 3 + .../__pycache__/BdfFontFile.cpython-37.pyc | Bin 0 -> 2471 bytes .../__pycache__/BlpImagePlugin.cpython-37.pyc | Bin 0 -> 10483 bytes .../__pycache__/BmpImagePlugin.cpython-37.pyc | Bin 0 -> 7123 bytes .../BufrStubImagePlugin.cpython-37.pyc | Bin 0 -> 1623 bytes .../__pycache__/ContainerIO.cpython-37.pyc | Bin 0 -> 2809 bytes .../__pycache__/CurImagePlugin.cpython-37.pyc | Bin 0 -> 1357 bytes .../__pycache__/DcxImagePlugin.cpython-37.pyc | Bin 0 -> 1791 bytes .../__pycache__/DdsImagePlugin.cpython-37.pyc | Bin 0 -> 4442 bytes .../__pycache__/EpsImagePlugin.cpython-37.pyc | Bin 0 -> 7483 bytes .../PIL/__pycache__/ExifTags.cpython-37.pyc | Bin 0 -> 7592 bytes .../FitsStubImagePlugin.cpython-37.pyc | Bin 0 -> 1611 bytes .../__pycache__/FliImagePlugin.cpython-37.pyc | Bin 0 -> 3684 bytes .../PIL/__pycache__/FontFile.cpython-37.pyc | Bin 0 -> 2302 bytes .../__pycache__/FpxImagePlugin.cpython-37.pyc | Bin 0 -> 3625 bytes .../FtexImagePlugin.cpython-37.pyc | Bin 0 -> 3458 bytes .../__pycache__/GbrImagePlugin.cpython-37.pyc | Bin 0 -> 1862 bytes .../__pycache__/GdImageFile.cpython-37.pyc | Bin 0 -> 2471 bytes .../__pycache__/GifImagePlugin.cpython-37.pyc | Bin 0 -> 16464 bytes .../GimpGradientFile.cpython-37.pyc | Bin 0 -> 3304 bytes .../GimpPaletteFile.cpython-37.pyc | Bin 0 -> 1371 bytes .../GribStubImagePlugin.cpython-37.pyc | Bin 0 -> 1665 bytes .../Hdf5StubImagePlugin.cpython-37.pyc | Bin 0 -> 1611 bytes .../IcnsImagePlugin.cpython-37.pyc | Bin 0 -> 9285 bytes .../__pycache__/IcoImagePlugin.cpython-37.pyc | Bin 0 -> 7054 bytes .../__pycache__/ImImagePlugin.cpython-37.pyc | Bin 0 -> 6801 bytes .../PIL/__pycache__/Image.cpython-37.pyc | Bin 0 -> 92790 bytes .../PIL/__pycache__/ImageChops.cpython-37.pyc | Bin 0 -> 7811 bytes .../PIL/__pycache__/ImageCms.cpython-37.pyc | Bin 0 -> 32131 bytes .../PIL/__pycache__/ImageColor.cpython-37.pyc | Bin 0 -> 6384 bytes .../PIL/__pycache__/ImageDraw.cpython-37.pyc | Bin 0 -> 12729 bytes .../PIL/__pycache__/ImageDraw2.cpython-37.pyc | Bin 0 -> 5559 bytes .../__pycache__/ImageEnhance.cpython-37.pyc | Bin 0 -> 3542 bytes .../PIL/__pycache__/ImageFile.cpython-37.pyc | Bin 0 -> 14249 bytes .../__pycache__/ImageFilter.cpython-37.pyc | Bin 0 -> 16567 bytes .../PIL/__pycache__/ImageFont.cpython-37.pyc | Bin 0 -> 32931 bytes .../PIL/__pycache__/ImageGrab.cpython-37.pyc | Bin 0 -> 2440 bytes .../PIL/__pycache__/ImageMath.cpython-37.pyc | Bin 0 -> 8143 bytes .../PIL/__pycache__/ImageMode.cpython-37.pyc | Bin 0 -> 1270 bytes .../PIL/__pycache__/ImageMorph.cpython-37.pyc | Bin 0 -> 7357 bytes .../PIL/__pycache__/ImageOps.cpython-37.pyc | Bin 0 -> 14441 bytes .../__pycache__/ImagePalette.cpython-37.pyc | Bin 0 -> 5513 bytes .../PIL/__pycache__/ImagePath.cpython-37.pyc | Bin 0 -> 226 bytes .../PIL/__pycache__/ImageQt.cpython-37.pyc | Bin 0 -> 4054 bytes .../__pycache__/ImageSequence.cpython-37.pyc | Bin 0 -> 2299 bytes .../PIL/__pycache__/ImageShow.cpython-37.pyc | Bin 0 -> 6642 bytes .../PIL/__pycache__/ImageStat.cpython-37.pyc | Bin 0 -> 3712 bytes .../PIL/__pycache__/ImageTk.cpython-37.pyc | Bin 0 -> 7741 bytes .../__pycache__/ImageTransform.cpython-37.pyc | Bin 0 -> 3477 bytes .../PIL/__pycache__/ImageWin.cpython-37.pyc | Bin 0 -> 8070 bytes .../__pycache__/ImtImagePlugin.cpython-37.pyc | Bin 0 -> 1224 bytes .../IptcImagePlugin.cpython-37.pyc | Bin 0 -> 4283 bytes .../Jpeg2KImagePlugin.cpython-37.pyc | Bin 0 -> 5874 bytes .../JpegImagePlugin.cpython-37.pyc | Bin 0 -> 16903 bytes .../__pycache__/JpegPresets.cpython-37.pyc | Bin 0 -> 5479 bytes .../McIdasImagePlugin.cpython-37.pyc | Bin 0 -> 1342 bytes .../__pycache__/MicImagePlugin.cpython-37.pyc | Bin 0 -> 2072 bytes .../MpegImagePlugin.cpython-37.pyc | Bin 0 -> 1910 bytes .../__pycache__/MpoImagePlugin.cpython-37.pyc | Bin 0 -> 3408 bytes .../__pycache__/MspImagePlugin.cpython-37.pyc | Bin 0 -> 3100 bytes .../PIL/__pycache__/PSDraw.cpython-37.pyc | Bin 0 -> 5781 bytes .../__pycache__/PaletteFile.cpython-37.pyc | Bin 0 -> 1341 bytes .../PalmImagePlugin.cpython-37.pyc | Bin 0 -> 7006 bytes .../__pycache__/PcdImagePlugin.cpython-37.pyc | Bin 0 -> 1192 bytes .../__pycache__/PcfFontFile.cpython-37.pyc | Bin 0 -> 5198 bytes .../__pycache__/PcxImagePlugin.cpython-37.pyc | Bin 0 -> 3570 bytes .../__pycache__/PdfImagePlugin.cpython-37.pyc | Bin 0 -> 3668 bytes .../PIL/__pycache__/PdfParser.cpython-37.pyc | Bin 0 -> 26154 bytes .../PixarImagePlugin.cpython-37.pyc | Bin 0 -> 1158 bytes .../__pycache__/PngImagePlugin.cpython-37.pyc | Bin 0 -> 28414 bytes .../__pycache__/PpmImagePlugin.cpython-37.pyc | Bin 0 -> 3016 bytes .../__pycache__/PsdImagePlugin.cpython-37.pyc | Bin 0 -> 4970 bytes .../PIL/__pycache__/PyAccess.cpython-37.pyc | Bin 0 -> 11227 bytes .../__pycache__/SgiImagePlugin.cpython-37.pyc | Bin 0 -> 3955 bytes .../SpiderImagePlugin.cpython-37.pyc | Bin 0 -> 6569 bytes .../__pycache__/SunImagePlugin.cpython-37.pyc | Bin 0 -> 1922 bytes .../PIL/__pycache__/TarIO.cpython-37.pyc | Bin 0 -> 1533 bytes .../__pycache__/TgaImagePlugin.cpython-37.pyc | Bin 0 -> 3725 bytes .../TiffImagePlugin.cpython-37.pyc | Bin 0 -> 46210 bytes .../PIL/__pycache__/TiffTags.cpython-37.pyc | Bin 0 -> 9399 bytes .../__pycache__/WalImageFile.cpython-37.pyc | Bin 0 -> 2546 bytes .../WebPImagePlugin.cpython-37.pyc | Bin 0 -> 6979 bytes .../__pycache__/WmfImagePlugin.cpython-37.pyc | Bin 0 -> 3423 bytes .../XVThumbImagePlugin.cpython-37.pyc | Bin 0 -> 1437 bytes .../__pycache__/XbmImagePlugin.cpython-37.pyc | Bin 0 -> 2022 bytes .../__pycache__/XpmImagePlugin.cpython-37.pyc | Bin 0 -> 2242 bytes .../PIL/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3902 bytes .../PIL/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 215 bytes .../PIL/__pycache__/_binary.cpython-37.pyc | Bin 0 -> 2446 bytes .../_tkinter_finder.cpython-37.pyc | Bin 0 -> 491 bytes .../PIL/__pycache__/_util.cpython-37.pyc | Bin 0 -> 1106 bytes .../PIL/__pycache__/_version.cpython-37.pyc | Bin 0 -> 188 bytes .../PIL/__pycache__/features.cpython-37.pyc | Bin 0 -> 8252 bytes venv/Lib/site-packages/PIL/_binary.py | 92 + .../PIL/_imaging.cp37-win_amd64.pyd | Bin 0 -> 2604032 bytes .../PIL/_imagingcms.cp37-win_amd64.pyd | Bin 0 -> 241152 bytes .../PIL/_imagingft.cp37-win_amd64.pyd | Bin 0 -> 620544 bytes .../PIL/_imagingmath.cp37-win_amd64.pyd | Bin 0 -> 24576 bytes .../PIL/_imagingmorph.cp37-win_amd64.pyd | Bin 0 -> 13312 bytes .../PIL/_imagingtk.cp37-win_amd64.pyd | Bin 0 -> 15360 bytes venv/Lib/site-packages/PIL/_tkinter_finder.py | 16 + venv/Lib/site-packages/PIL/_util.py | 30 + venv/Lib/site-packages/PIL/_version.py | 2 + .../PIL/_webp.cp37-win_amd64.pyd | Bin 0 -> 549376 bytes venv/Lib/site-packages/PIL/features.py | 309 + .../Pillow-7.2.0.dist-info/INSTALLER | 1 + .../Pillow-7.2.0.dist-info/LICENSE | 30 + .../Pillow-7.2.0.dist-info/METADATA | 135 + .../Pillow-7.2.0.dist-info/RECORD | 198 + .../Pillow-7.2.0.dist-info/WHEEL | 5 + .../Pillow-7.2.0.dist-info/top_level.txt | 1 + .../Pillow-7.2.0.dist-info/zip-safe | 1 + .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 309 bytes venv/Lib/site-packages/easy_install.py | 5 + .../pip-20.1.1.dist-info/INSTALLER | 1 + .../pip-20.1.1.dist-info/LICENSE.txt | 20 + .../pip-20.1.1.dist-info/METADATA | 87 + .../site-packages/pip-20.1.1.dist-info/RECORD | 743 ++ .../site-packages/pip-20.1.1.dist-info/WHEEL | 6 + .../pip-20.1.1.dist-info/entry_points.txt | 5 + .../pip-20.1.1.dist-info/top_level.txt | 1 + venv/Lib/site-packages/pip/__init__.py | 18 + venv/Lib/site-packages/pip/__main__.py | 26 + .../pip/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 653 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 501 bytes .../site-packages/pip/_internal/__init__.py | 17 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 702 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 0 -> 7332 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 9045 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 10706 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 12775 bytes .../__pycache__/locations.cpython-37.pyc | Bin 0 -> 4470 bytes .../_internal/__pycache__/main.cpython-37.pyc | Bin 0 -> 639 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 0 -> 3724 bytes .../self_outdated_check.cpython-37.pyc | Bin 0 -> 5433 bytes .../__pycache__/wheel_builder.cpython-37.pyc | Bin 0 -> 6707 bytes .../site-packages/pip/_internal/build_env.py | 219 + venv/Lib/site-packages/pip/_internal/cache.py | 349 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 264 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 0 -> 4960 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 0 -> 5659 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 0 -> 20406 bytes .../command_context.cpython-37.pyc | Bin 0 -> 1325 bytes .../cli/__pycache__/main.cpython-37.pyc | Bin 0 -> 1440 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 0 -> 2211 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 0 -> 8912 bytes .../__pycache__/progress_bars.cpython-37.pyc | Bin 0 -> 7645 bytes .../__pycache__/req_command.cpython-37.pyc | Bin 0 -> 9840 bytes .../cli/__pycache__/spinners.cpython-37.pyc | Bin 0 -> 4712 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 393 bytes .../pip/_internal/cli/autocompletion.py | 164 + .../pip/_internal/cli/base_command.py | 228 + .../pip/_internal/cli/cmdoptions.py | 962 ++ .../pip/_internal/cli/command_context.py | 36 + .../site-packages/pip/_internal/cli/main.py | 75 + .../pip/_internal/cli/main_parser.py | 99 + .../site-packages/pip/_internal/cli/parser.py | 266 + .../pip/_internal/cli/progress_bars.py | 277 + .../pip/_internal/cli/req_command.py | 408 + .../pip/_internal/cli/spinners.py | 173 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 122 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2924 bytes .../commands/__pycache__/cache.cpython-37.pyc | Bin 0 -> 4454 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 0 -> 1584 bytes .../__pycache__/completion.cpython-37.pyc | Bin 0 -> 3009 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 6525 bytes .../commands/__pycache__/debug.cpython-37.pyc | Bin 0 -> 6330 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 3876 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 2863 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 0 -> 2011 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 0 -> 1214 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 15814 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 0 -> 8304 bytes .../__pycache__/search.cpython-37.pyc | Bin 0 -> 4559 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 0 -> 6356 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 0 -> 2794 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 5052 bytes .../pip/_internal/commands/cache.py | 181 + .../pip/_internal/commands/check.py | 51 + .../pip/_internal/commands/completion.py | 95 + .../pip/_internal/commands/configuration.py | 233 + .../pip/_internal/commands/debug.py | 237 + .../pip/_internal/commands/download.py | 142 + .../pip/_internal/commands/freeze.py | 99 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/install.py | 691 ++ .../pip/_internal/commands/list.py | 299 + .../pip/_internal/commands/search.py | 146 + .../pip/_internal/commands/show.py | 180 + .../pip/_internal/commands/uninstall.py | 89 + .../pip/_internal/commands/wheel.py | 190 + .../pip/_internal/configuration.py | 426 + .../pip/_internal/distributions/__init__.py | 24 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 836 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 1936 bytes .../__pycache__/installed.cpython-37.pyc | Bin 0 -> 1222 bytes .../__pycache__/sdist.cpython-37.pyc | Bin 0 -> 3452 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 1558 bytes .../pip/_internal/distributions/base.py | 45 + .../pip/_internal/distributions/installed.py | 24 + .../pip/_internal/distributions/sdist.py | 104 + .../pip/_internal/distributions/wheel.py | 36 + .../site-packages/pip/_internal/exceptions.py | 308 + .../pip/_internal/index/__init__.py | 2 + .../index/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 218 bytes .../__pycache__/collector.cpython-37.pyc | Bin 0 -> 17364 bytes .../__pycache__/package_finder.cpython-37.pyc | Bin 0 -> 25550 bytes .../pip/_internal/index/collector.py | 661 ++ .../pip/_internal/index/package_finder.py | 1016 ++ .../site-packages/pip/_internal/locations.py | 194 + venv/Lib/site-packages/pip/_internal/main.py | 16 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 252 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 0 -> 1440 bytes .../__pycache__/direct_url.cpython-37.pyc | Bin 0 -> 6489 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 0 -> 2417 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 0 -> 1156 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 0 -> 7027 bytes .../models/__pycache__/scheme.cpython-37.pyc | Bin 0 -> 882 bytes .../__pycache__/search_scope.cpython-37.pyc | Bin 0 -> 3382 bytes .../selection_prefs.cpython-37.pyc | Bin 0 -> 1614 bytes .../__pycache__/target_python.cpython-37.pyc | Bin 0 -> 3239 bytes .../models/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 3186 bytes .../pip/_internal/models/candidate.py | 36 + .../pip/_internal/models/direct_url.py | 245 + .../pip/_internal/models/format_control.py | 84 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 236 + .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 133 + .../pip/_internal/models/selection_prefs.py | 47 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 78 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 240 bytes .../network/__pycache__/auth.cpython-37.pyc | Bin 0 -> 6965 bytes .../network/__pycache__/cache.cpython-37.pyc | Bin 0 -> 2661 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 4339 bytes .../__pycache__/session.cpython-37.pyc | Bin 0 -> 9185 bytes .../network/__pycache__/utils.cpython-37.pyc | Bin 0 -> 738 bytes .../network/__pycache__/xmlrpc.cpython-37.pyc | Bin 0 -> 1580 bytes .../pip/_internal/network/auth.py | 298 + .../pip/_internal/network/cache.py | 81 + .../pip/_internal/network/download.py | 200 + .../pip/_internal/network/session.py | 421 + .../pip/_internal/network/utils.py | 48 + .../pip/_internal/network/xmlrpc.py | 44 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 188 bytes .../__pycache__/check.cpython-37.pyc | Bin 0 -> 3674 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 5843 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 0 -> 10765 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 194 bytes .../build/__pycache__/metadata.cpython-37.pyc | Bin 0 -> 1227 bytes .../metadata_legacy.cpython-37.pyc | Bin 0 -> 1941 bytes .../build/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 1322 bytes .../__pycache__/wheel_legacy.cpython-37.pyc | Bin 0 -> 2552 bytes .../_internal/operations/build/metadata.py | 40 + .../operations/build/metadata_legacy.py | 77 + .../pip/_internal/operations/build/wheel.py | 46 + .../operations/build/wheel_legacy.py | 115 + .../pip/_internal/operations/check.py | 163 + .../pip/_internal/operations/freeze.py | 272 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 252 bytes .../editable_legacy.cpython-37.pyc | Bin 0 -> 1322 bytes .../install/__pycache__/legacy.cpython-37.pyc | Bin 0 -> 3310 bytes .../install/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 14946 bytes .../operations/install/editable_legacy.py | 52 + .../_internal/operations/install/legacy.py | 142 + .../pip/_internal/operations/install/wheel.py | 631 ++ .../pip/_internal/operations/prepare.py | 568 ++ .../site-packages/pip/_internal/pyproject.py | 196 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2185 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 0 -> 10736 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 0 -> 12762 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 0 -> 20203 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 0 -> 5776 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 0 -> 4047 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 0 -> 17374 bytes .../pip/_internal/req/constructors.py | 464 + .../pip/_internal/req/req_file.py | 582 ++ .../pip/_internal/req/req_install.py | 850 ++ .../pip/_internal/req/req_set.py | 202 + .../pip/_internal/req/req_tracker.py | 151 + .../pip/_internal/req/req_uninstall.py | 649 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 188 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 1006 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 195 bytes .../__pycache__/resolver.cpython-37.pyc | Bin 0 -> 11151 bytes .../_internal/resolution/legacy/resolver.py | 459 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 199 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 2311 bytes .../__pycache__/candidates.cpython-37.pyc | Bin 0 -> 13359 bytes .../__pycache__/factory.cpython-37.pyc | Bin 0 -> 5189 bytes .../__pycache__/provider.cpython-37.pyc | Bin 0 -> 1899 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 4275 bytes .../__pycache__/resolver.cpython-37.pyc | Bin 0 -> 5481 bytes .../_internal/resolution/resolvelib/base.py | 52 + .../resolution/resolvelib/candidates.py | 450 + .../resolution/resolvelib/factory.py | 201 + .../resolution/resolvelib/provider.py | 54 + .../resolution/resolvelib/requirements.py | 119 + .../resolution/resolvelib/resolver.py | 174 + .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 183 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 1361 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 0 -> 6107 bytes .../compatibility_tags.cpython-37.pyc | Bin 0 -> 3579 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 0 -> 2800 bytes .../direct_url_helpers.cpython-37.pyc | Bin 0 -> 2664 bytes .../__pycache__/distutils_args.cpython-37.pyc | Bin 0 -> 1165 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1267 bytes .../__pycache__/entrypoints.cpython-37.pyc | Bin 0 -> 1321 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 5557 bytes .../__pycache__/filetypes.cpython-37.pyc | Bin 0 -> 582 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1714 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 0 -> 4135 bytes .../inject_securetransport.cpython-37.pyc | Bin 0 -> 952 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 0 -> 9174 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 0 -> 24051 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 0 -> 1931 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 0 -> 2618 bytes .../__pycache__/pkg_resources.cpython-37.pyc | Bin 0 -> 1831 bytes .../setuptools_build.cpython-37.pyc | Bin 0 -> 2944 bytes .../__pycache__/subprocess.cpython-37.pyc | Bin 0 -> 5553 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 7027 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 0 -> 1461 bytes .../__pycache__/unpacking.cpython-37.pyc | Bin 0 -> 6009 bytes .../utils/__pycache__/urls.cpython-37.pyc | Bin 0 -> 1517 bytes .../__pycache__/virtualenv.cpython-37.pyc | Bin 0 -> 3258 bytes .../utils/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 6289 bytes .../pip/_internal/utils/appdirs.py | 44 + .../pip/_internal/utils/compat.py | 270 + .../pip/_internal/utils/compatibility_tags.py | 169 + .../pip/_internal/utils/deprecation.py | 104 + .../pip/_internal/utils/direct_url_helpers.py | 130 + .../pip/_internal/utils/distutils_args.py | 48 + .../pip/_internal/utils/encoding.py | 42 + .../pip/_internal/utils/entrypoints.py | 31 + .../pip/_internal/utils/filesystem.py | 222 + .../pip/_internal/utils/filetypes.py | 16 + .../pip/_internal/utils/glibc.py | 98 + .../pip/_internal/utils/hashes.py | 133 + .../_internal/utils/inject_securetransport.py | 36 + .../pip/_internal/utils/logging.py | 399 + .../site-packages/pip/_internal/utils/misc.py | 913 ++ .../pip/_internal/utils/models.py | 42 + .../pip/_internal/utils/packaging.py | 94 + .../pip/_internal/utils/pkg_resources.py | 44 + .../pip/_internal/utils/setuptools_build.py | 181 + .../pip/_internal/utils/subprocess.py | 277 + .../pip/_internal/utils/temp_dir.py | 271 + .../pip/_internal/utils/typing.py | 38 + .../pip/_internal/utils/unpacking.py | 272 + .../site-packages/pip/_internal/utils/urls.py | 55 + .../pip/_internal/utils/virtualenv.py | 116 + .../pip/_internal/utils/wheel.py | 225 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 476 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 0 -> 3713 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 0 -> 9561 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 0 -> 5034 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 0 -> 8458 bytes .../__pycache__/versioncontrol.cpython-37.pyc | Bin 0 -> 19540 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 120 + .../site-packages/pip/_internal/vcs/git.py | 394 + .../pip/_internal/vcs/mercurial.py | 161 + .../pip/_internal/vcs/subversion.py | 334 + .../pip/_internal/vcs/versioncontrol.py | 723 ++ .../pip/_internal/wheel_builder.py | 309 + .../Lib/site-packages/pip/_vendor/__init__.py | 114 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2959 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 21399 bytes .../__pycache__/contextlib2.cpython-37.pyc | Bin 0 -> 15358 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 0 -> 36624 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 0 -> 66447 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 242488 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 0 -> 8081 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 26879 bytes .../_vendor/__pycache__/toml.cpython-37.pyc | Bin 0 -> 22139 bytes venv/Lib/site-packages/pip/_vendor/appdirs.py | 633 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 541 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 0 -> 1544 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 0 -> 3035 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 1757 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 748 bytes .../__pycache__/controller.cpython-37.pyc | Bin 0 -> 7718 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 0 -> 2145 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 0 -> 4665 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 0 -> 4218 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 0 -> 657 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 285 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 0 -> 3195 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 0 -> 1541 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 376 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 188 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 269 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 444 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 0 -> 908 bytes .../pip/_vendor/certifi/cacert.pem | 4641 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 30 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 835 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 0 -> 27170 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 0 -> 1111 bytes .../chardistribution.cpython-37.pyc | Bin 0 -> 6297 bytes .../charsetgroupprober.cpython-37.pyc | Bin 0 -> 2218 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 0 -> 3428 bytes .../codingstatemachine.cpython-37.pyc | Bin 0 -> 2875 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 0 -> 346 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 0 -> 1118 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 0 -> 2609 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 0 -> 2596 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 0 -> 7057 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 0 -> 2404 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 0 -> 12054 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 0 -> 1119 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 0 -> 27174 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 0 -> 1119 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 0 -> 19098 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 0 -> 1127 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 0 -> 2961 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 0 -> 22126 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 0 -> 38005 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 0 -> 23619 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 0 -> 29075 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 0 -> 23577 bytes .../langhebrewmodel.cpython-37.pyc | Bin 0 -> 22206 bytes .../langhungarianmodel.cpython-37.pyc | Bin 0 -> 23608 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 0 -> 22185 bytes .../langturkishmodel.cpython-37.pyc | Bin 0 -> 22208 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 0 -> 2918 bytes .../mbcharsetprober.cpython-37.pyc | Bin 0 -> 2223 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 0 -> 1114 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 0 -> 15669 bytes .../sbcharsetprober.cpython-37.pyc | Bin 0 -> 2976 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 0 -> 1604 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 0 -> 2430 bytes .../universaldetector.cpython-37.pyc | Bin 0 -> 5820 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 0 -> 1961 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 430 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 187 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 0 -> 2676 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 435 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 0 -> 3333 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 0 -> 7589 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 0 -> 1654 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 0 -> 3848 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 0 -> 4596 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../site-packages/pip/_vendor/contextlib2.py | 518 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1033 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 0 -> 32043 bytes .../__pycache__/database.cpython-37.pyc | Bin 0 -> 42582 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 0 -> 17322 bytes .../__pycache__/locators.cpython-37.pyc | Bin 0 -> 38800 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 0 -> 10281 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 4467 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 0 -> 27682 bytes .../__pycache__/resources.cpython-37.pyc | Bin 0 -> 10877 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 0 -> 10756 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 0 -> 48010 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 20417 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 25618 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 475 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 0 -> 1072 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 21388 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 0 -> 15881 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 62718 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 786 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++++ .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/locators.py | 1302 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1096 +++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 416 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 96768 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 105984 bytes .../site-packages/pip/_vendor/distlib/util.py | 1761 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 90112 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel.py | 1004 ++ venv/Lib/site-packages/pip/_vendor/distro.py | 1230 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1304 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 0 -> 13751 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 0 -> 22642 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 0 -> 41543 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 0 -> 3296 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 66208 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 0 -> 97805 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 0 -> 10821 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1721 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 417 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 0 -> 1574 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 0 -> 2019 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 0 -> 2222 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 192 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 0 -> 1308 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 0 -> 842 bytes .../inject_meta_charset.cpython-37.pyc | Bin 0 -> 1862 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 0 -> 2626 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 0 -> 2753 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 0 -> 16428 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 0 -> 1346 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 931 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1528 bytes .../__pycache__/sax.cpython-37.pyc | Bin 0 -> 1478 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3312 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 11235 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 9339 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 11844 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 11784 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3989 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 6985 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 1714 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 3521 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 6630 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1888 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 249 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 0 -> 3056 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 0 -> 609 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 0 -> 9133 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 0 -> 21591 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 0 -> 1789 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 0 -> 203 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 0 -> 178631 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 398 + .../pip/_vendor/idna/idnadata.py | 1991 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8317 +++++++++++++++++ .../site-packages/pip/_vendor/ipaddress.py | 2420 +++++ .../pip/_vendor/msgpack/__init__.py | 54 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1384 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 210 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 1858 bytes .../msgpack/__pycache__/ext.cpython-37.pyc | Bin 0 -> 6183 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 0 -> 25896 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 191 + .../pip/_vendor/msgpack/fallback.py | 1063 +++ .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 723 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 561 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1142 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2961 bytes .../__pycache__/_typing.cpython-37.pyc | Bin 0 -> 1476 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 9266 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 4065 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 20276 bytes .../packaging/__pycache__/tags.cpython-37.pyc | Bin 0 -> 16738 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 1540 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 13140 bytes .../pip/_vendor/packaging/_compat.py | 38 + .../pip/_vendor/packaging/_structures.py | 86 + .../pip/_vendor/packaging/_typing.py | 39 + .../pip/_vendor/packaging/markers.py | 328 + .../pip/_vendor/packaging/requirements.py | 145 + .../pip/_vendor/packaging/specifiers.py | 849 ++ .../pip/_vendor/packaging/tags.py | 739 ++ .../pip/_vendor/packaging/utils.py | 62 + .../pip/_vendor/packaging/version.py | 535 ++ .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 274 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 0 -> 8238 bytes .../pep517/__pycache__/build.cpython-37.pyc | Bin 0 -> 3363 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 0 -> 4851 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 0 -> 2906 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 0 -> 1055 bytes .../__pycache__/dirtools.cpython-37.pyc | Bin 0 -> 1319 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 0 -> 4352 bytes .../pep517/__pycache__/meta.cpython-37.pyc | Bin 0 -> 2806 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 10476 bytes .../pip/_vendor/pep517/_in_process.py | 280 + .../site-packages/pip/_vendor/pep517/build.py | 124 + .../site-packages/pip/_vendor/pep517/check.py | 203 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 34 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 167 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 308 + .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 99734 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 634 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 5550 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 0 -> 2642 bytes .../__pycache__/counter.cpython-37.pyc | Bin 0 -> 1454 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 0 -> 1419 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/spinner.py | 43 + .../site-packages/pip/_vendor/pyparsing.py | 7107 ++++++++++++++ .../pip/_vendor/requests/__init__.py | 133 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3485 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 0 -> 547 bytes .../_internal_utils.cpython-37.pyc | Bin 0 -> 1300 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 0 -> 16877 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 0 -> 6729 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 0 -> 8344 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 0 -> 625 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 1604 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 0 -> 18779 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5497 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 0 -> 2678 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 972 bytes .../__pycache__/models.cpython-37.pyc | Bin 0 -> 24112 bytes .../__pycache__/packages.cpython-37.pyc | Bin 0 -> 502 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 19419 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 4217 bytes .../__pycache__/structures.cpython-37.pyc | Bin 0 -> 4401 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 0 -> 22165 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 ++ .../site-packages/pip/_vendor/requests/api.py | 161 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 76 + .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 954 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 767 ++ .../pip/_vendor/requests/status_codes.py | 123 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 982 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 630 bytes .../__pycache__/providers.cpython-37.pyc | Bin 0 -> 5775 bytes .../__pycache__/reporters.cpython-37.pyc | Bin 0 -> 1996 bytes .../__pycache__/resolvers.cpython-37.pyc | Bin 0 -> 14173 bytes .../__pycache__/structs.cpython-37.pyc | Bin 0 -> 3095 bytes .../pip/_vendor/resolvelib/providers.py | 121 + .../pip/_vendor/resolvelib/reporters.py | 36 + .../pip/_vendor/resolvelib/resolvers.py | 414 + .../pip/_vendor/resolvelib/structs.py | 68 + .../Lib/site-packages/pip/_vendor/retrying.py | 267 + venv/Lib/site-packages/pip/_vendor/six.py | 980 ++ venv/Lib/site-packages/pip/_vendor/toml.py | 1039 ++ .../pip/_vendor/toml/__init__.py | 21 + .../toml/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 598 bytes .../toml/__pycache__/decoder.cpython-37.pyc | Bin 0 -> 19754 bytes .../toml/__pycache__/encoder.cpython-37.pyc | Bin 0 -> 6873 bytes .../toml/__pycache__/ordered.cpython-37.pyc | Bin 0 -> 999 bytes .../toml/__pycache__/tz.cpython-37.pyc | Bin 0 -> 1107 bytes .../site-packages/pip/_vendor/toml/decoder.py | 945 ++ .../site-packages/pip/_vendor/toml/encoder.py | 250 + .../site-packages/pip/_vendor/toml/ordered.py | 15 + venv/Lib/site-packages/pip/_vendor/toml/tz.py | 21 + .../pip/_vendor/urllib3/__init__.py | 86 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2105 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 0 -> 10675 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 10016 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 0 -> 24089 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 10392 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 0 -> 8086 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 0 -> 2752 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 0 -> 12848 bytes .../__pycache__/request.cpython-37.pyc | Bin 0 -> 5584 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 20181 bytes .../pip/_vendor/urllib3/_collections.py | 336 + .../pip/_vendor/urllib3/connection.py | 414 + .../pip/_vendor/urllib3/connectionpool.py | 1051 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 191 bytes .../_appengine_environ.cpython-37.pyc | Bin 0 -> 1400 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 0 -> 8172 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 0 -> 3237 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 0 -> 14802 bytes .../securetransport.cpython-37.pyc | Bin 0 -> 19680 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 0 -> 5507 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 208 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 0 -> 10155 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 0 -> 7452 bytes .../contrib/_securetransport/bindings.py | 493 + .../contrib/_securetransport/low_level.py | 328 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 121 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 498 + .../urllib3/contrib/securetransport.py | 859 ++ .../pip/_vendor/urllib3/contrib/socks.py | 210 + .../pip/_vendor/urllib3/exceptions.py | 255 + .../pip/_vendor/urllib3/fields.py | 273 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 305 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 0 -> 26448 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 202 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 0 -> 1292 bytes .../urllib3/packages/backports/makefile.py | 52 + .../pip/_vendor/urllib3/packages/six.py | 1021 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 546 bytes .../_implementation.cpython-37.pyc | Bin 0 -> 3309 bytes .../ssl_match_hostname/_implementation.py | 160 + .../pip/_vendor/urllib3/poolmanager.py | 470 + .../pip/_vendor/urllib3/request.py | 171 + .../pip/_vendor/urllib3/response.py | 809 ++ .../pip/_vendor/urllib3/util/__init__.py | 46 + .../util/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1011 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 3160 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 0 -> 1032 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 0 -> 3326 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 0 -> 1959 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 0 -> 12880 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 0 -> 9757 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 0 -> 8819 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 0 -> 10600 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 0 -> 3124 bytes .../pip/_vendor/urllib3/util/connection.py | 138 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 135 + .../pip/_vendor/urllib3/util/response.py | 86 + .../pip/_vendor/urllib3/util/retry.py | 450 + .../pip/_vendor/urllib3/util/ssl_.py | 407 + .../pip/_vendor/urllib3/util/timeout.py | 258 + .../pip/_vendor/urllib3/util/url.py | 430 + .../pip/_vendor/urllib3/util/wait.py | 153 + venv/Lib/site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9667 bytes .../__pycache__/labels.cpython-37.pyc | Bin 0 -> 4081 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 0 -> 1903 bytes .../__pycache__/tests.cpython-37.pyc | Bin 0 -> 5044 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 0 -> 2656 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3307 +++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 100027 bytes .../__pycache__/py2_warn.cpython-37.pyc | Bin 0 -> 631 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 622 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 185 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20673 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203028 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24386 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 721 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 559 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1011 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2863 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8871 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3876 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19789 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 490 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10556 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 66 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2352 bytes .../site-packages/pkg_resources/py2_warn.py | 16 + .../site-packages/pkg_resources/py31compat.py | 23 + .../setuptools-47.1.0.dist-info/INSTALLER | 1 + .../setuptools-47.1.0.dist-info/LICENSE | 19 + .../setuptools-47.1.0.dist-info/METADATA | 109 + .../setuptools-47.1.0.dist-info/RECORD | 196 + .../setuptools-47.1.0.dist-info/WHEEL | 5 + .../dependency_links.txt | 2 + .../entry_points.txt | 68 + .../setuptools-47.1.0.dist-info/top_level.txt | 3 + .../setuptools-47.1.0.dist-info/zip-safe | 1 + venv/Lib/site-packages/setuptools/__init__.py | 232 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 7848 bytes .../_deprecation_warning.cpython-37.pyc | Bin 0 -> 540 bytes .../__pycache__/_imp.cpython-37.pyc | Bin 0 -> 2078 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 0 -> 5123 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 0 -> 8528 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 19168 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 0 -> 849 bytes .../__pycache__/depends.cpython-37.pyc | Bin 0 -> 5166 bytes .../__pycache__/dist.cpython-37.pyc | Bin 0 -> 32951 bytes .../__pycache__/errors.cpython-37.pyc | Bin 0 -> 840 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 1967 bytes .../__pycache__/glob.cpython-37.pyc | Bin 0 -> 3742 bytes .../__pycache__/installer.cpython-37.pyc | Bin 0 -> 4060 bytes .../__pycache__/launch.cpython-37.pyc | Bin 0 -> 846 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 0 -> 2724 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 0 -> 4626 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 0 -> 43009 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 0 -> 3604 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 0 -> 32790 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 0 -> 1756 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 1201 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 0 -> 1428 bytes .../__pycache__/py34compat.cpython-37.pyc | Bin 0 -> 474 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 15530 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 0 -> 1496 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 0 -> 6794 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 0 -> 1161 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 320 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 7205 bytes .../windows_support.cpython-37.pyc | Bin 0 -> 1003 bytes .../setuptools/_deprecation_warning.py | 7 + venv/Lib/site-packages/setuptools/_imp.py | 82 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 182 bytes .../__pycache__/ordered_set.cpython-37.pyc | Bin 0 -> 16402 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203025 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24383 bytes .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 730 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 568 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1008 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2860 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8905 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3993 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19758 bytes .../packaging/__pycache__/tags.cpython-37.pyc | Bin 0 -> 10807 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 1446 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 11950 bytes .../setuptools/_vendor/packaging/_compat.py | 31 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 296 + .../_vendor/packaging/requirements.py | 138 + .../_vendor/packaging/specifiers.py | 749 ++ .../setuptools/_vendor/packaging/tags.py | 404 + .../setuptools/_vendor/packaging/utils.py | 57 + .../setuptools/_vendor/packaging/version.py | 420 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 175 + .../site-packages/setuptools/build_meta.py | 272 + venv/Lib/site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes venv/Lib/site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes venv/Lib/site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 17 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 704 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 0 -> 2396 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 0 -> 14351 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 0 -> 1775 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 0 -> 1195 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 0 -> 2438 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 0 -> 9747 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 0 -> 8771 bytes .../__pycache__/develop.cpython-37.pyc | Bin 0 -> 6456 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 0 -> 1371 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 64920 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 0 -> 21623 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 4028 bytes .../install_egg_info.cpython-37.pyc | Bin 0 -> 2404 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 0 -> 4100 bytes .../install_scripts.cpython-37.pyc | Bin 0 -> 2334 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 4616 bytes .../__pycache__/register.cpython-37.pyc | Bin 0 -> 829 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 0 -> 2522 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 0 -> 917 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 0 -> 7822 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 0 -> 4515 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 0 -> 8405 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 0 -> 802 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 0 -> 6123 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 509 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 30 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 330 + .../setuptools/command/build_py.py | 276 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2354 +++++ .../setuptools/command/egg_info.py | 721 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 68 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 252 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 280 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 206 + venv/Lib/site-packages/setuptools/config.py | 700 ++ venv/Lib/site-packages/setuptools/dep_util.py | 25 + venv/Lib/site-packages/setuptools/depends.py | 176 + venv/Lib/site-packages/setuptools/dist.py | 1031 ++ venv/Lib/site-packages/setuptools/errors.py | 16 + .../Lib/site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 66 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2375 bytes venv/Lib/site-packages/setuptools/glob.py | 174 + venv/Lib/site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes venv/Lib/site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes venv/Lib/site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/installer.py | 150 + venv/Lib/site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 71 + venv/Lib/site-packages/setuptools/monkey.py | 179 + venv/Lib/site-packages/setuptools/msvc.py | 1825 ++++ .../site-packages/setuptools/namespaces.py | 111 + .../site-packages/setuptools/package_index.py | 1140 +++ .../site-packages/setuptools/py27compat.py | 60 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 59 + .../site-packages/setuptools/py34compat.py | 13 + venv/Lib/site-packages/setuptools/sandbox.py | 492 + .../setuptools/script (dev).tmpl | 6 + venv/Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 76 + .../site-packages/setuptools/ssl_support.py | 265 + .../site-packages/setuptools/unicode_utils.py | 44 + venv/Lib/site-packages/setuptools/version.py | 6 + venv/Lib/site-packages/setuptools/wheel.py | 217 + .../setuptools/windows_support.py | 29 + .../tornado-6.0.4.dist-info/INSTALLER | 1 + .../tornado-6.0.4.dist-info/LICENSE | 202 + .../tornado-6.0.4.dist-info/METADATA | 69 + .../tornado-6.0.4.dist-info/RECORD | 177 + .../tornado-6.0.4.dist-info/WHEEL | 5 + .../tornado-6.0.4.dist-info/top_level.txt | 1 + venv/Lib/site-packages/tornado/__init__.py | 26 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 280 bytes .../__pycache__/_locale_data.cpython-37.pyc | Bin 0 -> 2892 bytes .../tornado/__pycache__/auth.cpython-37.pyc | Bin 0 -> 38808 bytes .../__pycache__/autoreload.cpython-37.pyc | Bin 0 -> 7678 bytes .../__pycache__/concurrent.cpython-37.pyc | Bin 0 -> 8001 bytes .../curl_httpclient.cpython-37.pyc | Bin 0 -> 13615 bytes .../tornado/__pycache__/escape.cpython-37.pyc | Bin 0 -> 10541 bytes .../tornado/__pycache__/gen.cpython-37.pyc | Bin 0 -> 25340 bytes .../http1connection.cpython-37.pyc | Bin 0 -> 21469 bytes .../__pycache__/httpclient.cpython-37.pyc | Bin 0 -> 27830 bytes .../__pycache__/httpserver.cpython-37.pyc | Bin 0 -> 13388 bytes .../__pycache__/httputil.cpython-37.pyc | Bin 0 -> 32572 bytes .../tornado/__pycache__/ioloop.cpython-37.pyc | Bin 0 -> 31273 bytes .../__pycache__/iostream.cpython-37.pyc | Bin 0 -> 45843 bytes .../tornado/__pycache__/locale.cpython-37.pyc | Bin 0 -> 16124 bytes .../tornado/__pycache__/locks.cpython-37.pyc | Bin 0 -> 18654 bytes .../tornado/__pycache__/log.cpython-37.pyc | Bin 0 -> 8269 bytes .../__pycache__/netutil.cpython-37.pyc | Bin 0 -> 17552 bytes .../__pycache__/options.cpython-37.pyc | Bin 0 -> 23306 bytes .../__pycache__/process.cpython-37.pyc | Bin 0 -> 10588 bytes .../tornado/__pycache__/queues.cpython-37.pyc | Bin 0 -> 13201 bytes .../__pycache__/routing.cpython-37.pyc | Bin 0 -> 24118 bytes .../simple_httpclient.cpython-37.pyc | Bin 0 -> 18574 bytes .../__pycache__/tcpclient.cpython-37.pyc | Bin 0 -> 9052 bytes .../__pycache__/tcpserver.cpython-37.pyc | Bin 0 -> 10776 bytes .../__pycache__/template.cpython-37.pyc | Bin 0 -> 34076 bytes .../__pycache__/testing.cpython-37.pyc | Bin 0 -> 25909 bytes .../tornado/__pycache__/util.cpython-37.pyc | Bin 0 -> 14396 bytes .../tornado/__pycache__/web.cpython-37.pyc | Bin 0 -> 113278 bytes .../__pycache__/websocket.cpython-37.pyc | Bin 0 -> 51370 bytes .../tornado/__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 6427 bytes .../Lib/site-packages/tornado/_locale_data.py | 82 + venv/Lib/site-packages/tornado/auth.py | 1182 +++ venv/Lib/site-packages/tornado/autoreload.py | 364 + venv/Lib/site-packages/tornado/concurrent.py | 264 + .../site-packages/tornado/curl_httpclient.py | 572 ++ venv/Lib/site-packages/tornado/escape.py | 400 + venv/Lib/site-packages/tornado/gen.py | 845 ++ .../site-packages/tornado/http1connection.py | 836 ++ venv/Lib/site-packages/tornado/httpclient.py | 781 ++ venv/Lib/site-packages/tornado/httpserver.py | 398 + venv/Lib/site-packages/tornado/httputil.py | 1144 +++ venv/Lib/site-packages/tornado/ioloop.py | 946 ++ venv/Lib/site-packages/tornado/iostream.py | 1681 ++++ venv/Lib/site-packages/tornado/locale.py | 564 ++ venv/Lib/site-packages/tornado/locks.py | 570 ++ venv/Lib/site-packages/tornado/log.py | 336 + venv/Lib/site-packages/tornado/netutil.py | 614 ++ venv/Lib/site-packages/tornado/options.py | 726 ++ .../tornado/platform/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 180 bytes .../__pycache__/asyncio.cpython-37.pyc | Bin 0 -> 10925 bytes .../platform/__pycache__/auto.cpython-37.pyc | Bin 0 -> 672 bytes .../__pycache__/caresresolver.cpython-37.pyc | Bin 0 -> 3253 bytes .../__pycache__/interface.cpython-37.pyc | Bin 0 -> 665 bytes .../platform/__pycache__/posix.cpython-37.pyc | Bin 0 -> 690 bytes .../__pycache__/twisted.cpython-37.pyc | Bin 0 -> 3891 bytes .../__pycache__/windows.cpython-37.pyc | Bin 0 -> 598 bytes .../site-packages/tornado/platform/asyncio.py | 346 + .../site-packages/tornado/platform/auto.py | 32 + .../tornado/platform/caresresolver.py | 89 + .../tornado/platform/interface.py | 26 + .../site-packages/tornado/platform/posix.py | 29 + .../site-packages/tornado/platform/twisted.py | 131 + .../site-packages/tornado/platform/windows.py | 22 + venv/Lib/site-packages/tornado/process.py | 373 + venv/Lib/site-packages/tornado/py.typed | 0 venv/Lib/site-packages/tornado/queues.py | 410 + venv/Lib/site-packages/tornado/routing.py | 711 ++ .../tornado/simple_httpclient.py | 692 ++ .../tornado/speedups.cp37-win_amd64.pyd | Bin 0 -> 11264 bytes venv/Lib/site-packages/tornado/tcpclient.py | 334 + venv/Lib/site-packages/tornado/tcpserver.py | 330 + venv/Lib/site-packages/tornado/template.py | 1043 +++ .../site-packages/tornado/test/__init__.py | 8 + .../site-packages/tornado/test/__main__.py | 12 + .../test/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 334 bytes .../test/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 342 bytes .../__pycache__/asyncio_test.cpython-37.pyc | Bin 0 -> 6713 bytes .../test/__pycache__/auth_test.cpython-37.pyc | Bin 0 -> 22722 bytes .../autoreload_test.cpython-37.pyc | Bin 0 -> 3208 bytes .../concurrent_test.cpython-37.pyc | Bin 0 -> 8482 bytes .../curl_httpclient_test.cpython-37.pyc | Bin 0 -> 4938 bytes .../__pycache__/escape_test.cpython-37.pyc | Bin 0 -> 9547 bytes .../test/__pycache__/gen_test.cpython-37.pyc | Bin 0 -> 38305 bytes .../http1connection_test.cpython-37.pyc | Bin 0 -> 2859 bytes .../httpclient_test.cpython-37.pyc | Bin 0 -> 28597 bytes .../httpserver_test.cpython-37.pyc | Bin 0 -> 54591 bytes .../__pycache__/httputil_test.cpython-37.pyc | Bin 0 -> 17797 bytes .../__pycache__/import_test.cpython-37.pyc | Bin 0 -> 2032 bytes .../__pycache__/ioloop_test.cpython-37.pyc | Bin 0 -> 27608 bytes .../__pycache__/iostream_test.cpython-37.pyc | Bin 0 -> 44220 bytes .../__pycache__/locale_test.cpython-37.pyc | Bin 0 -> 5295 bytes .../__pycache__/locks_test.cpython-37.pyc | Bin 0 -> 17294 bytes .../test/__pycache__/log_test.cpython-37.pyc | Bin 0 -> 8362 bytes .../__pycache__/netutil_test.cpython-37.pyc | Bin 0 -> 8578 bytes .../__pycache__/options_test.cpython-37.pyc | Bin 0 -> 10802 bytes .../__pycache__/process_test.cpython-37.pyc | Bin 0 -> 8079 bytes .../__pycache__/queues_test.cpython-37.pyc | Bin 0 -> 14363 bytes .../resolve_test_helper.cpython-37.pyc | Bin 0 -> 462 bytes .../__pycache__/routing_test.cpython-37.pyc | Bin 0 -> 10608 bytes .../test/__pycache__/runtests.cpython-37.pyc | Bin 0 -> 6699 bytes .../simple_httpclient_test.cpython-37.pyc | Bin 0 -> 39325 bytes .../__pycache__/tcpclient_test.cpython-37.pyc | Bin 0 -> 16548 bytes .../__pycache__/tcpserver_test.cpython-37.pyc | Bin 0 -> 6826 bytes .../__pycache__/template_test.cpython-37.pyc | Bin 0 -> 19364 bytes .../__pycache__/testing_test.cpython-37.pyc | Bin 0 -> 15087 bytes .../__pycache__/twisted_test.cpython-37.pyc | Bin 0 -> 8566 bytes .../test/__pycache__/util.cpython-37.pyc | Bin 0 -> 2858 bytes .../test/__pycache__/util_test.cpython-37.pyc | Bin 0 -> 11375 bytes .../test/__pycache__/web_test.cpython-37.pyc | Bin 0 -> 128928 bytes .../__pycache__/websocket_test.cpython-37.pyc | Bin 0 -> 33574 bytes .../__pycache__/windows_test.cpython-37.pyc | Bin 0 -> 928 bytes .../test/__pycache__/wsgi_test.cpython-37.pyc | Bin 0 -> 1104 bytes .../tornado/test/asyncio_test.py | 190 + .../site-packages/tornado/test/auth_test.py | 609 ++ .../tornado/test/autoreload_test.py | 127 + .../tornado/test/concurrent_test.py | 209 + .../tornado/test/csv_translations/fr_FR.csv | 1 + .../tornado/test/curl_httpclient_test.py | 130 + .../site-packages/tornado/test/escape_test.py | 322 + .../site-packages/tornado/test/gen_test.py | 1111 +++ .../fr_FR/LC_MESSAGES/tornado_test.mo | Bin 0 -> 665 bytes .../fr_FR/LC_MESSAGES/tornado_test.po | 47 + .../tornado/test/http1connection_test.py | 58 + .../tornado/test/httpclient_test.py | 832 ++ .../tornado/test/httpserver_test.py | 1296 +++ .../tornado/test/httputil_test.py | 522 ++ .../site-packages/tornado/test/import_test.py | 66 + .../site-packages/tornado/test/ioloop_test.py | 719 ++ .../tornado/test/iostream_test.py | 1262 +++ .../site-packages/tornado/test/locale_test.py | 151 + .../site-packages/tornado/test/locks_test.py | 535 ++ .../site-packages/tornado/test/log_test.py | 245 + .../tornado/test/netutil_test.py | 226 + .../tornado/test/options_test.cfg | 7 + .../tornado/test/options_test.py | 329 + .../tornado/test/options_test_types.cfg | 11 + .../tornado/test/options_test_types_str.cfg | 8 + .../tornado/test/process_test.py | 265 + .../site-packages/tornado/test/queues_test.py | 427 + .../tornado/test/resolve_test_helper.py | 10 + .../tornado/test/routing_test.py | 276 + .../site-packages/tornado/test/runtests.py | 236 + .../tornado/test/simple_httpclient_test.py | 832 ++ .../tornado/test/static/dir/index.html | 1 + .../tornado/test/static/robots.txt | 2 + .../tornado/test/static/sample.xml | 23 + .../tornado/test/static/sample.xml.bz2 | Bin 0 -> 285 bytes .../tornado/test/static/sample.xml.gz | Bin 0 -> 264 bytes .../site-packages/tornado/test/static_foo.txt | 2 + .../tornado/test/tcpclient_test.py | 435 + .../tornado/test/tcpserver_test.py | 192 + .../tornado/test/template_test.py | 536 ++ .../tornado/test/templates/utf8.html | 1 + venv/Lib/site-packages/tornado/test/test.crt | 20 + venv/Lib/site-packages/tornado/test/test.key | 28 + .../tornado/test/testing_test.py | 350 + .../tornado/test/twisted_test.py | 236 + venv/Lib/site-packages/tornado/test/util.py | 114 + .../site-packages/tornado/test/util_test.py | 309 + .../site-packages/tornado/test/web_test.py | 3138 +++++++ .../tornado/test/websocket_test.py | 822 ++ .../tornado/test/windows_test.py | 24 + .../site-packages/tornado/test/wsgi_test.py | 20 + venv/Lib/site-packages/tornado/testing.py | 790 ++ venv/Lib/site-packages/tornado/util.py | 472 + venv/Lib/site-packages/tornado/web.py | 3593 +++++++ venv/Lib/site-packages/tornado/websocket.py | 1663 ++++ venv/Lib/site-packages/tornado/wsgi.py | 199 + venv/Scripts/Activate.ps1 | 51 + venv/Scripts/activate | 76 + venv/Scripts/activate.bat | 33 + venv/Scripts/deactivate.bat | 21 + venv/Scripts/easy_install-3.7.exe | Bin 0 -> 106391 bytes venv/Scripts/easy_install.exe | Bin 0 -> 106391 bytes venv/Scripts/pip.exe | Bin 0 -> 106382 bytes venv/Scripts/pip3.7.exe | Bin 0 -> 106382 bytes venv/Scripts/pip3.exe | Bin 0 -> 106382 bytes venv/Scripts/python.exe | Bin 0 -> 501264 bytes venv/Scripts/pythonw.exe | Bin 0 -> 500240 bytes venv/pyvenv.cfg | 3 + 1322 files changed, 225316 insertions(+) create mode 100644 requirements.txt create mode 100644 venv/Lib/site-packages/PIL/BdfFontFile.py create mode 100644 venv/Lib/site-packages/PIL/BlpImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/BmpImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/BufrStubImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/ContainerIO.py create mode 100644 venv/Lib/site-packages/PIL/CurImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/DcxImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/DdsImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/EpsImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/ExifTags.py create mode 100644 venv/Lib/site-packages/PIL/FitsStubImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/FliImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/FontFile.py create mode 100644 venv/Lib/site-packages/PIL/FpxImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/FtexImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/GbrImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/GdImageFile.py create mode 100644 venv/Lib/site-packages/PIL/GifImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/GimpGradientFile.py create mode 100644 venv/Lib/site-packages/PIL/GimpPaletteFile.py create mode 100644 venv/Lib/site-packages/PIL/GribStubImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/IcnsImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/IcoImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/ImImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/Image.py create mode 100644 venv/Lib/site-packages/PIL/ImageChops.py create mode 100644 venv/Lib/site-packages/PIL/ImageCms.py create mode 100644 venv/Lib/site-packages/PIL/ImageColor.py create mode 100644 venv/Lib/site-packages/PIL/ImageDraw.py create mode 100644 venv/Lib/site-packages/PIL/ImageDraw2.py create mode 100644 venv/Lib/site-packages/PIL/ImageEnhance.py create mode 100644 venv/Lib/site-packages/PIL/ImageFile.py create mode 100644 venv/Lib/site-packages/PIL/ImageFilter.py create mode 100644 venv/Lib/site-packages/PIL/ImageFont.py create mode 100644 venv/Lib/site-packages/PIL/ImageGrab.py create mode 100644 venv/Lib/site-packages/PIL/ImageMath.py create mode 100644 venv/Lib/site-packages/PIL/ImageMode.py create mode 100644 venv/Lib/site-packages/PIL/ImageMorph.py create mode 100644 venv/Lib/site-packages/PIL/ImageOps.py create mode 100644 venv/Lib/site-packages/PIL/ImagePalette.py create mode 100644 venv/Lib/site-packages/PIL/ImagePath.py create mode 100644 venv/Lib/site-packages/PIL/ImageQt.py create mode 100644 venv/Lib/site-packages/PIL/ImageSequence.py create mode 100644 venv/Lib/site-packages/PIL/ImageShow.py create mode 100644 venv/Lib/site-packages/PIL/ImageStat.py create mode 100644 venv/Lib/site-packages/PIL/ImageTk.py create mode 100644 venv/Lib/site-packages/PIL/ImageTransform.py create mode 100644 venv/Lib/site-packages/PIL/ImageWin.py create mode 100644 venv/Lib/site-packages/PIL/ImtImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/IptcImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/JpegImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/JpegPresets.py create mode 100644 venv/Lib/site-packages/PIL/McIdasImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/MicImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/MpegImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/MpoImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/MspImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/PSDraw.py create mode 100644 venv/Lib/site-packages/PIL/PaletteFile.py create mode 100644 venv/Lib/site-packages/PIL/PalmImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/PcdImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/PcfFontFile.py create mode 100644 venv/Lib/site-packages/PIL/PcxImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/PdfImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/PdfParser.py create mode 100644 venv/Lib/site-packages/PIL/PixarImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/PngImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/PpmImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/PsdImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/PyAccess.py create mode 100644 venv/Lib/site-packages/PIL/SgiImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/SpiderImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/SunImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/TarIO.py create mode 100644 venv/Lib/site-packages/PIL/TgaImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/TiffImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/TiffTags.py create mode 100644 venv/Lib/site-packages/PIL/WalImageFile.py create mode 100644 venv/Lib/site-packages/PIL/WebPImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/WmfImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/XVThumbImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/XbmImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/XpmImagePlugin.py create mode 100644 venv/Lib/site-packages/PIL/__init__.py create mode 100644 venv/Lib/site-packages/PIL/__main__.py create mode 100644 venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/FitsStubImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/Image.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/_binary.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/_util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/_version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/features.cpython-37.pyc create mode 100644 venv/Lib/site-packages/PIL/_binary.py create mode 100644 venv/Lib/site-packages/PIL/_imaging.cp37-win_amd64.pyd create mode 100644 venv/Lib/site-packages/PIL/_imagingcms.cp37-win_amd64.pyd create mode 100644 venv/Lib/site-packages/PIL/_imagingft.cp37-win_amd64.pyd create mode 100644 venv/Lib/site-packages/PIL/_imagingmath.cp37-win_amd64.pyd create mode 100644 venv/Lib/site-packages/PIL/_imagingmorph.cp37-win_amd64.pyd create mode 100644 venv/Lib/site-packages/PIL/_imagingtk.cp37-win_amd64.pyd create mode 100644 venv/Lib/site-packages/PIL/_tkinter_finder.py create mode 100644 venv/Lib/site-packages/PIL/_util.py create mode 100644 venv/Lib/site-packages/PIL/_version.py create mode 100644 venv/Lib/site-packages/PIL/_webp.cp37-win_amd64.pyd create mode 100644 venv/Lib/site-packages/PIL/features.py create mode 100644 venv/Lib/site-packages/Pillow-7.2.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/Pillow-7.2.0.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/Pillow-7.2.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/Pillow-7.2.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/Pillow-7.2.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/Pillow-7.2.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/Pillow-7.2.0.dist-info/zip-safe create mode 100644 venv/Lib/site-packages/__pycache__/easy_install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/easy_install.py create mode 100644 venv/Lib/site-packages/pip-20.1.1.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pip-20.1.1.dist-info/LICENSE.txt create mode 100644 venv/Lib/site-packages/pip-20.1.1.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pip-20.1.1.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pip-20.1.1.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pip-20.1.1.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/pip-20.1.1.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pip/__init__.py create mode 100644 venv/Lib/site-packages/pip/__main__.py create mode 100644 venv/Lib/site-packages/pip/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/build_env.py create mode 100644 venv/Lib/site-packages/pip/_internal/cache.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/command_context.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/main.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/req_command.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/spinners.py create mode 100644 venv/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/commands/cache.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/debug.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 venv/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 venv/Lib/site-packages/pip/_internal/configuration.py create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/base.py create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/installed.py create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/sdist.py create mode 100644 venv/Lib/site-packages/pip/_internal/distributions/wheel.py create mode 100644 venv/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 venv/Lib/site-packages/pip/_internal/index/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/index/collector.py create mode 100644 venv/Lib/site-packages/pip/_internal/index/package_finder.py create mode 100644 venv/Lib/site-packages/pip/_internal/locations.py create mode 100644 venv/Lib/site-packages/pip/_internal/main.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/direct_url.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/index.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/link.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/scheme.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/search_scope.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/target_python.py create mode 100644 venv/Lib/site-packages/pip/_internal/models/wheel.py create mode 100644 venv/Lib/site-packages/pip/_internal/network/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/network/auth.py create mode 100644 venv/Lib/site-packages/pip/_internal/network/cache.py create mode 100644 venv/Lib/site-packages/pip/_internal/network/download.py create mode 100644 venv/Lib/site-packages/pip/_internal/network/session.py create mode 100644 venv/Lib/site-packages/pip/_internal/network/utils.py create mode 100644 venv/Lib/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 venv/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 venv/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_tracker.py create mode 100644 venv/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/base.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 venv/Lib/site-packages/pip/_internal/self_outdated_check.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/filetypes.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/subprocess.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/typing.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/unpacking.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/urls.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 venv/Lib/site-packages/pip/_internal/utils/wheel.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 venv/Lib/site-packages/pip/_internal/wheel_builder.py create mode 100644 venv/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/contextlib2.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/toml.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/appdirs.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 venv/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 venv/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 venv/Lib/site-packages/pip/_vendor/contextlib2.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 venv/Lib/site-packages/pip/_vendor/distro.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 venv/Lib/site-packages/pip/_vendor/ipaddress.py create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_typing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_typing.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/tags.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/build.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/check.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/meta.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/bar.py create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/counter.py create mode 100644 venv/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 venv/Lib/site-packages/pip/_vendor/pyparsing.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 venv/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 venv/Lib/site-packages/pip/_vendor/retrying.py create mode 100644 venv/Lib/site-packages/pip/_vendor/six.py create mode 100644 venv/Lib/site-packages/pip/_vendor/toml.py create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/__pycache__/decoder.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/__pycache__/encoder.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/__pycache__/ordered.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/__pycache__/tz.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/decoder.py create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/encoder.py create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/ordered.py create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/tz.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 venv/Lib/site-packages/pip/_vendor/vendor.txt create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 venv/Lib/site-packages/pkg_resources/__init__.py create mode 100644 venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/__pycache__/py2_warn.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/six.py create mode 100644 venv/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/pkg_resources/py2_warn.py create mode 100644 venv/Lib/site-packages/pkg_resources/py31compat.py create mode 100644 venv/Lib/site-packages/setuptools-47.1.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/setuptools-47.1.0.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/setuptools-47.1.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/setuptools-47.1.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/setuptools-47.1.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/setuptools-47.1.0.dist-info/dependency_links.txt create mode 100644 venv/Lib/site-packages/setuptools-47.1.0.dist-info/entry_points.txt create mode 100644 venv/Lib/site-packages/setuptools-47.1.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/setuptools-47.1.0.dist-info/zip-safe create mode 100644 venv/Lib/site-packages/setuptools/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/_imp.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/config.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/depends.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/dist.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/errors.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/extension.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/glob.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/installer.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/launch.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_deprecation_warning.py create mode 100644 venv/Lib/site-packages/setuptools/_imp.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 venv/Lib/site-packages/setuptools/_vendor/six.py create mode 100644 venv/Lib/site-packages/setuptools/archive_util.py create mode 100644 venv/Lib/site-packages/setuptools/build_meta.py create mode 100644 venv/Lib/site-packages/setuptools/cli-32.exe create mode 100644 venv/Lib/site-packages/setuptools/cli-64.exe create mode 100644 venv/Lib/site-packages/setuptools/cli.exe create mode 100644 venv/Lib/site-packages/setuptools/command/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/command/alias.py create mode 100644 venv/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 venv/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 venv/Lib/site-packages/setuptools/command/bdist_wininst.py create mode 100644 venv/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 venv/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 venv/Lib/site-packages/setuptools/command/build_py.py create mode 100644 venv/Lib/site-packages/setuptools/command/develop.py create mode 100644 venv/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 venv/Lib/site-packages/setuptools/command/easy_install.py create mode 100644 venv/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 venv/Lib/site-packages/setuptools/command/install.py create mode 100644 venv/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 venv/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 venv/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 venv/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 venv/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 venv/Lib/site-packages/setuptools/command/register.py create mode 100644 venv/Lib/site-packages/setuptools/command/rotate.py create mode 100644 venv/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 venv/Lib/site-packages/setuptools/command/sdist.py create mode 100644 venv/Lib/site-packages/setuptools/command/setopt.py create mode 100644 venv/Lib/site-packages/setuptools/command/test.py create mode 100644 venv/Lib/site-packages/setuptools/command/upload.py create mode 100644 venv/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 venv/Lib/site-packages/setuptools/config.py create mode 100644 venv/Lib/site-packages/setuptools/dep_util.py create mode 100644 venv/Lib/site-packages/setuptools/depends.py create mode 100644 venv/Lib/site-packages/setuptools/dist.py create mode 100644 venv/Lib/site-packages/setuptools/errors.py create mode 100644 venv/Lib/site-packages/setuptools/extension.py create mode 100644 venv/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 venv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/setuptools/glob.py create mode 100644 venv/Lib/site-packages/setuptools/gui-32.exe create mode 100644 venv/Lib/site-packages/setuptools/gui-64.exe create mode 100644 venv/Lib/site-packages/setuptools/gui.exe create mode 100644 venv/Lib/site-packages/setuptools/installer.py create mode 100644 venv/Lib/site-packages/setuptools/launch.py create mode 100644 venv/Lib/site-packages/setuptools/lib2to3_ex.py create mode 100644 venv/Lib/site-packages/setuptools/monkey.py create mode 100644 venv/Lib/site-packages/setuptools/msvc.py create mode 100644 venv/Lib/site-packages/setuptools/namespaces.py create mode 100644 venv/Lib/site-packages/setuptools/package_index.py create mode 100644 venv/Lib/site-packages/setuptools/py27compat.py create mode 100644 venv/Lib/site-packages/setuptools/py31compat.py create mode 100644 venv/Lib/site-packages/setuptools/py33compat.py create mode 100644 venv/Lib/site-packages/setuptools/py34compat.py create mode 100644 venv/Lib/site-packages/setuptools/sandbox.py create mode 100644 venv/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 venv/Lib/site-packages/setuptools/script.tmpl create mode 100644 venv/Lib/site-packages/setuptools/site-patch.py create mode 100644 venv/Lib/site-packages/setuptools/ssl_support.py create mode 100644 venv/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 venv/Lib/site-packages/setuptools/version.py create mode 100644 venv/Lib/site-packages/setuptools/wheel.py create mode 100644 venv/Lib/site-packages/setuptools/windows_support.py create mode 100644 venv/Lib/site-packages/tornado-6.0.4.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/tornado-6.0.4.dist-info/LICENSE create mode 100644 venv/Lib/site-packages/tornado-6.0.4.dist-info/METADATA create mode 100644 venv/Lib/site-packages/tornado-6.0.4.dist-info/RECORD create mode 100644 venv/Lib/site-packages/tornado-6.0.4.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/tornado-6.0.4.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/tornado/__init__.py create mode 100644 venv/Lib/site-packages/tornado/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/_locale_data.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/auth.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/autoreload.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/concurrent.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/curl_httpclient.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/escape.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/gen.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/http1connection.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/httpclient.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/httpserver.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/httputil.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/ioloop.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/iostream.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/locale.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/locks.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/log.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/netutil.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/options.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/process.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/queues.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/routing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/simple_httpclient.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/tcpclient.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/tcpserver.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/template.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/testing.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/web.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/websocket.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/__pycache__/wsgi.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/_locale_data.py create mode 100644 venv/Lib/site-packages/tornado/auth.py create mode 100644 venv/Lib/site-packages/tornado/autoreload.py create mode 100644 venv/Lib/site-packages/tornado/concurrent.py create mode 100644 venv/Lib/site-packages/tornado/curl_httpclient.py create mode 100644 venv/Lib/site-packages/tornado/escape.py create mode 100644 venv/Lib/site-packages/tornado/gen.py create mode 100644 venv/Lib/site-packages/tornado/http1connection.py create mode 100644 venv/Lib/site-packages/tornado/httpclient.py create mode 100644 venv/Lib/site-packages/tornado/httpserver.py create mode 100644 venv/Lib/site-packages/tornado/httputil.py create mode 100644 venv/Lib/site-packages/tornado/ioloop.py create mode 100644 venv/Lib/site-packages/tornado/iostream.py create mode 100644 venv/Lib/site-packages/tornado/locale.py create mode 100644 venv/Lib/site-packages/tornado/locks.py create mode 100644 venv/Lib/site-packages/tornado/log.py create mode 100644 venv/Lib/site-packages/tornado/netutil.py create mode 100644 venv/Lib/site-packages/tornado/options.py create mode 100644 venv/Lib/site-packages/tornado/platform/__init__.py create mode 100644 venv/Lib/site-packages/tornado/platform/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/platform/__pycache__/asyncio.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/platform/__pycache__/auto.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/platform/__pycache__/caresresolver.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/platform/__pycache__/interface.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/platform/__pycache__/posix.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/platform/__pycache__/twisted.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/platform/__pycache__/windows.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/platform/asyncio.py create mode 100644 venv/Lib/site-packages/tornado/platform/auto.py create mode 100644 venv/Lib/site-packages/tornado/platform/caresresolver.py create mode 100644 venv/Lib/site-packages/tornado/platform/interface.py create mode 100644 venv/Lib/site-packages/tornado/platform/posix.py create mode 100644 venv/Lib/site-packages/tornado/platform/twisted.py create mode 100644 venv/Lib/site-packages/tornado/platform/windows.py create mode 100644 venv/Lib/site-packages/tornado/process.py create mode 100644 venv/Lib/site-packages/tornado/py.typed create mode 100644 venv/Lib/site-packages/tornado/queues.py create mode 100644 venv/Lib/site-packages/tornado/routing.py create mode 100644 venv/Lib/site-packages/tornado/simple_httpclient.py create mode 100644 venv/Lib/site-packages/tornado/speedups.cp37-win_amd64.pyd create mode 100644 venv/Lib/site-packages/tornado/tcpclient.py create mode 100644 venv/Lib/site-packages/tornado/tcpserver.py create mode 100644 venv/Lib/site-packages/tornado/template.py create mode 100644 venv/Lib/site-packages/tornado/test/__init__.py create mode 100644 venv/Lib/site-packages/tornado/test/__main__.py create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/__init__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/__main__.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/asyncio_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/auth_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/autoreload_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/concurrent_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/curl_httpclient_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/escape_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/gen_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/http1connection_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/httpclient_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/httpserver_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/httputil_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/import_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/ioloop_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/iostream_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/locale_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/locks_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/log_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/netutil_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/options_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/process_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/queues_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/resolve_test_helper.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/routing_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/runtests.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/simple_httpclient_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/tcpclient_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/tcpserver_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/template_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/testing_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/twisted_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/util.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/util_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/web_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/websocket_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/windows_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/__pycache__/wsgi_test.cpython-37.pyc create mode 100644 venv/Lib/site-packages/tornado/test/asyncio_test.py create mode 100644 venv/Lib/site-packages/tornado/test/auth_test.py create mode 100644 venv/Lib/site-packages/tornado/test/autoreload_test.py create mode 100644 venv/Lib/site-packages/tornado/test/concurrent_test.py create mode 100644 venv/Lib/site-packages/tornado/test/csv_translations/fr_FR.csv create mode 100644 venv/Lib/site-packages/tornado/test/curl_httpclient_test.py create mode 100644 venv/Lib/site-packages/tornado/test/escape_test.py create mode 100644 venv/Lib/site-packages/tornado/test/gen_test.py create mode 100644 venv/Lib/site-packages/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo create mode 100644 venv/Lib/site-packages/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po create mode 100644 venv/Lib/site-packages/tornado/test/http1connection_test.py create mode 100644 venv/Lib/site-packages/tornado/test/httpclient_test.py create mode 100644 venv/Lib/site-packages/tornado/test/httpserver_test.py create mode 100644 venv/Lib/site-packages/tornado/test/httputil_test.py create mode 100644 venv/Lib/site-packages/tornado/test/import_test.py create mode 100644 venv/Lib/site-packages/tornado/test/ioloop_test.py create mode 100644 venv/Lib/site-packages/tornado/test/iostream_test.py create mode 100644 venv/Lib/site-packages/tornado/test/locale_test.py create mode 100644 venv/Lib/site-packages/tornado/test/locks_test.py create mode 100644 venv/Lib/site-packages/tornado/test/log_test.py create mode 100644 venv/Lib/site-packages/tornado/test/netutil_test.py create mode 100644 venv/Lib/site-packages/tornado/test/options_test.cfg create mode 100644 venv/Lib/site-packages/tornado/test/options_test.py create mode 100644 venv/Lib/site-packages/tornado/test/options_test_types.cfg create mode 100644 venv/Lib/site-packages/tornado/test/options_test_types_str.cfg create mode 100644 venv/Lib/site-packages/tornado/test/process_test.py create mode 100644 venv/Lib/site-packages/tornado/test/queues_test.py create mode 100644 venv/Lib/site-packages/tornado/test/resolve_test_helper.py create mode 100644 venv/Lib/site-packages/tornado/test/routing_test.py create mode 100644 venv/Lib/site-packages/tornado/test/runtests.py create mode 100644 venv/Lib/site-packages/tornado/test/simple_httpclient_test.py create mode 100644 venv/Lib/site-packages/tornado/test/static/dir/index.html create mode 100644 venv/Lib/site-packages/tornado/test/static/robots.txt create mode 100644 venv/Lib/site-packages/tornado/test/static/sample.xml create mode 100644 venv/Lib/site-packages/tornado/test/static/sample.xml.bz2 create mode 100644 venv/Lib/site-packages/tornado/test/static/sample.xml.gz create mode 100644 venv/Lib/site-packages/tornado/test/static_foo.txt create mode 100644 venv/Lib/site-packages/tornado/test/tcpclient_test.py create mode 100644 venv/Lib/site-packages/tornado/test/tcpserver_test.py create mode 100644 venv/Lib/site-packages/tornado/test/template_test.py create mode 100644 venv/Lib/site-packages/tornado/test/templates/utf8.html create mode 100644 venv/Lib/site-packages/tornado/test/test.crt create mode 100644 venv/Lib/site-packages/tornado/test/test.key create mode 100644 venv/Lib/site-packages/tornado/test/testing_test.py create mode 100644 venv/Lib/site-packages/tornado/test/twisted_test.py create mode 100644 venv/Lib/site-packages/tornado/test/util.py create mode 100644 venv/Lib/site-packages/tornado/test/util_test.py create mode 100644 venv/Lib/site-packages/tornado/test/web_test.py create mode 100644 venv/Lib/site-packages/tornado/test/websocket_test.py create mode 100644 venv/Lib/site-packages/tornado/test/windows_test.py create mode 100644 venv/Lib/site-packages/tornado/test/wsgi_test.py create mode 100644 venv/Lib/site-packages/tornado/testing.py create mode 100644 venv/Lib/site-packages/tornado/util.py create mode 100644 venv/Lib/site-packages/tornado/web.py create mode 100644 venv/Lib/site-packages/tornado/websocket.py create mode 100644 venv/Lib/site-packages/tornado/wsgi.py create mode 100644 venv/Scripts/Activate.ps1 create mode 100644 venv/Scripts/activate create mode 100644 venv/Scripts/activate.bat create mode 100644 venv/Scripts/deactivate.bat create mode 100644 venv/Scripts/easy_install-3.7.exe create mode 100644 venv/Scripts/easy_install.exe create mode 100644 venv/Scripts/pip.exe create mode 100644 venv/Scripts/pip3.7.exe create mode 100644 venv/Scripts/pip3.exe create mode 100644 venv/Scripts/python.exe create mode 100644 venv/Scripts/pythonw.exe create mode 100644 venv/pyvenv.cfg diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..efba49d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Pillow==7.2.0 +tornado==6.0.4 diff --git a/venv/Lib/site-packages/PIL/BdfFontFile.py b/venv/Lib/site-packages/PIL/BdfFontFile.py new file mode 100644 index 0000000..102b72e --- /dev/null +++ b/venv/Lib/site-packages/PIL/BdfFontFile.py @@ -0,0 +1,110 @@ +# +# The Python Imaging Library +# $Id$ +# +# bitmap distribution font (bdf) file parser +# +# history: +# 1996-05-16 fl created (as bdf2pil) +# 1997-08-25 fl converted to FontFile driver +# 2001-05-25 fl removed bogus __init__ call +# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) +# 2003-04-22 fl more robustification (from Graham Dumpleton) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +""" +Parse X Bitmap Distribution Format (BDF) +""" + + +from . import FontFile, Image + +bdf_slant = { + "R": "Roman", + "I": "Italic", + "O": "Oblique", + "RI": "Reverse Italic", + "RO": "Reverse Oblique", + "OT": "Other", +} + +bdf_spacing = {"P": "Proportional", "M": "Monospaced", "C": "Cell"} + + +def bdf_char(f): + # skip to STARTCHAR + while True: + s = f.readline() + if not s: + return None + if s[:9] == b"STARTCHAR": + break + id = s[9:].strip().decode("ascii") + + # load symbol properties + props = {} + while True: + s = f.readline() + if not s or s[:6] == b"BITMAP": + break + i = s.find(b" ") + props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") + + # load bitmap + bitmap = [] + while True: + s = f.readline() + if not s or s[:7] == b"ENDCHAR": + break + bitmap.append(s[:-1]) + bitmap = b"".join(bitmap) + + [x, y, l, d] = [int(p) for p in props["BBX"].split()] + [dx, dy] = [int(p) for p in props["DWIDTH"].split()] + + bbox = (dx, dy), (l, -d - y, x + l, -d), (0, 0, x, y) + + try: + im = Image.frombytes("1", (x, y), bitmap, "hex", "1") + except ValueError: + # deal with zero-width characters + im = Image.new("1", (x, y)) + + return id, int(props["ENCODING"]), bbox, im + + +class BdfFontFile(FontFile.FontFile): + """Font file plugin for the X11 BDF format.""" + + def __init__(self, fp): + super().__init__() + + s = fp.readline() + if s[:13] != b"STARTFONT 2.1": + raise SyntaxError("not a valid BDF file") + + props = {} + comments = [] + + while True: + s = fp.readline() + if not s or s[:13] == b"ENDPROPERTIES": + break + i = s.find(b" ") + props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") + if s[:i] in [b"COMMENT", b"COPYRIGHT"]: + if s.find(b"LogicalFontDescription") < 0: + comments.append(s[i + 1 : -1].decode("ascii")) + + while True: + c = bdf_char(fp) + if not c: + break + id, ch, (xy, dst, src), im = c + if 0 <= ch < len(self.glyph): + self.glyph[ch] = xy, dst, src, im diff --git a/venv/Lib/site-packages/PIL/BlpImagePlugin.py b/venv/Lib/site-packages/PIL/BlpImagePlugin.py new file mode 100644 index 0000000..cb8a08e --- /dev/null +++ b/venv/Lib/site-packages/PIL/BlpImagePlugin.py @@ -0,0 +1,420 @@ +""" +Blizzard Mipmap Format (.blp) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +BLP1 files, used mostly in Warcraft III, are not fully supported. +All types of BLP2 files used in World of Warcraft are supported. + +The BLP file structure consists of a header, up to 16 mipmaps of the +texture + +Texture sizes must be powers of two, though the two dimensions do +not have to be equal; 512x256 is valid, but 512x200 is not. +The first mipmap (mipmap #0) is the full size image; each subsequent +mipmap halves both dimensions. The final mipmap should be 1x1. + +BLP files come in many different flavours: +* JPEG-compressed (type == 0) - only supported for BLP1. +* RAW images (type == 1, encoding == 1). Each mipmap is stored as an + array of 8-bit values, one per pixel, left to right, top to bottom. + Each value is an index to the palette. +* DXT-compressed (type == 1, encoding == 2): +- DXT1 compression is used if alpha_encoding == 0. + - An additional alpha bit is used if alpha_depth == 1. + - DXT3 compression is used if alpha_encoding == 1. + - DXT5 compression is used if alpha_encoding == 7. +""" + +import struct +from io import BytesIO + +from . import Image, ImageFile + +BLP_FORMAT_JPEG = 0 + +BLP_ENCODING_UNCOMPRESSED = 1 +BLP_ENCODING_DXT = 2 +BLP_ENCODING_UNCOMPRESSED_RAW_BGRA = 3 + +BLP_ALPHA_ENCODING_DXT1 = 0 +BLP_ALPHA_ENCODING_DXT3 = 1 +BLP_ALPHA_ENCODING_DXT5 = 7 + + +def unpack_565(i): + return (((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3) + + +def decode_dxt1(data, alpha=False): + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 8 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + # Decode next 8-byte block. + idx = block * 8 + color0, color1, bits = struct.unpack_from("> 2 + + a = 0xFF + if control == 0: + r, g, b = r0, g0, b0 + elif control == 1: + r, g, b = r1, g1, b1 + elif control == 2: + if color0 > color1: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + else: + r = (r0 + r1) // 2 + g = (g0 + g1) // 2 + b = (b0 + b1) // 2 + elif control == 3: + if color0 > color1: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + else: + r, g, b, a = 0, 0, 0, 0 + + if alpha: + ret[j].extend([r, g, b, a]) + else: + ret[j].extend([r, g, b]) + + return ret + + +def decode_dxt3(data): + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + idx = block * 16 + block = data[idx : idx + 16] + # Decode next 16-byte block. + bits = struct.unpack_from("<8B", block) + color0, color1 = struct.unpack_from(">= 4 + else: + high = True + a &= 0xF + a *= 17 # We get a value between 0 and 15 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +def decode_dxt5(data): + """ + input: one "row" of data (i.e. will produce 4 * width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + idx = block * 16 + block = data[idx : idx + 16] + # Decode next 16-byte block. + a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 + elif alphacode_index == 15: + alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) + else: # alphacode_index >= 18 and alphacode_index <= 45 + alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 + + if alphacode == 0: + a = a0 + elif alphacode == 1: + a = a1 + elif a0 > a1: + a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 + elif alphacode == 6: + a = 0 + elif alphacode == 7: + a = 255 + else: + a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +class BLPFormatError(NotImplementedError): + pass + + +class BlpImageFile(ImageFile.ImageFile): + """ + Blizzard Mipmap Format + """ + + format = "BLP" + format_description = "Blizzard Mipmap Format" + + def _open(self): + self.magic = self.fp.read(4) + self._read_blp_header() + + if self.magic == b"BLP1": + decoder = "BLP1" + self.mode = "RGB" + elif self.magic == b"BLP2": + decoder = "BLP2" + self.mode = "RGBA" if self._blp_alpha_depth else "RGB" + else: + raise BLPFormatError("Bad BLP magic %r" % (self.magic)) + + self.tile = [(decoder, (0, 0) + self.size, 0, (self.mode, 0, 1))] + + def _read_blp_header(self): + (self._blp_compression,) = struct.unpack(" mode, rawmode + 1: ("P", "P;1"), + 4: ("P", "P;4"), + 8: ("P", "P"), + 16: ("RGB", "BGR;15"), + 24: ("RGB", "BGR"), + 32: ("RGB", "BGRX"), +} + + +def _accept(prefix): + return prefix[:2] == b"BM" + + +def _dib_accept(prefix): + return i32(prefix[:4]) in [12, 40, 64, 108, 124] + + +# ============================================================================= +# Image plugin for the Windows BMP format. +# ============================================================================= +class BmpImageFile(ImageFile.ImageFile): + """ Image plugin for the Windows Bitmap format (BMP) """ + + # ------------------------------------------------------------- Description + format_description = "Windows Bitmap" + format = "BMP" + + # -------------------------------------------------- BMP Compression values + COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5} + for k, v in COMPRESSIONS.items(): + vars()[k] = v + + def _bitmap(self, header=0, offset=0): + """ Read relevant info about the BMP """ + read, seek = self.fp.read, self.fp.seek + if header: + seek(header) + file_info = {} + # read bmp header size @offset 14 (this is part of the header size) + file_info["header_size"] = i32(read(4)) + file_info["direction"] = -1 + + # -------------------- If requested, read header at a specific position + # read the rest of the bmp header, without its size + header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) + + # -------------------------------------------------- IBM OS/2 Bitmap v1 + # ----- This format has different offsets because of width/height types + if file_info["header_size"] == 12: + file_info["width"] = i16(header_data[0:2]) + file_info["height"] = i16(header_data[2:4]) + file_info["planes"] = i16(header_data[4:6]) + file_info["bits"] = i16(header_data[6:8]) + file_info["compression"] = self.RAW + file_info["palette_padding"] = 3 + + # --------------------------------------------- Windows Bitmap v2 to v5 + # v3, OS/2 v2, v4, v5 + elif file_info["header_size"] in (40, 64, 108, 124): + file_info["y_flip"] = i8(header_data[7]) == 0xFF + file_info["direction"] = 1 if file_info["y_flip"] else -1 + file_info["width"] = i32(header_data[0:4]) + file_info["height"] = ( + i32(header_data[4:8]) + if not file_info["y_flip"] + else 2 ** 32 - i32(header_data[4:8]) + ) + file_info["planes"] = i16(header_data[8:10]) + file_info["bits"] = i16(header_data[10:12]) + file_info["compression"] = i32(header_data[12:16]) + # byte size of pixel data + file_info["data_size"] = i32(header_data[16:20]) + file_info["pixels_per_meter"] = ( + i32(header_data[20:24]), + i32(header_data[24:28]), + ) + file_info["colors"] = i32(header_data[28:32]) + file_info["palette_padding"] = 4 + self.info["dpi"] = tuple( + int(x / 39.3701 + 0.5) for x in file_info["pixels_per_meter"] + ) + if file_info["compression"] == self.BITFIELDS: + if len(header_data) >= 52: + for idx, mask in enumerate( + ["r_mask", "g_mask", "b_mask", "a_mask"] + ): + file_info[mask] = i32(header_data[36 + idx * 4 : 40 + idx * 4]) + else: + # 40 byte headers only have the three components in the + # bitfields masks, ref: + # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx + # See also + # https://github.com/python-pillow/Pillow/issues/1293 + # There is a 4th component in the RGBQuad, in the alpha + # location, but it is listed as a reserved component, + # and it is not generally an alpha channel + file_info["a_mask"] = 0x0 + for mask in ["r_mask", "g_mask", "b_mask"]: + file_info[mask] = i32(read(4)) + file_info["rgb_mask"] = ( + file_info["r_mask"], + file_info["g_mask"], + file_info["b_mask"], + ) + file_info["rgba_mask"] = ( + file_info["r_mask"], + file_info["g_mask"], + file_info["b_mask"], + file_info["a_mask"], + ) + else: + raise OSError("Unsupported BMP header type (%d)" % file_info["header_size"]) + + # ------------------ Special case : header is reported 40, which + # ---------------------- is shorter than real size for bpp >= 16 + self._size = file_info["width"], file_info["height"] + + # ------- If color count was not found in the header, compute from bits + file_info["colors"] = ( + file_info["colors"] + if file_info.get("colors", 0) + else (1 << file_info["bits"]) + ) + + # ------------------------------- Check abnormal values for DOS attacks + if file_info["width"] * file_info["height"] > 2 ** 31: + raise OSError("Unsupported BMP Size: (%dx%d)" % self.size) + + # ---------------------- Check bit depth for unusual unsupported values + self.mode, raw_mode = BIT2MODE.get(file_info["bits"], (None, None)) + if self.mode is None: + raise OSError("Unsupported BMP pixel depth (%d)" % file_info["bits"]) + + # ---------------- Process BMP with Bitfields compression (not palette) + if file_info["compression"] == self.BITFIELDS: + SUPPORTED = { + 32: [ + (0xFF0000, 0xFF00, 0xFF, 0x0), + (0xFF0000, 0xFF00, 0xFF, 0xFF000000), + (0xFF, 0xFF00, 0xFF0000, 0xFF000000), + (0x0, 0x0, 0x0, 0x0), + (0xFF000000, 0xFF0000, 0xFF00, 0x0), + ], + 24: [(0xFF0000, 0xFF00, 0xFF)], + 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], + } + MASK_MODES = { + (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", + (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", + (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", + (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", + (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", + (24, (0xFF0000, 0xFF00, 0xFF)): "BGR", + (16, (0xF800, 0x7E0, 0x1F)): "BGR;16", + (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15", + } + if file_info["bits"] in SUPPORTED: + if ( + file_info["bits"] == 32 + and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]] + ): + raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])] + self.mode = "RGBA" if "A" in raw_mode else self.mode + elif ( + file_info["bits"] in (24, 16) + and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]] + ): + raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])] + else: + raise OSError("Unsupported BMP bitfields layout") + else: + raise OSError("Unsupported BMP bitfields layout") + elif file_info["compression"] == self.RAW: + if file_info["bits"] == 32 and header == 22: # 32-bit .cur offset + raw_mode, self.mode = "BGRA", "RGBA" + else: + raise OSError("Unsupported BMP compression (%d)" % file_info["compression"]) + + # --------------- Once the header is processed, process the palette/LUT + if self.mode == "P": # Paletted for 1, 4 and 8 bit images + + # ---------------------------------------------------- 1-bit images + if not (0 < file_info["colors"] <= 65536): + raise OSError("Unsupported BMP Palette size (%d)" % file_info["colors"]) + else: + padding = file_info["palette_padding"] + palette = read(padding * file_info["colors"]) + greyscale = True + indices = ( + (0, 255) + if file_info["colors"] == 2 + else list(range(file_info["colors"])) + ) + + # ----------------- Check if greyscale and ignore palette if so + for ind, val in enumerate(indices): + rgb = palette[ind * padding : ind * padding + 3] + if rgb != o8(val) * 3: + greyscale = False + + # ------- If all colors are grey, white or black, ditch palette + if greyscale: + self.mode = "1" if file_info["colors"] == 2 else "L" + raw_mode = self.mode + else: + self.mode = "P" + self.palette = ImagePalette.raw( + "BGRX" if padding == 4 else "BGR", palette + ) + + # ---------------------------- Finally set the tile data for the plugin + self.info["compression"] = file_info["compression"] + self.tile = [ + ( + "raw", + (0, 0, file_info["width"], file_info["height"]), + offset or self.fp.tell(), + ( + raw_mode, + ((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3), + file_info["direction"], + ), + ) + ] + + def _open(self): + """ Open file, check magic number and read header """ + # read 14 bytes: magic number, filesize, reserved, header final offset + head_data = self.fp.read(14) + # choke if the file does not have the required magic bytes + if not _accept(head_data): + raise SyntaxError("Not a BMP file") + # read the start position of the BMP image data (u32) + offset = i32(head_data[10:14]) + # load bitmap information (offset=raster info) + self._bitmap(offset=offset) + + +# ============================================================================= +# Image plugin for the DIB format (BMP alias) +# ============================================================================= +class DibImageFile(BmpImageFile): + + format = "DIB" + format_description = "Windows Bitmap" + + def _open(self): + self._bitmap() + + +# +# -------------------------------------------------------------------- +# Write BMP file + + +SAVE = { + "1": ("1", 1, 2), + "L": ("L", 8, 256), + "P": ("P", 8, 256), + "RGB": ("BGR", 24, 0), + "RGBA": ("BGRA", 32, 0), +} + + +def _dib_save(im, fp, filename): + _save(im, fp, filename, False) + + +def _save(im, fp, filename, bitmap_header=True): + try: + rawmode, bits, colors = SAVE[im.mode] + except KeyError as e: + raise OSError("cannot write mode %s as BMP" % im.mode) from e + + info = im.encoderinfo + + dpi = info.get("dpi", (96, 96)) + + # 1 meter == 39.3701 inches + ppm = tuple(map(lambda x: int(x * 39.3701 + 0.5), dpi)) + + stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) + header = 40 # or 64 for OS/2 version 2 + image = stride * im.size[1] + + # bitmap header + if bitmap_header: + offset = 14 + header + colors * 4 + file_size = offset + image + if file_size > 2 ** 32 - 1: + raise ValueError("File size is too large for the BMP format") + fp.write( + b"BM" # file type (magic) + + o32(file_size) # file size + + o32(0) # reserved + + o32(offset) # image data offset + ) + + # bitmap info header + fp.write( + o32(header) # info header size + + o32(im.size[0]) # width + + o32(im.size[1]) # height + + o16(1) # planes + + o16(bits) # depth + + o32(0) # compression (0=uncompressed) + + o32(image) # size of bitmap + + o32(ppm[0]) # resolution + + o32(ppm[1]) # resolution + + o32(colors) # colors used + + o32(colors) # colors important + ) + + fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) + + if im.mode == "1": + for i in (0, 255): + fp.write(o8(i) * 4) + elif im.mode == "L": + for i in range(256): + fp.write(o8(i) * 4) + elif im.mode == "P": + fp.write(im.im.getpalette("RGB", "BGRX")) + + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))]) + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(BmpImageFile.format, BmpImageFile, _accept) +Image.register_save(BmpImageFile.format, _save) + +Image.register_extension(BmpImageFile.format, ".bmp") + +Image.register_mime(BmpImageFile.format, "image/bmp") + +Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) +Image.register_save(DibImageFile.format, _dib_save) + +Image.register_extension(DibImageFile.format, ".dib") + +Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/venv/Lib/site-packages/PIL/BufrStubImagePlugin.py b/venv/Lib/site-packages/PIL/BufrStubImagePlugin.py new file mode 100644 index 0000000..48f21e1 --- /dev/null +++ b/venv/Lib/site-packages/PIL/BufrStubImagePlugin.py @@ -0,0 +1,73 @@ +# +# The Python Imaging Library +# $Id$ +# +# BUFR stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific BUFR image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix): + return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" + + +class BufrStubImageFile(ImageFile.StubImageFile): + + format = "BUFR" + format_description = "BUFR" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(4)): + raise SyntaxError("Not a BUFR file") + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self._size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise OSError("BUFR save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) +Image.register_save(BufrStubImageFile.format, _save) + +Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/venv/Lib/site-packages/PIL/ContainerIO.py b/venv/Lib/site-packages/PIL/ContainerIO.py new file mode 100644 index 0000000..45e80b3 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ContainerIO.py @@ -0,0 +1,120 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a class to read from a container file +# +# History: +# 1995-06-18 fl Created +# 1995-09-07 fl Added readline(), readlines() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +import io + + +class ContainerIO: + """ + A file object that provides read access to a part of an existing + file (for example a TAR file). + """ + + def __init__(self, file, offset, length): + """ + Create file object. + + :param file: Existing file. + :param offset: Start of region, in bytes. + :param length: Size of region, in bytes. + """ + self.fh = file + self.pos = 0 + self.offset = offset + self.length = length + self.fh.seek(offset) + + ## + # Always false. + + def isatty(self): + return False + + def seek(self, offset, mode=io.SEEK_SET): + """ + Move file pointer. + + :param offset: Offset in bytes. + :param mode: Starting position. Use 0 for beginning of region, 1 + for current offset, and 2 for end of region. You cannot move + the pointer outside the defined region. + """ + if mode == 1: + self.pos = self.pos + offset + elif mode == 2: + self.pos = self.length + offset + else: + self.pos = offset + # clamp + self.pos = max(0, min(self.pos, self.length)) + self.fh.seek(self.offset + self.pos) + + def tell(self): + """ + Get current file pointer. + + :returns: Offset from start of region, in bytes. + """ + return self.pos + + def read(self, n=0): + """ + Read data. + + :param n: Number of bytes to read. If omitted or zero, + read until end of region. + :returns: An 8-bit string. + """ + if n: + n = min(n, self.length - self.pos) + else: + n = self.length - self.pos + if not n: # EOF + return b"" if "b" in self.fh.mode else "" + self.pos = self.pos + n + return self.fh.read(n) + + def readline(self): + """ + Read a line of text. + + :returns: An 8-bit string. + """ + s = b"" if "b" in self.fh.mode else "" + newline_character = b"\n" if "b" in self.fh.mode else "\n" + while True: + c = self.read(1) + if not c: + break + s = s + c + if c == newline_character: + break + return s + + def readlines(self): + """ + Read multiple lines of text. + + :returns: A list of 8-bit strings. + """ + lines = [] + while True: + s = self.readline() + if not s: + break + lines.append(s) + return lines diff --git a/venv/Lib/site-packages/PIL/CurImagePlugin.py b/venv/Lib/site-packages/PIL/CurImagePlugin.py new file mode 100644 index 0000000..3a1b6d2 --- /dev/null +++ b/venv/Lib/site-packages/PIL/CurImagePlugin.py @@ -0,0 +1,74 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Cursor support for PIL +# +# notes: +# uses BmpImagePlugin.py to read the bitmap data. +# +# history: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from . import BmpImagePlugin, Image +from ._binary import i8, i16le as i16, i32le as i32 + +# +# -------------------------------------------------------------------- + + +def _accept(prefix): + return prefix[:4] == b"\0\0\2\0" + + +## +# Image plugin for Windows Cursor files. + + +class CurImageFile(BmpImagePlugin.BmpImageFile): + + format = "CUR" + format_description = "Windows Cursor" + + def _open(self): + + offset = self.fp.tell() + + # check magic + s = self.fp.read(6) + if not _accept(s): + raise SyntaxError("not a CUR file") + + # pick the largest cursor in the file + m = b"" + for i in range(i16(s[4:])): + s = self.fp.read(16) + if not m: + m = s + elif i8(s[0]) > i8(m[0]) and i8(s[1]) > i8(m[1]): + m = s + if not m: + raise TypeError("No cursors were found") + + # load as bitmap + self._bitmap(i32(m[12:]) + offset) + + # patch up the bitmap height + self._size = self.size[0], self.size[1] // 2 + d, e, o, a = self.tile[0] + self.tile[0] = d, (0, 0) + self.size, o, a + + return + + +# +# -------------------------------------------------------------------- + +Image.register_open(CurImageFile.format, CurImageFile, _accept) + +Image.register_extension(CurImageFile.format, ".cur") diff --git a/venv/Lib/site-packages/PIL/DcxImagePlugin.py b/venv/Lib/site-packages/PIL/DcxImagePlugin.py new file mode 100644 index 0000000..de21db8 --- /dev/null +++ b/venv/Lib/site-packages/PIL/DcxImagePlugin.py @@ -0,0 +1,89 @@ +# +# The Python Imaging Library. +# $Id$ +# +# DCX file handling +# +# DCX is a container file format defined by Intel, commonly used +# for fax applications. Each DCX file consists of a directory +# (a list of file offsets) followed by a set of (usually 1-bit) +# PCX files. +# +# History: +# 1995-09-09 fl Created +# 1996-03-20 fl Properly derived from PcxImageFile. +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2002-07-30 fl Fixed file handling +# +# Copyright (c) 1997-98 by Secret Labs AB. +# Copyright (c) 1995-96 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._binary import i32le as i32 +from .PcxImagePlugin import PcxImageFile + +MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? + + +def _accept(prefix): + return len(prefix) >= 4 and i32(prefix) == MAGIC + + +## +# Image plugin for the Intel DCX format. + + +class DcxImageFile(PcxImageFile): + + format = "DCX" + format_description = "Intel DCX" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # Header + s = self.fp.read(4) + if not _accept(s): + raise SyntaxError("not a DCX file") + + # Component directory + self._offset = [] + for i in range(1024): + offset = i32(self.fp.read(4)) + if not offset: + break + self._offset.append(offset) + + self.__fp = self.fp + self.frame = None + self.n_frames = len(self._offset) + self.is_animated = self.n_frames > 1 + self.seek(0) + + def seek(self, frame): + if not self._seek_check(frame): + return + self.frame = frame + self.fp = self.__fp + self.fp.seek(self._offset[frame]) + PcxImageFile._open(self) + + def tell(self): + return self.frame + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + +Image.register_open(DcxImageFile.format, DcxImageFile, _accept) + +Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/venv/Lib/site-packages/PIL/DdsImagePlugin.py b/venv/Lib/site-packages/PIL/DdsImagePlugin.py new file mode 100644 index 0000000..9ba6e0f --- /dev/null +++ b/venv/Lib/site-packages/PIL/DdsImagePlugin.py @@ -0,0 +1,178 @@ +""" +A Pillow loader for .dds files (S3TC-compressed aka DXTC) +Jerome Leclanche + +Documentation: + https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ +""" + +import struct +from io import BytesIO + +from . import Image, ImageFile + +# Magic ("DDS ") +DDS_MAGIC = 0x20534444 + +# DDS flags +DDSD_CAPS = 0x1 +DDSD_HEIGHT = 0x2 +DDSD_WIDTH = 0x4 +DDSD_PITCH = 0x8 +DDSD_PIXELFORMAT = 0x1000 +DDSD_MIPMAPCOUNT = 0x20000 +DDSD_LINEARSIZE = 0x80000 +DDSD_DEPTH = 0x800000 + +# DDS caps +DDSCAPS_COMPLEX = 0x8 +DDSCAPS_TEXTURE = 0x1000 +DDSCAPS_MIPMAP = 0x400000 + +DDSCAPS2_CUBEMAP = 0x200 +DDSCAPS2_CUBEMAP_POSITIVEX = 0x400 +DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800 +DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000 +DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000 +DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000 +DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000 +DDSCAPS2_VOLUME = 0x200000 + +# Pixel Format +DDPF_ALPHAPIXELS = 0x1 +DDPF_ALPHA = 0x2 +DDPF_FOURCC = 0x4 +DDPF_PALETTEINDEXED8 = 0x20 +DDPF_RGB = 0x40 +DDPF_LUMINANCE = 0x20000 + + +# dds.h + +DDS_FOURCC = DDPF_FOURCC +DDS_RGB = DDPF_RGB +DDS_RGBA = DDPF_RGB | DDPF_ALPHAPIXELS +DDS_LUMINANCE = DDPF_LUMINANCE +DDS_LUMINANCEA = DDPF_LUMINANCE | DDPF_ALPHAPIXELS +DDS_ALPHA = DDPF_ALPHA +DDS_PAL8 = DDPF_PALETTEINDEXED8 + +DDS_HEADER_FLAGS_TEXTURE = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT +DDS_HEADER_FLAGS_MIPMAP = DDSD_MIPMAPCOUNT +DDS_HEADER_FLAGS_VOLUME = DDSD_DEPTH +DDS_HEADER_FLAGS_PITCH = DDSD_PITCH +DDS_HEADER_FLAGS_LINEARSIZE = DDSD_LINEARSIZE + +DDS_HEIGHT = DDSD_HEIGHT +DDS_WIDTH = DDSD_WIDTH + +DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS_TEXTURE +DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS_COMPLEX | DDSCAPS_MIPMAP +DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS_COMPLEX + +DDS_CUBEMAP_POSITIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX +DDS_CUBEMAP_NEGATIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX +DDS_CUBEMAP_POSITIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY +DDS_CUBEMAP_NEGATIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY +DDS_CUBEMAP_POSITIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ +DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ + + +# DXT1 +DXT1_FOURCC = 0x31545844 + +# DXT3 +DXT3_FOURCC = 0x33545844 + +# DXT5 +DXT5_FOURCC = 0x35545844 + + +# dxgiformat.h + +DXGI_FORMAT_BC7_TYPELESS = 97 +DXGI_FORMAT_BC7_UNORM = 98 +DXGI_FORMAT_BC7_UNORM_SRGB = 99 + + +class DdsImageFile(ImageFile.ImageFile): + format = "DDS" + format_description = "DirectDraw Surface" + + def _open(self): + magic, header_size = struct.unpack(" 0: + s = fp.read(min(lengthfile, 100 * 1024)) + if not s: + break + lengthfile -= len(s) + f.write(s) + + # Build Ghostscript command + command = [ + "gs", + "-q", # quiet mode + "-g%dx%d" % size, # set output geometry (pixels) + "-r%fx%f" % res, # set input DPI (dots per inch) + "-dBATCH", # exit after processing + "-dNOPAUSE", # don't pause between pages + "-dSAFER", # safe mode + "-sDEVICE=ppmraw", # ppm driver + "-sOutputFile=%s" % outfile, # output file + # adjust for image origin + "-c", + "%d %d translate" % (-bbox[0], -bbox[1]), + "-f", + infile, # input file + # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) + "-c", + "showpage", + ] + + if gs_windows_binary is not None: + if not gs_windows_binary: + raise OSError("Unable to locate Ghostscript on paths") + command[0] = gs_windows_binary + + # push data through Ghostscript + try: + startupinfo = None + if sys.platform.startswith("win"): + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + subprocess.check_call(command, startupinfo=startupinfo) + out_im = Image.open(outfile) + out_im.load() + finally: + try: + os.unlink(outfile) + if infile_temp: + os.unlink(infile_temp) + except OSError: + pass + + im = out_im.im.copy() + out_im.close() + return im + + +class PSFile: + """ + Wrapper for bytesio object that treats either CR or LF as end of line. + """ + + def __init__(self, fp): + self.fp = fp + self.char = None + + def seek(self, offset, whence=io.SEEK_SET): + self.char = None + self.fp.seek(offset, whence) + + def readline(self): + s = self.char or b"" + self.char = None + + c = self.fp.read(1) + while c not in b"\r\n": + s = s + c + c = self.fp.read(1) + + self.char = self.fp.read(1) + # line endings can be 1 or 2 of \r \n, in either order + if self.char in b"\r\n": + self.char = None + + return s.decode("latin-1") + + +def _accept(prefix): + return prefix[:4] == b"%!PS" or (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5) + + +## +# Image plugin for Encapsulated Postscript. This plugin supports only +# a few variants of this format. + + +class EpsImageFile(ImageFile.ImageFile): + """EPS File Parser for the Python Imaging Library""" + + format = "EPS" + format_description = "Encapsulated Postscript" + + mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} + + def _open(self): + (length, offset) = self._find_offset(self.fp) + + # Rewrap the open file pointer in something that will + # convert line endings and decode to latin-1. + fp = PSFile(self.fp) + + # go to offset - start of "%!PS" + fp.seek(offset) + + box = None + + self.mode = "RGB" + self._size = 1, 1 # FIXME: huh? + + # + # Load EPS header + + s_raw = fp.readline() + s = s_raw.strip("\r\n") + + while s_raw: + if s: + if len(s) > 255: + raise SyntaxError("not an EPS file") + + try: + m = split.match(s) + except re.error as e: + raise SyntaxError("not an EPS file") from e + + if m: + k, v = m.group(1, 2) + self.info[k] = v + if k == "BoundingBox": + try: + # Note: The DSC spec says that BoundingBox + # fields should be integers, but some drivers + # put floating point values there anyway. + box = [int(float(i)) for i in v.split()] + self._size = box[2] - box[0], box[3] - box[1] + self.tile = [ + ("eps", (0, 0) + self.size, offset, (length, box)) + ] + except Exception: + pass + + else: + m = field.match(s) + if m: + k = m.group(1) + + if k == "EndComments": + break + if k[:8] == "PS-Adobe": + self.info[k[:8]] = k[9:] + else: + self.info[k] = "" + elif s[0] == "%": + # handle non-DSC Postscript comments that some + # tools mistakenly put in the Comments section + pass + else: + raise OSError("bad EPS header") + + s_raw = fp.readline() + s = s_raw.strip("\r\n") + + if s and s[:1] != "%": + break + + # + # Scan for an "ImageData" descriptor + + while s[:1] == "%": + + if len(s) > 255: + raise SyntaxError("not an EPS file") + + if s[:11] == "%ImageData:": + # Encoded bitmapped image. + x, y, bi, mo = s[11:].split(None, 7)[:4] + + if int(bi) != 8: + break + try: + self.mode = self.mode_map[int(mo)] + except ValueError: + break + + self._size = int(x), int(y) + return + + s = fp.readline().strip("\r\n") + if not s: + break + + if not box: + raise OSError("cannot determine EPS bounding box") + + def _find_offset(self, fp): + + s = fp.read(160) + + if s[:4] == b"%!PS": + # for HEAD without binary preview + fp.seek(0, io.SEEK_END) + length = fp.tell() + offset = 0 + elif i32(s[0:4]) == 0xC6D3D0C5: + # FIX for: Some EPS file not handled correctly / issue #302 + # EPS can contain binary data + # or start directly with latin coding + # more info see: + # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf + offset = i32(s[4:8]) + length = i32(s[8:12]) + else: + raise SyntaxError("not an EPS file") + + return (length, offset) + + def load(self, scale=1): + # Load EPS via Ghostscript + if not self.tile: + return + self.im = Ghostscript(self.tile, self.size, self.fp, scale) + self.mode = self.im.mode + self._size = self.im.size + self.tile = [] + + def load_seek(self, *args, **kwargs): + # we can't incrementally load, so force ImageFile.parser to + # use our custom load method by defining this method. + pass + + +# +# -------------------------------------------------------------------- + + +def _save(im, fp, filename, eps=1): + """EPS Writer for the Python Imaging Library.""" + + # + # make sure image data is available + im.load() + + # + # determine postscript image mode + if im.mode == "L": + operator = (8, 1, "image") + elif im.mode == "RGB": + operator = (8, 3, "false 3 colorimage") + elif im.mode == "CMYK": + operator = (8, 4, "false 4 colorimage") + else: + raise ValueError("image mode is not supported") + + base_fp = fp + wrapped_fp = False + if fp != sys.stdout: + fp = io.TextIOWrapper(fp, encoding="latin-1") + wrapped_fp = True + + try: + if eps: + # + # write EPS header + fp.write("%!PS-Adobe-3.0 EPSF-3.0\n") + fp.write("%%Creator: PIL 0.1 EpsEncode\n") + # fp.write("%%CreationDate: %s"...) + fp.write("%%%%BoundingBox: 0 0 %d %d\n" % im.size) + fp.write("%%Pages: 1\n") + fp.write("%%EndComments\n") + fp.write("%%Page: 1 1\n") + fp.write("%%ImageData: %d %d " % im.size) + fp.write('%d %d 0 1 1 "%s"\n' % operator) + + # + # image header + fp.write("gsave\n") + fp.write("10 dict begin\n") + fp.write("/buf %d string def\n" % (im.size[0] * operator[1])) + fp.write("%d %d scale\n" % im.size) + fp.write("%d %d 8\n" % im.size) # <= bits + fp.write("[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) + fp.write("{ currentfile buf readhexstring pop } bind\n") + fp.write(operator[2] + "\n") + if hasattr(fp, "flush"): + fp.flush() + + ImageFile._save(im, base_fp, [("eps", (0, 0) + im.size, 0, None)]) + + fp.write("\n%%%%EndBinary\n") + fp.write("grestore end\n") + if hasattr(fp, "flush"): + fp.flush() + finally: + if wrapped_fp: + fp.detach() + + +# +# -------------------------------------------------------------------- + + +Image.register_open(EpsImageFile.format, EpsImageFile, _accept) + +Image.register_save(EpsImageFile.format, _save) + +Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) + +Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/venv/Lib/site-packages/PIL/ExifTags.py b/venv/Lib/site-packages/PIL/ExifTags.py new file mode 100644 index 0000000..f1c037e --- /dev/null +++ b/venv/Lib/site-packages/PIL/ExifTags.py @@ -0,0 +1,318 @@ +# +# The Python Imaging Library. +# $Id$ +# +# EXIF tags +# +# Copyright (c) 2003 by Secret Labs AB +# +# See the README file for information on usage and redistribution. +# + +""" +This module provides constants and clear-text names for various +well-known EXIF tags. +""" + + +TAGS = { + # possibly incomplete + 0x000B: "ProcessingSoftware", + 0x00FE: "NewSubfileType", + 0x00FF: "SubfileType", + 0x0100: "ImageWidth", + 0x0101: "ImageLength", + 0x0102: "BitsPerSample", + 0x0103: "Compression", + 0x0106: "PhotometricInterpretation", + 0x0107: "Thresholding", + 0x0108: "CellWidth", + 0x0109: "CellLength", + 0x010A: "FillOrder", + 0x010D: "DocumentName", + 0x010E: "ImageDescription", + 0x010F: "Make", + 0x0110: "Model", + 0x0111: "StripOffsets", + 0x0112: "Orientation", + 0x0115: "SamplesPerPixel", + 0x0116: "RowsPerStrip", + 0x0117: "StripByteCounts", + 0x0118: "MinSampleValue", + 0x0119: "MaxSampleValue", + 0x011A: "XResolution", + 0x011B: "YResolution", + 0x011C: "PlanarConfiguration", + 0x011D: "PageName", + 0x0120: "FreeOffsets", + 0x0121: "FreeByteCounts", + 0x0122: "GrayResponseUnit", + 0x0123: "GrayResponseCurve", + 0x0124: "T4Options", + 0x0125: "T6Options", + 0x0128: "ResolutionUnit", + 0x0129: "PageNumber", + 0x012D: "TransferFunction", + 0x0131: "Software", + 0x0132: "DateTime", + 0x013B: "Artist", + 0x013C: "HostComputer", + 0x013D: "Predictor", + 0x013E: "WhitePoint", + 0x013F: "PrimaryChromaticities", + 0x0140: "ColorMap", + 0x0141: "HalftoneHints", + 0x0142: "TileWidth", + 0x0143: "TileLength", + 0x0144: "TileOffsets", + 0x0145: "TileByteCounts", + 0x014A: "SubIFDs", + 0x014C: "InkSet", + 0x014D: "InkNames", + 0x014E: "NumberOfInks", + 0x0150: "DotRange", + 0x0151: "TargetPrinter", + 0x0152: "ExtraSamples", + 0x0153: "SampleFormat", + 0x0154: "SMinSampleValue", + 0x0155: "SMaxSampleValue", + 0x0156: "TransferRange", + 0x0157: "ClipPath", + 0x0158: "XClipPathUnits", + 0x0159: "YClipPathUnits", + 0x015A: "Indexed", + 0x015B: "JPEGTables", + 0x015F: "OPIProxy", + 0x0200: "JPEGProc", + 0x0201: "JpegIFOffset", + 0x0202: "JpegIFByteCount", + 0x0203: "JpegRestartInterval", + 0x0205: "JpegLosslessPredictors", + 0x0206: "JpegPointTransforms", + 0x0207: "JpegQTables", + 0x0208: "JpegDCTables", + 0x0209: "JpegACTables", + 0x0211: "YCbCrCoefficients", + 0x0212: "YCbCrSubSampling", + 0x0213: "YCbCrPositioning", + 0x0214: "ReferenceBlackWhite", + 0x02BC: "XMLPacket", + 0x1000: "RelatedImageFileFormat", + 0x1001: "RelatedImageWidth", + 0x1002: "RelatedImageLength", + 0x4746: "Rating", + 0x4749: "RatingPercent", + 0x800D: "ImageID", + 0x828D: "CFARepeatPatternDim", + 0x828E: "CFAPattern", + 0x828F: "BatteryLevel", + 0x8298: "Copyright", + 0x829A: "ExposureTime", + 0x829D: "FNumber", + 0x83BB: "IPTCNAA", + 0x8649: "ImageResources", + 0x8769: "ExifOffset", + 0x8773: "InterColorProfile", + 0x8822: "ExposureProgram", + 0x8824: "SpectralSensitivity", + 0x8825: "GPSInfo", + 0x8827: "ISOSpeedRatings", + 0x8828: "OECF", + 0x8829: "Interlace", + 0x882A: "TimeZoneOffset", + 0x882B: "SelfTimerMode", + 0x9000: "ExifVersion", + 0x9003: "DateTimeOriginal", + 0x9004: "DateTimeDigitized", + 0x9101: "ComponentsConfiguration", + 0x9102: "CompressedBitsPerPixel", + 0x9201: "ShutterSpeedValue", + 0x9202: "ApertureValue", + 0x9203: "BrightnessValue", + 0x9204: "ExposureBiasValue", + 0x9205: "MaxApertureValue", + 0x9206: "SubjectDistance", + 0x9207: "MeteringMode", + 0x9208: "LightSource", + 0x9209: "Flash", + 0x920A: "FocalLength", + 0x920B: "FlashEnergy", + 0x920C: "SpatialFrequencyResponse", + 0x920D: "Noise", + 0x9211: "ImageNumber", + 0x9212: "SecurityClassification", + 0x9213: "ImageHistory", + 0x9214: "SubjectLocation", + 0x9215: "ExposureIndex", + 0x9216: "TIFF/EPStandardID", + 0x927C: "MakerNote", + 0x9286: "UserComment", + 0x9290: "SubsecTime", + 0x9291: "SubsecTimeOriginal", + 0x9292: "SubsecTimeDigitized", + 0x9400: "AmbientTemperature", + 0x9401: "Humidity", + 0x9402: "Pressure", + 0x9403: "WaterDepth", + 0x9404: "Acceleration", + 0x9405: "CameraElevationAngle", + 0x9C9B: "XPTitle", + 0x9C9C: "XPComment", + 0x9C9D: "XPAuthor", + 0x9C9E: "XPKeywords", + 0x9C9F: "XPSubject", + 0xA000: "FlashPixVersion", + 0xA001: "ColorSpace", + 0xA002: "ExifImageWidth", + 0xA003: "ExifImageHeight", + 0xA004: "RelatedSoundFile", + 0xA005: "ExifInteroperabilityOffset", + 0xA20B: "FlashEnergy", + 0xA20C: "SpatialFrequencyResponse", + 0xA20E: "FocalPlaneXResolution", + 0xA20F: "FocalPlaneYResolution", + 0xA210: "FocalPlaneResolutionUnit", + 0xA214: "SubjectLocation", + 0xA215: "ExposureIndex", + 0xA217: "SensingMethod", + 0xA300: "FileSource", + 0xA301: "SceneType", + 0xA302: "CFAPattern", + 0xA401: "CustomRendered", + 0xA402: "ExposureMode", + 0xA403: "WhiteBalance", + 0xA404: "DigitalZoomRatio", + 0xA405: "FocalLengthIn35mmFilm", + 0xA406: "SceneCaptureType", + 0xA407: "GainControl", + 0xA408: "Contrast", + 0xA409: "Saturation", + 0xA40A: "Sharpness", + 0xA40B: "DeviceSettingDescription", + 0xA40C: "SubjectDistanceRange", + 0xA420: "ImageUniqueID", + 0xA430: "CameraOwnerName", + 0xA431: "BodySerialNumber", + 0xA432: "LensSpecification", + 0xA433: "LensMake", + 0xA434: "LensModel", + 0xA435: "LensSerialNumber", + 0xA500: "Gamma", + 0xC4A5: "PrintImageMatching", + 0xC612: "DNGVersion", + 0xC613: "DNGBackwardVersion", + 0xC614: "UniqueCameraModel", + 0xC615: "LocalizedCameraModel", + 0xC616: "CFAPlaneColor", + 0xC617: "CFALayout", + 0xC618: "LinearizationTable", + 0xC619: "BlackLevelRepeatDim", + 0xC61A: "BlackLevel", + 0xC61B: "BlackLevelDeltaH", + 0xC61C: "BlackLevelDeltaV", + 0xC61D: "WhiteLevel", + 0xC61E: "DefaultScale", + 0xC61F: "DefaultCropOrigin", + 0xC620: "DefaultCropSize", + 0xC621: "ColorMatrix1", + 0xC622: "ColorMatrix2", + 0xC623: "CameraCalibration1", + 0xC624: "CameraCalibration2", + 0xC625: "ReductionMatrix1", + 0xC626: "ReductionMatrix2", + 0xC627: "AnalogBalance", + 0xC628: "AsShotNeutral", + 0xC629: "AsShotWhiteXY", + 0xC62A: "BaselineExposure", + 0xC62B: "BaselineNoise", + 0xC62C: "BaselineSharpness", + 0xC62D: "BayerGreenSplit", + 0xC62E: "LinearResponseLimit", + 0xC62F: "CameraSerialNumber", + 0xC630: "LensInfo", + 0xC631: "ChromaBlurRadius", + 0xC632: "AntiAliasStrength", + 0xC633: "ShadowScale", + 0xC634: "DNGPrivateData", + 0xC635: "MakerNoteSafety", + 0xC65A: "CalibrationIlluminant1", + 0xC65B: "CalibrationIlluminant2", + 0xC65C: "BestQualityScale", + 0xC65D: "RawDataUniqueID", + 0xC68B: "OriginalRawFileName", + 0xC68C: "OriginalRawFileData", + 0xC68D: "ActiveArea", + 0xC68E: "MaskedAreas", + 0xC68F: "AsShotICCProfile", + 0xC690: "AsShotPreProfileMatrix", + 0xC691: "CurrentICCProfile", + 0xC692: "CurrentPreProfileMatrix", + 0xC6BF: "ColorimetricReference", + 0xC6F3: "CameraCalibrationSignature", + 0xC6F4: "ProfileCalibrationSignature", + 0xC6F6: "AsShotProfileName", + 0xC6F7: "NoiseReductionApplied", + 0xC6F8: "ProfileName", + 0xC6F9: "ProfileHueSatMapDims", + 0xC6FA: "ProfileHueSatMapData1", + 0xC6FB: "ProfileHueSatMapData2", + 0xC6FC: "ProfileToneCurve", + 0xC6FD: "ProfileEmbedPolicy", + 0xC6FE: "ProfileCopyright", + 0xC714: "ForwardMatrix1", + 0xC715: "ForwardMatrix2", + 0xC716: "PreviewApplicationName", + 0xC717: "PreviewApplicationVersion", + 0xC718: "PreviewSettingsName", + 0xC719: "PreviewSettingsDigest", + 0xC71A: "PreviewColorSpace", + 0xC71B: "PreviewDateTime", + 0xC71C: "RawImageDigest", + 0xC71D: "OriginalRawFileDigest", + 0xC71E: "SubTileBlockSize", + 0xC71F: "RowInterleaveFactor", + 0xC725: "ProfileLookTableDims", + 0xC726: "ProfileLookTableData", + 0xC740: "OpcodeList1", + 0xC741: "OpcodeList2", + 0xC74E: "OpcodeList3", + 0xC761: "NoiseProfile", +} +"""Maps EXIF tags to tag names.""" + + +GPSTAGS = { + 0: "GPSVersionID", + 1: "GPSLatitudeRef", + 2: "GPSLatitude", + 3: "GPSLongitudeRef", + 4: "GPSLongitude", + 5: "GPSAltitudeRef", + 6: "GPSAltitude", + 7: "GPSTimeStamp", + 8: "GPSSatellites", + 9: "GPSStatus", + 10: "GPSMeasureMode", + 11: "GPSDOP", + 12: "GPSSpeedRef", + 13: "GPSSpeed", + 14: "GPSTrackRef", + 15: "GPSTrack", + 16: "GPSImgDirectionRef", + 17: "GPSImgDirection", + 18: "GPSMapDatum", + 19: "GPSDestLatitudeRef", + 20: "GPSDestLatitude", + 21: "GPSDestLongitudeRef", + 22: "GPSDestLongitude", + 23: "GPSDestBearingRef", + 24: "GPSDestBearing", + 25: "GPSDestDistanceRef", + 26: "GPSDestDistance", + 27: "GPSProcessingMethod", + 28: "GPSAreaInformation", + 29: "GPSDateStamp", + 30: "GPSDifferential", + 31: "GPSHPositioningError", +} +"""Maps EXIF GPS tags to tag names.""" diff --git a/venv/Lib/site-packages/PIL/FitsStubImagePlugin.py b/venv/Lib/site-packages/PIL/FitsStubImagePlugin.py new file mode 100644 index 0000000..c2ce865 --- /dev/null +++ b/venv/Lib/site-packages/PIL/FitsStubImagePlugin.py @@ -0,0 +1,76 @@ +# +# The Python Imaging Library +# $Id$ +# +# FITS stub adapter +# +# Copyright (c) 1998-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific FITS image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix): + return prefix[:6] == b"SIMPLE" + + +class FITSStubImageFile(ImageFile.StubImageFile): + + format = "FITS" + format_description = "FITS" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(6)): + raise SyntaxError("Not a FITS file") + + # FIXME: add more sanity checks here; mandatory header items + # include SIMPLE, BITPIX, NAXIS, etc. + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self._size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise OSError("FITS save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(FITSStubImageFile.format, FITSStubImageFile, _accept) +Image.register_save(FITSStubImageFile.format, _save) + +Image.register_extensions(FITSStubImageFile.format, [".fit", ".fits"]) diff --git a/venv/Lib/site-packages/PIL/FliImagePlugin.py b/venv/Lib/site-packages/PIL/FliImagePlugin.py new file mode 100644 index 0000000..f09d62c --- /dev/null +++ b/venv/Lib/site-packages/PIL/FliImagePlugin.py @@ -0,0 +1,169 @@ +# +# The Python Imaging Library. +# $Id$ +# +# FLI/FLC file handling. +# +# History: +# 95-09-01 fl Created +# 97-01-03 fl Fixed parser, setup decoder tile +# 98-07-15 fl Renamed offset attribute to avoid name clash +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, i32le as i32, o8 + +# +# decoder + + +def _accept(prefix): + return len(prefix) >= 6 and i16(prefix[4:6]) in [0xAF11, 0xAF12] + + +## +# Image plugin for the FLI/FLC animation format. Use the seek +# method to load individual frames. + + +class FliImageFile(ImageFile.ImageFile): + + format = "FLI" + format_description = "Autodesk FLI/FLC Animation" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # HEAD + s = self.fp.read(128) + if not ( + _accept(s) + and i16(s[14:16]) in [0, 3] # flags + and s[20:22] == b"\x00\x00" # reserved + ): + raise SyntaxError("not an FLI/FLC file") + + # frames + self.n_frames = i16(s[6:8]) + self.is_animated = self.n_frames > 1 + + # image characteristics + self.mode = "P" + self._size = i16(s[8:10]), i16(s[10:12]) + + # animation speed + duration = i32(s[16:20]) + magic = i16(s[4:6]) + if magic == 0xAF11: + duration = (duration * 1000) // 70 + self.info["duration"] = duration + + # look for palette + palette = [(a, a, a) for a in range(256)] + + s = self.fp.read(16) + + self.__offset = 128 + + if i16(s[4:6]) == 0xF100: + # prefix chunk; ignore it + self.__offset = self.__offset + i32(s) + s = self.fp.read(16) + + if i16(s[4:6]) == 0xF1FA: + # look for palette chunk + s = self.fp.read(6) + if i16(s[4:6]) == 11: + self._palette(palette, 2) + elif i16(s[4:6]) == 4: + self._palette(palette, 0) + + palette = [o8(r) + o8(g) + o8(b) for (r, g, b) in palette] + self.palette = ImagePalette.raw("RGB", b"".join(palette)) + + # set things up to decode first frame + self.__frame = -1 + self.__fp = self.fp + self.__rewind = self.fp.tell() + self.seek(0) + + def _palette(self, palette, shift): + # load palette + + i = 0 + for e in range(i16(self.fp.read(2))): + s = self.fp.read(2) + i = i + i8(s[0]) + n = i8(s[1]) + if n == 0: + n = 256 + s = self.fp.read(n * 3) + for n in range(0, len(s), 3): + r = i8(s[n]) << shift + g = i8(s[n + 1]) << shift + b = i8(s[n + 2]) << shift + palette[i] = (r, g, b) + i += 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0) + + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + + def _seek(self, frame): + if frame == 0: + self.__frame = -1 + self.__fp.seek(self.__rewind) + self.__offset = 128 + else: + # ensure that the previous frame was loaded + self.load() + + if frame != self.__frame + 1: + raise ValueError("cannot seek to frame %d" % frame) + self.__frame = frame + + # move to next frame + self.fp = self.__fp + self.fp.seek(self.__offset) + + s = self.fp.read(4) + if not s: + raise EOFError + + framesize = i32(s) + + self.decodermaxblock = framesize + self.tile = [("fli", (0, 0) + self.size, self.__offset, None)] + + self.__offset += framesize + + def tell(self): + return self.__frame + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + +# +# registry + +Image.register_open(FliImageFile.format, FliImageFile, _accept) + +Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/venv/Lib/site-packages/PIL/FontFile.py b/venv/Lib/site-packages/PIL/FontFile.py new file mode 100644 index 0000000..3ebd907 --- /dev/null +++ b/venv/Lib/site-packages/PIL/FontFile.py @@ -0,0 +1,111 @@ +# +# The Python Imaging Library +# $Id$ +# +# base class for raster font file parsers +# +# history: +# 1997-06-05 fl created +# 1997-08-19 fl restrict image width +# +# Copyright (c) 1997-1998 by Secret Labs AB +# Copyright (c) 1997-1998 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +import os + +from . import Image, _binary + +WIDTH = 800 + + +def puti16(fp, values): + """Write network order (big-endian) 16-bit sequence""" + for v in values: + if v < 0: + v += 65536 + fp.write(_binary.o16be(v)) + + +class FontFile: + """Base class for raster font file handlers.""" + + bitmap = None + + def __init__(self): + + self.info = {} + self.glyph = [None] * 256 + + def __getitem__(self, ix): + return self.glyph[ix] + + def compile(self): + """Create metrics and bitmap""" + + if self.bitmap: + return + + # create bitmap large enough to hold all data + h = w = maxwidth = 0 + lines = 1 + for glyph in self: + if glyph: + d, dst, src, im = glyph + h = max(h, src[3] - src[1]) + w = w + (src[2] - src[0]) + if w > WIDTH: + lines += 1 + w = src[2] - src[0] + maxwidth = max(maxwidth, w) + + xsize = maxwidth + ysize = lines * h + + if xsize == 0 and ysize == 0: + return "" + + self.ysize = h + + # paste glyphs into bitmap + self.bitmap = Image.new("1", (xsize, ysize)) + self.metrics = [None] * 256 + x = y = 0 + for i in range(256): + glyph = self[i] + if glyph: + d, dst, src, im = glyph + xx = src[2] - src[0] + # yy = src[3] - src[1] + x0, y0 = x, y + x = x + xx + if x > WIDTH: + x, y = 0, y + h + x0, y0 = x, y + x = xx + s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 + self.bitmap.paste(im.crop(src), s) + self.metrics[i] = d, dst, s + + def save(self, filename): + """Save font""" + + self.compile() + + # font data + self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") + + # font metrics + with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: + fp.write(b"PILfont\n") + fp.write((";;;;;;%d;\n" % self.ysize).encode("ascii")) # HACK!!! + fp.write(b"DATA\n") + for id in range(256): + m = self.metrics[id] + if not m: + puti16(fp, [0] * 10) + else: + puti16(fp, m[0] + m[1] + m[2]) diff --git a/venv/Lib/site-packages/PIL/FpxImagePlugin.py b/venv/Lib/site-packages/PIL/FpxImagePlugin.py new file mode 100644 index 0000000..bbee9e2 --- /dev/null +++ b/venv/Lib/site-packages/PIL/FpxImagePlugin.py @@ -0,0 +1,242 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library. +# $Id$ +# +# FlashPix support for PIL +# +# History: +# 97-01-25 fl Created (reads uncompressed RGB images only) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +import olefile + +from . import Image, ImageFile +from ._binary import i8, i32le as i32 + +# we map from colour field tuples to (mode, rawmode) descriptors +MODES = { + # opacity + (0x00007FFE): ("A", "L"), + # monochrome + (0x00010000,): ("L", "L"), + (0x00018000, 0x00017FFE): ("RGBA", "LA"), + # photo YCC + (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), + (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"), + # standard RGB (NIFRGB) + (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), + (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"), +} + + +# +# -------------------------------------------------------------------- + + +def _accept(prefix): + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for the FlashPix images. + + +class FpxImageFile(ImageFile.ImageFile): + + format = "FPX" + format_description = "FlashPix" + + def _open(self): + # + # read the OLE directory and see if this is a likely + # to be a FlashPix file + + try: + self.ole = olefile.OleFileIO(self.fp) + except OSError as e: + raise SyntaxError("not an FPX file; invalid OLE file") from e + + if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": + raise SyntaxError("not an FPX file; bad root CLSID") + + self._open_index(1) + + def _open_index(self, index=1): + # + # get the Image Contents Property Set + + prop = self.ole.getproperties( + ["Data Object Store %06d" % index, "\005Image Contents"] + ) + + # size (highest resolution) + + self._size = prop[0x1000002], prop[0x1000003] + + size = max(self.size) + i = 1 + while size > 64: + size = size / 2 + i += 1 + self.maxid = i - 1 + + # mode. instead of using a single field for this, flashpix + # requires you to specify the mode for each channel in each + # resolution subimage, and leaves it to the decoder to make + # sure that they all match. for now, we'll cheat and assume + # that this is always the case. + + id = self.maxid << 16 + + s = prop[0x2000002 | id] + + colors = [] + bands = i32(s, 4) + if bands > 4: + raise OSError("Invalid number of bands") + for i in range(bands): + # note: for now, we ignore the "uncalibrated" flag + colors.append(i32(s, 8 + i * 4) & 0x7FFFFFFF) + + self.mode, self.rawmode = MODES[tuple(colors)] + + # load JPEG tables, if any + self.jpeg = {} + for i in range(256): + id = 0x3000001 | (i << 16) + if id in prop: + self.jpeg[i] = prop[id] + + self._open_subimage(1, self.maxid) + + def _open_subimage(self, index=1, subimage=0): + # + # setup tile descriptors for a given subimage + + stream = [ + "Data Object Store %06d" % index, + "Resolution %04d" % subimage, + "Subimage 0000 Header", + ] + + fp = self.ole.openstream(stream) + + # skip prefix + fp.read(28) + + # header stream + s = fp.read(36) + + size = i32(s, 4), i32(s, 8) + # tilecount = i32(s, 12) + tilesize = i32(s, 16), i32(s, 20) + # channels = i32(s, 24) + offset = i32(s, 28) + length = i32(s, 32) + + if size != self.size: + raise OSError("subimage mismatch") + + # get tile descriptors + fp.seek(28 + offset) + s = fp.read(i32(s, 12) * length) + + x = y = 0 + xsize, ysize = size + xtile, ytile = tilesize + self.tile = [] + + for i in range(0, len(s), length): + + compression = i32(s, i + 8) + + if compression == 0: + self.tile.append( + ( + "raw", + (x, y, x + xtile, y + ytile), + i32(s, i) + 28, + (self.rawmode), + ) + ) + + elif compression == 1: + + # FIXME: the fill decoder is not implemented + self.tile.append( + ( + "fill", + (x, y, x + xtile, y + ytile), + i32(s, i) + 28, + (self.rawmode, s[12:16]), + ) + ) + + elif compression == 2: + + internal_color_conversion = i8(s[14]) + jpeg_tables = i8(s[15]) + rawmode = self.rawmode + + if internal_color_conversion: + # The image is stored as usual (usually YCbCr). + if rawmode == "RGBA": + # For "RGBA", data is stored as YCbCrA based on + # negative RGB. The following trick works around + # this problem : + jpegmode, rawmode = "YCbCrK", "CMYK" + else: + jpegmode = None # let the decoder decide + + else: + # The image is stored as defined by rawmode + jpegmode = rawmode + + self.tile.append( + ( + "jpeg", + (x, y, x + xtile, y + ytile), + i32(s, i) + 28, + (rawmode, jpegmode), + ) + ) + + # FIXME: jpeg tables are tile dependent; the prefix + # data must be placed in the tile descriptor itself! + + if jpeg_tables: + self.tile_prefix = self.jpeg[jpeg_tables] + + else: + raise OSError("unknown/invalid compression") + + x = x + xtile + if x >= xsize: + x, y = 0, y + ytile + if y >= ysize: + break # isn't really required + + self.stream = stream + self.fp = None + + def load(self): + + if not self.fp: + self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) + + return ImageFile.ImageFile.load(self) + + +# +# -------------------------------------------------------------------- + + +Image.register_open(FpxImageFile.format, FpxImageFile, _accept) + +Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/venv/Lib/site-packages/PIL/FtexImagePlugin.py b/venv/Lib/site-packages/PIL/FtexImagePlugin.py new file mode 100644 index 0000000..096ccac --- /dev/null +++ b/venv/Lib/site-packages/PIL/FtexImagePlugin.py @@ -0,0 +1,106 @@ +""" +A Pillow loader for .ftc and .ftu files (FTEX) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 + +The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a +packed custom format called FTEX. This file format uses file extensions FTC +and FTU. +* FTC files are compressed textures (using standard texture compression). +* FTU files are not compressed. +Texture File Format +The FTC and FTU texture files both use the same format. This +has the following structure: +{header} +{format_directory} +{data} +Where: +{header} = { + u32:magic, + u32:version, + u32:width, + u32:height, + u32:mipmap_count, + u32:format_count +} + +* The "magic" number is "FTEX". +* "width" and "height" are the dimensions of the texture. +* "mipmap_count" is the number of mipmaps in the texture. +* "format_count" is the number of texture formats (different versions of the +same texture) in this file. + +{format_directory} = format_count * { u32:format, u32:where } + +The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB +uncompressed textures. +The texture data for a format starts at the position "where" in the file. + +Each set of texture data in the file has the following structure: +{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } +* "mipmap_size" is the number of bytes in that mip level. For compressed +textures this is the size of the texture data compressed with DXT1. For 24 bit +uncompressed textures, this is 3 * width * height. Following this are the image +bytes for that mipmap level. + +Note: All data is stored in little-Endian (Intel) byte order. +""" + +import struct +from io import BytesIO + +from . import Image, ImageFile + +MAGIC = b"FTEX" +FORMAT_DXT1 = 0 +FORMAT_UNCOMPRESSED = 1 + + +class FtexImageFile(ImageFile.ImageFile): + format = "FTEX" + format_description = "Texture File Format (IW2:EOC)" + + def _open(self): + struct.unpack("= 8 and i32(prefix[:4]) >= 20 and i32(prefix[4:8]) in (1, 2) + + +## +# Image plugin for the GIMP brush format. + + +class GbrImageFile(ImageFile.ImageFile): + + format = "GBR" + format_description = "GIMP brush file" + + def _open(self): + header_size = i32(self.fp.read(4)) + version = i32(self.fp.read(4)) + if header_size < 20: + raise SyntaxError("not a GIMP brush") + if version not in (1, 2): + raise SyntaxError("Unsupported GIMP brush version: %s" % version) + + width = i32(self.fp.read(4)) + height = i32(self.fp.read(4)) + color_depth = i32(self.fp.read(4)) + if width <= 0 or height <= 0: + raise SyntaxError("not a GIMP brush") + if color_depth not in (1, 4): + raise SyntaxError("Unsupported GIMP brush color depth: %s" % color_depth) + + if version == 1: + comment_length = header_size - 20 + else: + comment_length = header_size - 28 + magic_number = self.fp.read(4) + if magic_number != b"GIMP": + raise SyntaxError("not a GIMP brush, bad magic number") + self.info["spacing"] = i32(self.fp.read(4)) + + comment = self.fp.read(comment_length)[:-1] + + if color_depth == 1: + self.mode = "L" + else: + self.mode = "RGBA" + + self._size = width, height + + self.info["comment"] = comment + + # Image might not be small + Image._decompression_bomb_check(self.size) + + # Data is an uncompressed block of w * h * bytes/pixel + self._data_size = width * height * color_depth + + def load(self): + if self.im: + # Already loaded + return + + self.im = Image.core.new(self.mode, self.size) + self.frombytes(self.fp.read(self._data_size)) + + +# +# registry + + +Image.register_open(GbrImageFile.format, GbrImageFile, _accept) +Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/venv/Lib/site-packages/PIL/GdImageFile.py b/venv/Lib/site-packages/PIL/GdImageFile.py new file mode 100644 index 0000000..0c4574f --- /dev/null +++ b/venv/Lib/site-packages/PIL/GdImageFile.py @@ -0,0 +1,89 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GD file handling +# +# History: +# 1996-04-12 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +""" +.. note:: + This format cannot be automatically recognized, so the + class is not registered for use with :py:func:`PIL.Image.open()`. To open a + gd file, use the :py:func:`PIL.GdImageFile.open()` function instead. + +.. warning:: + THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This + implementation is provided for convenience and demonstrational + purposes only. +""" + + +from . import ImageFile, ImagePalette, UnidentifiedImageError +from ._binary import i8, i16be as i16, i32be as i32 + + +class GdImageFile(ImageFile.ImageFile): + """ + Image plugin for the GD uncompressed format. Note that this format + is not supported by the standard :py:func:`PIL.Image.open()` function. To use + this plugin, you have to import the :py:mod:`PIL.GdImageFile` module and + use the :py:func:`PIL.GdImageFile.open()` function. + """ + + format = "GD" + format_description = "GD uncompressed images" + + def _open(self): + + # Header + s = self.fp.read(1037) + + if not i16(s[:2]) in [65534, 65535]: + raise SyntaxError("Not a valid GD 2.x .gd file") + + self.mode = "L" # FIXME: "P" + self._size = i16(s[2:4]), i16(s[4:6]) + + trueColor = i8(s[6]) + trueColorOffset = 2 if trueColor else 0 + + # transparency index + tindex = i32(s[7 + trueColorOffset : 7 + trueColorOffset + 4]) + if tindex < 256: + self.info["transparency"] = tindex + + self.palette = ImagePalette.raw( + "XBGR", s[7 + trueColorOffset + 4 : 7 + trueColorOffset + 4 + 256 * 4] + ) + + self.tile = [ + ("raw", (0, 0) + self.size, 7 + trueColorOffset + 4 + 256 * 4, ("L", 0, 1)) + ] + + +def open(fp, mode="r"): + """ + Load texture from a GD image file. + + :param filename: GD file name, or an opened file handle. + :param mode: Optional mode. In this version, if the mode argument + is given, it must be "r". + :returns: An image instance. + :raises OSError: If the image could not be read. + """ + if mode != "r": + raise ValueError("bad mode") + + try: + return GdImageFile(fp) + except SyntaxError as e: + raise UnidentifiedImageError("cannot identify this image file") from e diff --git a/venv/Lib/site-packages/PIL/GifImagePlugin.py b/venv/Lib/site-packages/PIL/GifImagePlugin.py new file mode 100644 index 0000000..653051b --- /dev/null +++ b/venv/Lib/site-packages/PIL/GifImagePlugin.py @@ -0,0 +1,885 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GIF file handling +# +# History: +# 1995-09-01 fl Created +# 1996-12-14 fl Added interlace support +# 1996-12-30 fl Added animation support +# 1997-01-05 fl Added write support, fixed local colour map bug +# 1997-02-23 fl Make sure to load raster data in getdata() +# 1997-07-05 fl Support external decoder (0.4) +# 1998-07-09 fl Handle all modes when saving (0.5) +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) +# 2001-04-17 fl Added palette optimization (0.7) +# 2002-06-06 fl Added transparency support for save (0.8) +# 2004-02-24 fl Disable interlacing for small images +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import itertools +import math +import os +import subprocess + +from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence +from ._binary import i8, i16le as i16, o8, o16le as o16 + +# -------------------------------------------------------------------- +# Identify/read GIF files + + +def _accept(prefix): + return prefix[:6] in [b"GIF87a", b"GIF89a"] + + +## +# Image plugin for GIF images. This plugin supports both GIF87 and +# GIF89 images. + + +class GifImageFile(ImageFile.ImageFile): + + format = "GIF" + format_description = "Compuserve GIF" + _close_exclusive_fp_after_loading = False + + global_palette = None + + def data(self): + s = self.fp.read(1) + if s and i8(s): + return self.fp.read(i8(s)) + return None + + def _open(self): + + # Screen + s = self.fp.read(13) + if not _accept(s): + raise SyntaxError("not a GIF file") + + self.info["version"] = s[:6] + self._size = i16(s[6:]), i16(s[8:]) + self.tile = [] + flags = i8(s[10]) + bits = (flags & 7) + 1 + + if flags & 128: + # get global palette + self.info["background"] = i8(s[11]) + # check if palette contains colour indices + p = self.fp.read(3 << bits) + for i in range(0, len(p), 3): + if not (i // 3 == i8(p[i]) == i8(p[i + 1]) == i8(p[i + 2])): + p = ImagePalette.raw("RGB", p) + self.global_palette = self.palette = p + break + + self.__fp = self.fp # FIXME: hack + self.__rewind = self.fp.tell() + self._n_frames = None + self._is_animated = None + self._seek(0) # get ready to read first frame + + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + try: + while True: + self.seek(self.tell() + 1) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + + @property + def is_animated(self): + if self._is_animated is None: + if self._n_frames is not None: + self._is_animated = self._n_frames != 1 + else: + current = self.tell() + + try: + self.seek(1) + self._is_animated = True + except EOFError: + self._is_animated = False + + self.seek(current) + return self._is_animated + + def seek(self, frame): + if not self._seek_check(frame): + return + if frame < self.__frame: + if frame != 0: + self.im = None + self._seek(0) + + last_frame = self.__frame + for f in range(self.__frame + 1, frame + 1): + try: + self._seek(f) + except EOFError as e: + self.seek(last_frame) + raise EOFError("no more images in GIF file") from e + + def _seek(self, frame): + + if frame == 0: + # rewind + self.__offset = 0 + self.dispose = None + self.dispose_extent = [0, 0, 0, 0] # x0, y0, x1, y1 + self.__frame = -1 + self.__fp.seek(self.__rewind) + self._prev_im = None + self.disposal_method = 0 + else: + # ensure that the previous frame was loaded + if not self.im: + self.load() + + if frame != self.__frame + 1: + raise ValueError("cannot seek to frame %d" % frame) + self.__frame = frame + + self.tile = [] + + self.fp = self.__fp + if self.__offset: + # backup to last frame + self.fp.seek(self.__offset) + while self.data(): + pass + self.__offset = 0 + + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + + from copy import copy + + self.palette = copy(self.global_palette) + + info = {} + while True: + + s = self.fp.read(1) + if not s or s == b";": + break + + elif s == b"!": + # + # extensions + # + s = self.fp.read(1) + block = self.data() + if i8(s) == 249: + # + # graphic control extension + # + flags = i8(block[0]) + if flags & 1: + info["transparency"] = i8(block[3]) + info["duration"] = i16(block[1:3]) * 10 + + # disposal method - find the value of bits 4 - 6 + dispose_bits = 0b00011100 & flags + dispose_bits = dispose_bits >> 2 + if dispose_bits: + # only set the dispose if it is not + # unspecified. I'm not sure if this is + # correct, but it seems to prevent the last + # frame from looking odd for some animations + self.disposal_method = dispose_bits + elif i8(s) == 254: + # + # comment extension + # + while block: + if "comment" in info: + info["comment"] += block + else: + info["comment"] = block + block = self.data() + continue + elif i8(s) == 255: + # + # application extension + # + info["extension"] = block, self.fp.tell() + if block[:11] == b"NETSCAPE2.0": + block = self.data() + if len(block) >= 3 and i8(block[0]) == 1: + info["loop"] = i16(block[1:3]) + while self.data(): + pass + + elif s == b",": + # + # local image + # + s = self.fp.read(9) + + # extent + x0, y0 = i16(s[0:]), i16(s[2:]) + x1, y1 = x0 + i16(s[4:]), y0 + i16(s[6:]) + if x1 > self.size[0] or y1 > self.size[1]: + self._size = max(x1, self.size[0]), max(y1, self.size[1]) + self.dispose_extent = x0, y0, x1, y1 + flags = i8(s[8]) + + interlace = (flags & 64) != 0 + + if flags & 128: + bits = (flags & 7) + 1 + self.palette = ImagePalette.raw("RGB", self.fp.read(3 << bits)) + + # image data + bits = i8(self.fp.read(1)) + self.__offset = self.fp.tell() + self.tile = [ + ("gif", (x0, y0, x1, y1), self.__offset, (bits, interlace)) + ] + break + + else: + pass + # raise OSError, "illegal GIF tag `%x`" % i8(s) + + try: + if self.disposal_method < 2: + # do not dispose or none specified + self.dispose = None + elif self.disposal_method == 2: + # replace with background colour + Image._decompression_bomb_check(self.size) + self.dispose = Image.core.fill("P", self.size, self.info["background"]) + else: + # replace with previous contents + if self.im: + self.dispose = self.im.copy() + + # only dispose the extent in this frame + if self.dispose: + self.dispose = self._crop(self.dispose, self.dispose_extent) + except (AttributeError, KeyError): + pass + + if not self.tile: + # self.__fp = None + raise EOFError + + for k in ["transparency", "duration", "comment", "extension", "loop"]: + if k in info: + self.info[k] = info[k] + elif k in self.info: + del self.info[k] + + self.mode = "L" + if self.palette: + self.mode = "P" + + def tell(self): + return self.__frame + + def load_end(self): + ImageFile.ImageFile.load_end(self) + + # if the disposal method is 'do not dispose', transparent + # pixels should show the content of the previous frame + if self._prev_im and self.disposal_method == 1: + # we do this by pasting the updated area onto the previous + # frame which we then use as the current image content + updated = self._crop(self.im, self.dispose_extent) + self._prev_im.paste(updated, self.dispose_extent, updated.convert("RGBA")) + self.im = self._prev_im + self._prev_im = self.im.copy() + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + +# -------------------------------------------------------------------- +# Write GIF files + + +RAWMODE = {"1": "L", "L": "L", "P": "P"} + + +def _normalize_mode(im, initial_call=False): + """ + Takes an image (or frame), returns an image in a mode that is appropriate + for saving in a Gif. + + It may return the original image, or it may return an image converted to + palette or 'L' mode. + + UNDONE: What is the point of mucking with the initial call palette, for + an image that shouldn't have a palette, or it would be a mode 'P' and + get returned in the RAWMODE clause. + + :param im: Image object + :param initial_call: Default false, set to true for a single frame. + :returns: Image object + """ + if im.mode in RAWMODE: + im.load() + return im + if Image.getmodebase(im.mode) == "RGB": + if initial_call: + palette_size = 256 + if im.palette: + palette_size = len(im.palette.getdata()[1]) // 3 + return im.convert("P", palette=Image.ADAPTIVE, colors=palette_size) + else: + return im.convert("P") + return im.convert("L") + + +def _normalize_palette(im, palette, info): + """ + Normalizes the palette for image. + - Sets the palette to the incoming palette, if provided. + - Ensures that there's a palette for L mode images + - Optimizes the palette if necessary/desired. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: Image object + """ + source_palette = None + if palette: + # a bytes palette + if isinstance(palette, (bytes, bytearray, list)): + source_palette = bytearray(palette[:768]) + if isinstance(palette, ImagePalette.ImagePalette): + source_palette = bytearray( + itertools.chain.from_iterable( + zip( + palette.palette[:256], + palette.palette[256:512], + palette.palette[512:768], + ) + ) + ) + + if im.mode == "P": + if not source_palette: + source_palette = im.im.getpalette("RGB")[:768] + else: # L-mode + if not source_palette: + source_palette = bytearray(i // 3 for i in range(768)) + im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette) + + used_palette_colors = _get_optimize(im, info) + if used_palette_colors is not None: + return im.remap_palette(used_palette_colors, source_palette) + + im.palette.palette = source_palette + return im + + +def _write_single_frame(im, fp, palette): + im_out = _normalize_mode(im, True) + for k, v in im_out.info.items(): + im.encoderinfo.setdefault(k, v) + im_out = _normalize_palette(im_out, palette, im.encoderinfo) + + for s in _get_global_header(im_out, im.encoderinfo): + fp.write(s) + + # local image header + flags = 0 + if get_interlace(im): + flags = flags | 64 + _write_local_header(fp, im, (0, 0), flags) + + im_out.encoderconfig = (8, get_interlace(im)) + ImageFile._save(im_out, fp, [("gif", (0, 0) + im.size, 0, RAWMODE[im_out.mode])]) + + fp.write(b"\0") # end of image data + + +def _write_multiple_frames(im, fp, palette): + + duration = im.encoderinfo.get("duration", im.info.get("duration")) + disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) + + im_frames = [] + frame_count = 0 + background_im = None + for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): + for im_frame in ImageSequence.Iterator(imSequence): + # a copy is required here since seek can still mutate the image + im_frame = _normalize_mode(im_frame.copy()) + if frame_count == 0: + for k, v in im_frame.info.items(): + im.encoderinfo.setdefault(k, v) + im_frame = _normalize_palette(im_frame, palette, im.encoderinfo) + + encoderinfo = im.encoderinfo.copy() + if isinstance(duration, (list, tuple)): + encoderinfo["duration"] = duration[frame_count] + if isinstance(disposal, (list, tuple)): + encoderinfo["disposal"] = disposal[frame_count] + frame_count += 1 + + if im_frames: + # delta frame + previous = im_frames[-1] + if encoderinfo.get("disposal") == 2: + if background_im is None: + background = _get_background( + im, + im.encoderinfo.get("background", im.info.get("background")), + ) + background_im = Image.new("P", im_frame.size, background) + background_im.putpalette(im_frames[0]["im"].palette) + base_im = background_im + else: + base_im = previous["im"] + if _get_palette_bytes(im_frame) == _get_palette_bytes(base_im): + delta = ImageChops.subtract_modulo(im_frame, base_im) + else: + delta = ImageChops.subtract_modulo( + im_frame.convert("RGB"), base_im.convert("RGB") + ) + bbox = delta.getbbox() + if not bbox: + # This frame is identical to the previous frame + if duration: + previous["encoderinfo"]["duration"] += encoderinfo["duration"] + continue + else: + bbox = None + im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) + + if len(im_frames) > 1: + for frame_data in im_frames: + im_frame = frame_data["im"] + if not frame_data["bbox"]: + # global header + for s in _get_global_header(im_frame, frame_data["encoderinfo"]): + fp.write(s) + offset = (0, 0) + else: + # compress difference + frame_data["encoderinfo"]["include_color_table"] = True + + im_frame = im_frame.crop(frame_data["bbox"]) + offset = frame_data["bbox"][:2] + _write_frame_data(fp, im_frame, offset, frame_data["encoderinfo"]) + return True + elif "duration" in im.encoderinfo and isinstance( + im.encoderinfo["duration"], (list, tuple) + ): + # Since multiple frames will not be written, add together the frame durations + im.encoderinfo["duration"] = sum(im.encoderinfo["duration"]) + + +def _save_all(im, fp, filename): + _save(im, fp, filename, save_all=True) + + +def _save(im, fp, filename, save_all=False): + # header + if "palette" in im.encoderinfo or "palette" in im.info: + palette = im.encoderinfo.get("palette", im.info.get("palette")) + else: + palette = None + im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) + + if not save_all or not _write_multiple_frames(im, fp, palette): + _write_single_frame(im, fp, palette) + + fp.write(b";") # end of file + + if hasattr(fp, "flush"): + fp.flush() + + +def get_interlace(im): + interlace = im.encoderinfo.get("interlace", 1) + + # workaround for @PIL153 + if min(im.size) < 16: + interlace = 0 + + return interlace + + +def _write_local_header(fp, im, offset, flags): + transparent_color_exists = False + try: + transparency = im.encoderinfo["transparency"] + except KeyError: + pass + else: + transparency = int(transparency) + # optimize the block away if transparent color is not used + transparent_color_exists = True + + used_palette_colors = _get_optimize(im, im.encoderinfo) + if used_palette_colors is not None: + # adjust the transparency index after optimize + try: + transparency = used_palette_colors.index(transparency) + except ValueError: + transparent_color_exists = False + + if "duration" in im.encoderinfo: + duration = int(im.encoderinfo["duration"] / 10) + else: + duration = 0 + + disposal = int(im.encoderinfo.get("disposal", 0)) + + if transparent_color_exists or duration != 0 or disposal: + packed_flag = 1 if transparent_color_exists else 0 + packed_flag |= disposal << 2 + if not transparent_color_exists: + transparency = 0 + + fp.write( + b"!" + + o8(249) # extension intro + + o8(4) # length + + o8(packed_flag) # packed fields + + o16(duration) # duration + + o8(transparency) # transparency index + + o8(0) + ) + + if "comment" in im.encoderinfo and 1 <= len(im.encoderinfo["comment"]): + fp.write(b"!" + o8(254)) # extension intro + comment = im.encoderinfo["comment"] + if isinstance(comment, str): + comment = comment.encode() + for i in range(0, len(comment), 255): + subblock = comment[i : i + 255] + fp.write(o8(len(subblock)) + subblock) + fp.write(o8(0)) + if "loop" in im.encoderinfo: + number_of_loops = im.encoderinfo["loop"] + fp.write( + b"!" + + o8(255) # extension intro + + o8(11) + + b"NETSCAPE2.0" + + o8(3) + + o8(1) + + o16(number_of_loops) # number of loops + + o8(0) + ) + include_color_table = im.encoderinfo.get("include_color_table") + if include_color_table: + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + if color_table_size: + flags = flags | 128 # local color table flag + flags = flags | color_table_size + + fp.write( + b"," + + o16(offset[0]) # offset + + o16(offset[1]) + + o16(im.size[0]) # size + + o16(im.size[1]) + + o8(flags) # flags + ) + if include_color_table and color_table_size: + fp.write(_get_header_palette(palette_bytes)) + fp.write(o8(8)) # bits + + +def _save_netpbm(im, fp, filename): + + # Unused by default. + # To use, uncomment the register_save call at the end of the file. + # + # If you need real GIF compression and/or RGB quantization, you + # can use the external NETPBM/PBMPLUS utilities. See comments + # below for information on how to enable this. + tempfile = im._dump() + + try: + with open(filename, "wb") as f: + if im.mode != "RGB": + subprocess.check_call( + ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL + ) + else: + # Pipe ppmquant output into ppmtogif + # "ppmquant 256 %s | ppmtogif > %s" % (tempfile, filename) + quant_cmd = ["ppmquant", "256", tempfile] + togif_cmd = ["ppmtogif"] + quant_proc = subprocess.Popen( + quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL + ) + togif_proc = subprocess.Popen( + togif_cmd, + stdin=quant_proc.stdout, + stdout=f, + stderr=subprocess.DEVNULL, + ) + + # Allow ppmquant to receive SIGPIPE if ppmtogif exits + quant_proc.stdout.close() + + retcode = quant_proc.wait() + if retcode: + raise subprocess.CalledProcessError(retcode, quant_cmd) + + retcode = togif_proc.wait() + if retcode: + raise subprocess.CalledProcessError(retcode, togif_cmd) + finally: + try: + os.unlink(tempfile) + except OSError: + pass + + +# Force optimization so that we can test performance against +# cases where it took lots of memory and time previously. +_FORCE_OPTIMIZE = False + + +def _get_optimize(im, info): + """ + Palette optimization is a potentially expensive operation. + + This function determines if the palette should be optimized using + some heuristics, then returns the list of palette entries in use. + + :param im: Image object + :param info: encoderinfo + :returns: list of indexes of palette entries in use, or None + """ + if im.mode in ("P", "L") and info and info.get("optimize", 0): + # Potentially expensive operation. + + # The palette saves 3 bytes per color not used, but palette + # lengths are restricted to 3*(2**N) bytes. Max saving would + # be 768 -> 6 bytes if we went all the way down to 2 colors. + # * If we're over 128 colors, we can't save any space. + # * If there aren't any holes, it's not worth collapsing. + # * If we have a 'large' image, the palette is in the noise. + + # create the new palette if not every color is used + optimise = _FORCE_OPTIMIZE or im.mode == "L" + if optimise or im.width * im.height < 512 * 512: + # check which colors are used + used_palette_colors = [] + for i, count in enumerate(im.histogram()): + if count: + used_palette_colors.append(i) + + if optimise or ( + len(used_palette_colors) <= 128 + and max(used_palette_colors) > len(used_palette_colors) + ): + return used_palette_colors + + +def _get_color_table_size(palette_bytes): + # calculate the palette size for the header + if not palette_bytes: + return 0 + elif len(palette_bytes) < 9: + return 1 + else: + return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1 + + +def _get_header_palette(palette_bytes): + """ + Returns the palette, null padded to the next power of 2 (*3) bytes + suitable for direct inclusion in the GIF header + + :param palette_bytes: Unpadded palette bytes, in RGBRGB form + :returns: Null padded palette + """ + color_table_size = _get_color_table_size(palette_bytes) + + # add the missing amount of bytes + # the palette has to be 2< 0: + palette_bytes += o8(0) * 3 * actual_target_size_diff + return palette_bytes + + +def _get_palette_bytes(im): + """ + Gets the palette for inclusion in the gif header + + :param im: Image object + :returns: Bytes, len<=768 suitable for inclusion in gif header + """ + return im.palette.palette + + +def _get_background(im, infoBackground): + background = 0 + if infoBackground: + background = infoBackground + if isinstance(background, tuple): + # WebPImagePlugin stores an RGBA value in info["background"] + # So it must be converted to the same format as GifImagePlugin's + # info["background"] - a global color table index + background = im.palette.getcolor(background) + return background + + +def _get_global_header(im, info): + """Return a list of strings representing a GIF header""" + + # Header Block + # http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp + + version = b"87a" + for extensionKey in ["transparency", "duration", "loop", "comment"]: + if info and extensionKey in info: + if (extensionKey == "duration" and info[extensionKey] == 0) or ( + extensionKey == "comment" and not (1 <= len(info[extensionKey]) <= 255) + ): + continue + version = b"89a" + break + else: + if im.info.get("version") == b"89a": + version = b"89a" + + background = _get_background(im, info.get("background")) + + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + + return [ + b"GIF" # signature + + version # version + + o16(im.size[0]) # canvas width + + o16(im.size[1]), # canvas height + # Logical Screen Descriptor + # size of global color table + global color table flag + o8(color_table_size + 128), # packed fields + # background + reserved/aspect + o8(background) + o8(0), + # Global Color Table + _get_header_palette(palette_bytes), + ] + + +def _write_frame_data(fp, im_frame, offset, params): + try: + im_frame.encoderinfo = params + + # local image header + _write_local_header(fp, im_frame, offset, 0) + + ImageFile._save( + im_frame, fp, [("gif", (0, 0) + im_frame.size, 0, RAWMODE[im_frame.mode])] + ) + + fp.write(b"\0") # end of image data + finally: + del im_frame.encoderinfo + + +# -------------------------------------------------------------------- +# Legacy GIF utilities + + +def getheader(im, palette=None, info=None): + """ + Legacy Method to get Gif data from image. + + Warning:: May modify image data. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: tuple of(list of header items, optimized palette) + + """ + used_palette_colors = _get_optimize(im, info) + + if info is None: + info = {} + + if "background" not in info and "background" in im.info: + info["background"] = im.info["background"] + + im_mod = _normalize_palette(im, palette, info) + im.palette = im_mod.palette + im.im = im_mod.im + header = _get_global_header(im, info) + + return header, used_palette_colors + + +# To specify duration, add the time in milliseconds to getdata(), +# e.g. getdata(im_frame, duration=1000) +def getdata(im, offset=(0, 0), **params): + """ + Legacy Method + + Return a list of strings representing this image. + The first string is a local image header, the rest contains + encoded image data. + + :param im: Image object + :param offset: Tuple of (x, y) pixels. Defaults to (0,0) + :param \\**params: E.g. duration or other encoder info parameters + :returns: List of Bytes containing gif encoded frame data + + """ + + class Collector: + data = [] + + def write(self, data): + self.data.append(data) + + im.load() # make sure raster data is available + + fp = Collector() + + _write_frame_data(fp, im, offset, params) + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GifImageFile.format, GifImageFile, _accept) +Image.register_save(GifImageFile.format, _save) +Image.register_save_all(GifImageFile.format, _save_all) +Image.register_extension(GifImageFile.format, ".gif") +Image.register_mime(GifImageFile.format, "image/gif") + +# +# Uncomment the following line if you wish to use NETPBM/PBMPLUS +# instead of the built-in "uncompressed" GIF encoder + +# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/venv/Lib/site-packages/PIL/GimpGradientFile.py b/venv/Lib/site-packages/PIL/GimpGradientFile.py new file mode 100644 index 0000000..7ab7f99 --- /dev/null +++ b/venv/Lib/site-packages/PIL/GimpGradientFile.py @@ -0,0 +1,140 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read (and render) GIMP gradient files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +""" +Stuff to translate curve segments to palette values (derived from +the corresponding code in GIMP, written by Federico Mena Quintero. +See the GIMP distribution for more information.) +""" + + +from math import log, pi, sin, sqrt + +from ._binary import o8 + +EPSILON = 1e-10 +"""""" # Enable auto-doc for data member + + +def linear(middle, pos): + if pos <= middle: + if middle < EPSILON: + return 0.0 + else: + return 0.5 * pos / middle + else: + pos = pos - middle + middle = 1.0 - middle + if middle < EPSILON: + return 1.0 + else: + return 0.5 + 0.5 * pos / middle + + +def curved(middle, pos): + return pos ** (log(0.5) / log(max(middle, EPSILON))) + + +def sine(middle, pos): + return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 + + +def sphere_increasing(middle, pos): + return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) + + +def sphere_decreasing(middle, pos): + return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) + + +SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] +"""""" # Enable auto-doc for data member + + +class GradientFile: + + gradient = None + + def getpalette(self, entries=256): + + palette = [] + + ix = 0 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + for i in range(entries): + + x = i / (entries - 1) + + while x1 < x: + ix += 1 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + w = x1 - x0 + + if w < EPSILON: + scale = segment(0.5, 0.5) + else: + scale = segment((xm - x0) / w, (x - x0) / w) + + # expand to RGBA + r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) + g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) + b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) + a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) + + # add to palette + palette.append(r + g + b + a) + + return b"".join(palette), "RGBA" + + +class GimpGradientFile(GradientFile): + """File handler for GIMP's gradient format.""" + + def __init__(self, fp): + + if fp.readline()[:13] != b"GIMP Gradient": + raise SyntaxError("not a GIMP gradient file") + + line = fp.readline() + + # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do + if line.startswith(b"Name: "): + line = fp.readline().strip() + + count = int(line) + + gradient = [] + + for i in range(count): + + s = fp.readline().split() + w = [float(x) for x in s[:11]] + + x0, x1 = w[0], w[2] + xm = w[1] + rgb0 = w[3:7] + rgb1 = w[7:11] + + segment = SEGMENTS[int(s[11])] + cspace = int(s[12]) + + if cspace != 0: + raise OSError("cannot handle HSV colour space") + + gradient.append((x0, x1, xm, rgb0, rgb1, segment)) + + self.gradient = gradient diff --git a/venv/Lib/site-packages/PIL/GimpPaletteFile.py b/venv/Lib/site-packages/PIL/GimpPaletteFile.py new file mode 100644 index 0000000..10fd3ad --- /dev/null +++ b/venv/Lib/site-packages/PIL/GimpPaletteFile.py @@ -0,0 +1,56 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read GIMP palette files +# +# History: +# 1997-08-23 fl Created +# 2004-09-07 fl Support GIMP 2.0 palette files. +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1997-2004. +# +# See the README file for information on usage and redistribution. +# + +import re + +from ._binary import o8 + + +class GimpPaletteFile: + """File handler for GIMP's palette format.""" + + rawmode = "RGB" + + def __init__(self, fp): + + self.palette = [o8(i) * 3 for i in range(256)] + + if fp.readline()[:12] != b"GIMP Palette": + raise SyntaxError("not a GIMP palette file") + + for i in range(256): + + s = fp.readline() + if not s: + break + + # skip fields and comment lines + if re.match(br"\w+:|#", s): + continue + if len(s) > 100: + raise SyntaxError("bad palette file") + + v = tuple(map(int, s.split()[:3])) + if len(v) != 3: + raise ValueError("bad palette entry") + + self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) + + self.palette = b"".join(self.palette) + + def getpalette(self): + + return self.palette, self.rawmode diff --git a/venv/Lib/site-packages/PIL/GribStubImagePlugin.py b/venv/Lib/site-packages/PIL/GribStubImagePlugin.py new file mode 100644 index 0000000..515c272 --- /dev/null +++ b/venv/Lib/site-packages/PIL/GribStubImagePlugin.py @@ -0,0 +1,74 @@ +# +# The Python Imaging Library +# $Id$ +# +# GRIB stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile +from ._binary import i8 + +_handler = None + + +def register_handler(handler): + """ + Install application-specific GRIB image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix): + return prefix[0:4] == b"GRIB" and i8(prefix[7]) == 1 + + +class GribStubImageFile(ImageFile.StubImageFile): + + format = "GRIB" + format_description = "GRIB" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + raise SyntaxError("Not a GRIB file") + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self._size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise OSError("GRIB save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) +Image.register_save(GribStubImageFile.format, _save) + +Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py b/venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py new file mode 100644 index 0000000..362f2d3 --- /dev/null +++ b/venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py @@ -0,0 +1,73 @@ +# +# The Python Imaging Library +# $Id$ +# +# HDF5 stub adapter +# +# Copyright (c) 2000-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific HDF5 image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix): + return prefix[:8] == b"\x89HDF\r\n\x1a\n" + + +class HDF5StubImageFile(ImageFile.StubImageFile): + + format = "HDF5" + format_description = "HDF5" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + raise SyntaxError("Not an HDF file") + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self._size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise OSError("HDF5 save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) +Image.register_save(HDF5StubImageFile.format, _save) + +Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/venv/Lib/site-packages/PIL/IcnsImagePlugin.py b/venv/Lib/site-packages/PIL/IcnsImagePlugin.py new file mode 100644 index 0000000..7023855 --- /dev/null +++ b/venv/Lib/site-packages/PIL/IcnsImagePlugin.py @@ -0,0 +1,384 @@ +# +# The Python Imaging Library. +# $Id$ +# +# macOS icns file decoder, based on icns.py by Bob Ippolito. +# +# history: +# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. +# +# Copyright (c) 2004 by Bob Ippolito. +# Copyright (c) 2004 by Secret Labs. +# Copyright (c) 2004 by Fredrik Lundh. +# Copyright (c) 2014 by Alastair Houghton. +# +# See the README file for information on usage and redistribution. +# + +import io +import os +import shutil +import struct +import subprocess +import sys +import tempfile + +from PIL import Image, ImageFile, PngImagePlugin, features +from PIL._binary import i8 + +enable_jpeg2k = features.check_codec("jpg_2000") +if enable_jpeg2k: + from PIL import Jpeg2KImagePlugin + +HEADERSIZE = 8 + + +def nextheader(fobj): + return struct.unpack(">4sI", fobj.read(HEADERSIZE)) + + +def read_32t(fobj, start_length, size): + # The 128x128 icon seems to have an extra header for some reason. + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(4) + if sig != b"\x00\x00\x00\x00": + raise SyntaxError("Unknown signature, expecting 0x00000000") + return read_32(fobj, (start + 4, length - 4), size) + + +def read_32(fobj, start_length, size): + """ + Read a 32bit RGB icon resource. Seems to be either uncompressed or + an RLE packbits-like scheme. + """ + (start, length) = start_length + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + if length == sizesq * 3: + # uncompressed ("RGBRGBGB") + indata = fobj.read(length) + im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) + else: + # decode image + im = Image.new("RGB", pixel_size, None) + for band_ix in range(3): + data = [] + bytesleft = sizesq + while bytesleft > 0: + byte = fobj.read(1) + if not byte: + break + byte = i8(byte) + if byte & 0x80: + blocksize = byte - 125 + byte = fobj.read(1) + for i in range(blocksize): + data.append(byte) + else: + blocksize = byte + 1 + data.append(fobj.read(blocksize)) + bytesleft -= blocksize + if bytesleft <= 0: + break + if bytesleft != 0: + raise SyntaxError("Error reading channel [%r left]" % bytesleft) + band = Image.frombuffer("L", pixel_size, b"".join(data), "raw", "L", 0, 1) + im.im.putband(band.im, band_ix) + return {"RGB": im} + + +def read_mk(fobj, start_length, size): + # Alpha masks seem to be uncompressed + start = start_length[0] + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + band = Image.frombuffer("L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1) + return {"A": band} + + +def read_png_or_jpeg2000(fobj, start_length, size): + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(12) + if sig[:8] == b"\x89PNG\x0d\x0a\x1a\x0a": + fobj.seek(start) + im = PngImagePlugin.PngImageFile(fobj) + return {"RGBA": im} + elif ( + sig[:4] == b"\xff\x4f\xff\x51" + or sig[:4] == b"\x0d\x0a\x87\x0a" + or sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" + ): + if not enable_jpeg2k: + raise ValueError( + "Unsupported icon subimage format (rebuild PIL " + "with JPEG 2000 support to fix this)" + ) + # j2k, jpc or j2c + fobj.seek(start) + jp2kstream = fobj.read(length) + f = io.BytesIO(jp2kstream) + im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) + if im.mode != "RGBA": + im = im.convert("RGBA") + return {"RGBA": im} + else: + raise ValueError("Unsupported icon subimage format") + + +class IcnsFile: + + SIZES = { + (512, 512, 2): [(b"ic10", read_png_or_jpeg2000)], + (512, 512, 1): [(b"ic09", read_png_or_jpeg2000)], + (256, 256, 2): [(b"ic14", read_png_or_jpeg2000)], + (256, 256, 1): [(b"ic08", read_png_or_jpeg2000)], + (128, 128, 2): [(b"ic13", read_png_or_jpeg2000)], + (128, 128, 1): [ + (b"ic07", read_png_or_jpeg2000), + (b"it32", read_32t), + (b"t8mk", read_mk), + ], + (64, 64, 1): [(b"icp6", read_png_or_jpeg2000)], + (32, 32, 2): [(b"ic12", read_png_or_jpeg2000)], + (48, 48, 1): [(b"ih32", read_32), (b"h8mk", read_mk)], + (32, 32, 1): [ + (b"icp5", read_png_or_jpeg2000), + (b"il32", read_32), + (b"l8mk", read_mk), + ], + (16, 16, 2): [(b"ic11", read_png_or_jpeg2000)], + (16, 16, 1): [ + (b"icp4", read_png_or_jpeg2000), + (b"is32", read_32), + (b"s8mk", read_mk), + ], + } + + def __init__(self, fobj): + """ + fobj is a file-like object as an icns resource + """ + # signature : (start, length) + self.dct = dct = {} + self.fobj = fobj + sig, filesize = nextheader(fobj) + if sig != b"icns": + raise SyntaxError("not an icns file") + i = HEADERSIZE + while i < filesize: + sig, blocksize = nextheader(fobj) + if blocksize <= 0: + raise SyntaxError("invalid block header") + i += HEADERSIZE + blocksize -= HEADERSIZE + dct[sig] = (i, blocksize) + fobj.seek(blocksize, io.SEEK_CUR) + i += blocksize + + def itersizes(self): + sizes = [] + for size, fmts in self.SIZES.items(): + for (fmt, reader) in fmts: + if fmt in self.dct: + sizes.append(size) + break + return sizes + + def bestsize(self): + sizes = self.itersizes() + if not sizes: + raise SyntaxError("No 32bit icon resources found") + return max(sizes) + + def dataforsize(self, size): + """ + Get an icon resource as {channel: array}. Note that + the arrays are bottom-up like windows bitmaps and will likely + need to be flipped or transposed in some way. + """ + dct = {} + for code, reader in self.SIZES[size]: + desc = self.dct.get(code) + if desc is not None: + dct.update(reader(self.fobj, desc, size)) + return dct + + def getimage(self, size=None): + if size is None: + size = self.bestsize() + if len(size) == 2: + size = (size[0], size[1], 1) + channels = self.dataforsize(size) + + im = channels.get("RGBA", None) + if im: + return im + + im = channels.get("RGB").copy() + try: + im.putalpha(channels["A"]) + except KeyError: + pass + return im + + +## +# Image plugin for Mac OS icons. + + +class IcnsImageFile(ImageFile.ImageFile): + """ + PIL image support for Mac OS .icns files. + Chooses the best resolution, but will possibly load + a different size image if you mutate the size attribute + before calling 'load'. + + The info dictionary has a key 'sizes' that is a list + of sizes that the icns file has. + """ + + format = "ICNS" + format_description = "Mac OS icns resource" + + def _open(self): + self.icns = IcnsFile(self.fp) + self.mode = "RGBA" + self.info["sizes"] = self.icns.itersizes() + self.best_size = self.icns.bestsize() + self.size = ( + self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2], + ) + + @property + def size(self): + return self._size + + @size.setter + def size(self, value): + info_size = value + if info_size not in self.info["sizes"] and len(info_size) == 2: + info_size = (info_size[0], info_size[1], 1) + if ( + info_size not in self.info["sizes"] + and len(info_size) == 3 + and info_size[2] == 1 + ): + simple_sizes = [ + (size[0] * size[2], size[1] * size[2]) for size in self.info["sizes"] + ] + if value in simple_sizes: + info_size = self.info["sizes"][simple_sizes.index(value)] + if info_size not in self.info["sizes"]: + raise ValueError("This is not one of the allowed sizes of this image") + self._size = value + + def load(self): + if len(self.size) == 3: + self.best_size = self.size + self.size = ( + self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2], + ) + + Image.Image.load(self) + if self.im and self.im.size == self.size: + # Already loaded + return + self.load_prepare() + # This is likely NOT the best way to do it, but whatever. + im = self.icns.getimage(self.best_size) + + # If this is a PNG or JPEG 2000, it won't be loaded yet + im.load() + + self.im = im.im + self.mode = im.mode + self.size = im.size + self.load_end() + + +def _save(im, fp, filename): + """ + Saves the image as a series of PNG files, + that are then converted to a .icns file + using the macOS command line utility 'iconutil'. + + macOS only. + """ + if hasattr(fp, "flush"): + fp.flush() + + # create the temporary set of pngs + with tempfile.TemporaryDirectory(".iconset") as iconset: + provided_images = { + im.width: im for im in im.encoderinfo.get("append_images", []) + } + last_w = None + second_path = None + for w in [16, 32, 128, 256, 512]: + prefix = "icon_{}x{}".format(w, w) + + first_path = os.path.join(iconset, prefix + ".png") + if last_w == w: + shutil.copyfile(second_path, first_path) + else: + im_w = provided_images.get(w, im.resize((w, w), Image.LANCZOS)) + im_w.save(first_path) + + second_path = os.path.join(iconset, prefix + "@2x.png") + im_w2 = provided_images.get(w * 2, im.resize((w * 2, w * 2), Image.LANCZOS)) + im_w2.save(second_path) + last_w = w * 2 + + # iconutil -c icns -o {} {} + + fp_only = not filename + if fp_only: + f, filename = tempfile.mkstemp(".icns") + os.close(f) + convert_cmd = ["iconutil", "-c", "icns", "-o", filename, iconset] + convert_proc = subprocess.Popen( + convert_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL + ) + + convert_proc.stdout.close() + + retcode = convert_proc.wait() + + if retcode: + raise subprocess.CalledProcessError(retcode, convert_cmd) + + if fp_only: + with open(filename, "rb") as f: + fp.write(f.read()) + + +Image.register_open(IcnsImageFile.format, IcnsImageFile, lambda x: x[:4] == b"icns") +Image.register_extension(IcnsImageFile.format, ".icns") + +if sys.platform == "darwin": + Image.register_save(IcnsImageFile.format, _save) + + Image.register_mime(IcnsImageFile.format, "image/icns") + + +if __name__ == "__main__": + + if len(sys.argv) < 2: + print("Syntax: python IcnsImagePlugin.py [file]") + sys.exit() + + with open(sys.argv[1], "rb") as fp: + imf = IcnsImageFile(fp) + for size in imf.info["sizes"]: + imf.size = size + imf.save("out-%s-%s-%s.png" % size) + with Image.open(sys.argv[1]) as im: + im.save("out.png") + if sys.platform == "windows": + os.startfile("out.png") diff --git a/venv/Lib/site-packages/PIL/IcoImagePlugin.py b/venv/Lib/site-packages/PIL/IcoImagePlugin.py new file mode 100644 index 0000000..e4a7432 --- /dev/null +++ b/venv/Lib/site-packages/PIL/IcoImagePlugin.py @@ -0,0 +1,324 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Icon support for PIL +# +# History: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis +# . +# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki +# +# Icon format references: +# * https://en.wikipedia.org/wiki/ICO_(file_format) +# * https://msdn.microsoft.com/en-us/library/ms997538.aspx + + +import struct +import warnings +from io import BytesIO +from math import ceil, log + +from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin +from ._binary import i8, i16le as i16, i32le as i32 + +# +# -------------------------------------------------------------------- + +_MAGIC = b"\0\0\1\0" + + +def _save(im, fp, filename): + fp.write(_MAGIC) # (2+2) + sizes = im.encoderinfo.get( + "sizes", + [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], + ) + width, height = im.size + sizes = filter( + lambda x: False + if (x[0] > width or x[1] > height or x[0] > 256 or x[1] > 256) + else True, + sizes, + ) + sizes = list(sizes) + fp.write(struct.pack("=8bpp) + "reserved": i8(s[3]), + "planes": i16(s[4:]), + "bpp": i16(s[6:]), + "size": i32(s[8:]), + "offset": i32(s[12:]), + } + + # See Wikipedia + for j in ("width", "height"): + if not icon_header[j]: + icon_header[j] = 256 + + # See Wikipedia notes about color depth. + # We need this just to differ images with equal sizes + icon_header["color_depth"] = ( + icon_header["bpp"] + or ( + icon_header["nb_color"] != 0 + and ceil(log(icon_header["nb_color"], 2)) + ) + or 256 + ) + + icon_header["dim"] = (icon_header["width"], icon_header["height"]) + icon_header["square"] = icon_header["width"] * icon_header["height"] + + self.entry.append(icon_header) + + self.entry = sorted(self.entry, key=lambda x: x["color_depth"]) + # ICO images are usually squares + # self.entry = sorted(self.entry, key=lambda x: x['width']) + self.entry = sorted(self.entry, key=lambda x: x["square"]) + self.entry.reverse() + + def sizes(self): + """ + Get a list of all available icon sizes and color depths. + """ + return {(h["width"], h["height"]) for h in self.entry} + + def getentryindex(self, size, bpp=False): + for (i, h) in enumerate(self.entry): + if size == h["dim"] and (bpp is False or bpp == h["color_depth"]): + return i + return 0 + + def getimage(self, size, bpp=False): + """ + Get an image from the icon + """ + return self.frame(self.getentryindex(size, bpp)) + + def frame(self, idx): + """ + Get an image from frame idx + """ + + header = self.entry[idx] + + self.buf.seek(header["offset"]) + data = self.buf.read(8) + self.buf.seek(header["offset"]) + + if data[:8] == PngImagePlugin._MAGIC: + # png frame + im = PngImagePlugin.PngImageFile(self.buf) + else: + # XOR + AND mask bmp frame + im = BmpImagePlugin.DibImageFile(self.buf) + Image._decompression_bomb_check(im.size) + + # change tile dimension to only encompass XOR image + im._size = (im.size[0], int(im.size[1] / 2)) + d, e, o, a = im.tile[0] + im.tile[0] = d, (0, 0) + im.size, o, a + + # figure out where AND mask image starts + mode = a[0] + bpp = 8 + for k, v in BmpImagePlugin.BIT2MODE.items(): + if mode == v[1]: + bpp = k + break + + if 32 == bpp: + # 32-bit color depth icon image allows semitransparent areas + # PIL's DIB format ignores transparency bits, recover them. + # The DIB is packed in BGRX byte order where X is the alpha + # channel. + + # Back up to start of bmp data + self.buf.seek(o) + # extract every 4th byte (eg. 3,7,11,15,...) + alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] + + # convert to an 8bpp grayscale image + mask = Image.frombuffer( + "L", # 8bpp + im.size, # (w, h) + alpha_bytes, # source chars + "raw", # raw decoder + ("L", 0, -1), # 8bpp inverted, unpadded, reversed + ) + else: + # get AND image from end of bitmap + w = im.size[0] + if (w % 32) > 0: + # bitmap row data is aligned to word boundaries + w += 32 - (im.size[0] % 32) + + # the total mask data is + # padded row size * height / bits per char + + and_mask_offset = o + int(im.size[0] * im.size[1] * (bpp / 8.0)) + total_bytes = int((w * im.size[1]) / 8) + + self.buf.seek(and_mask_offset) + mask_data = self.buf.read(total_bytes) + + # convert raw data to image + mask = Image.frombuffer( + "1", # 1 bpp + im.size, # (w, h) + mask_data, # source chars + "raw", # raw decoder + ("1;I", int(w / 8), -1), # 1bpp inverted, padded, reversed + ) + + # now we have two images, im is XOR image and mask is AND image + + # apply mask image as alpha channel + im = im.convert("RGBA") + im.putalpha(mask) + + return im + + +## +# Image plugin for Windows Icon files. + + +class IcoImageFile(ImageFile.ImageFile): + """ + PIL read-only image support for Microsoft Windows .ico files. + + By default the largest resolution image in the file will be loaded. This + can be changed by altering the 'size' attribute before calling 'load'. + + The info dictionary has a key 'sizes' that is a list of the sizes available + in the icon file. + + Handles classic, XP and Vista icon formats. + + When saving, PNG compression is used. Support for this was only added in + Windows Vista. + + This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis + . + https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki + """ + + format = "ICO" + format_description = "Windows Icon" + + def _open(self): + self.ico = IcoFile(self.fp) + self.info["sizes"] = self.ico.sizes() + self.size = self.ico.entry[0]["dim"] + self.load() + + @property + def size(self): + return self._size + + @size.setter + def size(self, value): + if value not in self.info["sizes"]: + raise ValueError("This is not one of the allowed sizes of this image") + self._size = value + + def load(self): + if self.im and self.im.size == self.size: + # Already loaded + return + im = self.ico.getimage(self.size) + # if tile is PNG, it won't really be loaded yet + im.load() + self.im = im.im + self.mode = im.mode + if im.size != self.size: + warnings.warn("Image was not the expected size") + + index = self.ico.getentryindex(self.size) + sizes = list(self.info["sizes"]) + sizes[index] = im.size + self.info["sizes"] = set(sizes) + + self.size = im.size + + def load_seek(self): + # Flag the ImageFile.Parser so that it + # just does all the decode at the end. + pass + + +# +# -------------------------------------------------------------------- + + +Image.register_open(IcoImageFile.format, IcoImageFile, _accept) +Image.register_save(IcoImageFile.format, _save) +Image.register_extension(IcoImageFile.format, ".ico") + +Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/venv/Lib/site-packages/PIL/ImImagePlugin.py b/venv/Lib/site-packages/PIL/ImImagePlugin.py new file mode 100644 index 0000000..d940899 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImImagePlugin.py @@ -0,0 +1,377 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IFUNC IM file handling for PIL +# +# history: +# 1995-09-01 fl Created. +# 1997-01-03 fl Save palette images +# 1997-01-08 fl Added sequence support +# 1997-01-23 fl Added P and RGB save support +# 1997-05-31 fl Read floating point images +# 1997-06-22 fl Save floating point images +# 1997-08-27 fl Read and save 1-bit images +# 1998-06-25 fl Added support for RGB+LUT images +# 1998-07-02 fl Added support for YCC images +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 1998-12-29 fl Added I;16 support +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# 2003-09-26 fl Added LA/PA support +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +import os +import re + +from . import Image, ImageFile, ImagePalette +from ._binary import i8 + +# -------------------------------------------------------------------- +# Standard tags + +COMMENT = "Comment" +DATE = "Date" +EQUIPMENT = "Digitalization equipment" +FRAMES = "File size (no of images)" +LUT = "Lut" +NAME = "Name" +SCALE = "Scale (x,y)" +SIZE = "Image size (x*y)" +MODE = "Image type" + +TAGS = { + COMMENT: 0, + DATE: 0, + EQUIPMENT: 0, + FRAMES: 0, + LUT: 0, + NAME: 0, + SCALE: 0, + SIZE: 0, + MODE: 0, +} + +OPEN = { + # ifunc93/p3cfunc formats + "0 1 image": ("1", "1"), + "L 1 image": ("1", "1"), + "Greyscale image": ("L", "L"), + "Grayscale image": ("L", "L"), + "RGB image": ("RGB", "RGB;L"), + "RLB image": ("RGB", "RLB"), + "RYB image": ("RGB", "RLB"), + "B1 image": ("1", "1"), + "B2 image": ("P", "P;2"), + "B4 image": ("P", "P;4"), + "X 24 image": ("RGB", "RGB"), + "L 32 S image": ("I", "I;32"), + "L 32 F image": ("F", "F;32"), + # old p3cfunc formats + "RGB3 image": ("RGB", "RGB;T"), + "RYB3 image": ("RGB", "RYB;T"), + # extensions + "LA image": ("LA", "LA;L"), + "PA image": ("LA", "PA;L"), + "RGBA image": ("RGBA", "RGBA;L"), + "RGBX image": ("RGBX", "RGBX;L"), + "CMYK image": ("CMYK", "CMYK;L"), + "YCC image": ("YCbCr", "YCbCr;L"), +} + +# ifunc95 extensions +for i in ["8", "8S", "16", "16S", "32", "32F"]: + OPEN["L %s image" % i] = ("F", "F;%s" % i) + OPEN["L*%s image" % i] = ("F", "F;%s" % i) +for i in ["16", "16L", "16B"]: + OPEN["L %s image" % i] = ("I;%s" % i, "I;%s" % i) + OPEN["L*%s image" % i] = ("I;%s" % i, "I;%s" % i) +for i in ["32S"]: + OPEN["L %s image" % i] = ("I", "I;%s" % i) + OPEN["L*%s image" % i] = ("I", "I;%s" % i) +for i in range(2, 33): + OPEN["L*%s image" % i] = ("F", "F;%s" % i) + + +# -------------------------------------------------------------------- +# Read IM directory + +split = re.compile(br"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") + + +def number(s): + try: + return int(s) + except ValueError: + return float(s) + + +## +# Image plugin for the IFUNC IM file format. + + +class ImImageFile(ImageFile.ImageFile): + + format = "IM" + format_description = "IFUNC Image Memory" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # Quick rejection: if there's not an LF among the first + # 100 bytes, this is (probably) not a text header. + + if b"\n" not in self.fp.read(100): + raise SyntaxError("not an IM file") + self.fp.seek(0) + + n = 0 + + # Default values + self.info[MODE] = "L" + self.info[SIZE] = (512, 512) + self.info[FRAMES] = 1 + + self.rawmode = "L" + + while True: + + s = self.fp.read(1) + + # Some versions of IFUNC uses \n\r instead of \r\n... + if s == b"\r": + continue + + if not s or s == b"\0" or s == b"\x1A": + break + + # FIXME: this may read whole file if not a text file + s = s + self.fp.readline() + + if len(s) > 100: + raise SyntaxError("not an IM file") + + if s[-2:] == b"\r\n": + s = s[:-2] + elif s[-1:] == b"\n": + s = s[:-1] + + try: + m = split.match(s) + except re.error as e: + raise SyntaxError("not an IM file") from e + + if m: + + k, v = m.group(1, 2) + + # Don't know if this is the correct encoding, + # but a decent guess (I guess) + k = k.decode("latin-1", "replace") + v = v.decode("latin-1", "replace") + + # Convert value as appropriate + if k in [FRAMES, SCALE, SIZE]: + v = v.replace("*", ",") + v = tuple(map(number, v.split(","))) + if len(v) == 1: + v = v[0] + elif k == MODE and v in OPEN: + v, self.rawmode = OPEN[v] + + # Add to dictionary. Note that COMMENT tags are + # combined into a list of strings. + if k == COMMENT: + if k in self.info: + self.info[k].append(v) + else: + self.info[k] = [v] + else: + self.info[k] = v + + if k in TAGS: + n += 1 + + else: + + raise SyntaxError( + "Syntax error in IM header: " + s.decode("ascii", "replace") + ) + + if not n: + raise SyntaxError("Not an IM file") + + # Basic attributes + self._size = self.info[SIZE] + self.mode = self.info[MODE] + + # Skip forward to start of image data + while s and s[0:1] != b"\x1A": + s = self.fp.read(1) + if not s: + raise SyntaxError("File truncated") + + if LUT in self.info: + # convert lookup table to palette or lut attribute + palette = self.fp.read(768) + greyscale = 1 # greyscale palette + linear = 1 # linear greyscale palette + for i in range(256): + if palette[i] == palette[i + 256] == palette[i + 512]: + if i8(palette[i]) != i: + linear = 0 + else: + greyscale = 0 + if self.mode in ["L", "LA", "P", "PA"]: + if greyscale: + if not linear: + self.lut = [i8(c) for c in palette[:256]] + else: + if self.mode in ["L", "P"]: + self.mode = self.rawmode = "P" + elif self.mode in ["LA", "PA"]: + self.mode = "PA" + self.rawmode = "PA;L" + self.palette = ImagePalette.raw("RGB;L", palette) + elif self.mode == "RGB": + if not greyscale or not linear: + self.lut = [i8(c) for c in palette] + + self.frame = 0 + + self.__offset = offs = self.fp.tell() + + self.__fp = self.fp # FIXME: hack + + if self.rawmode[:2] == "F;": + + # ifunc95 formats + try: + # use bit decoder (if necessary) + bits = int(self.rawmode[2:]) + if bits not in [8, 16, 32]: + self.tile = [("bit", (0, 0) + self.size, offs, (bits, 8, 3, 0, -1))] + return + except ValueError: + pass + + if self.rawmode in ["RGB;T", "RYB;T"]: + # Old LabEye/3PC files. Would be very surprised if anyone + # ever stumbled upon such a file ;-) + size = self.size[0] * self.size[1] + self.tile = [ + ("raw", (0, 0) + self.size, offs, ("G", 0, -1)), + ("raw", (0, 0) + self.size, offs + size, ("R", 0, -1)), + ("raw", (0, 0) + self.size, offs + 2 * size, ("B", 0, -1)), + ] + else: + # LabEye/IFUNC files + self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))] + + @property + def n_frames(self): + return self.info[FRAMES] + + @property + def is_animated(self): + return self.info[FRAMES] > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + + self.frame = frame + + if self.mode == "1": + bits = 1 + else: + bits = 8 * len(self.mode) + + size = ((self.size[0] * bits + 7) // 8) * self.size[1] + offs = self.__offset + frame * size + + self.fp = self.__fp + + self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))] + + def tell(self): + return self.frame + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + +# +# -------------------------------------------------------------------- +# Save IM files + + +SAVE = { + # mode: (im type, raw mode) + "1": ("0 1", "1"), + "L": ("Greyscale", "L"), + "LA": ("LA", "LA;L"), + "P": ("Greyscale", "P"), + "PA": ("LA", "PA;L"), + "I": ("L 32S", "I;32S"), + "I;16": ("L 16", "I;16"), + "I;16L": ("L 16L", "I;16L"), + "I;16B": ("L 16B", "I;16B"), + "F": ("L 32F", "F;32F"), + "RGB": ("RGB", "RGB;L"), + "RGBA": ("RGBA", "RGBA;L"), + "RGBX": ("RGBX", "RGBX;L"), + "CMYK": ("CMYK", "CMYK;L"), + "YCbCr": ("YCC", "YCbCr;L"), +} + + +def _save(im, fp, filename): + + try: + image_type, rawmode = SAVE[im.mode] + except KeyError as e: + raise ValueError("Cannot save %s images as IM" % im.mode) from e + + frames = im.encoderinfo.get("frames", 1) + + fp.write(("Image type: %s image\r\n" % image_type).encode("ascii")) + if filename: + # Each line must be 100 characters or less, + # or: SyntaxError("not an IM file") + # 8 characters are used for "Name: " and "\r\n" + # Keep just the filename, ditch the potentially overlong path + name, ext = os.path.splitext(os.path.basename(filename)) + name = "".join([name[: 92 - len(ext)], ext]) + + fp.write(("Name: %s\r\n" % name).encode("ascii")) + fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode("ascii")) + fp.write(("File size (no of images): %d\r\n" % frames).encode("ascii")) + if im.mode in ["P", "PA"]: + fp.write(b"Lut: 1\r\n") + fp.write(b"\000" * (511 - fp.tell()) + b"\032") + if im.mode in ["P", "PA"]: + fp.write(im.im.getpalette("RGB", "RGB;L")) # 768 bytes + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, -1))]) + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(ImImageFile.format, ImImageFile) +Image.register_save(ImImageFile.format, _save) + +Image.register_extension(ImImageFile.format, ".im") diff --git a/venv/Lib/site-packages/PIL/Image.py b/venv/Lib/site-packages/PIL/Image.py new file mode 100644 index 0000000..c141974 --- /dev/null +++ b/venv/Lib/site-packages/PIL/Image.py @@ -0,0 +1,3462 @@ +# +# The Python Imaging Library. +# $Id$ +# +# the Image class wrapper +# +# partial release history: +# 1995-09-09 fl Created +# 1996-03-11 fl PIL release 0.0 (proof of concept) +# 1996-04-30 fl PIL release 0.1b1 +# 1999-07-28 fl PIL release 1.0 final +# 2000-06-07 fl PIL release 1.1 +# 2000-10-20 fl PIL release 1.1.1 +# 2001-05-07 fl PIL release 1.1.2 +# 2002-03-15 fl PIL release 1.1.3 +# 2003-05-10 fl PIL release 1.1.4 +# 2005-03-28 fl PIL release 1.1.5 +# 2006-12-02 fl PIL release 1.1.6 +# 2009-11-15 fl PIL release 1.1.7 +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +import atexit +import builtins +import io +import logging +import math +import numbers +import os +import struct +import sys +import tempfile +import warnings +import xml.etree.ElementTree +from collections.abc import Callable, MutableMapping +from pathlib import Path + +# VERSION was removed in Pillow 6.0.0. +# PILLOW_VERSION is deprecated and will be removed in a future release. +# Use __version__ instead. +from . import ( + ImageMode, + TiffTags, + UnidentifiedImageError, + __version__, + _plugins, + _raise_version_warning, +) +from ._binary import i8, i32le +from ._util import deferred_error, isPath + +if sys.version_info >= (3, 7): + + def __getattr__(name): + if name == "PILLOW_VERSION": + _raise_version_warning() + return __version__ + raise AttributeError("module '{}' has no attribute '{}'".format(__name__, name)) + + +else: + + from . import PILLOW_VERSION + + # Silence warning + assert PILLOW_VERSION + + +logger = logging.getLogger(__name__) + + +class DecompressionBombWarning(RuntimeWarning): + pass + + +class DecompressionBombError(Exception): + pass + + +# Limit to around a quarter gigabyte for a 24 bit (3 bpp) image +MAX_IMAGE_PIXELS = int(1024 * 1024 * 1024 // 4 // 3) + + +try: + # If the _imaging C module is not present, Pillow will not load. + # Note that other modules should not refer to _imaging directly; + # import Image and use the Image.core variable instead. + # Also note that Image.core is not a publicly documented interface, + # and should be considered private and subject to change. + from . import _imaging as core + + if __version__ != getattr(core, "PILLOW_VERSION", None): + raise ImportError( + "The _imaging extension was built for another version of Pillow or PIL:\n" + "Core version: %s\n" + "Pillow version: %s" % (getattr(core, "PILLOW_VERSION", None), __version__) + ) + +except ImportError as v: + core = deferred_error(ImportError("The _imaging C module is not installed.")) + # Explanations for ways that we know we might have an import error + if str(v).startswith("Module use of python"): + # The _imaging C module is present, but not compiled for + # the right version (windows only). Print a warning, if + # possible. + warnings.warn( + "The _imaging extension was built for another version of Python.", + RuntimeWarning, + ) + elif str(v).startswith("The _imaging extension"): + warnings.warn(str(v), RuntimeWarning) + # Fail here anyway. Don't let people run with a mostly broken Pillow. + # see docs/porting.rst + raise + + +# works everywhere, win for pypy, not cpython +USE_CFFI_ACCESS = hasattr(sys, "pypy_version_info") +try: + import cffi +except ImportError: + cffi = None + + +def isImageType(t): + """ + Checks if an object is an image object. + + .. warning:: + + This function is for internal use only. + + :param t: object to check if it's an image + :returns: True if the object is an image + """ + return hasattr(t, "im") + + +# +# Constants + +NONE = 0 + +# transpose +FLIP_LEFT_RIGHT = 0 +FLIP_TOP_BOTTOM = 1 +ROTATE_90 = 2 +ROTATE_180 = 3 +ROTATE_270 = 4 +TRANSPOSE = 5 +TRANSVERSE = 6 + +# transforms (also defined in Imaging.h) +AFFINE = 0 +EXTENT = 1 +PERSPECTIVE = 2 +QUAD = 3 +MESH = 4 + +# resampling filters (also defined in Imaging.h) +NEAREST = NONE = 0 +BOX = 4 +BILINEAR = LINEAR = 2 +HAMMING = 5 +BICUBIC = CUBIC = 3 +LANCZOS = ANTIALIAS = 1 + +_filters_support = {BOX: 0.5, BILINEAR: 1.0, HAMMING: 1.0, BICUBIC: 2.0, LANCZOS: 3.0} + + +# dithers +NEAREST = NONE = 0 +ORDERED = 1 # Not yet implemented +RASTERIZE = 2 # Not yet implemented +FLOYDSTEINBERG = 3 # default + +# palettes/quantizers +WEB = 0 +ADAPTIVE = 1 + +MEDIANCUT = 0 +MAXCOVERAGE = 1 +FASTOCTREE = 2 +LIBIMAGEQUANT = 3 + +# categories +NORMAL = 0 +SEQUENCE = 1 +CONTAINER = 2 + +if hasattr(core, "DEFAULT_STRATEGY"): + DEFAULT_STRATEGY = core.DEFAULT_STRATEGY + FILTERED = core.FILTERED + HUFFMAN_ONLY = core.HUFFMAN_ONLY + RLE = core.RLE + FIXED = core.FIXED + + +# -------------------------------------------------------------------- +# Registries + +ID = [] +OPEN = {} +MIME = {} +SAVE = {} +SAVE_ALL = {} +EXTENSION = {} +DECODERS = {} +ENCODERS = {} + +# -------------------------------------------------------------------- +# Modes supported by this version + +_MODEINFO = { + # NOTE: this table will be removed in future versions. use + # getmode* functions or ImageMode descriptors instead. + # official modes + "1": ("L", "L", ("1",)), + "L": ("L", "L", ("L",)), + "I": ("L", "I", ("I",)), + "F": ("L", "F", ("F",)), + "P": ("P", "L", ("P",)), + "RGB": ("RGB", "L", ("R", "G", "B")), + "RGBX": ("RGB", "L", ("R", "G", "B", "X")), + "RGBA": ("RGB", "L", ("R", "G", "B", "A")), + "CMYK": ("RGB", "L", ("C", "M", "Y", "K")), + "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr")), + "LAB": ("RGB", "L", ("L", "A", "B")), + "HSV": ("RGB", "L", ("H", "S", "V")), + # Experimental modes include I;16, I;16L, I;16B, RGBa, BGR;15, and + # BGR;24. Use these modes only if you know exactly what you're + # doing... +} + +if sys.byteorder == "little": + _ENDIAN = "<" +else: + _ENDIAN = ">" + +_MODE_CONV = { + # official modes + "1": ("|b1", None), # Bits need to be extended to bytes + "L": ("|u1", None), + "LA": ("|u1", 2), + "I": (_ENDIAN + "i4", None), + "F": (_ENDIAN + "f4", None), + "P": ("|u1", None), + "RGB": ("|u1", 3), + "RGBX": ("|u1", 4), + "RGBA": ("|u1", 4), + "CMYK": ("|u1", 4), + "YCbCr": ("|u1", 3), + "LAB": ("|u1", 3), # UNDONE - unsigned |u1i1i1 + "HSV": ("|u1", 3), + # I;16 == I;16L, and I;32 == I;32L + "I;16": ("u2", None), + "I;16L": ("i2", None), + "I;16LS": ("u4", None), + "I;32L": ("i4", None), + "I;32LS": ("= 1: + return + + try: + from . import BmpImagePlugin + + assert BmpImagePlugin + except ImportError: + pass + try: + from . import GifImagePlugin + + assert GifImagePlugin + except ImportError: + pass + try: + from . import JpegImagePlugin + + assert JpegImagePlugin + except ImportError: + pass + try: + from . import PpmImagePlugin + + assert PpmImagePlugin + except ImportError: + pass + try: + from . import PngImagePlugin + + assert PngImagePlugin + except ImportError: + pass + # try: + # import TiffImagePlugin + # assert TiffImagePlugin + # except ImportError: + # pass + + _initialized = 1 + + +def init(): + """ + Explicitly initializes the Python Imaging Library. This function + loads all available file format drivers. + """ + + global _initialized + if _initialized >= 2: + return 0 + + for plugin in _plugins: + try: + logger.debug("Importing %s", plugin) + __import__("PIL.%s" % plugin, globals(), locals(), []) + except ImportError as e: + logger.debug("Image: failed to import %s: %s", plugin, e) + + if OPEN or SAVE: + _initialized = 2 + return 1 + + +# -------------------------------------------------------------------- +# Codec factories (used by tobytes/frombytes and ImageFile.load) + + +def _getdecoder(mode, decoder_name, args, extra=()): + + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + decoder = DECODERS[decoder_name] + except KeyError: + pass + else: + return decoder(mode, *args + extra) + + try: + # get decoder + decoder = getattr(core, decoder_name + "_decoder") + except AttributeError as e: + raise OSError("decoder %s not available" % decoder_name) from e + return decoder(mode, *args + extra) + + +def _getencoder(mode, encoder_name, args, extra=()): + + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + encoder = ENCODERS[encoder_name] + except KeyError: + pass + else: + return encoder(mode, *args + extra) + + try: + # get encoder + encoder = getattr(core, encoder_name + "_encoder") + except AttributeError as e: + raise OSError("encoder %s not available" % encoder_name) from e + return encoder(mode, *args + extra) + + +# -------------------------------------------------------------------- +# Simple expression analyzer + + +def coerce_e(value): + return value if isinstance(value, _E) else _E(value) + + +class _E: + def __init__(self, data): + self.data = data + + def __add__(self, other): + return _E((self.data, "__add__", coerce_e(other).data)) + + def __mul__(self, other): + return _E((self.data, "__mul__", coerce_e(other).data)) + + +def _getscaleoffset(expr): + stub = ["stub"] + data = expr(_E(stub)).data + try: + (a, b, c) = data # simplified syntax + if a is stub and b == "__mul__" and isinstance(c, numbers.Number): + return c, 0.0 + if a is stub and b == "__add__" and isinstance(c, numbers.Number): + return 1.0, c + except TypeError: + pass + try: + ((a, b, c), d, e) = data # full syntax + if ( + a is stub + and b == "__mul__" + and isinstance(c, numbers.Number) + and d == "__add__" + and isinstance(e, numbers.Number) + ): + return c, e + except TypeError: + pass + raise ValueError("illegal expression") + + +# -------------------------------------------------------------------- +# Implementation wrapper + + +class Image: + """ + This class represents an image object. To create + :py:class:`~PIL.Image.Image` objects, use the appropriate factory + functions. There's hardly ever any reason to call the Image constructor + directly. + + * :py:func:`~PIL.Image.open` + * :py:func:`~PIL.Image.new` + * :py:func:`~PIL.Image.frombytes` + """ + + format = None + format_description = None + _close_exclusive_fp_after_loading = True + + def __init__(self): + # FIXME: take "new" parameters / other image? + # FIXME: turn mode and size into delegating properties? + self.im = None + self.mode = "" + self._size = (0, 0) + self.palette = None + self.info = {} + self.category = NORMAL + self.readonly = 0 + self.pyaccess = None + self._exif = None + + @property + def width(self): + return self.size[0] + + @property + def height(self): + return self.size[1] + + @property + def size(self): + return self._size + + def _new(self, im): + new = Image() + new.im = im + new.mode = im.mode + new._size = im.size + if im.mode in ("P", "PA"): + if self.palette: + new.palette = self.palette.copy() + else: + from . import ImagePalette + + new.palette = ImagePalette.ImagePalette() + new.info = self.info.copy() + return new + + # Context manager support + def __enter__(self): + return self + + def __exit__(self, *args): + if hasattr(self, "fp") and getattr(self, "_exclusive_fp", False): + if hasattr(self, "_close__fp"): + self._close__fp() + if self.fp: + self.fp.close() + self.fp = None + + def close(self): + """ + Closes the file pointer, if possible. + + This operation will destroy the image core and release its memory. + The image data will be unusable afterward. + + This function is only required to close images that have not + had their file read and closed by the + :py:meth:`~PIL.Image.Image.load` method. See + :ref:`file-handling` for more information. + """ + try: + if hasattr(self, "_close__fp"): + self._close__fp() + self.fp.close() + self.fp = None + except Exception as msg: + logger.debug("Error closing: %s", msg) + + if getattr(self, "map", None): + self.map = None + + # Instead of simply setting to None, we're setting up a + # deferred error that will better explain that the core image + # object is gone. + self.im = deferred_error(ValueError("Operation on closed image")) + + def _copy(self): + self.load() + self.im = self.im.copy() + self.pyaccess = None + self.readonly = 0 + + def _ensure_mutable(self): + if self.readonly: + self._copy() + else: + self.load() + + def _dump(self, file=None, format=None, **options): + suffix = "" + if format: + suffix = "." + format + + if not file: + f, filename = tempfile.mkstemp(suffix) + os.close(f) + else: + filename = file + if not filename.endswith(suffix): + filename = filename + suffix + + self.load() + + if not format or format == "PPM": + self.im.save_ppm(filename) + else: + self.save(filename, format, **options) + + return filename + + def __eq__(self, other): + return ( + self.__class__ is other.__class__ + and self.mode == other.mode + and self.size == other.size + and self.info == other.info + and self.category == other.category + and self.readonly == other.readonly + and self.getpalette() == other.getpalette() + and self.tobytes() == other.tobytes() + ) + + def __repr__(self): + return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( + self.__class__.__module__, + self.__class__.__name__, + self.mode, + self.size[0], + self.size[1], + id(self), + ) + + def _repr_png_(self): + """ iPython display hook support + + :returns: png version of the image as bytes + """ + b = io.BytesIO() + self.save(b, "PNG") + return b.getvalue() + + @property + def __array_interface__(self): + # numpy array interface support + new = {} + shape, typestr = _conv_type_shape(self) + new["shape"] = shape + new["typestr"] = typestr + new["version"] = 3 + if self.mode == "1": + # Binary images need to be extended from bits to bytes + # See: https://github.com/python-pillow/Pillow/issues/350 + new["data"] = self.tobytes("raw", "L") + else: + new["data"] = self.tobytes() + return new + + def __getstate__(self): + return [self.info, self.mode, self.size, self.getpalette(), self.tobytes()] + + def __setstate__(self, state): + Image.__init__(self) + self.tile = [] + info, mode, size, palette, data = state + self.info = info + self.mode = mode + self._size = size + self.im = core.new(mode, size) + if mode in ("L", "LA", "P", "PA") and palette: + self.putpalette(palette) + self.frombytes(data) + + def tobytes(self, encoder_name="raw", *args): + """ + Return image as a bytes object. + + .. warning:: + + This method returns the raw image data from the internal + storage. For compressed image data (e.g. PNG, JPEG) use + :meth:`~.save`, with a BytesIO parameter for in-memory + data. + + :param encoder_name: What encoder to use. The default is to + use the standard "raw" encoder. + :param args: Extra arguments to the encoder. + :rtype: A bytes object. + """ + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if encoder_name == "raw" and args == (): + args = self.mode + + self.load() + + # unpack data + e = _getencoder(self.mode, encoder_name, args) + e.setimage(self.im) + + bufsize = max(65536, self.size[0] * 4) # see RawEncode.c + + data = [] + while True: + l, s, d = e.encode(bufsize) + data.append(d) + if s: + break + if s < 0: + raise RuntimeError("encoder error %d in tobytes" % s) + + return b"".join(data) + + def tostring(self, *args, **kw): + raise NotImplementedError( + "tostring() has been removed. Please call tobytes() instead." + ) + + def tobitmap(self, name="image"): + """ + Returns the image converted to an X11 bitmap. + + .. note:: This method only works for mode "1" images. + + :param name: The name prefix to use for the bitmap variables. + :returns: A string containing an X11 bitmap. + :raises ValueError: If the mode is not "1" + """ + + self.load() + if self.mode != "1": + raise ValueError("not a bitmap") + data = self.tobytes("xbm") + return b"".join( + [ + ("#define %s_width %d\n" % (name, self.size[0])).encode("ascii"), + ("#define %s_height %d\n" % (name, self.size[1])).encode("ascii"), + ("static char %s_bits[] = {\n" % name).encode("ascii"), + data, + b"};", + ] + ) + + def frombytes(self, data, decoder_name="raw", *args): + """ + Loads this image with pixel data from a bytes object. + + This method is similar to the :py:func:`~PIL.Image.frombytes` function, + but loads data into this image instead of creating a new image object. + """ + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + # default format + if decoder_name == "raw" and args == (): + args = self.mode + + # unpack data + d = _getdecoder(self.mode, decoder_name, args) + d.setimage(self.im) + s = d.decode(data) + + if s[0] >= 0: + raise ValueError("not enough image data") + if s[1] != 0: + raise ValueError("cannot decode image data") + + def fromstring(self, *args, **kw): + raise NotImplementedError( + "fromstring() has been removed. Please call frombytes() instead." + ) + + def load(self): + """ + Allocates storage for the image and loads the pixel data. In + normal cases, you don't need to call this method, since the + Image class automatically loads an opened image when it is + accessed for the first time. + + If the file associated with the image was opened by Pillow, then this + method will close it. The exception to this is if the image has + multiple frames, in which case the file will be left open for seek + operations. See :ref:`file-handling` for more information. + + :returns: An image access object. + :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` + """ + if self.im and self.palette and self.palette.dirty: + # realize palette + self.im.putpalette(*self.palette.getdata()) + self.palette.dirty = 0 + self.palette.mode = "RGB" + self.palette.rawmode = None + if "transparency" in self.info: + if isinstance(self.info["transparency"], int): + self.im.putpalettealpha(self.info["transparency"], 0) + else: + self.im.putpalettealphas(self.info["transparency"]) + self.palette.mode = "RGBA" + + if self.im: + if cffi and USE_CFFI_ACCESS: + if self.pyaccess: + return self.pyaccess + from . import PyAccess + + self.pyaccess = PyAccess.new(self, self.readonly) + if self.pyaccess: + return self.pyaccess + return self.im.pixel_access(self.readonly) + + def verify(self): + """ + Verifies the contents of a file. For data read from a file, this + method attempts to determine if the file is broken, without + actually decoding the image data. If this method finds any + problems, it raises suitable exceptions. If you need to load + the image after using this method, you must reopen the image + file. + """ + pass + + def convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): + """ + Returns a converted copy of this image. For the "P" mode, this + method translates pixels through the palette. If mode is + omitted, a mode is chosen so that all information in the image + and the palette can be represented without a palette. + + The current version supports all possible conversions between + "L", "RGB" and "CMYK." The **matrix** argument only supports "L" + and "RGB". + + When translating a color image to greyscale (mode "L"), + the library uses the ITU-R 601-2 luma transform:: + + L = R * 299/1000 + G * 587/1000 + B * 114/1000 + + The default method of converting a greyscale ("L") or "RGB" + image into a bilevel (mode "1") image uses Floyd-Steinberg + dither to approximate the original image luminosity levels. If + dither is :data:`NONE`, all values larger than 128 are set to 255 (white), + all other values to 0 (black). To use other thresholds, use the + :py:meth:`~PIL.Image.Image.point` method. + + When converting from "RGBA" to "P" without a **matrix** argument, + this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, + and **dither** and **palette** are ignored. + + :param mode: The requested mode. See: :ref:`concept-modes`. + :param matrix: An optional conversion matrix. If given, this + should be 4- or 12-tuple containing floating point values. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are :data:`NONE` or :data:`FLOYDSTEINBERG` (default). + Note that this is not used when **matrix** is supplied. + :param palette: Palette to use when converting from mode "RGB" + to "P". Available palettes are :data:`WEB` or :data:`ADAPTIVE`. + :param colors: Number of colors to use for the :data:`ADAPTIVE` palette. + Defaults to 256. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + if not mode and self.mode == "P": + # determine default mode + if self.palette: + mode = self.palette.mode + else: + mode = "RGB" + if not mode or (mode == self.mode and not matrix): + return self.copy() + + has_transparency = self.info.get("transparency") is not None + if matrix: + # matrix conversion + if mode not in ("L", "RGB"): + raise ValueError("illegal conversion") + im = self.im.convert_matrix(mode, matrix) + new = self._new(im) + if has_transparency and self.im.bands == 3: + transparency = new.info["transparency"] + + def convert_transparency(m, v): + v = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 + return max(0, min(255, int(v))) + + if mode == "L": + transparency = convert_transparency(matrix, transparency) + elif len(mode) == 3: + transparency = tuple( + [ + convert_transparency( + matrix[i * 4 : i * 4 + 4], transparency + ) + for i in range(0, len(transparency)) + ] + ) + new.info["transparency"] = transparency + return new + + if mode == "P" and self.mode == "RGBA": + return self.quantize(colors) + + trns = None + delete_trns = False + # transparency handling + if has_transparency: + if self.mode in ("1", "L", "I", "RGB") and mode == "RGBA": + # Use transparent conversion to promote from transparent + # color to an alpha channel. + new_im = self._new( + self.im.convert_transparent(mode, self.info["transparency"]) + ) + del new_im.info["transparency"] + return new_im + elif self.mode in ("L", "RGB", "P") and mode in ("L", "RGB", "P"): + t = self.info["transparency"] + if isinstance(t, bytes): + # Dragons. This can't be represented by a single color + warnings.warn( + "Palette images with Transparency expressed in bytes should be " + "converted to RGBA images" + ) + delete_trns = True + else: + # get the new transparency color. + # use existing conversions + trns_im = Image()._new(core.new(self.mode, (1, 1))) + if self.mode == "P": + trns_im.putpalette(self.palette) + if isinstance(t, tuple): + try: + t = trns_im.palette.getcolor(t) + except Exception as e: + raise ValueError( + "Couldn't allocate a palette color for transparency" + ) from e + trns_im.putpixel((0, 0), t) + + if mode in ("L", "RGB"): + trns_im = trns_im.convert(mode) + else: + # can't just retrieve the palette number, got to do it + # after quantization. + trns_im = trns_im.convert("RGB") + trns = trns_im.getpixel((0, 0)) + + elif self.mode == "P" and mode == "RGBA": + t = self.info["transparency"] + delete_trns = True + + if isinstance(t, bytes): + self.im.putpalettealphas(t) + elif isinstance(t, int): + self.im.putpalettealpha(t, 0) + else: + raise ValueError("Transparency for P mode should be bytes or int") + + if mode == "P" and palette == ADAPTIVE: + im = self.im.quantize(colors) + new = self._new(im) + from . import ImagePalette + + new.palette = ImagePalette.raw("RGB", new.im.getpalette("RGB")) + if delete_trns: + # This could possibly happen if we requantize to fewer colors. + # The transparency would be totally off in that case. + del new.info["transparency"] + if trns is not None: + try: + new.info["transparency"] = new.palette.getcolor(trns) + except Exception: + # if we can't make a transparent color, don't leave the old + # transparency hanging around to mess us up. + del new.info["transparency"] + warnings.warn("Couldn't allocate palette entry for transparency") + return new + + # colorspace conversion + if dither is None: + dither = FLOYDSTEINBERG + + try: + im = self.im.convert(mode, dither) + except ValueError: + try: + # normalize source image and try again + im = self.im.convert(getmodebase(self.mode)) + im = im.convert(mode, dither) + except KeyError as e: + raise ValueError("illegal conversion") from e + + new_im = self._new(im) + if delete_trns: + # crash fail if we leave a bytes transparency in an rgb/l mode. + del new_im.info["transparency"] + if trns is not None: + if new_im.mode == "P": + try: + new_im.info["transparency"] = new_im.palette.getcolor(trns) + except Exception: + del new_im.info["transparency"] + warnings.warn("Couldn't allocate palette entry for transparency") + else: + new_im.info["transparency"] = trns + return new_im + + def quantize(self, colors=256, method=None, kmeans=0, palette=None, dither=1): + """ + Convert the image to 'P' mode with the specified number + of colors. + + :param colors: The desired number of colors, <= 256 + :param method: :data:`MEDIANCUT` (median cut), + :data:`MAXCOVERAGE` (maximum coverage), + :data:`FASTOCTREE` (fast octree), + :data:`LIBIMAGEQUANT` (libimagequant; check support using + :py:func:`PIL.features.check_feature` + with ``feature="libimagequant"``). + :param kmeans: Integer + :param palette: Quantize to the palette of given + :py:class:`PIL.Image.Image`. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are :data:`NONE` or :data:`FLOYDSTEINBERG` (default). + Default: 1 (legacy setting) + :returns: A new image + + """ + + self.load() + + if method is None: + # defaults: + method = 0 + if self.mode == "RGBA": + method = 2 + + if self.mode == "RGBA" and method not in (2, 3): + # Caller specified an invalid mode. + raise ValueError( + "Fast Octree (method == 2) and libimagequant (method == 3) " + "are the only valid methods for quantizing RGBA images" + ) + + if palette: + # use palette from reference image + palette.load() + if palette.mode != "P": + raise ValueError("bad mode for palette image") + if self.mode != "RGB" and self.mode != "L": + raise ValueError( + "only RGB or L mode images can be quantized to a palette" + ) + im = self.im.convert("P", dither, palette.im) + return self._new(im) + + im = self._new(self.im.quantize(colors, method, kmeans)) + + from . import ImagePalette + + mode = im.im.getpalettemode() + im.palette = ImagePalette.ImagePalette(mode, im.im.getpalette(mode, mode)) + + return im + + def copy(self): + """ + Copies this image. Use this method if you wish to paste things + into an image, but still retain the original. + + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + self.load() + return self._new(self.im.copy()) + + __copy__ = copy + + def crop(self, box=None): + """ + Returns a rectangular region from this image. The box is a + 4-tuple defining the left, upper, right, and lower pixel + coordinate. See :ref:`coordinate-system`. + + Note: Prior to Pillow 3.4.0, this was a lazy operation. + + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if box is None: + return self.copy() + + self.load() + return self._new(self._crop(self.im, box)) + + def _crop(self, im, box): + """ + Returns a rectangular region from the core image object im. + + This is equivalent to calling im.crop((x0, y0, x1, y1)), but + includes additional sanity checks. + + :param im: a core image object + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :returns: A core image object. + """ + + x0, y0, x1, y1 = map(int, map(round, box)) + + absolute_values = (abs(x1 - x0), abs(y1 - y0)) + + _decompression_bomb_check(absolute_values) + + return im.crop((x0, y0, x1, y1)) + + def draft(self, mode, size): + """ + Configures the image file loader so it returns a version of the + image that as closely as possible matches the given mode and + size. For example, you can use this method to convert a color + JPEG to greyscale while loading it. + + If any changes are made, returns a tuple with the chosen ``mode`` and + ``box`` with coordinates of the original image within the altered one. + + Note that this method modifies the :py:class:`~PIL.Image.Image` object + in place. If the image has already been loaded, this method has no + effect. + + Note: This method is not implemented for most images. It is + currently implemented only for JPEG and MPO images. + + :param mode: The requested mode. + :param size: The requested size. + """ + pass + + def _expand(self, xmargin, ymargin=None): + if ymargin is None: + ymargin = xmargin + self.load() + return self._new(self.im.expand(xmargin, ymargin, 0)) + + def filter(self, filter): + """ + Filters this image using the given filter. For a list of + available filters, see the :py:mod:`~PIL.ImageFilter` module. + + :param filter: Filter kernel. + :returns: An :py:class:`~PIL.Image.Image` object. """ + + from . import ImageFilter + + self.load() + + if isinstance(filter, Callable): + filter = filter() + if not hasattr(filter, "filter"): + raise TypeError( + "filter argument should be ImageFilter.Filter instance or class" + ) + + multiband = isinstance(filter, ImageFilter.MultibandFilter) + if self.im.bands == 1 or multiband: + return self._new(filter.filter(self.im)) + + ims = [] + for c in range(self.im.bands): + ims.append(self._new(filter.filter(self.im.getband(c)))) + return merge(self.mode, ims) + + def getbands(self): + """ + Returns a tuple containing the name of each band in this image. + For example, **getbands** on an RGB image returns ("R", "G", "B"). + + :returns: A tuple containing band names. + :rtype: tuple + """ + return ImageMode.getmode(self.mode).bands + + def getbbox(self): + """ + Calculates the bounding box of the non-zero regions in the + image. + + :returns: The bounding box is returned as a 4-tuple defining the + left, upper, right, and lower pixel coordinate. See + :ref:`coordinate-system`. If the image is completely empty, this + method returns None. + + """ + + self.load() + return self.im.getbbox() + + def getcolors(self, maxcolors=256): + """ + Returns a list of colors used in this image. + + :param maxcolors: Maximum number of colors. If this number is + exceeded, this method returns None. The default limit is + 256 colors. + :returns: An unsorted list of (count, pixel) values. + """ + + self.load() + if self.mode in ("1", "L", "P"): + h = self.im.histogram() + out = [] + for i in range(256): + if h[i]: + out.append((h[i], i)) + if len(out) > maxcolors: + return None + return out + return self.im.getcolors(maxcolors) + + def getdata(self, band=None): + """ + Returns the contents of this image as a sequence object + containing pixel values. The sequence object is flattened, so + that values for line one follow directly after the values of + line zero, and so on. + + Note that the sequence object returned by this method is an + internal PIL data type, which only supports certain sequence + operations. To convert it to an ordinary sequence (e.g. for + printing), use **list(im.getdata())**. + + :param band: What band to return. The default is to return + all bands. To return a single band, pass in the index + value (e.g. 0 to get the "R" band from an "RGB" image). + :returns: A sequence-like object. + """ + + self.load() + if band is not None: + return self.im.getband(band) + return self.im # could be abused + + def getextrema(self): + """ + Gets the the minimum and maximum pixel values for each band in + the image. + + :returns: For a single-band image, a 2-tuple containing the + minimum and maximum pixel value. For a multi-band image, + a tuple containing one 2-tuple for each band. + """ + + self.load() + if self.im.bands > 1: + extrema = [] + for i in range(self.im.bands): + extrema.append(self.im.getband(i).getextrema()) + return tuple(extrema) + return self.im.getextrema() + + def getexif(self): + if self._exif is None: + self._exif = Exif() + + exif_info = self.info.get("exif") + if exif_info is None and "Raw profile type exif" in self.info: + exif_info = bytes.fromhex( + "".join(self.info["Raw profile type exif"].split("\n")[3:]) + ) + self._exif.load(exif_info) + + # XMP tags + if 0x0112 not in self._exif: + xmp_tags = self.info.get("XML:com.adobe.xmp") + if xmp_tags: + root = xml.etree.ElementTree.fromstring(xmp_tags) + for elem in root.iter(): + if elem.tag.endswith("}Description"): + orientation = elem.attrib.get( + "{http://ns.adobe.com/tiff/1.0/}Orientation" + ) + if orientation: + self._exif[0x0112] = int(orientation) + break + + return self._exif + + def getim(self): + """ + Returns a capsule that points to the internal image memory. + + :returns: A capsule object. + """ + + self.load() + return self.im.ptr + + def getpalette(self): + """ + Returns the image palette as a list. + + :returns: A list of color values [r, g, b, ...], or None if the + image has no palette. + """ + + self.load() + try: + return list(self.im.getpalette()) + except ValueError: + return None # no palette + + def getpixel(self, xy): + """ + Returns the pixel value at a given position. + + :param xy: The coordinate, given as (x, y). See + :ref:`coordinate-system`. + :returns: The pixel value. If the image is a multi-layer image, + this method returns a tuple. + """ + + self.load() + if self.pyaccess: + return self.pyaccess.getpixel(xy) + return self.im.getpixel(xy) + + def getprojection(self): + """ + Get projection to x and y axes + + :returns: Two sequences, indicating where there are non-zero + pixels along the X-axis and the Y-axis, respectively. + """ + + self.load() + x, y = self.im.getprojection() + return [i8(c) for c in x], [i8(c) for c in y] + + def histogram(self, mask=None, extrema=None): + """ + Returns a histogram for the image. The histogram is returned as + a list of pixel counts, one for each pixel value in the source + image. If the image has more than one band, the histograms for + all bands are concatenated (for example, the histogram for an + "RGB" image contains 768 values). + + A bilevel image (mode "1") is treated as a greyscale ("L") image + by this method. + + If a mask is provided, the method returns a histogram for those + parts of the image where the mask image is non-zero. The mask + image must have the same size as the image, and be either a + bi-level image (mode "1") or a greyscale image ("L"). + + :param mask: An optional mask. + :param extrema: An optional tuple of manually-specified extrema. + :returns: A list containing pixel counts. + """ + self.load() + if mask: + mask.load() + return self.im.histogram((0, 0), mask.im) + if self.mode in ("I", "F"): + if extrema is None: + extrema = self.getextrema() + return self.im.histogram(extrema) + return self.im.histogram() + + def entropy(self, mask=None, extrema=None): + """ + Calculates and returns the entropy for the image. + + A bilevel image (mode "1") is treated as a greyscale ("L") + image by this method. + + If a mask is provided, the method employs the histogram for + those parts of the image where the mask image is non-zero. + The mask image must have the same size as the image, and be + either a bi-level image (mode "1") or a greyscale image ("L"). + + :param mask: An optional mask. + :param extrema: An optional tuple of manually-specified extrema. + :returns: A float value representing the image entropy + """ + self.load() + if mask: + mask.load() + return self.im.entropy((0, 0), mask.im) + if self.mode in ("I", "F"): + if extrema is None: + extrema = self.getextrema() + return self.im.entropy(extrema) + return self.im.entropy() + + def offset(self, xoffset, yoffset=None): + raise NotImplementedError( + "offset() has been removed. Please call ImageChops.offset() instead." + ) + + def paste(self, im, box=None, mask=None): + """ + Pastes another image into this image. The box argument is either + a 2-tuple giving the upper left corner, a 4-tuple defining the + left, upper, right, and lower pixel coordinate, or None (same as + (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size + of the pasted image must match the size of the region. + + If the modes don't match, the pasted image is converted to the mode of + this image (see the :py:meth:`~PIL.Image.Image.convert` method for + details). + + Instead of an image, the source can be a integer or tuple + containing pixel values. The method then fills the region + with the given color. When creating RGB images, you can + also use color strings as supported by the ImageColor module. + + If a mask is given, this method updates only the regions + indicated by the mask. You can use either "1", "L" or "RGBA" + images (in the latter case, the alpha band is used as mask). + Where the mask is 255, the given image is copied as is. Where + the mask is 0, the current value is preserved. Intermediate + values will mix the two images together, including their alpha + channels if they have them. + + See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to + combine images with respect to their alpha channels. + + :param im: Source image or pixel value (integer or tuple). + :param box: An optional 4-tuple giving the region to paste into. + If a 2-tuple is used instead, it's treated as the upper left + corner. If omitted or None, the source is pasted into the + upper left corner. + + If an image is given as the second argument and there is no + third, the box defaults to (0, 0), and the second argument + is interpreted as a mask image. + :param mask: An optional mask image. + """ + + if isImageType(box) and mask is None: + # abbreviated paste(im, mask) syntax + mask = box + box = None + + if box is None: + box = (0, 0) + + if len(box) == 2: + # upper left corner given; get size from image or mask + if isImageType(im): + size = im.size + elif isImageType(mask): + size = mask.size + else: + # FIXME: use self.size here? + raise ValueError("cannot determine region size; use 4-item box") + box += (box[0] + size[0], box[1] + size[1]) + + if isinstance(im, str): + from . import ImageColor + + im = ImageColor.getcolor(im, self.mode) + + elif isImageType(im): + im.load() + if self.mode != im.mode: + if self.mode != "RGB" or im.mode not in ("RGBA", "RGBa"): + # should use an adapter for this! + im = im.convert(self.mode) + im = im.im + + self._ensure_mutable() + + if mask: + mask.load() + self.im.paste(im, box, mask.im) + else: + self.im.paste(im, box) + + def alpha_composite(self, im, dest=(0, 0), source=(0, 0)): + """ 'In-place' analog of Image.alpha_composite. Composites an image + onto this image. + + :param im: image to composite over this one + :param dest: Optional 2 tuple (left, top) specifying the upper + left corner in this (destination) image. + :param source: Optional 2 (left, top) tuple for the upper left + corner in the overlay source image, or 4 tuple (left, top, right, + bottom) for the bounds of the source rectangle + + Performance Note: Not currently implemented in-place in the core layer. + """ + + if not isinstance(source, (list, tuple)): + raise ValueError("Source must be a tuple") + if not isinstance(dest, (list, tuple)): + raise ValueError("Destination must be a tuple") + if not len(source) in (2, 4): + raise ValueError("Source must be a 2 or 4-tuple") + if not len(dest) == 2: + raise ValueError("Destination must be a 2-tuple") + if min(source) < 0: + raise ValueError("Source must be non-negative") + if min(dest) < 0: + raise ValueError("Destination must be non-negative") + + if len(source) == 2: + source = source + im.size + + # over image, crop if it's not the whole thing. + if source == (0, 0) + im.size: + overlay = im + else: + overlay = im.crop(source) + + # target for the paste + box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) + + # destination image. don't copy if we're using the whole image. + if box == (0, 0) + self.size: + background = self + else: + background = self.crop(box) + + result = alpha_composite(background, overlay) + self.paste(result, box) + + def point(self, lut, mode=None): + """ + Maps this image through a lookup table or function. + + :param lut: A lookup table, containing 256 (or 65536 if + self.mode=="I" and mode == "L") values per band in the + image. A function can be used instead, it should take a + single argument. The function is called once for each + possible pixel value, and the resulting table is applied to + all bands of the image. + :param mode: Output mode (default is same as input). In the + current version, this can only be used if the source image + has mode "L" or "P", and the output has mode "1" or the + source image mode is "I" and the output mode is "L". + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + if isinstance(lut, ImagePointHandler): + return lut.point(self) + + if callable(lut): + # if it isn't a list, it should be a function + if self.mode in ("I", "I;16", "F"): + # check if the function can be used with point_transform + # UNDONE wiredfool -- I think this prevents us from ever doing + # a gamma function point transform on > 8bit images. + scale, offset = _getscaleoffset(lut) + return self._new(self.im.point_transform(scale, offset)) + # for other modes, convert the function to a table + lut = [lut(i) for i in range(256)] * self.im.bands + + if self.mode == "F": + # FIXME: _imaging returns a confusing error message for this case + raise ValueError("point operation not supported for this mode") + + return self._new(self.im.point(lut, mode)) + + def putalpha(self, alpha): + """ + Adds or replaces the alpha layer in this image. If the image + does not have an alpha layer, it's converted to "LA" or "RGBA". + The new layer must be either "L" or "1". + + :param alpha: The new alpha layer. This can either be an "L" or "1" + image having the same size as this image, or an integer or + other color value. + """ + + self._ensure_mutable() + + if self.mode not in ("LA", "PA", "RGBA"): + # attempt to promote self to a matching alpha mode + try: + mode = getmodebase(self.mode) + "A" + try: + self.im.setmode(mode) + except (AttributeError, ValueError) as e: + # do things the hard way + im = self.im.convert(mode) + if im.mode not in ("LA", "PA", "RGBA"): + raise ValueError from e # sanity check + self.im = im + self.pyaccess = None + self.mode = self.im.mode + except (KeyError, ValueError) as e: + raise ValueError("illegal image mode") from e + + if self.mode in ("LA", "PA"): + band = 1 + else: + band = 3 + + if isImageType(alpha): + # alpha layer + if alpha.mode not in ("1", "L"): + raise ValueError("illegal image mode") + alpha.load() + if alpha.mode == "1": + alpha = alpha.convert("L") + else: + # constant alpha + try: + self.im.fillband(band, alpha) + except (AttributeError, ValueError): + # do things the hard way + alpha = new("L", self.size, alpha) + else: + return + + self.im.putband(alpha.im, band) + + def putdata(self, data, scale=1.0, offset=0.0): + """ + Copies pixel data to this image. This method copies data from a + sequence object into the image, starting at the upper left + corner (0, 0), and continuing until either the image or the + sequence ends. The scale and offset values are used to adjust + the sequence values: **pixel = value*scale + offset**. + + :param data: A sequence object. + :param scale: An optional scale value. The default is 1.0. + :param offset: An optional offset value. The default is 0.0. + """ + + self._ensure_mutable() + + self.im.putdata(data, scale, offset) + + def putpalette(self, data, rawmode="RGB"): + """ + Attaches a palette to this image. The image must be a "P", + "PA", "L" or "LA" image, and the palette sequence must contain + 768 integer values, where each group of three values represent + the red, green, and blue values for the corresponding pixel + index. Instead of an integer sequence, you can use an 8-bit + string. + + :param data: A palette sequence (either a list or a string). + :param rawmode: The raw mode of the palette. + """ + from . import ImagePalette + + if self.mode not in ("L", "LA", "P", "PA"): + raise ValueError("illegal image mode") + self.load() + if isinstance(data, ImagePalette.ImagePalette): + palette = ImagePalette.raw(data.rawmode, data.palette) + else: + if not isinstance(data, bytes): + data = bytes(data) + palette = ImagePalette.raw(rawmode, data) + self.mode = "PA" if "A" in self.mode else "P" + self.palette = palette + self.palette.mode = "RGB" + self.load() # install new palette + + def putpixel(self, xy, value): + """ + Modifies the pixel at the given position. The color is given as + a single numerical value for single-band images, and a tuple for + multi-band images. In addition to this, RGB and RGBA tuples are + accepted for P images. + + Note that this method is relatively slow. For more extensive changes, + use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` + module instead. + + See: + + * :py:meth:`~PIL.Image.Image.paste` + * :py:meth:`~PIL.Image.Image.putdata` + * :py:mod:`~PIL.ImageDraw` + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :param value: The pixel value. + """ + + if self.readonly: + self._copy() + self.load() + + if self.pyaccess: + return self.pyaccess.putpixel(xy, value) + + if ( + self.mode == "P" + and isinstance(value, (list, tuple)) + and len(value) in [3, 4] + ): + # RGB or RGBA value for a P image + value = self.palette.getcolor(value) + return self.im.putpixel(xy, value) + + def remap_palette(self, dest_map, source_palette=None): + """ + Rewrites the image to reorder the palette. + + :param dest_map: A list of indexes into the original palette. + e.g. [1,0] would swap a two item palette, and list(range(256)) + is the identity transform. + :param source_palette: Bytes or None. + :returns: An :py:class:`~PIL.Image.Image` object. + + """ + from . import ImagePalette + + if self.mode not in ("L", "P"): + raise ValueError("illegal image mode") + + if source_palette is None: + if self.mode == "P": + real_source_palette = self.im.getpalette("RGB")[:768] + else: # L-mode + real_source_palette = bytearray(i // 3 for i in range(768)) + else: + real_source_palette = source_palette + + palette_bytes = b"" + new_positions = [0] * 256 + + # pick only the used colors from the palette + for i, oldPosition in enumerate(dest_map): + palette_bytes += real_source_palette[oldPosition * 3 : oldPosition * 3 + 3] + new_positions[oldPosition] = i + + # replace the palette color id of all pixel with the new id + + # Palette images are [0..255], mapped through a 1 or 3 + # byte/color map. We need to remap the whole image + # from palette 1 to palette 2. New_positions is + # an array of indexes into palette 1. Palette 2 is + # palette 1 with any holes removed. + + # We're going to leverage the convert mechanism to use the + # C code to remap the image from palette 1 to palette 2, + # by forcing the source image into 'L' mode and adding a + # mapping 'L' mode palette, then converting back to 'L' + # sans palette thus converting the image bytes, then + # assigning the optimized RGB palette. + + # perf reference, 9500x4000 gif, w/~135 colors + # 14 sec prepatch, 1 sec postpatch with optimization forced. + + mapping_palette = bytearray(new_positions) + + m_im = self.copy() + m_im.mode = "P" + + m_im.palette = ImagePalette.ImagePalette( + "RGB", palette=mapping_palette * 3, size=768 + ) + # possibly set palette dirty, then + # m_im.putpalette(mapping_palette, 'L') # converts to 'P' + # or just force it. + # UNDONE -- this is part of the general issue with palettes + m_im.im.putpalette(*m_im.palette.getdata()) + + m_im = m_im.convert("L") + + # Internally, we require 768 bytes for a palette. + new_palette_bytes = palette_bytes + (768 - len(palette_bytes)) * b"\x00" + m_im.putpalette(new_palette_bytes) + m_im.palette = ImagePalette.ImagePalette( + "RGB", palette=palette_bytes, size=len(palette_bytes) + ) + + return m_im + + def _get_safe_box(self, size, resample, box): + """Expands the box so it includes adjacent pixels + that may be used by resampling with the given resampling filter. + """ + filter_support = _filters_support[resample] - 0.5 + scale_x = (box[2] - box[0]) / size[0] + scale_y = (box[3] - box[1]) / size[1] + support_x = filter_support * scale_x + support_y = filter_support * scale_y + + return ( + max(0, int(box[0] - support_x)), + max(0, int(box[1] - support_y)), + min(self.size[0], math.ceil(box[2] + support_x)), + min(self.size[1], math.ceil(box[3] + support_y)), + ) + + def resize(self, size, resample=BICUBIC, box=None, reducing_gap=None): + """ + Returns a resized copy of this image. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param resample: An optional resampling filter. This can be + one of :py:data:`PIL.Image.NEAREST`, :py:data:`PIL.Image.BOX`, + :py:data:`PIL.Image.BILINEAR`, :py:data:`PIL.Image.HAMMING`, + :py:data:`PIL.Image.BICUBIC` or :py:data:`PIL.Image.LANCZOS`. + Default filter is :py:data:`PIL.Image.BICUBIC`. + If the image has mode "1" or "P", it is + always set to :py:data:`PIL.Image.NEAREST`. + See: :ref:`concept-filters`. + :param box: An optional 4-tuple of floats providing + the source image region to be scaled. + The values must be within (0, 0, width, height) rectangle. + If omitted or None, the entire source is used. + :param reducing_gap: Apply optimization by resizing the image + in two steps. First, reducing the image by integer times + using :py:meth:`~PIL.Image.Image.reduce`. + Second, resizing using regular resampling. The last step + changes size no less than by ``reducing_gap`` times. + ``reducing_gap`` may be None (no first step is performed) + or should be greater than 1.0. The bigger ``reducing_gap``, + the closer the result to the fair resampling. + The smaller ``reducing_gap``, the faster resizing. + With ``reducing_gap`` greater or equal to 3.0, the result is + indistinguishable from fair resampling in most cases. + The default value is None (no optimization). + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if resample not in (NEAREST, BILINEAR, BICUBIC, LANCZOS, BOX, HAMMING): + message = "Unknown resampling filter ({}).".format(resample) + + filters = [ + "{} ({})".format(filter[1], filter[0]) + for filter in ( + (NEAREST, "Image.NEAREST"), + (LANCZOS, "Image.LANCZOS"), + (BILINEAR, "Image.BILINEAR"), + (BICUBIC, "Image.BICUBIC"), + (BOX, "Image.BOX"), + (HAMMING, "Image.HAMMING"), + ) + ] + raise ValueError( + message + " Use " + ", ".join(filters[:-1]) + " or " + filters[-1] + ) + + if reducing_gap is not None and reducing_gap < 1.0: + raise ValueError("reducing_gap must be 1.0 or greater") + + size = tuple(size) + + if box is None: + box = (0, 0) + self.size + else: + box = tuple(box) + + if self.size == size and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ("1", "P"): + resample = NEAREST + + if self.mode in ["LA", "RGBA"]: + im = self.convert(self.mode[:-1] + "a") + im = im.resize(size, resample, box) + return im.convert(self.mode) + + self.load() + + if reducing_gap is not None and resample != NEAREST: + factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 + factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 + if factor_x > 1 or factor_y > 1: + reduce_box = self._get_safe_box(size, resample, box) + factor = (factor_x, factor_y) + if callable(self.reduce): + self = self.reduce(factor, box=reduce_box) + else: + self = Image.reduce(self, factor, box=reduce_box) + box = ( + (box[0] - reduce_box[0]) / factor_x, + (box[1] - reduce_box[1]) / factor_y, + (box[2] - reduce_box[0]) / factor_x, + (box[3] - reduce_box[1]) / factor_y, + ) + + return self._new(self.im.resize(size, resample, box)) + + def reduce(self, factor, box=None): + """ + Returns a copy of the image reduced by `factor` times. + If the size of the image is not dividable by the `factor`, + the resulting size will be rounded up. + + :param factor: A greater than 0 integer or tuple of two integers + for width and height separately. + :param box: An optional 4-tuple of ints providing + the source image region to be reduced. + The values must be within (0, 0, width, height) rectangle. + If omitted or None, the entire source is used. + """ + if not isinstance(factor, (list, tuple)): + factor = (factor, factor) + + if box is None: + box = (0, 0) + self.size + else: + box = tuple(box) + + if factor == (1, 1) and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ["LA", "RGBA"]: + im = self.convert(self.mode[:-1] + "a") + im = im.reduce(factor, box) + return im.convert(self.mode) + + self.load() + + return self._new(self.im.reduce(factor, box)) + + def rotate( + self, + angle, + resample=NEAREST, + expand=0, + center=None, + translate=None, + fillcolor=None, + ): + """ + Returns a rotated copy of this image. This method returns a + copy of this image, rotated the given number of degrees counter + clockwise around its centre. + + :param angle: In degrees counter clockwise. + :param resample: An optional resampling filter. This can be + one of :py:data:`PIL.Image.NEAREST` (use nearest neighbour), + :py:data:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:data:`PIL.Image.BICUBIC` + (cubic spline interpolation in a 4x4 environment). + If omitted, or if the image has mode "1" or "P", it is + set to :py:data:`PIL.Image.NEAREST`. See :ref:`concept-filters`. + :param expand: Optional expansion flag. If true, expands the output + image to make it large enough to hold the entire rotated image. + If false or omitted, make the output image the same size as the + input image. Note that the expand flag assumes rotation around + the center and no translation. + :param center: Optional center of rotation (a 2-tuple). Origin is + the upper left corner. Default is the center of the image. + :param translate: An optional post-rotate translation (a 2-tuple). + :param fillcolor: An optional color for area outside the rotated image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + angle = angle % 360.0 + + # Fast paths regardless of filter, as long as we're not + # translating or changing the center. + if not (center or translate): + if angle == 0: + return self.copy() + if angle == 180: + return self.transpose(ROTATE_180) + if angle == 90 and expand: + return self.transpose(ROTATE_90) + if angle == 270 and expand: + return self.transpose(ROTATE_270) + + # Calculate the affine matrix. Note that this is the reverse + # transformation (from destination image to source) because we + # want to interpolate the (discrete) destination pixel from + # the local area around the (floating) source pixel. + + # The matrix we actually want (note that it operates from the right): + # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) + # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) + # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) + + # The reverse matrix is thus: + # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) + # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) + # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) + + # In any case, the final translation may be updated at the end to + # compensate for the expand flag. + + w, h = self.size + + if translate is None: + post_trans = (0, 0) + else: + post_trans = translate + if center is None: + # FIXME These should be rounded to ints? + rotn_center = (w / 2.0, h / 2.0) + else: + rotn_center = center + + angle = -math.radians(angle) + matrix = [ + round(math.cos(angle), 15), + round(math.sin(angle), 15), + 0.0, + round(-math.sin(angle), 15), + round(math.cos(angle), 15), + 0.0, + ] + + def transform(x, y, matrix): + (a, b, c, d, e, f) = matrix + return a * x + b * y + c, d * x + e * y + f + + matrix[2], matrix[5] = transform( + -rotn_center[0] - post_trans[0], -rotn_center[1] - post_trans[1], matrix + ) + matrix[2] += rotn_center[0] + matrix[5] += rotn_center[1] + + if expand: + # calculate output size + xx = [] + yy = [] + for x, y in ((0, 0), (w, 0), (w, h), (0, h)): + x, y = transform(x, y, matrix) + xx.append(x) + yy.append(y) + nw = math.ceil(max(xx)) - math.floor(min(xx)) + nh = math.ceil(max(yy)) - math.floor(min(yy)) + + # We multiply a translation matrix from the right. Because of its + # special form, this is the same as taking the image of the + # translation vector as new translation vector. + matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) + w, h = nw, nh + + return self.transform((w, h), AFFINE, matrix, resample, fillcolor=fillcolor) + + def save(self, fp, format=None, **params): + """ + Saves this image under the given filename. If no format is + specified, the format to use is determined from the filename + extension, if possible. + + Keyword options can be used to provide additional instructions + to the writer. If a writer doesn't recognise an option, it is + silently ignored. The available options are described in the + :doc:`image format documentation + <../handbook/image-file-formats>` for each writer. + + You can use a file object instead of a filename. In this case, + you must always specify the format. The file object must + implement the ``seek``, ``tell``, and ``write`` + methods, and be opened in binary mode. + + :param fp: A filename (string), pathlib.Path object or file object. + :param format: Optional format override. If omitted, the + format to use is determined from the filename extension. + If a file object was used instead of a filename, this + parameter should always be used. + :param params: Extra parameters to the image writer. + :returns: None + :exception ValueError: If the output format could not be determined + from the file name. Use the format option to solve this. + :exception OSError: If the file could not be written. The file + may have been created, and may contain partial data. + """ + + filename = "" + open_fp = False + if isPath(fp): + filename = fp + open_fp = True + elif isinstance(fp, Path): + filename = str(fp) + open_fp = True + if not filename and hasattr(fp, "name") and isPath(fp.name): + # only set the name for metadata purposes + filename = fp.name + + # may mutate self! + self._ensure_mutable() + + save_all = params.pop("save_all", False) + self.encoderinfo = params + self.encoderconfig = () + + preinit() + + ext = os.path.splitext(filename)[1].lower() + + if not format: + if ext not in EXTENSION: + init() + try: + format = EXTENSION[ext] + except KeyError as e: + raise ValueError("unknown file extension: {}".format(ext)) from e + + if format.upper() not in SAVE: + init() + if save_all: + save_handler = SAVE_ALL[format.upper()] + else: + save_handler = SAVE[format.upper()] + + if open_fp: + if params.get("append", False): + # Open also for reading ("+"), because TIFF save_all + # writer needs to go back and edit the written data. + fp = builtins.open(filename, "r+b") + else: + fp = builtins.open(filename, "w+b") + + try: + save_handler(self, fp, filename) + finally: + # do what we can to clean up + if open_fp: + fp.close() + + def seek(self, frame): + """ + Seeks to the given frame in this sequence file. If you seek + beyond the end of the sequence, the method raises an + ``EOFError`` exception. When a sequence file is opened, the + library automatically seeks to frame 0. + + See :py:meth:`~PIL.Image.Image.tell`. + + :param frame: Frame number, starting at 0. + :exception EOFError: If the call attempts to seek beyond the end + of the sequence. + """ + + # overridden by file handlers + if frame != 0: + raise EOFError + + def show(self, title=None, command=None): + """ + Displays this image. This method is mainly intended for debugging purposes. + + This method calls :py:func:`PIL.ImageShow.show` internally. You can use + :py:func:`PIL.ImageShow.register` to override its default behaviour. + + The image is first saved to a temporary file. By default, it will be in + PNG format. + + On Unix, the image is then opened using the **display**, **eog** or + **xv** utility, depending on which one can be found. + + On macOS, the image is opened with the native Preview application. + + On Windows, the image is opened with the standard PNG display utility. + + :param title: Optional title to use for the image window, where possible. + """ + + if command is not None: + warnings.warn( + "The command parameter is deprecated and will be removed in a future " + "release. Use a subclass of ImageShow.Viewer instead.", + DeprecationWarning, + ) + + _show(self, title=title, command=command) + + def split(self): + """ + Split this image into individual bands. This method returns a + tuple of individual image bands from an image. For example, + splitting an "RGB" image creates three new images each + containing a copy of one of the original bands (red, green, + blue). + + If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` + method can be more convenient and faster. + + :returns: A tuple containing bands. + """ + + self.load() + if self.im.bands == 1: + ims = [self.copy()] + else: + ims = map(self._new, self.im.split()) + return tuple(ims) + + def getchannel(self, channel): + """ + Returns an image containing a single channel of the source image. + + :param channel: What channel to return. Could be index + (0 for "R" channel of "RGB") or channel name + ("A" for alpha channel of "RGBA"). + :returns: An image in "L" mode. + + .. versionadded:: 4.3.0 + """ + self.load() + + if isinstance(channel, str): + try: + channel = self.getbands().index(channel) + except ValueError as e: + raise ValueError('The image has no channel "{}"'.format(channel)) from e + + return self._new(self.im.getband(channel)) + + def tell(self): + """ + Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. + + :returns: Frame number, starting with 0. + """ + return 0 + + def thumbnail(self, size, resample=BICUBIC, reducing_gap=2.0): + """ + Make this image into a thumbnail. This method modifies the + image to contain a thumbnail version of itself, no larger than + the given size. This method calculates an appropriate thumbnail + size to preserve the aspect of the image, calls the + :py:meth:`~PIL.Image.Image.draft` method to configure the file reader + (where applicable), and finally resizes the image. + + Note that this function modifies the :py:class:`~PIL.Image.Image` + object in place. If you need to use the full resolution image as well, + apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original + image. + + :param size: Requested size. + :param resample: Optional resampling filter. This can be one + of :py:data:`PIL.Image.NEAREST`, :py:data:`PIL.Image.BILINEAR`, + :py:data:`PIL.Image.BICUBIC`, or :py:data:`PIL.Image.LANCZOS`. + If omitted, it defaults to :py:data:`PIL.Image.BICUBIC`. + (was :py:data:`PIL.Image.NEAREST` prior to version 2.5.0). + See: :ref:`concept-filters`. + :param reducing_gap: Apply optimization by resizing the image + in two steps. First, reducing the image by integer times + using :py:meth:`~PIL.Image.Image.reduce` or + :py:meth:`~PIL.Image.Image.draft` for JPEG images. + Second, resizing using regular resampling. The last step + changes size no less than by ``reducing_gap`` times. + ``reducing_gap`` may be None (no first step is performed) + or should be greater than 1.0. The bigger ``reducing_gap``, + the closer the result to the fair resampling. + The smaller ``reducing_gap``, the faster resizing. + With ``reducing_gap`` greater or equal to 3.0, the result is + indistinguishable from fair resampling in most cases. + The default value is 2.0 (very close to fair resampling + while still being faster in many cases). + :returns: None + """ + + x, y = map(math.floor, size) + if x >= self.width and y >= self.height: + return + + def round_aspect(number, key): + return max(min(math.floor(number), math.ceil(number), key=key), 1) + + # preserve aspect ratio + aspect = self.width / self.height + if x / y >= aspect: + x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) + else: + y = round_aspect( + x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) + ) + size = (x, y) + + box = None + if reducing_gap is not None: + res = self.draft(None, (size[0] * reducing_gap, size[1] * reducing_gap)) + if res is not None: + box = res[1] + + if self.size != size: + im = self.resize(size, resample, box=box, reducing_gap=reducing_gap) + + self.im = im.im + self._size = size + self.mode = self.im.mode + + self.readonly = 0 + self.pyaccess = None + + # FIXME: the different transform methods need further explanation + # instead of bloating the method docs, add a separate chapter. + def transform( + self, size, method, data=None, resample=NEAREST, fill=1, fillcolor=None + ): + """ + Transforms this image. This method creates a new image with the + given size, and the same mode as the original, and copies data + to the new image using the given transform. + + :param size: The output size. + :param method: The transformation method. This is one of + :py:data:`PIL.Image.EXTENT` (cut out a rectangular subregion), + :py:data:`PIL.Image.AFFINE` (affine transform), + :py:data:`PIL.Image.PERSPECTIVE` (perspective transform), + :py:data:`PIL.Image.QUAD` (map a quadrilateral to a rectangle), or + :py:data:`PIL.Image.MESH` (map a number of source quadrilaterals + in one operation). + + It may also be an :py:class:`~PIL.Image.ImageTransformHandler` + object:: + + class Example(Image.ImageTransformHandler): + def transform(size, method, data, resample, fill=1): + # Return result + + It may also be an object with a :py:meth:`~method.getdata` method + that returns a tuple supplying new **method** and **data** values:: + + class Example: + def getdata(self): + method = Image.EXTENT + data = (0, 0, 100, 100) + return method, data + :param data: Extra data to the transformation method. + :param resample: Optional resampling filter. It can be one of + :py:data:`PIL.Image.NEAREST` (use nearest neighbour), + :py:data:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:data:`PIL.Image.BICUBIC` (cubic spline + interpolation in a 4x4 environment). If omitted, or if the image + has mode "1" or "P", it is set to :py:data:`PIL.Image.NEAREST`. + See: :ref:`concept-filters`. + :param fill: If **method** is an + :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of + the arguments passed to it. Otherwise, it is unused. + :param fillcolor: Optional fill color for the area outside the + transform in the output image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if self.mode == "LA": + return ( + self.convert("La") + .transform(size, method, data, resample, fill, fillcolor) + .convert("LA") + ) + + if self.mode == "RGBA": + return ( + self.convert("RGBa") + .transform(size, method, data, resample, fill, fillcolor) + .convert("RGBA") + ) + + if isinstance(method, ImageTransformHandler): + return method.transform(size, self, resample=resample, fill=fill) + + if hasattr(method, "getdata"): + # compatibility w. old-style transform objects + method, data = method.getdata() + + if data is None: + raise ValueError("missing method data") + + im = new(self.mode, size, fillcolor) + im.info = self.info.copy() + if method == MESH: + # list of quads + for box, quad in data: + im.__transformer(box, self, QUAD, quad, resample, fillcolor is None) + else: + im.__transformer( + (0, 0) + size, self, method, data, resample, fillcolor is None + ) + + return im + + def __transformer(self, box, image, method, data, resample=NEAREST, fill=1): + w = box[2] - box[0] + h = box[3] - box[1] + + if method == AFFINE: + data = data[0:6] + + elif method == EXTENT: + # convert extent to an affine transform + x0, y0, x1, y1 = data + xs = (x1 - x0) / w + ys = (y1 - y0) / h + method = AFFINE + data = (xs, 0, x0, 0, ys, y0) + + elif method == PERSPECTIVE: + data = data[0:8] + + elif method == QUAD: + # quadrilateral warp. data specifies the four corners + # given as NW, SW, SE, and NE. + nw = data[0:2] + sw = data[2:4] + se = data[4:6] + ne = data[6:8] + x0, y0 = nw + As = 1.0 / w + At = 1.0 / h + data = ( + x0, + (ne[0] - x0) * As, + (sw[0] - x0) * At, + (se[0] - sw[0] - ne[0] + x0) * As * At, + y0, + (ne[1] - y0) * As, + (sw[1] - y0) * At, + (se[1] - sw[1] - ne[1] + y0) * As * At, + ) + + else: + raise ValueError("unknown transformation method") + + if resample not in (NEAREST, BILINEAR, BICUBIC): + if resample in (BOX, HAMMING, LANCZOS): + message = { + BOX: "Image.BOX", + HAMMING: "Image.HAMMING", + LANCZOS: "Image.LANCZOS/Image.ANTIALIAS", + }[resample] + " ({}) cannot be used.".format(resample) + else: + message = "Unknown resampling filter ({}).".format(resample) + + filters = [ + "{} ({})".format(filter[1], filter[0]) + for filter in ( + (NEAREST, "Image.NEAREST"), + (BILINEAR, "Image.BILINEAR"), + (BICUBIC, "Image.BICUBIC"), + ) + ] + raise ValueError( + message + " Use " + ", ".join(filters[:-1]) + " or " + filters[-1] + ) + + image.load() + + self.load() + + if image.mode in ("1", "P"): + resample = NEAREST + + self.im.transform2(box, image.im, method, data, resample, fill) + + def transpose(self, method): + """ + Transpose image (flip or rotate in 90 degree steps) + + :param method: One of :py:data:`PIL.Image.FLIP_LEFT_RIGHT`, + :py:data:`PIL.Image.FLIP_TOP_BOTTOM`, :py:data:`PIL.Image.ROTATE_90`, + :py:data:`PIL.Image.ROTATE_180`, :py:data:`PIL.Image.ROTATE_270`, + :py:data:`PIL.Image.TRANSPOSE` or :py:data:`PIL.Image.TRANSVERSE`. + :returns: Returns a flipped or rotated copy of this image. + """ + + self.load() + return self._new(self.im.transpose(method)) + + def effect_spread(self, distance): + """ + Randomly spread pixels in an image. + + :param distance: Distance to spread pixels. + """ + self.load() + return self._new(self.im.effect_spread(distance)) + + def toqimage(self): + """Returns a QImage copy of this image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.toqimage(self) + + def toqpixmap(self): + """Returns a QPixmap copy of this image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.toqpixmap(self) + + +# -------------------------------------------------------------------- +# Abstract handlers. + + +class ImagePointHandler: + # used as a mixin by point transforms (for use with im.point) + pass + + +class ImageTransformHandler: + # used as a mixin by geometry transforms (for use with im.transform) + pass + + +# -------------------------------------------------------------------- +# Factories + +# +# Debugging + + +def _wedge(): + """Create greyscale wedge (for debugging only)""" + + return Image()._new(core.wedge("L")) + + +def _check_size(size): + """ + Common check to enforce type and sanity check on size tuples + + :param size: Should be a 2 tuple of (width, height) + :returns: True, or raises a ValueError + """ + + if not isinstance(size, (list, tuple)): + raise ValueError("Size must be a tuple") + if len(size) != 2: + raise ValueError("Size must be a tuple of length 2") + if size[0] < 0 or size[1] < 0: + raise ValueError("Width and height must be >= 0") + + return True + + +def new(mode, size, color=0): + """ + Creates a new image with the given mode and size. + + :param mode: The mode to use for the new image. See: + :ref:`concept-modes`. + :param size: A 2-tuple, containing (width, height) in pixels. + :param color: What color to use for the image. Default is black. + If given, this should be a single integer or floating point value + for single-band modes, and a tuple for multi-band modes (one value + per band). When creating RGB images, you can also use color + strings as supported by the ImageColor module. If the color is + None, the image is not initialised. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + if color is None: + # don't initialize + return Image()._new(core.new(mode, size)) + + if isinstance(color, str): + # css3-style specifier + + from . import ImageColor + + color = ImageColor.getcolor(color, mode) + + im = Image() + if mode == "P" and isinstance(color, (list, tuple)) and len(color) in [3, 4]: + # RGB or RGBA value for a P image + from . import ImagePalette + + im.palette = ImagePalette.ImagePalette() + color = im.palette.getcolor(color) + return im._new(core.fill(mode, size, color)) + + +def frombytes(mode, size, data, decoder_name="raw", *args): + """ + Creates a copy of an image memory from pixel data in a buffer. + + In its simplest form, this function takes three arguments + (mode, size, and unpacked pixel data). + + You can also use any pixel decoder supported by PIL. For more + information on available decoders, see the section + :ref:`Writing Your Own File Decoder `. + + Note that this function decodes pixel data only, not entire images. + If you have an entire image in a string, wrap it in a + :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load + it. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A byte buffer containing raw data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw" and args == (): + args = mode + + im = new(mode, size) + im.frombytes(data, decoder_name, args) + return im + + +def fromstring(*args, **kw): + raise NotImplementedError( + "fromstring() has been removed. Please call frombytes() instead." + ) + + +def frombuffer(mode, size, data, decoder_name="raw", *args): + """ + Creates an image memory referencing pixel data in a byte buffer. + + This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data + in the byte buffer, where possible. This means that changes to the + original buffer object are reflected in this image). Not all modes can + share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". + + Note that this function decodes pixel data only, not entire images. + If you have an entire image file in a string, wrap it in a + **BytesIO** object, and use :py:func:`~PIL.Image.open` to load it. + + In the current version, the default parameters used for the "raw" decoder + differs from that used for :py:func:`~PIL.Image.frombytes`. This is a + bug, and will probably be fixed in a future release. The current release + issues a warning if you do this; to disable the warning, you should provide + the full set of parameters. See below for details. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A bytes or other buffer object containing raw + data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. For the + default encoder ("raw"), it's recommended that you provide the + full set of parameters:: + + frombuffer(mode, size, data, "raw", mode, 0, 1) + + :returns: An :py:class:`~PIL.Image.Image` object. + + .. versionadded:: 1.1.4 + """ + + _check_size(size) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw": + if args == (): + args = mode, 0, 1 + if args[0] in _MAPMODES: + im = new(mode, (1, 1)) + im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) + im.readonly = 1 + return im + + return frombytes(mode, size, data, decoder_name, args) + + +def fromarray(obj, mode=None): + """ + Creates an image memory from an object exporting the array interface + (using the buffer protocol). + + If **obj** is not contiguous, then the tobytes method is called + and :py:func:`~PIL.Image.frombuffer` is used. + + If you have an image in NumPy:: + + from PIL import Image + import numpy as np + im = Image.open('hopper.jpg') + a = np.asarray(im) + + Then this can be used to convert it to a Pillow image:: + + im = Image.fromarray(a) + + :param obj: Object with array interface + :param mode: Mode to use (will be determined from type if None) + See: :ref:`concept-modes`. + :returns: An image object. + + .. versionadded:: 1.1.6 + """ + arr = obj.__array_interface__ + shape = arr["shape"] + ndim = len(shape) + strides = arr.get("strides", None) + if mode is None: + try: + typekey = (1, 1) + shape[2:], arr["typestr"] + except KeyError as e: + raise TypeError("Cannot handle this data type") from e + try: + mode, rawmode = _fromarray_typemap[typekey] + except KeyError as e: + raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e + else: + rawmode = mode + if mode in ["1", "L", "I", "P", "F"]: + ndmax = 2 + elif mode == "RGB": + ndmax = 3 + else: + ndmax = 4 + if ndim > ndmax: + raise ValueError("Too many dimensions: %d > %d." % (ndim, ndmax)) + + size = 1 if ndim == 1 else shape[1], shape[0] + if strides is not None: + if hasattr(obj, "tobytes"): + obj = obj.tobytes() + else: + obj = obj.tostring() + + return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) + + +def fromqimage(im): + """Creates an image instance from a QImage image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.fromqimage(im) + + +def fromqpixmap(im): + """Creates an image instance from a QPixmap image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.fromqpixmap(im) + + +_fromarray_typemap = { + # (shape, typestr) => mode, rawmode + # first two members of shape are set to one + ((1, 1), "|b1"): ("1", "1;8"), + ((1, 1), "|u1"): ("L", "L"), + ((1, 1), "|i1"): ("I", "I;8"), + ((1, 1), "u2"): ("I", "I;16B"), + ((1, 1), "i2"): ("I", "I;16BS"), + ((1, 1), "u4"): ("I", "I;32B"), + ((1, 1), "i4"): ("I", "I;32BS"), + ((1, 1), "f4"): ("F", "F;32BF"), + ((1, 1), "f8"): ("F", "F;64BF"), + ((1, 1, 2), "|u1"): ("LA", "LA"), + ((1, 1, 3), "|u1"): ("RGB", "RGB"), + ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), +} + +# shortcuts +_fromarray_typemap[((1, 1), _ENDIAN + "i4")] = ("I", "I") +_fromarray_typemap[((1, 1), _ENDIAN + "f4")] = ("F", "F") + + +def _decompression_bomb_check(size): + if MAX_IMAGE_PIXELS is None: + return + + pixels = size[0] * size[1] + + if pixels > 2 * MAX_IMAGE_PIXELS: + raise DecompressionBombError( + "Image size (%d pixels) exceeds limit of %d pixels, " + "could be decompression bomb DOS attack." % (pixels, 2 * MAX_IMAGE_PIXELS) + ) + + if pixels > MAX_IMAGE_PIXELS: + warnings.warn( + "Image size (%d pixels) exceeds limit of %d pixels, " + "could be decompression bomb DOS attack." % (pixels, MAX_IMAGE_PIXELS), + DecompressionBombWarning, + ) + + +def open(fp, mode="r"): + """ + Opens and identifies the given image file. + + This is a lazy operation; this function identifies the file, but + the file remains open and the actual image data is not read from + the file until you try to process the data (or call the + :py:meth:`~PIL.Image.Image.load` method). See + :py:func:`~PIL.Image.new`. See :ref:`file-handling`. + + :param fp: A filename (string), pathlib.Path object or a file object. + The file object must implement :py:meth:`~file.read`, + :py:meth:`~file.seek`, and :py:meth:`~file.tell` methods, + and be opened in binary mode. + :param mode: The mode. If given, this argument must be "r". + :returns: An :py:class:`~PIL.Image.Image` object. + :exception FileNotFoundError: If the file cannot be found. + :exception PIL.UnidentifiedImageError: If the image cannot be opened and + identified. + :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` + instance is used for ``fp``. + """ + + if mode != "r": + raise ValueError("bad mode %r" % mode) + elif isinstance(fp, io.StringIO): + raise ValueError( + "StringIO cannot be used to open an image. " + "Binary data must be used instead." + ) + + exclusive_fp = False + filename = "" + if isinstance(fp, Path): + filename = str(fp.resolve()) + elif isPath(fp): + filename = fp + + if filename: + fp = builtins.open(filename, "rb") + exclusive_fp = True + + try: + fp.seek(0) + except (AttributeError, io.UnsupportedOperation): + fp = io.BytesIO(fp.read()) + exclusive_fp = True + + prefix = fp.read(16) + + preinit() + + accept_warnings = [] + + def _open_core(fp, filename, prefix): + for i in ID: + try: + factory, accept = OPEN[i] + result = not accept or accept(prefix) + if type(result) in [str, bytes]: + accept_warnings.append(result) + elif result: + fp.seek(0) + im = factory(fp, filename) + _decompression_bomb_check(im.size) + return im + except (SyntaxError, IndexError, TypeError, struct.error): + # Leave disabled by default, spams the logs with image + # opening failures that are entirely expected. + # logger.debug("", exc_info=True) + continue + except BaseException: + if exclusive_fp: + fp.close() + raise + return None + + im = _open_core(fp, filename, prefix) + + if im is None: + if init(): + im = _open_core(fp, filename, prefix) + + if im: + im._exclusive_fp = exclusive_fp + return im + + if exclusive_fp: + fp.close() + for message in accept_warnings: + warnings.warn(message) + raise UnidentifiedImageError( + "cannot identify image file %r" % (filename if filename else fp) + ) + + +# +# Image processing. + + +def alpha_composite(im1, im2): + """ + Alpha composite im2 over im1. + + :param im1: The first image. Must have mode RGBA. + :param im2: The second image. Must have mode RGBA, and the same size as + the first image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.alpha_composite(im1.im, im2.im)) + + +def blend(im1, im2, alpha): + """ + Creates a new image by interpolating between two input images, using + a constant alpha.:: + + out = image1 * (1.0 - alpha) + image2 * alpha + + :param im1: The first image. + :param im2: The second image. Must have the same mode and size as + the first image. + :param alpha: The interpolation alpha factor. If alpha is 0.0, a + copy of the first image is returned. If alpha is 1.0, a copy of + the second image is returned. There are no restrictions on the + alpha value. If necessary, the result is clipped to fit into + the allowed output range. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.blend(im1.im, im2.im, alpha)) + + +def composite(image1, image2, mask): + """ + Create composite image by blending images using a transparency mask. + + :param image1: The first image. + :param image2: The second image. Must have the same mode and + size as the first image. + :param mask: A mask image. This image can have mode + "1", "L", or "RGBA", and must have the same size as the + other two images. + """ + + image = image2.copy() + image.paste(image1, None, mask) + return image + + +def eval(image, *args): + """ + Applies the function (which should take one argument) to each pixel + in the given image. If the image has more than one band, the same + function is applied to each band. Note that the function is + evaluated once for each possible pixel value, so you cannot use + random components or other generators. + + :param image: The input image. + :param function: A function object, taking one integer argument. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + return image.point(args[0]) + + +def merge(mode, bands): + """ + Merge a set of single band images into a new multiband image. + + :param mode: The mode to use for the output image. See: + :ref:`concept-modes`. + :param bands: A sequence containing one single-band image for + each band in the output image. All bands must have the + same size. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if getmodebands(mode) != len(bands) or "*" in mode: + raise ValueError("wrong number of bands") + for band in bands[1:]: + if band.mode != getmodetype(mode): + raise ValueError("mode mismatch") + if band.size != bands[0].size: + raise ValueError("size mismatch") + for band in bands: + band.load() + return bands[0]._new(core.merge(mode, *[b.im for b in bands])) + + +# -------------------------------------------------------------------- +# Plugin registry + + +def register_open(id, factory, accept=None): + """ + Register an image file plugin. This function should not be used + in application code. + + :param id: An image format identifier. + :param factory: An image file factory method. + :param accept: An optional function that can be used to quickly + reject images having another format. + """ + id = id.upper() + ID.append(id) + OPEN[id] = factory, accept + + +def register_mime(id, mimetype): + """ + Registers an image MIME type. This function should not be used + in application code. + + :param id: An image format identifier. + :param mimetype: The image MIME type for this format. + """ + MIME[id.upper()] = mimetype + + +def register_save(id, driver): + """ + Registers an image save function. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE[id.upper()] = driver + + +def register_save_all(id, driver): + """ + Registers an image function to save all the frames + of a multiframe format. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE_ALL[id.upper()] = driver + + +def register_extension(id, extension): + """ + Registers an image extension. This function should not be + used in application code. + + :param id: An image format identifier. + :param extension: An extension used for this format. + """ + EXTENSION[extension.lower()] = id.upper() + + +def register_extensions(id, extensions): + """ + Registers image extensions. This function should not be + used in application code. + + :param id: An image format identifier. + :param extensions: A list of extensions used for this format. + """ + for extension in extensions: + register_extension(id, extension) + + +def registered_extensions(): + """ + Returns a dictionary containing all file extensions belonging + to registered plugins + """ + if not EXTENSION: + init() + return EXTENSION + + +def register_decoder(name, decoder): + """ + Registers an image decoder. This function should not be + used in application code. + + :param name: The name of the decoder + :param decoder: A callable(mode, args) that returns an + ImageFile.PyDecoder object + + .. versionadded:: 4.1.0 + """ + DECODERS[name] = decoder + + +def register_encoder(name, encoder): + """ + Registers an image encoder. This function should not be + used in application code. + + :param name: The name of the encoder + :param encoder: A callable(mode, args) that returns an + ImageFile.PyEncoder object + + .. versionadded:: 4.1.0 + """ + ENCODERS[name] = encoder + + +# -------------------------------------------------------------------- +# Simple display support. + + +def _show(image, **options): + options["_internal_pillow"] = True + _showxv(image, **options) + + +def _showxv(image, title=None, **options): + from . import ImageShow + + if "_internal_pillow" in options: + del options["_internal_pillow"] + else: + warnings.warn( + "_showxv is deprecated and will be removed in a future release. " + "Use Image.show instead.", + DeprecationWarning, + ) + ImageShow.show(image, title, **options) + + +# -------------------------------------------------------------------- +# Effects + + +def effect_mandelbrot(size, extent, quality): + """ + Generate a Mandelbrot set covering the given extent. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param extent: The extent to cover, as a 4-tuple: + (x0, y0, x1, y2). + :param quality: Quality. + """ + return Image()._new(core.effect_mandelbrot(size, extent, quality)) + + +def effect_noise(size, sigma): + """ + Generate Gaussian noise centered around 128. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param sigma: Standard deviation of noise. + """ + return Image()._new(core.effect_noise(size, sigma)) + + +def linear_gradient(mode): + """ + Generate 256x256 linear gradient from black to white, top to bottom. + + :param mode: Input mode. + """ + return Image()._new(core.linear_gradient(mode)) + + +def radial_gradient(mode): + """ + Generate 256x256 radial gradient from black to white, centre to edge. + + :param mode: Input mode. + """ + return Image()._new(core.radial_gradient(mode)) + + +# -------------------------------------------------------------------- +# Resources + + +def _apply_env_variables(env=None): + if env is None: + env = os.environ + + for var_name, setter in [ + ("PILLOW_ALIGNMENT", core.set_alignment), + ("PILLOW_BLOCK_SIZE", core.set_block_size), + ("PILLOW_BLOCKS_MAX", core.set_blocks_max), + ]: + if var_name not in env: + continue + + var = env[var_name].lower() + + units = 1 + for postfix, mul in [("k", 1024), ("m", 1024 * 1024)]: + if var.endswith(postfix): + units = mul + var = var[: -len(postfix)] + + try: + var = int(var) * units + except ValueError: + warnings.warn("{} is not int".format(var_name)) + continue + + try: + setter(var) + except ValueError as e: + warnings.warn("{}: {}".format(var_name, e)) + + +_apply_env_variables() +atexit.register(core.clear_cache) + + +class Exif(MutableMapping): + endian = "<" + + def __init__(self): + self._data = {} + self._ifds = {} + self._info = None + self._loaded_exif = None + + def _fixup(self, value): + try: + if len(value) == 1 and isinstance(value, tuple): + return value[0] + except Exception: + pass + return value + + def _fixup_dict(self, src_dict): + # Helper function for _getexif() + # returns a dict with any single item tuples/lists as individual values + return {k: self._fixup(v) for k, v in src_dict.items()} + + def _get_ifd_dict(self, tag): + try: + # an offset pointer to the location of the nested embedded IFD. + # It should be a long, but may be corrupted. + self.fp.seek(self[tag]) + except (KeyError, TypeError): + pass + else: + from . import TiffImagePlugin + + info = TiffImagePlugin.ImageFileDirectory_v2(self.head) + info.load(self.fp) + return self._fixup_dict(info) + + def load(self, data): + # Extract EXIF information. This is highly experimental, + # and is likely to be replaced with something better in a future + # version. + + # The EXIF record consists of a TIFF file embedded in a JPEG + # application marker (!). + if data == self._loaded_exif: + return + self._loaded_exif = data + self._data.clear() + self._ifds.clear() + self._info = None + if not data: + return + + if data.startswith(b"Exif\x00\x00"): + data = data[6:] + self.fp = io.BytesIO(data) + self.head = self.fp.read(8) + # process dictionary + from . import TiffImagePlugin + + self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) + self.endian = self._info._endian + self.fp.seek(self._info.next) + self._info.load(self.fp) + + # get EXIF extension + ifd = self._get_ifd_dict(0x8769) + if ifd: + self._data.update(ifd) + self._ifds[0x8769] = ifd + + def tobytes(self, offset=8): + from . import TiffImagePlugin + + if self.endian == "<": + head = b"II\x2A\x00\x08\x00\x00\x00" + else: + head = b"MM\x00\x2A\x00\x00\x00\x08" + ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) + for tag, value in self.items(): + ifd[tag] = value + return b"Exif\x00\x00" + head + ifd.tobytes(offset) + + def get_ifd(self, tag): + if tag not in self._ifds and tag in self: + if tag in [0x8825, 0xA005]: + # gpsinfo, interop + self._ifds[tag] = self._get_ifd_dict(tag) + elif tag == 0x927C: # makernote + from .TiffImagePlugin import ImageFileDirectory_v2 + + if self[0x927C][:8] == b"FUJIFILM": + exif_data = self[0x927C] + ifd_offset = i32le(exif_data[8:12]) + ifd_data = exif_data[ifd_offset:] + + makernote = {} + for i in range(0, struct.unpack(" 4: + (offset,) = struct.unpack("H", ifd_data[:2])[0]): + ifd_tag, typ, count, data = struct.unpack( + ">HHL4s", ifd_data[i * 12 + 2 : (i + 1) * 12 + 2] + ) + if ifd_tag == 0x1101: + # CameraInfo + (offset,) = struct.unpack(">L", data) + self.fp.seek(offset) + + camerainfo = {"ModelID": self.fp.read(4)} + + self.fp.read(4) + # Seconds since 2000 + camerainfo["TimeStamp"] = i32le(self.fp.read(12)) + + self.fp.read(4) + camerainfo["InternalSerialNumber"] = self.fp.read(4) + + self.fp.read(12) + parallax = self.fp.read(4) + handler = ImageFileDirectory_v2._load_dispatch[ + TiffTags.FLOAT + ][1] + camerainfo["Parallax"] = handler( + ImageFileDirectory_v2(), parallax, False + ) + + self.fp.read(4) + camerainfo["Category"] = self.fp.read(2) + + makernote = {0x1101: dict(self._fixup_dict(camerainfo))} + self._ifds[0x927C] = makernote + return self._ifds.get(tag, {}) + + def __str__(self): + if self._info is not None: + # Load all keys into self._data + for tag in self._info.keys(): + self[tag] + + return str(self._data) + + def __len__(self): + keys = set(self._data) + if self._info is not None: + keys.update(self._info) + return len(keys) + + def __getitem__(self, tag): + if self._info is not None and tag not in self._data and tag in self._info: + self._data[tag] = self._fixup(self._info[tag]) + if tag == 0x8825: + self._data[tag] = self.get_ifd(tag) + del self._info[tag] + return self._data[tag] + + def __contains__(self, tag): + return tag in self._data or (self._info is not None and tag in self._info) + + def __setitem__(self, tag, value): + if self._info is not None and tag in self._info: + del self._info[tag] + self._data[tag] = value + + def __delitem__(self, tag): + if self._info is not None and tag in self._info: + del self._info[tag] + del self._data[tag] + + def __iter__(self): + keys = set(self._data) + if self._info is not None: + keys.update(self._info) + return iter(keys) diff --git a/venv/Lib/site-packages/PIL/ImageChops.py b/venv/Lib/site-packages/PIL/ImageChops.py new file mode 100644 index 0000000..c1a2574 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageChops.py @@ -0,0 +1,328 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard channel operations +# +# History: +# 1996-03-24 fl Created +# 1996-08-13 fl Added logical operations (for "1" images) +# 2000-10-12 fl Added offset method (from Image.py) +# +# Copyright (c) 1997-2000 by Secret Labs AB +# Copyright (c) 1996-2000 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +def constant(image, value): + """Fill a channel with a given grey level. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.new("L", image.size, value) + + +def duplicate(image): + """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return image.copy() + + +def invert(image): + """ + Invert an image (channel). + + .. code-block:: python + + out = MAX - image + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image.load() + return image._new(image.im.chop_invert()) + + +def lighter(image1, image2): + """ + Compares the two images, pixel by pixel, and returns a new image containing + the lighter values. + + .. code-block:: python + + out = max(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_lighter(image2.im)) + + +def darker(image1, image2): + """ + Compares the two images, pixel by pixel, and returns a new image containing + the darker values. + + .. code-block:: python + + out = min(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_darker(image2.im)) + + +def difference(image1, image2): + """ + Returns the absolute value of the pixel-by-pixel difference between the two + images. + + .. code-block:: python + + out = abs(image1 - image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_difference(image2.im)) + + +def multiply(image1, image2): + """ + Superimposes two images on top of each other. + + If you multiply an image with a solid black image, the result is black. If + you multiply with a solid white image, the image is unaffected. + + .. code-block:: python + + out = image1 * image2 / MAX + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_multiply(image2.im)) + + +def screen(image1, image2): + """ + Superimposes two inverted images on top of each other. + + .. code-block:: python + + out = MAX - ((MAX - image1) * (MAX - image2) / MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_screen(image2.im)) + + +def soft_light(image1, image2): + """ + Superimposes two images on top of each other using the Soft Light algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_soft_light(image2.im)) + + +def hard_light(image1, image2): + """ + Superimposes two images on top of each other using the Hard Light algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_hard_light(image2.im)) + + +def overlay(image1, image2): + """ + Superimposes two images on top of each other using the Overlay algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_overlay(image2.im)) + + +def add(image1, image2, scale=1.0, offset=0): + """ + Adds two images, dividing the result by scale and adding the + offset. If omitted, scale defaults to 1.0, and offset to 0.0. + + .. code-block:: python + + out = ((image1 + image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add(image2.im, scale, offset)) + + +def subtract(image1, image2, scale=1.0, offset=0): + """ + Subtracts two images, dividing the result by scale and adding the offset. + If omitted, scale defaults to 1.0, and offset to 0.0. + + .. code-block:: python + + out = ((image1 - image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) + + +def add_modulo(image1, image2): + """Add two images, without clipping the result. + + .. code-block:: python + + out = ((image1 + image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add_modulo(image2.im)) + + +def subtract_modulo(image1, image2): + """Subtract two images, without clipping the result. + + .. code-block:: python + + out = ((image1 - image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract_modulo(image2.im)) + + +def logical_and(image1, image2): + """Logical AND between two images. + + Both of the images must have mode "1". If you would like to perform a + logical AND on an image with a mode other than "1", try + :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask + as the second image. + + .. code-block:: python + + out = ((image1 and image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_and(image2.im)) + + +def logical_or(image1, image2): + """Logical OR between two images. + + Both of the images must have mode "1". + + .. code-block:: python + + out = ((image1 or image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_or(image2.im)) + + +def logical_xor(image1, image2): + """Logical XOR between two images. + + Both of the images must have mode "1". + + .. code-block:: python + + out = ((bool(image1) != bool(image2)) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_xor(image2.im)) + + +def blend(image1, image2, alpha): + """Blend images using constant transparency weight. Alias for + :py:meth:`PIL.Image.Image.blend`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.blend(image1, image2, alpha) + + +def composite(image1, image2, mask): + """Create composite using transparency mask. Alias for + :py:meth:`PIL.Image.Image.composite`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.composite(image1, image2, mask) + + +def offset(image, xoffset, yoffset=None): + """Returns a copy of the image where data has been offset by the given + distances. Data wraps around the edges. If **yoffset** is omitted, it + is assumed to be equal to **xoffset**. + + :param xoffset: The horizontal distance. + :param yoffset: The vertical distance. If omitted, both + distances are set to the same value. + :rtype: :py:class:`~PIL.Image.Image` + """ + + if yoffset is None: + yoffset = xoffset + image.load() + return image._new(image.im.offset(xoffset, yoffset)) diff --git a/venv/Lib/site-packages/PIL/ImageCms.py b/venv/Lib/site-packages/PIL/ImageCms.py new file mode 100644 index 0000000..1c4ce5a --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageCms.py @@ -0,0 +1,990 @@ +# The Python Imaging Library. +# $Id$ + +# Optional color management support, based on Kevin Cazabon's PyCMS +# library. + +# History: + +# 2009-03-08 fl Added to PIL. + +# Copyright (C) 2002-2003 Kevin Cazabon +# Copyright (c) 2009 by Fredrik Lundh +# Copyright (c) 2013 by Eric Soroos + +# See the README file for information on usage and redistribution. See +# below for the original description. + +import sys + +from PIL import Image + +try: + from PIL import _imagingcms +except ImportError as ex: + # Allow error import for doc purposes, but error out when accessing + # anything in core. + from ._util import deferred_error + + _imagingcms = deferred_error(ex) + +DESCRIPTION = """ +pyCMS + + a Python / PIL interface to the littleCMS ICC Color Management System + Copyright (C) 2002-2003 Kevin Cazabon + kevin@cazabon.com + http://www.cazabon.com + + pyCMS home page: http://www.cazabon.com/pyCMS + littleCMS home page: http://www.littlecms.com + (littleCMS is Copyright (C) 1998-2001 Marti Maria) + + Originally released under LGPL. Graciously donated to PIL in + March 2009, for distribution under the standard PIL license + + The pyCMS.py module provides a "clean" interface between Python/PIL and + pyCMSdll, taking care of some of the more complex handling of the direct + pyCMSdll functions, as well as error-checking and making sure that all + relevant data is kept together. + + While it is possible to call pyCMSdll functions directly, it's not highly + recommended. + + Version History: + + 1.0.0 pil Oct 2013 Port to LCMS 2. + + 0.1.0 pil mod March 10, 2009 + + Renamed display profile to proof profile. The proof + profile is the profile of the device that is being + simulated, not the profile of the device which is + actually used to display/print the final simulation + (that'd be the output profile) - also see LCMSAPI.txt + input colorspace -> using 'renderingIntent' -> proof + colorspace -> using 'proofRenderingIntent' -> output + colorspace + + Added LCMS FLAGS support. + Added FLAGS["SOFTPROOFING"] as default flag for + buildProofTransform (otherwise the proof profile/intent + would be ignored). + + 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms + + 0.0.2 alpha Jan 6, 2002 + + Added try/except statements around type() checks of + potential CObjects... Python won't let you use type() + on them, and raises a TypeError (stupid, if you ask + me!) + + Added buildProofTransformFromOpenProfiles() function. + Additional fixes in DLL, see DLL code for details. + + 0.0.1 alpha first public release, Dec. 26, 2002 + + Known to-do list with current version (of Python interface, not pyCMSdll): + + none + +""" + +VERSION = "1.0.0 pil" + +# --------------------------------------------------------------------. + +core = _imagingcms + +# +# intent/direction values + +INTENT_PERCEPTUAL = 0 +INTENT_RELATIVE_COLORIMETRIC = 1 +INTENT_SATURATION = 2 +INTENT_ABSOLUTE_COLORIMETRIC = 3 + +DIRECTION_INPUT = 0 +DIRECTION_OUTPUT = 1 +DIRECTION_PROOF = 2 + +# +# flags + +FLAGS = { + "MATRIXINPUT": 1, + "MATRIXOUTPUT": 2, + "MATRIXONLY": (1 | 2), + "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot + # Don't create prelinearization tables on precalculated transforms + # (internal use): + "NOPRELINEARIZATION": 16, + "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) + "NOTCACHE": 64, # Inhibit 1-pixel cache + "NOTPRECALC": 256, + "NULLTRANSFORM": 512, # Don't transform anyway + "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy + "LOWRESPRECALC": 2048, # Use less memory to minimize resources + "WHITEBLACKCOMPENSATION": 8192, + "BLACKPOINTCOMPENSATION": 8192, + "GAMUTCHECK": 4096, # Out of Gamut alarm + "SOFTPROOFING": 16384, # Do softproofing + "PRESERVEBLACK": 32768, # Black preservation + "NODEFAULTRESOURCEDEF": 16777216, # CRD special + "GRIDPOINTS": lambda n: ((n) & 0xFF) << 16, # Gridpoints +} + +_MAX_FLAG = 0 +for flag in FLAGS.values(): + if isinstance(flag, int): + _MAX_FLAG = _MAX_FLAG | flag + + +# --------------------------------------------------------------------. +# Experimental PIL-level API +# --------------------------------------------------------------------. + +## +# Profile. + + +class ImageCmsProfile: + def __init__(self, profile): + """ + :param profile: Either a string representing a filename, + a file like object containing a profile or a + low-level profile object + + """ + + if isinstance(profile, str): + self._set(core.profile_open(profile), profile) + elif hasattr(profile, "read"): + self._set(core.profile_frombytes(profile.read())) + elif isinstance(profile, _imagingcms.CmsProfile): + self._set(profile) + else: + raise TypeError("Invalid type for Profile") + + def _set(self, profile, filename=None): + self.profile = profile + self.filename = filename + if profile: + self.product_name = None # profile.product_name + self.product_info = None # profile.product_info + else: + self.product_name = None + self.product_info = None + + def tobytes(self): + """ + Returns the profile in a format suitable for embedding in + saved images. + + :returns: a bytes object containing the ICC profile. + """ + + return core.profile_tobytes(self.profile) + + +class ImageCmsTransform(Image.ImagePointHandler): + + """ + Transform. This can be used with the procedural API, or with the standard + :py:func:`~PIL.Image.Image.point` method. + + Will return the output profile in the ``output.info['icc_profile']``. + """ + + def __init__( + self, + input, + output, + input_mode, + output_mode, + intent=INTENT_PERCEPTUAL, + proof=None, + proof_intent=INTENT_ABSOLUTE_COLORIMETRIC, + flags=0, + ): + if proof is None: + self.transform = core.buildTransform( + input.profile, output.profile, input_mode, output_mode, intent, flags + ) + else: + self.transform = core.buildProofTransform( + input.profile, + output.profile, + proof.profile, + input_mode, + output_mode, + intent, + proof_intent, + flags, + ) + # Note: inputMode and outputMode are for pyCMS compatibility only + self.input_mode = self.inputMode = input_mode + self.output_mode = self.outputMode = output_mode + + self.output_profile = output + + def point(self, im): + return self.apply(im) + + def apply(self, im, imOut=None): + im.load() + if imOut is None: + imOut = Image.new(self.output_mode, im.size, None) + self.transform.apply(im.im.id, imOut.im.id) + imOut.info["icc_profile"] = self.output_profile.tobytes() + return imOut + + def apply_in_place(self, im): + im.load() + if im.mode != self.output_mode: + raise ValueError("mode mismatch") # wrong output mode + self.transform.apply(im.im.id, im.im.id) + im.info["icc_profile"] = self.output_profile.tobytes() + return im + + +def get_display_profile(handle=None): + """ (experimental) Fetches the profile for the current display device. + :returns: ``None`` if the profile is not known. + """ + + if sys.platform != "win32": + return None + + from PIL import ImageWin + + if isinstance(handle, ImageWin.HDC): + profile = core.get_display_profile_win32(handle, 1) + else: + profile = core.get_display_profile_win32(handle or 0) + if profile is None: + return None + return ImageCmsProfile(profile) + + +# --------------------------------------------------------------------. +# pyCMS compatible layer +# --------------------------------------------------------------------. + + +class PyCMSError(Exception): + + """ (pyCMS) Exception class. + This is used for all errors in the pyCMS API. """ + + pass + + +def profileToProfile( + im, + inputProfile, + outputProfile, + renderingIntent=INTENT_PERCEPTUAL, + outputMode=None, + inPlace=False, + flags=0, +): + """ + (pyCMS) Applies an ICC transformation to a given image, mapping from + ``inputProfile`` to ``outputProfile``. + + If the input or output profiles specified are not valid filenames, a + :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and + ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. + If an error occurs during application of the profiles, + a :exc:`PyCMSError` will be raised. + If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), + a :exc:`PyCMSError` will be raised. + + This function applies an ICC transformation to im from ``inputProfile``'s + color space to ``outputProfile``'s color space using the specified rendering + intent to decide how to handle out-of-gamut colors. + + ``outputMode`` can be used to specify that a color mode conversion is to + be done using these profiles, but the specified profiles must be able + to handle that mode. I.e., if converting im from RGB to CMYK using + profiles, the input profile must handle RGB data, and the output + profile must handle CMYK data. + + :param im: An open :py:class:`~PIL.Image.Image` object (i.e. Image.new(...) + or Image.open(...), etc.) + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this image, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this image, or a profile object + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param outputMode: A valid PIL mode for the output image (i.e. "RGB", + "CMYK", etc.). Note: if rendering the image "inPlace", outputMode + MUST be the same mode as the input, or omitted completely. If + omitted, the outputMode will be the same as the mode of the input + image (im.mode) + :param inPlace: Boolean. If ``True``, the original image is modified in-place, + and ``None`` is returned. If ``False`` (default), a new + :py:class:`~PIL.Image.Image` object is returned with the transform applied. + :param flags: Integer (0-...) specifying additional flags + :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on + the value of ``inPlace`` + :exception PyCMSError: + """ + + if outputMode is None: + outputMode = im.mode + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + raise PyCMSError("renderingIntent must be an integer between 0 and 3") + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + transform = ImageCmsTransform( + inputProfile, + outputProfile, + im.mode, + outputMode, + renderingIntent, + flags=flags, + ) + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + return imOut + + +def getOpenProfile(profileFilename): + """ + (pyCMS) Opens an ICC profile file. + + The PyCMSProfile object can be passed back into pyCMS for use in creating + transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). + + If ``profileFilename`` is not a valid filename for an ICC profile, + a :exc:`PyCMSError` will be raised. + + :param profileFilename: String, as a valid filename path to the ICC profile + you wish to open, or a file-like object. + :returns: A CmsProfile class object. + :exception PyCMSError: + """ + + try: + return ImageCmsProfile(profileFilename) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def buildTransform( + inputProfile, + outputProfile, + inMode, + outMode, + renderingIntent=INTENT_PERCEPTUAL, + flags=0, +): + """ + (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the + ``outputProfile``. Use applyTransform to apply the transform to a given + image. + + If the input or output profiles specified are not valid filenames, a + :exc:`PyCMSError` will be raised. If an error occurs during creation + of the transform, a :exc:`PyCMSError` will be raised. + + If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` + (or by pyCMS), a :exc:`PyCMSError` will be raised. + + This function builds and returns an ICC transform from the ``inputProfile`` + to the ``outputProfile`` using the ``renderingIntent`` to determine what to do + with out-of-gamut colors. It will ONLY work for converting images that + are in ``inMode`` to images that are in ``outMode`` color format (PIL mode, + i.e. "RGB", "RGBA", "CMYK", etc.). + + Building the transform is a fair part of the overhead in + ImageCms.profileToProfile(), so if you're planning on converting multiple + images using the same input/output settings, this can save you time. + Once you have a transform object, it can be used with + ImageCms.applyProfile() to convert images without the need to re-compute + the lookup table for the transform. + + The reason pyCMS returns a class object rather than a handle directly + to the transform is that it needs to keep track of the PIL input/output + modes that the transform is meant for. These attributes are stored in + the ``inMode`` and ``outMode`` attributes of the object (which can be + manually overridden if you really want to, but I don't know of any + time that would be of use, or would even work). + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + raise PyCMSError("renderingIntent must be an integer between 0 and 3") + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + return ImageCmsTransform( + inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags + ) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def buildProofTransform( + inputProfile, + outputProfile, + proofProfile, + inMode, + outMode, + renderingIntent=INTENT_PERCEPTUAL, + proofRenderingIntent=INTENT_ABSOLUTE_COLORIMETRIC, + flags=FLAGS["SOFTPROOFING"], +): + """ + (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the + ``outputProfile``, but tries to simulate the result that would be + obtained on the ``proofProfile`` device. + + If the input, output, or proof profiles specified are not valid + filenames, a :exc:`PyCMSError` will be raised. + + If an error occurs during creation of the transform, + a :exc:`PyCMSError` will be raised. + + If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` + (or by pyCMS), a :exc:`PyCMSError` will be raised. + + This function builds and returns an ICC transform from the ``inputProfile`` + to the ``outputProfile``, but tries to simulate the result that would be + obtained on the ``proofProfile`` device using ``renderingIntent`` and + ``proofRenderingIntent`` to determine what to do with out-of-gamut + colors. This is known as "soft-proofing". It will ONLY work for + converting images that are in ``inMode`` to images that are in outMode + color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). + + Usage of the resulting transform object is exactly the same as with + ImageCms.buildTransform(). + + Proof profiling is generally used when using an output device to get a + good idea of what the final printed/displayed image would look like on + the ``proofProfile`` device when it's quicker and easier to use the + output device for judging color. Generally, this means that the + output device is a monitor, or a dye-sub printer (etc.), and the simulated + device is something more expensive, complicated, or time consuming + (making it difficult to make a real print for color judgement purposes). + + Soft-proofing basically functions by adjusting the colors on the + output device to match the colors of the device being simulated. However, + when the simulated device has a much wider gamut than the output + device, you may obtain marginal results. + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + (monitor, usually) profile you wish to use for this transform, or a + profile object + :param proofProfile: String, as a valid filename path to the ICC proof + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the input->proof (simulated) transform + + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param proofRenderingIntent: Integer (0-3) specifying the rendering intent + you wish to use for proof->output transform + + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + raise PyCMSError("renderingIntent must be an integer between 0 and 3") + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + raise PyCMSError("flags must be an integer between 0 and %s" + _MAX_FLAG) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + if not isinstance(proofProfile, ImageCmsProfile): + proofProfile = ImageCmsProfile(proofProfile) + return ImageCmsTransform( + inputProfile, + outputProfile, + inMode, + outMode, + renderingIntent, + proofProfile, + proofRenderingIntent, + flags, + ) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +buildTransformFromOpenProfiles = buildTransform +buildProofTransformFromOpenProfiles = buildProofTransform + + +def applyTransform(im, transform, inPlace=False): + """ + (pyCMS) Applies a transform to a given image. + + If ``im.mode != transform.inMode``, a :exc:`PyCMSError` is raised. + + If ``inPlace`` is ``True`` and ``transform.inMode != transform.outMode``, a + :exc:`PyCMSError` is raised. + + If ``im.mode``, ``transform.inMode`` or ``transform.outMode`` is not + supported by pyCMSdll or the profiles you used for the transform, a + :exc:`PyCMSError` is raised. + + If an error occurs while the transform is being applied, + a :exc:`PyCMSError` is raised. + + This function applies a pre-calculated transform (from + ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) + to an image. The transform can be used for multiple images, saving + considerable calculation time if doing the same conversion multiple times. + + If you want to modify im in-place instead of receiving a new image as + the return value, set ``inPlace`` to ``True``. This can only be done if + ``transform.inMode`` and ``transform.outMode`` are the same, because we can't + change the mode in-place (the buffer sizes for some modes are + different). The default behavior is to return a new :py:class:`~PIL.Image.Image` + object of the same dimensions in mode ``transform.outMode``. + + :param im: An :py:class:`~PIL.Image.Image` object, and im.mode must be the same + as the ``inMode`` supported by the transform. + :param transform: A valid CmsTransform class object + :param inPlace: Bool. If ``True``, ``im` is modified in place and ``None`` is + returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the + transform applied is returned (and ``im`` is not changed). The default is + ``False``. + :returns: Either ``None``, or a new :py:class:`~PIL.Image.Image` object, + depending on the value of ``inPlace``. The profile will be returned in + the image's ``info['icc_profile']``. + :exception PyCMSError: + """ + + try: + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (TypeError, ValueError) as v: + raise PyCMSError(v) from v + + return imOut + + +def createProfile(colorSpace, colorTemp=-1): + """ + (pyCMS) Creates a profile. + + If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, + a :exc:`PyCMSError` is raised. + + If using LAB and ``colorTemp`` is not a positive integer, + a :exc:`PyCMSError` is raised. + + If an error occurs while creating the profile, + a :exc:`PyCMSError` is raised. + + Use this function to create common profiles on-the-fly instead of + having to supply a profile on disk and knowing the path to it. It + returns a normal CmsProfile object that can be passed to + ImageCms.buildTransformFromOpenProfiles() to create a transform to apply + to images. + + :param colorSpace: String, the color space of the profile you wish to + create. + Currently only "LAB", "XYZ", and "sRGB" are supported. + :param colorTemp: Positive integer for the white point for the profile, in + degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 + illuminant if omitted (5000k). colorTemp is ONLY applied to LAB + profiles, and is ignored for XYZ and sRGB. + :returns: A CmsProfile class object + :exception PyCMSError: + """ + + if colorSpace not in ["LAB", "XYZ", "sRGB"]: + raise PyCMSError( + "Color space not supported for on-the-fly profile creation (%s)" + % colorSpace + ) + + if colorSpace == "LAB": + try: + colorTemp = float(colorTemp) + except (TypeError, ValueError) as e: + raise PyCMSError( + 'Color temperature must be numeric, "%s" not valid' % colorTemp + ) from e + + try: + return core.createProfile(colorSpace, colorTemp) + except (TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileName(profile): + """ + + (pyCMS) Gets the internal product name for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, + a :exc:`PyCMSError` is raised If an error occurs while trying + to obtain the name tag, a :exc:`PyCMSError` is raised. + + Use this function to obtain the INTERNAL name of the profile (stored + in an ICC tag in the profile itself), usually the one used when the + profile was originally created. Sometimes this tag also contains + additional information supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal name of the profile as stored + in an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # do it in python, not c. + # // name was "%s - %s" (model, manufacturer) || Description , + # // but if the Model and Manufacturer were the same or the model + # // was long, Just the model, in 1.x + model = profile.profile.model + manufacturer = profile.profile.manufacturer + + if not (model or manufacturer): + return (profile.profile.profile_description or "") + "\n" + if not manufacturer or len(model) > 30: + return model + "\n" + return "{} - {}\n".format(model, manufacturer) + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileInfo(profile): + """ + (pyCMS) Gets the internal product information for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, + a :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the info tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + info tag. This often contains details about the profile, and how it + was created, as supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # add an extra newline to preserve pyCMS compatibility + # Python, not C. the white point bits weren't working well, + # so skipping. + # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint + description = profile.profile.profile_description + cpright = profile.profile.copyright + arr = [] + for elt in (description, cpright): + if elt: + arr.append(elt) + return "\r\n\r\n".join(arr) + "\r\n\r\n" + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileCopyright(profile): + """ + (pyCMS) Gets the copyright for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the copyright tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + copyright tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.copyright or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileManufacturer(profile): + """ + (pyCMS) Gets the manufacturer for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the manufacturer tag, a + :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + manufacturer tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.manufacturer or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileModel(profile): + """ + (pyCMS) Gets the model for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the model tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + model tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.model or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileDescription(profile): + """ + (pyCMS) Gets the description for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the description tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + description tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in an + ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.profile_description or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getDefaultIntent(profile): + """ + (pyCMS) Gets the default intent name for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the default intent, a + :exc:`PyCMSError` is raised. + + Use this function to determine the default (and usually best optimized) + rendering intent for this profile. Most profiles support multiple + rendering intents, but are intended mostly for one type of conversion. + If you wish to use a different intent than returned, use + ImageCms.isIntentSupported() to verify it will work first. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: Integer 0-3 specifying the default rendering intent for this + profile. + + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.rendering_intent + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def isIntentSupported(profile, intent, direction): + """ + (pyCMS) Checks if a given intent is supported. + + Use this function to verify that you can use your desired + ``intent`` with ``profile``, and that ``profile`` can be used for the + input/output/proof profile as you desire. + + Some profiles are created specifically for one "direction", can cannot + be used for others. Some profiles can only be used for certain + rendering intents, so it's best to either verify this before trying + to create a transform with them (using this function), or catch the + potential :exc:`PyCMSError` that will occur if they don't + support the modes you select. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :param intent: Integer (0-3) specifying the rendering intent you wish to + use with this profile + + ImageCms.INTENT_PERCEPTUAL = 0 (DEFAULT) + ImageCms.INTENT_RELATIVE_COLORIMETRIC = 1 + ImageCms.INTENT_SATURATION = 2 + ImageCms.INTENT_ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param direction: Integer specifying if the profile is to be used for + input, output, or proof + + INPUT = 0 (or use ImageCms.DIRECTION_INPUT) + OUTPUT = 1 (or use ImageCms.DIRECTION_OUTPUT) + PROOF = 2 (or use ImageCms.DIRECTION_PROOF) + + :returns: 1 if the intent/direction are supported, -1 if they are not. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # FIXME: I get different results for the same data w. different + # compilers. Bug in LittleCMS or in the binding? + if profile.profile.is_intent_supported(intent, direction): + return 1 + else: + return -1 + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def versions(): + """ + (pyCMS) Fetches versions. + """ + + return (VERSION, core.littlecms_version, sys.version.split()[0], Image.__version__) diff --git a/venv/Lib/site-packages/PIL/ImageColor.py b/venv/Lib/site-packages/PIL/ImageColor.py new file mode 100644 index 0000000..9cf7a99 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageColor.py @@ -0,0 +1,300 @@ +# +# The Python Imaging Library +# $Id$ +# +# map CSS3-style colour description strings to RGB +# +# History: +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-15 fl Added RGBA support +# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 +# 2004-07-19 fl Fixed gray/grey spelling issues +# 2009-03-05 fl Fixed rounding error in grayscale calculation +# +# Copyright (c) 2002-2004 by Secret Labs AB +# Copyright (c) 2002-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import re + +from . import Image + + +def getrgb(color): + """ + Convert a color string to an RGB tuple. If the string cannot be parsed, + this function raises a :py:exc:`ValueError` exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :return: ``(red, green, blue[, alpha])`` + """ + color = color.lower() + + rgb = colormap.get(color, None) + if rgb: + if isinstance(rgb, tuple): + return rgb + colormap[color] = rgb = getrgb(rgb) + return rgb + + # check for known string formats + if re.match("#[a-f0-9]{3}$", color): + return (int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16)) + + if re.match("#[a-f0-9]{4}$", color): + return ( + int(color[1] * 2, 16), + int(color[2] * 2, 16), + int(color[3] * 2, 16), + int(color[4] * 2, 16), + ) + + if re.match("#[a-f0-9]{6}$", color): + return (int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16)) + + if re.match("#[a-f0-9]{8}$", color): + return ( + int(color[1:3], 16), + int(color[3:5], 16), + int(color[5:7], 16), + int(color[7:9], 16), + ) + + m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return (int(m.group(1)), int(m.group(2)), int(m.group(3))) + + m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) + if m: + return ( + int((int(m.group(1)) * 255) / 100.0 + 0.5), + int((int(m.group(2)) * 255) / 100.0 + 0.5), + int((int(m.group(3)) * 255) / 100.0 + 0.5), + ) + + m = re.match( + r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color + ) + if m: + from colorsys import hls_to_rgb + + rgb = hls_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(3)) / 100.0, + float(m.group(2)) / 100.0, + ) + return ( + int(rgb[0] * 255 + 0.5), + int(rgb[1] * 255 + 0.5), + int(rgb[2] * 255 + 0.5), + ) + + m = re.match( + r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color + ) + if m: + from colorsys import hsv_to_rgb + + rgb = hsv_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(2)) / 100.0, + float(m.group(3)) / 100.0, + ) + return ( + int(rgb[0] * 255 + 0.5), + int(rgb[1] * 255 + 0.5), + int(rgb[2] * 255 + 0.5), + ) + + m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return (int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4))) + raise ValueError("unknown color specifier: %r" % color) + + +def getcolor(color, mode): + """ + Same as :py:func:`~PIL.ImageColor.getrgb`, but converts the RGB value to a + greyscale value if the mode is not color or a palette image. If the string + cannot be parsed, this function raises a :py:exc:`ValueError` exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :return: ``(graylevel [, alpha]) or (red, green, blue[, alpha])`` + """ + # same as getrgb, but converts the result to the given mode + color, alpha = getrgb(color), 255 + if len(color) == 4: + color, alpha = color[0:3], color[3] + + if Image.getmodebase(mode) == "L": + r, g, b = color + # ITU-R Recommendation 601-2 for nonlinear RGB + # scaled to 24 bits to match the convert's implementation. + color = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 + if mode[-1] == "A": + return (color, alpha) + else: + if mode[-1] == "A": + return color + (alpha,) + return color + + +colormap = { + # X11 colour table from https://drafts.csswg.org/css-color-4/, with + # gray/grey spelling issues fixed. This is a superset of HTML 4.0 + # colour names used in CSS 1. + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgrey": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkslategrey": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dimgrey": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "grey": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgreen": "#90ee90", + "lightgray": "#d3d3d3", + "lightgrey": "#d3d3d3", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightslategrey": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370db", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#db7093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "rebeccapurple": "#663399", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "slategrey": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", +} diff --git a/venv/Lib/site-packages/PIL/ImageDraw.py b/venv/Lib/site-packages/PIL/ImageDraw.py new file mode 100644 index 0000000..cbecf65 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageDraw.py @@ -0,0 +1,566 @@ +# +# The Python Imaging Library +# $Id$ +# +# drawing interface operations +# +# History: +# 1996-04-13 fl Created (experimental) +# 1996-08-07 fl Filled polygons, ellipses. +# 1996-08-13 fl Added text support +# 1998-06-28 fl Handle I and F images +# 1998-12-29 fl Added arc; use arc primitive to draw ellipses +# 1999-01-10 fl Added shape stuff (experimental) +# 1999-02-06 fl Added bitmap support +# 1999-02-11 fl Changed all primitives to take options +# 1999-02-20 fl Fixed backwards compatibility +# 2000-10-12 fl Copy on write, when necessary +# 2001-02-18 fl Use default ink for bitmap/text also in fill mode +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing +# 2002-12-11 fl Refactored low-level drawing API (work in progress) +# 2004-08-26 fl Made Draw() a factory function, added getdraw() support +# 2004-09-04 fl Added width support to line primitive +# 2004-09-10 fl Added font mode handling +# 2006-06-19 fl Added font bearing support (getmask2) +# +# Copyright (c) 1997-2006 by Secret Labs AB +# Copyright (c) 1996-2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import math +import numbers + +from . import Image, ImageColor + + +""" +A simple 2D drawing interface for PIL images. +

+Application code should use the Draw factory, instead of +directly. +""" + + +class ImageDraw: + def __init__(self, im, mode=None): + """ + Create a drawing instance. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + im.load() + if im.readonly: + im._copy() # make it writeable + blend = 0 + if mode is None: + mode = im.mode + if mode != im.mode: + if mode == "RGBA" and im.mode == "RGB": + blend = 1 + else: + raise ValueError("mode mismatch") + if mode == "P": + self.palette = im.palette + else: + self.palette = None + self.im = im.im + self.draw = Image.core.draw(self.im, blend) + self.mode = mode + if mode in ("I", "F"): + self.ink = self.draw.draw_ink(1) + else: + self.ink = self.draw.draw_ink(-1) + if mode in ("1", "P", "I", "F"): + # FIXME: fix Fill2 to properly support matte for I+F images + self.fontmode = "1" + else: + self.fontmode = "L" # aliasing is okay for other modes + self.fill = 0 + self.font = None + + def getfont(self): + """ + Get the current default font. + + :returns: An image font.""" + if not self.font: + # FIXME: should add a font repository + from . import ImageFont + + self.font = ImageFont.load_default() + return self.font + + def _getink(self, ink, fill=None): + if ink is None and fill is None: + if self.fill: + fill = self.ink + else: + ink = self.ink + else: + if ink is not None: + if isinstance(ink, str): + ink = ImageColor.getcolor(ink, self.mode) + if self.palette and not isinstance(ink, numbers.Number): + ink = self.palette.getcolor(ink) + ink = self.draw.draw_ink(ink) + if fill is not None: + if isinstance(fill, str): + fill = ImageColor.getcolor(fill, self.mode) + if self.palette and not isinstance(fill, numbers.Number): + fill = self.palette.getcolor(fill) + fill = self.draw.draw_ink(fill) + return ink, fill + + def arc(self, xy, start, end, fill=None, width=0): + """Draw an arc.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_arc(xy, start, end, ink, width) + + def bitmap(self, xy, bitmap, fill=None): + """Draw a bitmap.""" + bitmap.load() + ink, fill = self._getink(fill) + if ink is None: + ink = fill + if ink is not None: + self.draw.draw_bitmap(xy, bitmap.im, ink) + + def chord(self, xy, start, end, fill=None, outline=None, width=1): + """Draw a chord.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_chord(xy, start, end, fill, 1) + if ink is not None and ink != fill and width != 0: + self.draw.draw_chord(xy, start, end, ink, 0, width) + + def ellipse(self, xy, fill=None, outline=None, width=1): + """Draw an ellipse.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_ellipse(xy, fill, 1) + if ink is not None and ink != fill and width != 0: + self.draw.draw_ellipse(xy, ink, 0, width) + + def line(self, xy, fill=None, width=0, joint=None): + """Draw a line, or a connected sequence of line segments.""" + ink = self._getink(fill)[0] + if ink is not None: + self.draw.draw_lines(xy, ink, width) + if joint == "curve" and width > 4: + if not isinstance(xy[0], (list, tuple)): + xy = [tuple(xy[i : i + 2]) for i in range(0, len(xy), 2)] + for i in range(1, len(xy) - 1): + point = xy[i] + angles = [ + math.degrees(math.atan2(end[0] - start[0], start[1] - end[1])) + % 360 + for start, end in ((xy[i - 1], point), (point, xy[i + 1])) + ] + if angles[0] == angles[1]: + # This is a straight line, so no joint is required + continue + + def coord_at_angle(coord, angle): + x, y = coord + angle -= 90 + distance = width / 2 - 1 + return tuple( + [ + p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) + for p, p_d in ( + (x, distance * math.cos(math.radians(angle))), + (y, distance * math.sin(math.radians(angle))), + ) + ] + ) + + flipped = ( + angles[1] > angles[0] and angles[1] - 180 > angles[0] + ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0]) + coords = [ + (point[0] - width / 2 + 1, point[1] - width / 2 + 1), + (point[0] + width / 2 - 1, point[1] + width / 2 - 1), + ] + if flipped: + start, end = (angles[1] + 90, angles[0] + 90) + else: + start, end = (angles[0] - 90, angles[1] - 90) + self.pieslice(coords, start - 90, end - 90, fill) + + if width > 8: + # Cover potential gaps between the line and the joint + if flipped: + gapCoords = [ + coord_at_angle(point, angles[0] + 90), + point, + coord_at_angle(point, angles[1] + 90), + ] + else: + gapCoords = [ + coord_at_angle(point, angles[0] - 90), + point, + coord_at_angle(point, angles[1] - 90), + ] + self.line(gapCoords, fill, width=3) + + def shape(self, shape, fill=None, outline=None): + """(Experimental) Draw a shape.""" + shape.close() + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_outline(shape, fill, 1) + if ink is not None and ink != fill: + self.draw.draw_outline(shape, ink, 0) + + def pieslice(self, xy, start, end, fill=None, outline=None, width=1): + """Draw a pieslice.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_pieslice(xy, start, end, fill, 1) + if ink is not None and ink != fill and width != 0: + self.draw.draw_pieslice(xy, start, end, ink, 0, width) + + def point(self, xy, fill=None): + """Draw one or more individual pixels.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_points(xy, ink) + + def polygon(self, xy, fill=None, outline=None): + """Draw a polygon.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_polygon(xy, fill, 1) + if ink is not None and ink != fill: + self.draw.draw_polygon(xy, ink, 0) + + def rectangle(self, xy, fill=None, outline=None, width=1): + """Draw a rectangle.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_rectangle(xy, fill, 1) + if ink is not None and ink != fill and width != 0: + self.draw.draw_rectangle(xy, ink, 0, width) + + def _multiline_check(self, text): + """Draw text.""" + split_character = "\n" if isinstance(text, str) else b"\n" + + return split_character in text + + def _multiline_split(self, text): + split_character = "\n" if isinstance(text, str) else b"\n" + + return text.split(split_character) + + def text( + self, + xy, + text, + fill=None, + font=None, + anchor=None, + spacing=4, + align="left", + direction=None, + features=None, + language=None, + stroke_width=0, + stroke_fill=None, + *args, + **kwargs + ): + if self._multiline_check(text): + return self.multiline_text( + xy, + text, + fill, + font, + anchor, + spacing, + align, + direction, + features, + language, + stroke_width, + stroke_fill, + ) + + if font is None: + font = self.getfont() + + def getink(fill): + ink, fill = self._getink(fill) + if ink is None: + return fill + return ink + + def draw_text(ink, stroke_width=0, stroke_offset=None): + coord = xy + try: + mask, offset = font.getmask2( + text, + self.fontmode, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + *args, + **kwargs, + ) + coord = coord[0] + offset[0], coord[1] + offset[1] + except AttributeError: + try: + mask = font.getmask( + text, + self.fontmode, + direction, + features, + language, + stroke_width, + *args, + **kwargs, + ) + except TypeError: + mask = font.getmask(text) + if stroke_offset: + coord = coord[0] + stroke_offset[0], coord[1] + stroke_offset[1] + self.draw.draw_bitmap(coord, mask, ink) + + ink = getink(fill) + if ink is not None: + stroke_ink = None + if stroke_width: + stroke_ink = getink(stroke_fill) if stroke_fill is not None else ink + + if stroke_ink is not None: + # Draw stroked text + draw_text(stroke_ink, stroke_width) + + # Draw normal text + draw_text(ink, 0, (stroke_width, stroke_width)) + else: + # Only draw normal text + draw_text(ink) + + def multiline_text( + self, + xy, + text, + fill=None, + font=None, + anchor=None, + spacing=4, + align="left", + direction=None, + features=None, + language=None, + stroke_width=0, + stroke_fill=None, + ): + widths = [] + max_width = 0 + lines = self._multiline_split(text) + line_spacing = ( + self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing + ) + for line in lines: + line_width, line_height = self.textsize( + line, + font, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + ) + widths.append(line_width) + max_width = max(max_width, line_width) + left, top = xy + for idx, line in enumerate(lines): + if align == "left": + pass # left = x + elif align == "center": + left += (max_width - widths[idx]) / 2.0 + elif align == "right": + left += max_width - widths[idx] + else: + raise ValueError('align must be "left", "center" or "right"') + self.text( + (left, top), + line, + fill, + font, + anchor, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + stroke_fill=stroke_fill, + ) + top += line_spacing + left = xy[0] + + def textsize( + self, + text, + font=None, + spacing=4, + direction=None, + features=None, + language=None, + stroke_width=0, + ): + """Get the size of a given string, in pixels.""" + if self._multiline_check(text): + return self.multiline_textsize( + text, font, spacing, direction, features, language, stroke_width + ) + + if font is None: + font = self.getfont() + return font.getsize(text, direction, features, language, stroke_width) + + def multiline_textsize( + self, + text, + font=None, + spacing=4, + direction=None, + features=None, + language=None, + stroke_width=0, + ): + max_width = 0 + lines = self._multiline_split(text) + line_spacing = ( + self.textsize("A", font=font, stroke_width=stroke_width)[1] + spacing + ) + for line in lines: + line_width, line_height = self.textsize( + line, font, spacing, direction, features, language, stroke_width + ) + max_width = max(max_width, line_width) + return max_width, len(lines) * line_spacing - spacing + + +def Draw(im, mode=None): + """ + A simple 2D drawing interface for PIL images. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + try: + return im.getdraw(mode) + except AttributeError: + return ImageDraw(im, mode) + + +# experimental access to the outline API +try: + Outline = Image.core.outline +except AttributeError: + Outline = None + + +def getdraw(im=None, hints=None): + """ + (Experimental) A more advanced 2D drawing interface for PIL images, + based on the WCK interface. + + :param im: The image to draw in. + :param hints: An optional list of hints. + :returns: A (drawing context, drawing resource factory) tuple. + """ + # FIXME: this needs more work! + # FIXME: come up with a better 'hints' scheme. + handler = None + if not hints or "nicest" in hints: + try: + from . import _imagingagg as handler + except ImportError: + pass + if handler is None: + from . import ImageDraw2 as handler + if im: + im = handler.Draw(im) + return im, handler + + +def floodfill(image, xy, value, border=None, thresh=0): + """ + (experimental) Fills a bounded region with a given color. + + :param image: Target image. + :param xy: Seed position (a 2-item coordinate tuple). See + :ref:`coordinate-system`. + :param value: Fill color. + :param border: Optional border value. If given, the region consists of + pixels with a color different from the border color. If not given, + the region consists of pixels having the same color as the seed + pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of + non-homogeneous, but similar, colors. + """ + # based on an implementation by Eric S. Raymond + # amended by yo1995 @20180806 + pixel = image.load() + x, y = xy + try: + background = pixel[x, y] + if _color_diff(value, background) <= thresh: + return # seed point already has fill color + pixel[x, y] = value + except (ValueError, IndexError): + return # seed point outside image + edge = {(x, y)} + # use a set to keep record of current and previous edge pixels + # to reduce memory consumption + full_edge = set() + while edge: + new_edge = set() + for (x, y) in edge: # 4 adjacent method + for (s, t) in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): + # If already processed, or if a coordinate is negative, skip + if (s, t) in full_edge or s < 0 or t < 0: + continue + try: + p = pixel[s, t] + except (ValueError, IndexError): + pass + else: + full_edge.add((s, t)) + if border is None: + fill = _color_diff(p, background) <= thresh + else: + fill = p != value and p != border + if fill: + pixel[s, t] = value + new_edge.add((s, t)) + full_edge = edge # discard pixels processed + edge = new_edge + + +def _color_diff(color1, color2): + """ + Uses 1-norm distance to calculate difference between two values. + """ + if isinstance(color2, tuple): + return sum([abs(color1[i] - color2[i]) for i in range(0, len(color2))]) + else: + return abs(color1 - color2) diff --git a/venv/Lib/site-packages/PIL/ImageDraw2.py b/venv/Lib/site-packages/PIL/ImageDraw2.py new file mode 100644 index 0000000..1f63110 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageDraw2.py @@ -0,0 +1,179 @@ +# +# The Python Imaging Library +# $Id$ +# +# WCK-style drawing interface operations +# +# History: +# 2003-12-07 fl created +# 2005-05-15 fl updated; added to PIL as ImageDraw2 +# 2005-05-15 fl added text support +# 2005-05-20 fl added arc/chord/pieslice support +# +# Copyright (c) 2003-2005 by Secret Labs AB +# Copyright (c) 2003-2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +""" +(Experimental) WCK-style drawing interface operations + +.. seealso:: :py:mod:`PIL.ImageDraw` +""" + + +from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath + + +class Pen: + """Stores an outline color and width.""" + + def __init__(self, color, width=1, opacity=255): + self.color = ImageColor.getrgb(color) + self.width = width + + +class Brush: + """Stores a fill color""" + + def __init__(self, color, opacity=255): + self.color = ImageColor.getrgb(color) + + +class Font: + """Stores a TrueType font and color""" + + def __init__(self, color, file, size=12): + # FIXME: add support for bitmap fonts + self.color = ImageColor.getrgb(color) + self.font = ImageFont.truetype(file, size) + + +class Draw: + """ + (Experimental) WCK-style drawing interface + """ + + def __init__(self, image, size=None, color=None): + if not hasattr(image, "im"): + image = Image.new(image, size, color) + self.draw = ImageDraw.Draw(image) + self.image = image + self.transform = None + + def flush(self): + return self.image + + def render(self, op, xy, pen, brush=None): + # handle color arguments + outline = fill = None + width = 1 + if isinstance(pen, Pen): + outline = pen.color + width = pen.width + elif isinstance(brush, Pen): + outline = brush.color + width = brush.width + if isinstance(brush, Brush): + fill = brush.color + elif isinstance(pen, Brush): + fill = pen.color + # handle transformation + if self.transform: + xy = ImagePath.Path(xy) + xy.transform(self.transform) + # render the item + if op == "line": + self.draw.line(xy, fill=outline, width=width) + else: + getattr(self.draw, op)(xy, fill=fill, outline=outline) + + def settransform(self, offset): + """Sets a transformation offset.""" + (xoffset, yoffset) = offset + self.transform = (1, 0, xoffset, 0, 1, yoffset) + + def arc(self, xy, start, end, *options): + """ + Draws an arc (a portion of a circle outline) between the start and end + angles, inside the given bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` + """ + self.render("arc", xy, start, end, *options) + + def chord(self, xy, start, end, *options): + """ + Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points + with a straight line. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` + """ + self.render("chord", xy, start, end, *options) + + def ellipse(self, xy, *options): + """ + Draws an ellipse inside the given bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` + """ + self.render("ellipse", xy, *options) + + def line(self, xy, *options): + """ + Draws a line between the coordinates in the ``xy`` list. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` + """ + self.render("line", xy, *options) + + def pieslice(self, xy, start, end, *options): + """ + Same as arc, but also draws straight lines between the end points and the + center of the bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` + """ + self.render("pieslice", xy, start, end, *options) + + def polygon(self, xy, *options): + """ + Draws a polygon. + + The polygon outline consists of straight lines between the given + coordinates, plus a straight line between the last and the first + coordinate. + + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` + """ + self.render("polygon", xy, *options) + + def rectangle(self, xy, *options): + """ + Draws a rectangle. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` + """ + self.render("rectangle", xy, *options) + + def text(self, xy, text, font): + """ + Draws the string at the given position. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` + """ + if self.transform: + xy = ImagePath.Path(xy) + xy.transform(self.transform) + self.draw.text(xy, text, font=font.font, fill=font.color) + + def textsize(self, text, font): + """ + Return the size of the given string, in pixels. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textsize` + """ + return self.draw.textsize(text, font=font.font) diff --git a/venv/Lib/site-packages/PIL/ImageEnhance.py b/venv/Lib/site-packages/PIL/ImageEnhance.py new file mode 100644 index 0000000..3b79d5c --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageEnhance.py @@ -0,0 +1,103 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image enhancement classes +# +# For a background, see "Image Processing By Interpolation and +# Extrapolation", Paul Haeberli and Douglas Voorhies. Available +# at http://www.graficaobscura.com/interp/index.html +# +# History: +# 1996-03-23 fl Created +# 2009-06-16 fl Fixed mean calculation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFilter, ImageStat + + +class _Enhance: + def enhance(self, factor): + """ + Returns an enhanced image. + + :param factor: A floating point value controlling the enhancement. + Factor 1.0 always returns a copy of the original image, + lower factors mean less color (brightness, contrast, + etc), and higher values more. There are no restrictions + on this value. + :rtype: :py:class:`~PIL.Image.Image` + """ + return Image.blend(self.degenerate, self.image, factor) + + +class Color(_Enhance): + """Adjust image color balance. + + This class can be used to adjust the colour balance of an image, in + a manner similar to the controls on a colour TV set. An enhancement + factor of 0.0 gives a black and white image. A factor of 1.0 gives + the original image. + """ + + def __init__(self, image): + self.image = image + self.intermediate_mode = "L" + if "A" in image.getbands(): + self.intermediate_mode = "LA" + + self.degenerate = image.convert(self.intermediate_mode).convert(image.mode) + + +class Contrast(_Enhance): + """Adjust image contrast. + + This class can be used to control the contrast of an image, similar + to the contrast control on a TV set. An enhancement factor of 0.0 + gives a solid grey image. A factor of 1.0 gives the original image. + """ + + def __init__(self, image): + self.image = image + mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5) + self.degenerate = Image.new("L", image.size, mean).convert(image.mode) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) + + +class Brightness(_Enhance): + """Adjust image brightness. + + This class can be used to control the brightness of an image. An + enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the + original image. + """ + + def __init__(self, image): + self.image = image + self.degenerate = Image.new(image.mode, image.size, 0) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) + + +class Sharpness(_Enhance): + """Adjust image sharpness. + + This class can be used to adjust the sharpness of an image. An + enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the + original image, and a factor of 2.0 gives a sharpened image. + """ + + def __init__(self, image): + self.image = image + self.degenerate = image.filter(ImageFilter.SMOOTH) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) diff --git a/venv/Lib/site-packages/PIL/ImageFile.py b/venv/Lib/site-packages/PIL/ImageFile.py new file mode 100644 index 0000000..fd2e1bb --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageFile.py @@ -0,0 +1,693 @@ +# +# The Python Imaging Library. +# $Id$ +# +# base class for image file handlers +# +# history: +# 1995-09-09 fl Created +# 1996-03-11 fl Fixed load mechanism. +# 1996-04-15 fl Added pcx/xbm decoders. +# 1996-04-30 fl Added encoders. +# 1996-12-14 fl Added load helpers +# 1997-01-11 fl Use encode_to_file where possible +# 1997-08-27 fl Flush output in _save +# 1998-03-05 fl Use memory mapping for some modes +# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" +# 1999-05-31 fl Added image parser +# 2000-10-12 fl Set readonly flag on memory-mapped images +# 2002-03-20 fl Use better messages for common decoder errors +# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available +# 2003-10-30 fl Added StubImageFile class +# 2004-02-25 fl Made incremental parser more robust +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import io +import struct +import sys +import warnings + +from . import Image +from ._util import isPath + +MAXBLOCK = 65536 + +SAFEBLOCK = 1024 * 1024 + +LOAD_TRUNCATED_IMAGES = False + +ERRORS = { + -1: "image buffer overrun error", + -2: "decoding error", + -3: "unknown error", + -8: "bad configuration", + -9: "out of memory error", +} + + +# +# -------------------------------------------------------------------- +# Helpers + + +def raise_oserror(error): + try: + message = Image.core.getcodecstatus(error) + except AttributeError: + message = ERRORS.get(error) + if not message: + message = "decoder error %d" % error + raise OSError(message + " when reading image file") + + +def raise_ioerror(error): + warnings.warn( + "raise_ioerror is deprecated and will be removed in a future release. " + "Use raise_oserror instead.", + DeprecationWarning, + ) + return raise_oserror(error) + + +def _tilesort(t): + # sort on offset + return t[2] + + +# +# -------------------------------------------------------------------- +# ImageFile base class + + +class ImageFile(Image.Image): + """Base class for image file format handlers.""" + + def __init__(self, fp=None, filename=None): + super().__init__() + + self._min_frame = 0 + + self.custom_mimetype = None + + self.tile = None + self.readonly = 1 # until we know better + + self.decoderconfig = () + self.decodermaxblock = MAXBLOCK + + if isPath(fp): + # filename + self.fp = open(fp, "rb") + self.filename = fp + self._exclusive_fp = True + else: + # stream + self.fp = fp + self.filename = filename + # can be overridden + self._exclusive_fp = None + + try: + try: + self._open() + except ( + IndexError, # end of data + TypeError, # end of data (ord) + KeyError, # unsupported mode + EOFError, # got header but not the first frame + struct.error, + ) as v: + raise SyntaxError(v) from v + + if not self.mode or self.size[0] <= 0: + raise SyntaxError("not identified by this driver") + except BaseException: + # close the file only if we have opened it this constructor + if self._exclusive_fp: + self.fp.close() + raise + + def get_format_mimetype(self): + if self.custom_mimetype: + return self.custom_mimetype + if self.format is not None: + return Image.MIME.get(self.format.upper()) + + def verify(self): + """Check file integrity""" + + # raise exception if something's wrong. must be called + # directly after open, and closes file when finished. + if self._exclusive_fp: + self.fp.close() + self.fp = None + + def load(self): + """Load image data based on tile list""" + + if self.tile is None: + raise OSError("cannot load this image") + + pixel = Image.Image.load(self) + if not self.tile: + return pixel + + self.map = None + use_mmap = self.filename and len(self.tile) == 1 + # As of pypy 2.1.0, memory mapping was failing here. + use_mmap = use_mmap and not hasattr(sys, "pypy_version_info") + + readonly = 0 + + # look for read/seek overrides + try: + read = self.load_read + # don't use mmap if there are custom read/seek functions + use_mmap = False + except AttributeError: + read = self.fp.read + + try: + seek = self.load_seek + use_mmap = False + except AttributeError: + seek = self.fp.seek + + if use_mmap: + # try memory mapping + decoder_name, extents, offset, args = self.tile[0] + if ( + decoder_name == "raw" + and len(args) >= 3 + and args[0] == self.mode + and args[0] in Image._MAPMODES + ): + try: + if hasattr(Image.core, "map"): + # use built-in mapper WIN32 only + self.map = Image.core.map(self.filename) + self.map.seek(offset) + self.im = self.map.readimage( + self.mode, self.size, args[1], args[2] + ) + else: + # use mmap, if possible + import mmap + + with open(self.filename, "r") as fp: + self.map = mmap.mmap( + fp.fileno(), 0, access=mmap.ACCESS_READ + ) + self.im = Image.core.map_buffer( + self.map, self.size, decoder_name, offset, args + ) + readonly = 1 + # After trashing self.im, + # we might need to reload the palette data. + if self.palette: + self.palette.dirty = 1 + except (AttributeError, OSError, ImportError): + self.map = None + + self.load_prepare() + err_code = -3 # initialize to unknown error + if not self.map: + # sort tiles in file order + self.tile.sort(key=_tilesort) + + try: + # FIXME: This is a hack to handle TIFF's JpegTables tag. + prefix = self.tile_prefix + except AttributeError: + prefix = b"" + + for decoder_name, extents, offset, args in self.tile: + decoder = Image._getdecoder( + self.mode, decoder_name, args, self.decoderconfig + ) + try: + seek(offset) + decoder.setimage(self.im, extents) + if decoder.pulls_fd: + decoder.setfd(self.fp) + status, err_code = decoder.decode(b"") + else: + b = prefix + while True: + try: + s = read(self.decodermaxblock) + except (IndexError, struct.error) as e: + # truncated png/gif + if LOAD_TRUNCATED_IMAGES: + break + else: + raise OSError("image file is truncated") from e + + if not s: # truncated jpeg + if LOAD_TRUNCATED_IMAGES: + break + else: + raise OSError( + "image file is truncated " + "(%d bytes not processed)" % len(b) + ) + + b = b + s + n, err_code = decoder.decode(b) + if n < 0: + break + b = b[n:] + finally: + # Need to cleanup here to prevent leaks + decoder.cleanup() + + self.tile = [] + self.readonly = readonly + + self.load_end() + + if self._exclusive_fp and self._close_exclusive_fp_after_loading: + self.fp.close() + self.fp = None + + if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: + # still raised if decoder fails to return anything + raise_oserror(err_code) + + return Image.Image.load(self) + + def load_prepare(self): + # create image memory if necessary + if not self.im or self.im.mode != self.mode or self.im.size != self.size: + self.im = Image.core.new(self.mode, self.size) + # create palette (optional) + if self.mode == "P": + Image.Image.load(self) + + def load_end(self): + # may be overridden + pass + + # may be defined for contained formats + # def load_seek(self, pos): + # pass + + # may be defined for blocked formats (e.g. PNG) + # def load_read(self, bytes): + # pass + + def _seek_check(self, frame): + if ( + frame < self._min_frame + # Only check upper limit on frames if additional seek operations + # are not required to do so + or ( + not (hasattr(self, "_n_frames") and self._n_frames is None) + and frame >= self.n_frames + self._min_frame + ) + ): + raise EOFError("attempt to seek outside sequence") + + return self.tell() != frame + + +class StubImageFile(ImageFile): + """ + Base class for stub image loaders. + + A stub loader is an image loader that can identify files of a + certain format, but relies on external code to load the file. + """ + + def _open(self): + raise NotImplementedError("StubImageFile subclass must implement _open") + + def load(self): + loader = self._load() + if loader is None: + raise OSError("cannot find loader for this %s file" % self.format) + image = loader.load(self) + assert image is not None + # become the other object (!) + self.__class__ = image.__class__ + self.__dict__ = image.__dict__ + + def _load(self): + """(Hook) Find actual image loader.""" + raise NotImplementedError("StubImageFile subclass must implement _load") + + +class Parser: + """ + Incremental image parser. This class implements the standard + feed/close consumer interface. + """ + + incremental = None + image = None + data = None + decoder = None + offset = 0 + finished = 0 + + def reset(self): + """ + (Consumer) Reset the parser. Note that you can only call this + method immediately after you've created a parser; parser + instances cannot be reused. + """ + assert self.data is None, "cannot reuse parsers" + + def feed(self, data): + """ + (Consumer) Feed data to the parser. + + :param data: A string buffer. + :exception OSError: If the parser failed to parse the image file. + """ + # collect data + + if self.finished: + return + + if self.data is None: + self.data = data + else: + self.data = self.data + data + + # parse what we have + if self.decoder: + + if self.offset > 0: + # skip header + skip = min(len(self.data), self.offset) + self.data = self.data[skip:] + self.offset = self.offset - skip + if self.offset > 0 or not self.data: + return + + n, e = self.decoder.decode(self.data) + + if n < 0: + # end of stream + self.data = None + self.finished = 1 + if e < 0: + # decoding error + self.image = None + raise_oserror(e) + else: + # end of image + return + self.data = self.data[n:] + + elif self.image: + + # if we end up here with no decoder, this file cannot + # be incrementally parsed. wait until we've gotten all + # available data + pass + + else: + + # attempt to open this file + try: + with io.BytesIO(self.data) as fp: + im = Image.open(fp) + except OSError: + # traceback.print_exc() + pass # not enough data + else: + flag = hasattr(im, "load_seek") or hasattr(im, "load_read") + if flag or len(im.tile) != 1: + # custom load code, or multiple tiles + self.decode = None + else: + # initialize decoder + im.load_prepare() + d, e, o, a = im.tile[0] + im.tile = [] + self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig) + self.decoder.setimage(im.im, e) + + # calculate decoder offset + self.offset = o + if self.offset <= len(self.data): + self.data = self.data[self.offset :] + self.offset = 0 + + self.image = im + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + """ + (Consumer) Close the stream. + + :returns: An image object. + :exception OSError: If the parser failed to parse the image file either + because it cannot be identified or cannot be + decoded. + """ + # finish decoding + if self.decoder: + # get rid of what's left in the buffers + self.feed(b"") + self.data = self.decoder = None + if not self.finished: + raise OSError("image was incomplete") + if not self.image: + raise OSError("cannot parse this image") + if self.data: + # incremental parsing not possible; reopen the file + # not that we have all data + with io.BytesIO(self.data) as fp: + try: + self.image = Image.open(fp) + finally: + self.image.load() + return self.image + + +# -------------------------------------------------------------------- + + +def _save(im, fp, tile, bufsize=0): + """Helper to save image based on tile list + + :param im: Image object. + :param fp: File object. + :param tile: Tile list. + :param bufsize: Optional buffer size + """ + + im.load() + if not hasattr(im, "encoderconfig"): + im.encoderconfig = () + tile.sort(key=_tilesort) + # FIXME: make MAXBLOCK a configuration parameter + # It would be great if we could have the encoder specify what it needs + # But, it would need at least the image size in most cases. RawEncode is + # a tricky case. + bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c + if fp == sys.stdout: + fp.flush() + return + try: + fh = fp.fileno() + fp.flush() + except (AttributeError, io.UnsupportedOperation) as e: + # compress to Python file-compatible object + for e, b, o, a in tile: + e = Image._getencoder(im.mode, e, a, im.encoderconfig) + if o > 0: + fp.seek(o) + e.setimage(im.im, b) + if e.pushes_fd: + e.setfd(fp) + l, s = e.encode_to_pyfd() + else: + while True: + l, s, d = e.encode(bufsize) + fp.write(d) + if s: + break + if s < 0: + raise OSError("encoder error %d when writing image file" % s) from e + e.cleanup() + else: + # slight speedup: compress to real file object + for e, b, o, a in tile: + e = Image._getencoder(im.mode, e, a, im.encoderconfig) + if o > 0: + fp.seek(o) + e.setimage(im.im, b) + if e.pushes_fd: + e.setfd(fp) + l, s = e.encode_to_pyfd() + else: + s = e.encode_to_file(fh, bufsize) + if s < 0: + raise OSError("encoder error %d when writing image file" % s) + e.cleanup() + if hasattr(fp, "flush"): + fp.flush() + + +def _safe_read(fp, size): + """ + Reads large blocks in a safe way. Unlike fp.read(n), this function + doesn't trust the user. If the requested size is larger than + SAFEBLOCK, the file is read block by block. + + :param fp: File handle. Must implement a read method. + :param size: Number of bytes to read. + :returns: A string containing up to size bytes of data. + """ + if size <= 0: + return b"" + if size <= SAFEBLOCK: + return fp.read(size) + data = [] + while size > 0: + block = fp.read(min(size, SAFEBLOCK)) + if not block: + break + data.append(block) + size -= len(block) + return b"".join(data) + + +class PyCodecState: + def __init__(self): + self.xsize = 0 + self.ysize = 0 + self.xoff = 0 + self.yoff = 0 + + def extents(self): + return (self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize) + + +class PyDecoder: + """ + Python implementation of a format decoder. Override this class and + add the decoding logic in the `decode` method. + + See :ref:`Writing Your Own File Decoder in Python` + """ + + _pulls_fd = False + + def __init__(self, mode, *args): + self.im = None + self.state = PyCodecState() + self.fd = None + self.mode = mode + self.init(args) + + def init(self, args): + """ + Override to perform decoder specific initialization + + :param args: Array of args items from the tile entry + :returns: None + """ + self.args = args + + @property + def pulls_fd(self): + return self._pulls_fd + + def decode(self, buffer): + """ + Override to perform the decoding process. + + :param buffer: A bytes object with the data to be decoded. + :returns: A tuple of (bytes consumed, errcode). + If finished with decoding return <0 for the bytes consumed. + Err codes are from `ERRORS` + """ + raise NotImplementedError() + + def cleanup(self): + """ + Override to perform decoder specific cleanup + + :returns: None + """ + pass + + def setfd(self, fd): + """ + Called from ImageFile to set the python file-like object + + :param fd: A python file-like object + :returns: None + """ + self.fd = fd + + def setimage(self, im, extents=None): + """ + Called from ImageFile to set the core output image for the decoder + + :param im: A core image object + :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle + for this tile + :returns: None + """ + + # following c code + self.im = im + + if extents: + (x0, y0, x1, y1) = extents + else: + (x0, y0, x1, y1) = (0, 0, 0, 0) + + if x0 == 0 and x1 == 0: + self.state.xsize, self.state.ysize = self.im.size + else: + self.state.xoff = x0 + self.state.yoff = y0 + self.state.xsize = x1 - x0 + self.state.ysize = y1 - y0 + + if self.state.xsize <= 0 or self.state.ysize <= 0: + raise ValueError("Size cannot be negative") + + if ( + self.state.xsize + self.state.xoff > self.im.size[0] + or self.state.ysize + self.state.yoff > self.im.size[1] + ): + raise ValueError("Tile cannot extend outside image") + + def set_as_raw(self, data, rawmode=None): + """ + Convenience method to set the internal image from a stream of raw data + + :param data: Bytes to be set + :param rawmode: The rawmode to be used for the decoder. + If not specified, it will default to the mode of the image + :returns: None + """ + + if not rawmode: + rawmode = self.mode + d = Image._getdecoder(self.mode, "raw", (rawmode)) + d.setimage(self.im, self.state.extents()) + s = d.decode(data) + + if s[0] >= 0: + raise ValueError("not enough image data") + if s[1] != 0: + raise ValueError("cannot decode image data") diff --git a/venv/Lib/site-packages/PIL/ImageFilter.py b/venv/Lib/site-packages/PIL/ImageFilter.py new file mode 100644 index 0000000..3e61a6c --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageFilter.py @@ -0,0 +1,535 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard filters +# +# History: +# 1995-11-27 fl Created +# 2002-06-08 fl Added rank and mode filters +# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2002 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +import functools + +try: + import numpy +except ImportError: # pragma: no cover + numpy = None + + +class Filter: + pass + + +class MultibandFilter(Filter): + pass + + +class BuiltinFilter(MultibandFilter): + def filter(self, image): + if image.mode == "P": + raise ValueError("cannot filter palette images") + return image.filter(*self.filterargs) + + +class Kernel(BuiltinFilter): + """ + Create a convolution kernel. The current version only + supports 3x3 and 5x5 integer and floating point kernels. + + In the current version, kernels can only be applied to + "L" and "RGB" images. + + :param size: Kernel size, given as (width, height). In the current + version, this must be (3,3) or (5,5). + :param kernel: A sequence containing kernel weights. + :param scale: Scale factor. If given, the result for each pixel is + divided by this value. the default is the sum of the + kernel weights. + :param offset: Offset. If given, this value is added to the result, + after it has been divided by the scale factor. + """ + + name = "Kernel" + + def __init__(self, size, kernel, scale=None, offset=0): + if scale is None: + # default scale is sum of kernel + scale = functools.reduce(lambda a, b: a + b, kernel) + if size[0] * size[1] != len(kernel): + raise ValueError("not enough coefficients in kernel") + self.filterargs = size, scale, offset, kernel + + +class RankFilter(Filter): + """ + Create a rank filter. The rank filter sorts all pixels in + a window of the given size, and returns the **rank**'th value. + + :param size: The kernel size, in pixels. + :param rank: What pixel value to pick. Use 0 for a min filter, + ``size * size / 2`` for a median filter, ``size * size - 1`` + for a max filter, etc. + """ + + name = "Rank" + + def __init__(self, size, rank): + self.size = size + self.rank = rank + + def filter(self, image): + if image.mode == "P": + raise ValueError("cannot filter palette images") + image = image.expand(self.size // 2, self.size // 2) + return image.rankfilter(self.size, self.rank) + + +class MedianFilter(RankFilter): + """ + Create a median filter. Picks the median pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Median" + + def __init__(self, size=3): + self.size = size + self.rank = size * size // 2 + + +class MinFilter(RankFilter): + """ + Create a min filter. Picks the lowest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Min" + + def __init__(self, size=3): + self.size = size + self.rank = 0 + + +class MaxFilter(RankFilter): + """ + Create a max filter. Picks the largest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Max" + + def __init__(self, size=3): + self.size = size + self.rank = size * size - 1 + + +class ModeFilter(Filter): + """ + Create a mode filter. Picks the most frequent pixel value in a box with the + given size. Pixel values that occur only once or twice are ignored; if no + pixel value occurs more than twice, the original pixel value is preserved. + + :param size: The kernel size, in pixels. + """ + + name = "Mode" + + def __init__(self, size=3): + self.size = size + + def filter(self, image): + return image.modefilter(self.size) + + +class GaussianBlur(MultibandFilter): + """Gaussian blur filter. + + :param radius: Blur radius. + """ + + name = "GaussianBlur" + + def __init__(self, radius=2): + self.radius = radius + + def filter(self, image): + return image.gaussian_blur(self.radius) + + +class BoxBlur(MultibandFilter): + """Blurs the image by setting each pixel to the average value of the pixels + in a square box extending radius pixels in each direction. + Supports float radius of arbitrary size. Uses an optimized implementation + which runs in linear time relative to the size of the image + for any radius value. + + :param radius: Size of the box in one direction. Radius 0 does not blur, + returns an identical image. Radius 1 takes 1 pixel + in each direction, i.e. 9 pixels in total. + """ + + name = "BoxBlur" + + def __init__(self, radius): + self.radius = radius + + def filter(self, image): + return image.box_blur(self.radius) + + +class UnsharpMask(MultibandFilter): + """Unsharp mask filter. + + See Wikipedia's entry on `digital unsharp masking`_ for an explanation of + the parameters. + + :param radius: Blur Radius + :param percent: Unsharp strength, in percent + :param threshold: Threshold controls the minimum brightness change that + will be sharpened + + .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking + + """ # noqa: E501 + + name = "UnsharpMask" + + def __init__(self, radius=2, percent=150, threshold=3): + self.radius = radius + self.percent = percent + self.threshold = threshold + + def filter(self, image): + return image.unsharp_mask(self.radius, self.percent, self.threshold) + + +class BLUR(BuiltinFilter): + name = "Blur" + # fmt: off + filterargs = (5, 5), 16, 0, ( + 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, + ) + # fmt: on + + +class CONTOUR(BuiltinFilter): + name = "Contour" + # fmt: off + filterargs = (3, 3), 1, 255, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1, + ) + # fmt: on + + +class DETAIL(BuiltinFilter): + name = "Detail" + # fmt: off + filterargs = (3, 3), 6, 0, ( + 0, -1, 0, + -1, 10, -1, + 0, -1, 0, + ) + # fmt: on + + +class EDGE_ENHANCE(BuiltinFilter): + name = "Edge-enhance" + # fmt: off + filterargs = (3, 3), 2, 0, ( + -1, -1, -1, + -1, 10, -1, + -1, -1, -1, + ) + # fmt: on + + +class EDGE_ENHANCE_MORE(BuiltinFilter): + name = "Edge-enhance More" + # fmt: off + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 9, -1, + -1, -1, -1, + ) + # fmt: on + + +class EMBOSS(BuiltinFilter): + name = "Emboss" + # fmt: off + filterargs = (3, 3), 1, 128, ( + -1, 0, 0, + 0, 1, 0, + 0, 0, 0, + ) + # fmt: on + + +class FIND_EDGES(BuiltinFilter): + name = "Find Edges" + # fmt: off + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1, + ) + # fmt: on + + +class SHARPEN(BuiltinFilter): + name = "Sharpen" + # fmt: off + filterargs = (3, 3), 16, 0, ( + -2, -2, -2, + -2, 32, -2, + -2, -2, -2, + ) + # fmt: on + + +class SMOOTH(BuiltinFilter): + name = "Smooth" + # fmt: off + filterargs = (3, 3), 13, 0, ( + 1, 1, 1, + 1, 5, 1, + 1, 1, 1, + ) + # fmt: on + + +class SMOOTH_MORE(BuiltinFilter): + name = "Smooth More" + # fmt: off + filterargs = (5, 5), 100, 0, ( + 1, 1, 1, 1, 1, + 1, 5, 5, 5, 1, + 1, 5, 44, 5, 1, + 1, 5, 5, 5, 1, + 1, 1, 1, 1, 1, + ) + # fmt: on + + +class Color3DLUT(MultibandFilter): + """Three-dimensional color lookup table. + + Transforms 3-channel pixels using the values of the channels as coordinates + in the 3D lookup table and interpolating the nearest elements. + + This method allows you to apply almost any color transformation + in constant time by using pre-calculated decimated tables. + + .. versionadded:: 5.2.0 + + :param size: Size of the table. One int or tuple of (int, int, int). + Minimal size in any dimension is 2, maximum is 65. + :param table: Flat lookup table. A list of ``channels * size**3`` + float elements or a list of ``size**3`` channels-sized + tuples with floats. Channels are changed first, + then first dimension, then second, then third. + Value 0.0 corresponds lowest value of output, 1.0 highest. + :param channels: Number of channels in the table. Could be 3 or 4. + Default is 3. + :param target_mode: A mode for the result image. Should have not less + than ``channels`` channels. Default is ``None``, + which means that mode wouldn't be changed. + """ + + name = "Color 3D LUT" + + def __init__(self, size, table, channels=3, target_mode=None, **kwargs): + if channels not in (3, 4): + raise ValueError("Only 3 or 4 output channels are supported") + self.size = size = self._check_size(size) + self.channels = channels + self.mode = target_mode + + # Hidden flag `_copy_table=False` could be used to avoid extra copying + # of the table if the table is specially made for the constructor. + copy_table = kwargs.get("_copy_table", True) + items = size[0] * size[1] * size[2] + wrong_size = False + + if numpy and isinstance(table, numpy.ndarray): + if copy_table: + table = table.copy() + + if table.shape in [ + (items * channels,), + (items, channels), + (size[2], size[1], size[0], channels), + ]: + table = table.reshape(items * channels) + else: + wrong_size = True + + else: + if copy_table: + table = list(table) + + # Convert to a flat list + if table and isinstance(table[0], (list, tuple)): + table, raw_table = [], table + for pixel in raw_table: + if len(pixel) != channels: + raise ValueError( + "The elements of the table should " + "have a length of {}.".format(channels) + ) + table.extend(pixel) + + if wrong_size or len(table) != items * channels: + raise ValueError( + "The table should have either channels * size**3 float items " + "or size**3 items of channels-sized tuples with floats. " + "Table should be: {}x{}x{}x{}. Actual length: {}".format( + channels, size[0], size[1], size[2], len(table) + ) + ) + self.table = table + + @staticmethod + def _check_size(size): + try: + _, _, _ = size + except ValueError as e: + raise ValueError( + "Size should be either an integer or a tuple of three integers." + ) from e + except TypeError: + size = (size, size, size) + size = [int(x) for x in size] + for size1D in size: + if not 2 <= size1D <= 65: + raise ValueError("Size should be in [2, 65] range.") + return size + + @classmethod + def generate(cls, size, callback, channels=3, target_mode=None): + """Generates new LUT using provided callback. + + :param size: Size of the table. Passed to the constructor. + :param callback: Function with three parameters which correspond + three color channels. Will be called ``size**3`` + times with values from 0.0 to 1.0 and should return + a tuple with ``channels`` elements. + :param channels: The number of channels which should return callback. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + size1D, size2D, size3D = cls._check_size(size) + if channels not in (3, 4): + raise ValueError("Only 3 or 4 output channels are supported") + + table = [0] * (size1D * size2D * size3D * channels) + idx_out = 0 + for b in range(size3D): + for g in range(size2D): + for r in range(size1D): + table[idx_out : idx_out + channels] = callback( + r / (size1D - 1), g / (size2D - 1), b / (size3D - 1) + ) + idx_out += channels + + return cls( + (size1D, size2D, size3D), + table, + channels=channels, + target_mode=target_mode, + _copy_table=False, + ) + + def transform(self, callback, with_normals=False, channels=None, target_mode=None): + """Transforms the table values using provided callback and returns + a new LUT with altered values. + + :param callback: A function which takes old lookup table values + and returns a new set of values. The number + of arguments which function should take is + ``self.channels`` or ``3 + self.channels`` + if ``with_normals`` flag is set. + Should return a tuple of ``self.channels`` or + ``channels`` elements if it is set. + :param with_normals: If true, ``callback`` will be called with + coordinates in the color cube as the first + three arguments. Otherwise, ``callback`` + will be called only with actual color values. + :param channels: The number of channels in the resulting lookup table. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + if channels not in (None, 3, 4): + raise ValueError("Only 3 or 4 output channels are supported") + ch_in = self.channels + ch_out = channels or ch_in + size1D, size2D, size3D = self.size + + table = [0] * (size1D * size2D * size3D * ch_out) + idx_in = 0 + idx_out = 0 + for b in range(size3D): + for g in range(size2D): + for r in range(size1D): + values = self.table[idx_in : idx_in + ch_in] + if with_normals: + values = callback( + r / (size1D - 1), + g / (size2D - 1), + b / (size3D - 1), + *values, + ) + else: + values = callback(*values) + table[idx_out : idx_out + ch_out] = values + idx_in += ch_in + idx_out += ch_out + + return type(self)( + self.size, + table, + channels=ch_out, + target_mode=target_mode or self.mode, + _copy_table=False, + ) + + def __repr__(self): + r = [ + "{} from {}".format(self.__class__.__name__, self.table.__class__.__name__), + "size={:d}x{:d}x{:d}".format(*self.size), + "channels={:d}".format(self.channels), + ] + if self.mode: + r.append("target_mode={}".format(self.mode)) + return "<{}>".format(" ".join(r)) + + def filter(self, image): + from . import Image + + return image.color_lut_3d( + self.mode or image.mode, + Image.LINEAR, + self.channels, + self.size[0], + self.size[1], + self.size[2], + self.table, + ) diff --git a/venv/Lib/site-packages/PIL/ImageFont.py b/venv/Lib/site-packages/PIL/ImageFont.py new file mode 100644 index 0000000..8f792d5 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageFont.py @@ -0,0 +1,860 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIL raster font management +# +# History: +# 1996-08-07 fl created (experimental) +# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 +# 1999-02-06 fl rewrote most font management stuff in C +# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) +# 2001-02-17 fl added freetype support +# 2001-05-09 fl added TransposedFont wrapper class +# 2002-03-04 fl make sure we have a "L" or "1" font +# 2002-12-04 fl skip non-directory entries in the system path +# 2003-04-29 fl add embedded default font +# 2003-09-27 fl added support for truetype charmap encodings +# +# Todo: +# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import base64 +import os +import sys +from io import BytesIO + +from . import Image +from ._util import isDirectory, isPath + +LAYOUT_BASIC = 0 +LAYOUT_RAQM = 1 + + +class _imagingft_not_installed: + # module placeholder + def __getattr__(self, id): + raise ImportError("The _imagingft C module is not installed") + + +try: + from . import _imagingft as core +except ImportError: + core = _imagingft_not_installed() + + +# FIXME: add support for pilfont2 format (see FontFile.py) + +# -------------------------------------------------------------------- +# Font metrics format: +# "PILfont" LF +# fontdescriptor LF +# (optional) key=value... LF +# "DATA" LF +# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) +# +# To place a character, cut out srcbox and paste at dstbox, +# relative to the character position. Then move the character +# position according to dx, dy. +# -------------------------------------------------------------------- + + +class ImageFont: + "PIL font wrapper" + + def _load_pilfont(self, filename): + + with open(filename, "rb") as fp: + image = None + for ext in (".png", ".gif", ".pbm"): + if image: + image.close() + try: + fullname = os.path.splitext(filename)[0] + ext + image = Image.open(fullname) + except Exception: + pass + else: + if image and image.mode in ("1", "L"): + break + else: + if image: + image.close() + raise OSError("cannot find glyph data file") + + self.file = fullname + + self._load_pilfont_data(fp, image) + image.close() + + def _load_pilfont_data(self, file, image): + + # read PILfont header + if file.readline() != b"PILfont\n": + raise SyntaxError("Not a PILfont file") + file.readline().split(b";") + self.info = [] # FIXME: should be a dictionary + while True: + s = file.readline() + if not s or s == b"DATA\n": + break + self.info.append(s) + + # read PILfont metrics + data = file.read(256 * 20) + + # check image + if image.mode not in ("1", "L"): + raise TypeError("invalid font image mode") + + image.load() + + self.font = Image.core.font(image.im, data) + + def getsize(self, text, *args, **kwargs): + """ + Returns width and height (in pixels) of given text. + + :param text: Text to measure. + + :return: (width, height) + """ + return self.font.getsize(text) + + def getmask(self, text, mode="", *args, **kwargs): + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :return: An internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module. + """ + return self.font.getmask(text, mode) + + +## +# Wrapper for FreeType fonts. Application code should use the +# truetype factory function to create font objects. + + +class FreeTypeFont: + "FreeType font wrapper (requires _imagingft service)" + + def __init__(self, font=None, size=10, index=0, encoding="", layout_engine=None): + # FIXME: use service provider instead + + self.path = font + self.size = size + self.index = index + self.encoding = encoding + + if layout_engine not in (LAYOUT_BASIC, LAYOUT_RAQM): + layout_engine = LAYOUT_BASIC + if core.HAVE_RAQM: + layout_engine = LAYOUT_RAQM + elif layout_engine == LAYOUT_RAQM and not core.HAVE_RAQM: + layout_engine = LAYOUT_BASIC + + self.layout_engine = layout_engine + + def load_from_bytes(f): + self.font_bytes = f.read() + self.font = core.getfont( + "", size, index, encoding, self.font_bytes, layout_engine + ) + + if isPath(font): + if sys.platform == "win32": + font_bytes_path = font if isinstance(font, bytes) else font.encode() + try: + font_bytes_path.decode("ascii") + except UnicodeDecodeError: + # FreeType cannot load fonts with non-ASCII characters on Windows + # So load it into memory first + with open(font, "rb") as f: + load_from_bytes(f) + return + self.font = core.getfont( + font, size, index, encoding, layout_engine=layout_engine + ) + else: + load_from_bytes(font) + + def _multiline_split(self, text): + split_character = "\n" if isinstance(text, str) else b"\n" + return text.split(split_character) + + def getname(self): + """ + :return: A tuple of the font family (e.g. Helvetica) and the font style + (e.g. Bold) + """ + return self.font.family, self.font.style + + def getmetrics(self): + """ + :return: A tuple of the font ascent (the distance from the baseline to + the highest outline point) and descent (the distance from the + baseline to the lowest outline point, a negative value) + """ + return self.font.ascent, self.font.descent + + def getsize( + self, text, direction=None, features=None, language=None, stroke_width=0 + ): + """ + Returns width and height (in pixels) of given text if rendered in font with + provided direction, features, and language. + + :param text: Text to measure. + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + ` + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :return: (width, height) + """ + size, offset = self.font.getsize(text, False, direction, features, language) + return ( + size[0] + stroke_width * 2 + offset[0], + size[1] + stroke_width * 2 + offset[1], + ) + + def getsize_multiline( + self, + text, + direction=None, + spacing=4, + features=None, + language=None, + stroke_width=0, + ): + """ + Returns width and height (in pixels) of given text if rendered in font + with provided direction, features, and language, while respecting + newline characters. + + :param text: Text to measure. + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + :param spacing: The vertical gap between lines, defaulting to 4 pixels. + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + ` + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :return: (width, height) + """ + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self.getsize("A", stroke_width=stroke_width)[1] + spacing + for line in lines: + line_width, line_height = self.getsize( + line, direction, features, language, stroke_width + ) + max_width = max(max_width, line_width) + + return max_width, len(lines) * line_spacing - spacing + + def getoffset(self, text): + """ + Returns the offset of given text. This is the gap between the + starting coordinate and the first marking. Note that this gap is + included in the result of :py:func:`~PIL.ImageFont.FreeTypeFont.getsize`. + + :param text: Text to measure. + + :return: A tuple of the x and y offset + """ + return self.font.getsize(text)[1] + + def getmask( + self, + text, + mode="", + direction=None, + features=None, + language=None, + stroke_width=0, + ): + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + ` + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :return: An internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module. + """ + return self.getmask2( + text, + mode, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + )[0] + + def getmask2( + self, + text, + mode="", + fill=Image.core.fill, + direction=None, + features=None, + language=None, + stroke_width=0, + *args, + **kwargs + ): + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + ` + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :return: A tuple of an internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module, and the text offset, the + gap between the starting coordinate and the first marking + """ + size, offset = self.font.getsize( + text, mode == "1", direction, features, language + ) + size = size[0] + stroke_width * 2, size[1] + stroke_width * 2 + im = fill("L", size, 0) + self.font.render( + text, im.id, mode == "1", direction, features, language, stroke_width + ) + return im, offset + + def font_variant( + self, font=None, size=None, index=None, encoding=None, layout_engine=None + ): + """ + Create a copy of this FreeTypeFont object, + using any specified arguments to override the settings. + + Parameters are identical to the parameters used to initialize this + object. + + :return: A FreeTypeFont object. + """ + return FreeTypeFont( + font=self.path if font is None else font, + size=self.size if size is None else size, + index=self.index if index is None else index, + encoding=self.encoding if encoding is None else encoding, + layout_engine=layout_engine or self.layout_engine, + ) + + def get_variation_names(self): + """ + :returns: A list of the named styles in a variation font. + :exception OSError: If the font is not a variation font. + """ + try: + names = self.font.getvarnames() + except AttributeError as e: + raise NotImplementedError("FreeType 2.9.1 or greater is required") from e + return [name.replace(b"\x00", b"") for name in names] + + def set_variation_by_name(self, name): + """ + :param name: The name of the style. + :exception OSError: If the font is not a variation font. + """ + names = self.get_variation_names() + if not isinstance(name, bytes): + name = name.encode() + index = names.index(name) + + if index == getattr(self, "_last_variation_index", None): + # When the same name is set twice in a row, + # there is an 'unknown freetype error' + # https://savannah.nongnu.org/bugs/?56186 + return + self._last_variation_index = index + + self.font.setvarname(index) + + def get_variation_axes(self): + """ + :returns: A list of the axes in a variation font. + :exception OSError: If the font is not a variation font. + """ + try: + axes = self.font.getvaraxes() + except AttributeError as e: + raise NotImplementedError("FreeType 2.9.1 or greater is required") from e + for axis in axes: + axis["name"] = axis["name"].replace(b"\x00", b"") + return axes + + def set_variation_by_axes(self, axes): + """ + :param axes: A list of values for each axis. + :exception OSError: If the font is not a variation font. + """ + try: + self.font.setvaraxes(axes) + except AttributeError as e: + raise NotImplementedError("FreeType 2.9.1 or greater is required") from e + + +class TransposedFont: + "Wrapper for writing rotated or mirrored text" + + def __init__(self, font, orientation=None): + """ + Wrapper that creates a transposed font from any existing font + object. + + :param font: A font object. + :param orientation: An optional orientation. If given, this should + be one of Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM, + Image.ROTATE_90, Image.ROTATE_180, or Image.ROTATE_270. + """ + self.font = font + self.orientation = orientation # any 'transpose' argument, or None + + def getsize(self, text, *args, **kwargs): + w, h = self.font.getsize(text) + if self.orientation in (Image.ROTATE_90, Image.ROTATE_270): + return h, w + return w, h + + def getmask(self, text, mode="", *args, **kwargs): + im = self.font.getmask(text, mode, *args, **kwargs) + if self.orientation is not None: + return im.transpose(self.orientation) + return im + + +def load(filename): + """ + Load a font file. This function loads a font object from the given + bitmap font file, and returns the corresponding font object. + + :param filename: Name of font file. + :return: A font object. + :exception OSError: If the file could not be read. + """ + f = ImageFont() + f._load_pilfont(filename) + return f + + +def truetype(font=None, size=10, index=0, encoding="", layout_engine=None): + """ + Load a TrueType or OpenType font from a file or file-like object, + and create a font object. + This function loads a font object from the given file or file-like + object, and creates a font object for a font of the given size. + + Pillow uses FreeType to open font files. If you are opening many fonts + simultaneously on Windows, be aware that Windows limits the number of files + that can be open in C at once to 512. If you approach that limit, an + ``OSError`` may be thrown, reporting that FreeType "cannot open resource". + + This function requires the _imagingft service. + + :param font: A filename or file-like object containing a TrueType font. + If the file is not found in this filename, the loader may also + search in other directories, such as the :file:`fonts/` + directory on Windows or :file:`/Library/Fonts/`, + :file:`/System/Library/Fonts/` and :file:`~/Library/Fonts/` on + macOS. + + :param size: The requested size, in points. + :param index: Which font face to load (default is first available face). + :param encoding: Which font encoding to use (default is Unicode). Possible + encodings include (see the FreeType documentation for more + information): + + * "unic" (Unicode) + * "symb" (Microsoft Symbol) + * "ADOB" (Adobe Standard) + * "ADBE" (Adobe Expert) + * "ADBC" (Adobe Custom) + * "armn" (Apple Roman) + * "sjis" (Shift JIS) + * "gb " (PRC) + * "big5" + * "wans" (Extended Wansung) + * "joha" (Johab) + * "lat1" (Latin-1) + + This specifies the character set to use. It does not alter the + encoding of any text provided in subsequent operations. + :param layout_engine: Which layout engine to use, if available: + `ImageFont.LAYOUT_BASIC` or `ImageFont.LAYOUT_RAQM`. + + You can check support for Raqm layout using + :py:func:`PIL.features.check_feature` with ``feature="raqm"``. + + .. versionadded:: 4.2.0 + :return: A font object. + :exception OSError: If the file could not be read. + """ + + def freetype(font): + return FreeTypeFont(font, size, index, encoding, layout_engine) + + try: + return freetype(font) + except OSError: + if not isPath(font): + raise + ttf_filename = os.path.basename(font) + + dirs = [] + if sys.platform == "win32": + # check the windows font repository + # NOTE: must use uppercase WINDIR, to work around bugs in + # 1.5.2's os.environ.get() + windir = os.environ.get("WINDIR") + if windir: + dirs.append(os.path.join(windir, "fonts")) + elif sys.platform in ("linux", "linux2"): + lindirs = os.environ.get("XDG_DATA_DIRS", "") + if not lindirs: + # According to the freedesktop spec, XDG_DATA_DIRS should + # default to /usr/share + lindirs = "/usr/share" + dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")] + elif sys.platform == "darwin": + dirs += [ + "/Library/Fonts", + "/System/Library/Fonts", + os.path.expanduser("~/Library/Fonts"), + ] + + ext = os.path.splitext(ttf_filename)[1] + first_font_with_a_different_extension = None + for directory in dirs: + for walkroot, walkdir, walkfilenames in os.walk(directory): + for walkfilename in walkfilenames: + if ext and walkfilename == ttf_filename: + return freetype(os.path.join(walkroot, walkfilename)) + elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: + fontpath = os.path.join(walkroot, walkfilename) + if os.path.splitext(fontpath)[1] == ".ttf": + return freetype(fontpath) + if not ext and first_font_with_a_different_extension is None: + first_font_with_a_different_extension = fontpath + if first_font_with_a_different_extension: + return freetype(first_font_with_a_different_extension) + raise + + +def load_path(filename): + """ + Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a + bitmap font along the Python path. + + :param filename: Name of font file. + :return: A font object. + :exception OSError: If the file could not be read. + """ + for directory in sys.path: + if isDirectory(directory): + if not isinstance(filename, str): + filename = filename.decode("utf-8") + try: + return load(os.path.join(directory, filename)) + except OSError: + pass + raise OSError("cannot find font file") + + +def load_default(): + """Load a "better than nothing" default font. + + .. versionadded:: 1.1.4 + + :return: A font object. + """ + f = ImageFont() + f._load_pilfont_data( + # courB08 + BytesIO( + base64.b64decode( + b""" +UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA +BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL +AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA +AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB +ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A +BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB +//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA +AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH +AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA +ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv +AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ +/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 +AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA +AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG +AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA +BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA +AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA +2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF +AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// ++gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA +////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA +BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv +AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA +AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA +AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA +BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// +//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA +AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF +AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB +mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn +AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA +AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 +AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA +Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB +//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA +AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ +AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC +DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ +AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ ++wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 +AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ +///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG +AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA +BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA +Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC +eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG +AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// ++gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA +////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA +BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT +AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A +AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA +Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA +Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// +//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA +AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ +AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA +LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 +AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA +AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 +AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA +AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG +AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA +EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK +AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA +pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG +AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// ++QAGAAIAzgAKANUAEw== +""" + ) + ), + Image.open( + BytesIO( + base64.b64decode( + b""" +iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u +Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 +M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g +LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F +IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA +Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 +NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx +in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 +SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY +AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt +y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG +ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY +lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H +/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 +AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 +c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ +/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw +pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv +oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR +evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA +AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// +Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR +w7IkEbzhVQAAAABJRU5ErkJggg== +""" + ) + ) + ), + ) + return f diff --git a/venv/Lib/site-packages/PIL/ImageGrab.py b/venv/Lib/site-packages/PIL/ImageGrab.py new file mode 100644 index 0000000..3fa338b --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageGrab.py @@ -0,0 +1,120 @@ +# +# The Python Imaging Library +# $Id$ +# +# screen grabber +# +# History: +# 2001-04-26 fl created +# 2001-09-17 fl use builtin driver, if present +# 2002-11-19 fl added grabclipboard support +# +# Copyright (c) 2001-2002 by Secret Labs AB +# Copyright (c) 2001-2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import sys + +from . import Image + +if sys.platform == "darwin": + import os + import tempfile + import subprocess + + +def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None): + if xdisplay is None: + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp(".png") + os.close(fh) + subprocess.call(["screencapture", "-x", filepath]) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + if bbox: + im_cropped = im.crop(bbox) + im.close() + return im_cropped + return im + elif sys.platform == "win32": + offset, size, data = Image.core.grabscreen_win32( + include_layered_windows, all_screens + ) + im = Image.frombytes( + "RGB", + size, + data, + # RGB, 32-bit line padding, origin lower left corner + "raw", + "BGR", + (size[0] * 3 + 3) & -4, + -1, + ) + if bbox: + x0, y0 = offset + left, top, right, bottom = bbox + im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) + return im + # use xdisplay=None for default display on non-win32/macOS systems + if not Image.core.HAVE_XCB: + raise OSError("Pillow was built without XCB support") + size, data = Image.core.grabscreen_x11(xdisplay) + im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) + if bbox: + im = im.crop(bbox) + return im + + +def grabclipboard(): + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp(".jpg") + os.close(fh) + commands = [ + 'set theFile to (open for access POSIX file "' + + filepath + + '" with write permission)', + "try", + " write (the clipboard as JPEG picture) to theFile", + "end try", + "close access theFile", + ] + script = ["osascript"] + for command in commands: + script += ["-e", command] + subprocess.call(script) + + im = None + if os.stat(filepath).st_size != 0: + im = Image.open(filepath) + im.load() + os.unlink(filepath) + return im + elif sys.platform == "win32": + fmt, data = Image.core.grabclipboard_win32() + if fmt == "file": # CF_HDROP + import struct + + o = struct.unpack_from("I", data)[0] + if data[16] != 0: + files = data[o:].decode("utf-16le").split("\0") + else: + files = data[o:].decode("mbcs").split("\0") + return files[: files.index("")] + if isinstance(data, bytes): + import io + + data = io.BytesIO(data) + if fmt == "png": + from . import PngImagePlugin + + return PngImagePlugin.PngImageFile(data) + elif fmt == "DIB": + from . import BmpImagePlugin + + return BmpImagePlugin.DibImageFile(data) + return None + else: + raise NotImplementedError("ImageGrab.grabclipboard() is macOS and Windows only") diff --git a/venv/Lib/site-packages/PIL/ImageMath.py b/venv/Lib/site-packages/PIL/ImageMath.py new file mode 100644 index 0000000..9a2d0b7 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageMath.py @@ -0,0 +1,253 @@ +# +# The Python Imaging Library +# $Id$ +# +# a simple math add-on for the Python Imaging Library +# +# History: +# 1999-02-15 fl Original PIL Plus release +# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 +# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 +# +# Copyright (c) 1999-2005 by Secret Labs AB +# Copyright (c) 2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import builtins + +from . import Image, _imagingmath + +VERBOSE = 0 + + +def _isconstant(v): + return isinstance(v, (int, float)) + + +class _Operand: + """Wraps an image operand, providing standard operators""" + + def __init__(self, im): + self.im = im + + def __fixup(self, im1): + # convert image to suitable mode + if isinstance(im1, _Operand): + # argument was an image. + if im1.im.mode in ("1", "L"): + return im1.im.convert("I") + elif im1.im.mode in ("I", "F"): + return im1.im + else: + raise ValueError("unsupported mode: %s" % im1.im.mode) + else: + # argument was a constant + if _isconstant(im1) and self.im.mode in ("1", "L", "I"): + return Image.new("I", self.im.size, im1) + else: + return Image.new("F", self.im.size, im1) + + def apply(self, op, im1, im2=None, mode=None): + im1 = self.__fixup(im1) + if im2 is None: + # unary operation + out = Image.new(mode or im1.mode, im1.size, None) + im1.load() + try: + op = getattr(_imagingmath, op + "_" + im1.mode) + except AttributeError as e: + raise TypeError("bad operand type for '%s'" % op) from e + _imagingmath.unop(op, out.im.id, im1.im.id) + else: + # binary operation + im2 = self.__fixup(im2) + if im1.mode != im2.mode: + # convert both arguments to floating point + if im1.mode != "F": + im1 = im1.convert("F") + if im2.mode != "F": + im2 = im2.convert("F") + if im1.mode != im2.mode: + raise ValueError("mode mismatch") + if im1.size != im2.size: + # crop both arguments to a common size + size = (min(im1.size[0], im2.size[0]), min(im1.size[1], im2.size[1])) + if im1.size != size: + im1 = im1.crop((0, 0) + size) + if im2.size != size: + im2 = im2.crop((0, 0) + size) + out = Image.new(mode or im1.mode, size, None) + else: + out = Image.new(mode or im1.mode, im1.size, None) + im1.load() + im2.load() + try: + op = getattr(_imagingmath, op + "_" + im1.mode) + except AttributeError as e: + raise TypeError("bad operand type for '%s'" % op) from e + _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id) + return _Operand(out) + + # unary operators + def __bool__(self): + # an image is "true" if it contains at least one non-zero pixel + return self.im.getbbox() is not None + + def __abs__(self): + return self.apply("abs", self) + + def __pos__(self): + return self + + def __neg__(self): + return self.apply("neg", self) + + # binary operators + def __add__(self, other): + return self.apply("add", self, other) + + def __radd__(self, other): + return self.apply("add", other, self) + + def __sub__(self, other): + return self.apply("sub", self, other) + + def __rsub__(self, other): + return self.apply("sub", other, self) + + def __mul__(self, other): + return self.apply("mul", self, other) + + def __rmul__(self, other): + return self.apply("mul", other, self) + + def __truediv__(self, other): + return self.apply("div", self, other) + + def __rtruediv__(self, other): + return self.apply("div", other, self) + + def __mod__(self, other): + return self.apply("mod", self, other) + + def __rmod__(self, other): + return self.apply("mod", other, self) + + def __pow__(self, other): + return self.apply("pow", self, other) + + def __rpow__(self, other): + return self.apply("pow", other, self) + + # bitwise + def __invert__(self): + return self.apply("invert", self) + + def __and__(self, other): + return self.apply("and", self, other) + + def __rand__(self, other): + return self.apply("and", other, self) + + def __or__(self, other): + return self.apply("or", self, other) + + def __ror__(self, other): + return self.apply("or", other, self) + + def __xor__(self, other): + return self.apply("xor", self, other) + + def __rxor__(self, other): + return self.apply("xor", other, self) + + def __lshift__(self, other): + return self.apply("lshift", self, other) + + def __rshift__(self, other): + return self.apply("rshift", self, other) + + # logical + def __eq__(self, other): + return self.apply("eq", self, other) + + def __ne__(self, other): + return self.apply("ne", self, other) + + def __lt__(self, other): + return self.apply("lt", self, other) + + def __le__(self, other): + return self.apply("le", self, other) + + def __gt__(self, other): + return self.apply("gt", self, other) + + def __ge__(self, other): + return self.apply("ge", self, other) + + +# conversions +def imagemath_int(self): + return _Operand(self.im.convert("I")) + + +def imagemath_float(self): + return _Operand(self.im.convert("F")) + + +# logical +def imagemath_equal(self, other): + return self.apply("eq", self, other, mode="I") + + +def imagemath_notequal(self, other): + return self.apply("ne", self, other, mode="I") + + +def imagemath_min(self, other): + return self.apply("min", self, other) + + +def imagemath_max(self, other): + return self.apply("max", self, other) + + +def imagemath_convert(self, mode): + return _Operand(self.im.convert(mode)) + + +ops = {} +for k, v in list(globals().items()): + if k[:10] == "imagemath_": + ops[k[10:]] = v + + +def eval(expression, _dict={}, **kw): + """ + Evaluates an image expression. + + :param expression: A string containing a Python-style expression. + :param options: Values to add to the evaluation context. You + can either use a dictionary, or one or more keyword + arguments. + :return: The evaluated expression. This is usually an image object, but can + also be an integer, a floating point value, or a pixel tuple, + depending on the expression. + """ + + # build execution namespace + args = ops.copy() + args.update(_dict) + args.update(kw) + for k, v in list(args.items()): + if hasattr(v, "im"): + args[k] = _Operand(v) + + out = builtins.eval(expression, args) + try: + return out.im + except AttributeError: + return out diff --git a/venv/Lib/site-packages/PIL/ImageMode.py b/venv/Lib/site-packages/PIL/ImageMode.py new file mode 100644 index 0000000..9882883 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageMode.py @@ -0,0 +1,64 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard mode descriptors +# +# History: +# 2006-03-20 fl Added +# +# Copyright (c) 2006 by Secret Labs AB. +# Copyright (c) 2006 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +# mode descriptor cache +_modes = None + + +class ModeDescriptor: + """Wrapper for mode strings.""" + + def __init__(self, mode, bands, basemode, basetype): + self.mode = mode + self.bands = bands + self.basemode = basemode + self.basetype = basetype + + def __str__(self): + return self.mode + + +def getmode(mode): + """Gets a mode descriptor for the given mode.""" + global _modes + if not _modes: + # initialize mode cache + + from . import Image + + modes = {} + # core modes + for m, (basemode, basetype, bands) in Image._MODEINFO.items(): + modes[m] = ModeDescriptor(m, bands, basemode, basetype) + # extra experimental modes + modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L") + modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L") + modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L") + modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L") + # mapping modes + for i16mode in ( + "I;16", + "I;16S", + "I;16L", + "I;16LS", + "I;16B", + "I;16BS", + "I;16N", + "I;16NS", + ): + modes[i16mode] = ModeDescriptor(i16mode, ("I",), "L", "L") + # set global mode cache atomically + _modes = modes + return _modes[mode] diff --git a/venv/Lib/site-packages/PIL/ImageMorph.py b/venv/Lib/site-packages/PIL/ImageMorph.py new file mode 100644 index 0000000..d1ec09e --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageMorph.py @@ -0,0 +1,245 @@ +# A binary morphology add-on for the Python Imaging Library +# +# History: +# 2014-06-04 Initial version. +# +# Copyright (c) 2014 Dov Grobgeld + +import re + +from . import Image, _imagingmorph + +LUT_SIZE = 1 << 9 + +# fmt: off +ROTATION_MATRIX = [ + 6, 3, 0, + 7, 4, 1, + 8, 5, 2, +] +MIRROR_MATRIX = [ + 2, 1, 0, + 5, 4, 3, + 8, 7, 6, +] +# fmt: on + + +class LutBuilder: + """A class for building a MorphLut from a descriptive language + + The input patterns is a list of a strings sequences like these:: + + 4:(... + .1. + 111)->1 + + (whitespaces including linebreaks are ignored). The option 4 + describes a series of symmetry operations (in this case a + 4-rotation), the pattern is described by: + + - . or X - Ignore + - 1 - Pixel is on + - 0 - Pixel is off + + The result of the operation is described after "->" string. + + The default is to return the current pixel value, which is + returned if no other match is found. + + Operations: + + - 4 - 4 way rotation + - N - Negate + - 1 - Dummy op for no other operation (an op must always be given) + - M - Mirroring + + Example:: + + lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) + lut = lb.build_lut() + + """ + + def __init__(self, patterns=None, op_name=None): + if patterns is not None: + self.patterns = patterns + else: + self.patterns = [] + self.lut = None + if op_name is not None: + known_patterns = { + "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"], + "dilation4": ["4:(... .0. .1.)->1"], + "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"], + "erosion4": ["4:(... .1. .0.)->0"], + "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"], + "edge": [ + "1:(... ... ...)->0", + "4:(.0. .1. ...)->1", + "4:(01. .1. ...)->1", + ], + } + if op_name not in known_patterns: + raise Exception("Unknown pattern " + op_name + "!") + + self.patterns = known_patterns[op_name] + + def add_patterns(self, patterns): + self.patterns += patterns + + def build_default_lut(self): + symbols = [0, 1] + m = 1 << 4 # pos of current pixel + self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) + + def get_lut(self): + return self.lut + + def _string_permute(self, pattern, permutation): + """string_permute takes a pattern and a permutation and returns the + string permuted according to the permutation list. + """ + assert len(permutation) == 9 + return "".join(pattern[p] for p in permutation) + + def _pattern_permute(self, basic_pattern, options, basic_result): + """pattern_permute takes a basic pattern and its result and clones + the pattern according to the modifications described in the $options + parameter. It returns a list of all cloned patterns.""" + patterns = [(basic_pattern, basic_result)] + + # rotations + if "4" in options: + res = patterns[-1][1] + for i in range(4): + patterns.append( + (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res) + ) + # mirror + if "M" in options: + n = len(patterns) + for pattern, res in patterns[0:n]: + patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) + + # negate + if "N" in options: + n = len(patterns) + for pattern, res in patterns[0:n]: + # Swap 0 and 1 + pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1") + res = 1 - int(res) + patterns.append((pattern, res)) + + return patterns + + def build_lut(self): + """Compile all patterns into a morphology lut. + + TBD :Build based on (file) morphlut:modify_lut + """ + self.build_default_lut() + patterns = [] + + # Parse and create symmetries of the patterns strings + for p in self.patterns: + m = re.search(r"(\w*):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", "")) + if not m: + raise Exception('Syntax error in pattern "' + p + '"') + options = m.group(1) + pattern = m.group(2) + result = int(m.group(3)) + + # Get rid of spaces + pattern = pattern.replace(" ", "").replace("\n", "") + + patterns += self._pattern_permute(pattern, options, result) + + # compile the patterns into regular expressions for speed + for i, pattern in enumerate(patterns): + p = pattern[0].replace(".", "X").replace("X", "[01]") + p = re.compile(p) + patterns[i] = (p, pattern[1]) + + # Step through table and find patterns that match. + # Note that all the patterns are searched. The last one + # caught overrides + for i in range(LUT_SIZE): + # Build the bit pattern + bitpattern = bin(i)[2:] + bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1] + + for p, r in patterns: + if p.match(bitpattern): + self.lut[i] = [0, 1][r] + + return self.lut + + +class MorphOp: + """A class for binary morphological operators""" + + def __init__(self, lut=None, op_name=None, patterns=None): + """Create a binary morphological operator""" + self.lut = lut + if op_name is not None: + self.lut = LutBuilder(op_name=op_name).build_lut() + elif patterns is not None: + self.lut = LutBuilder(patterns=patterns).build_lut() + + def apply(self, image): + """Run a single morphological operation on an image + + Returns a tuple of the number of changed pixels and the + morphed image""" + if self.lut is None: + raise Exception("No operator loaded") + + if image.mode != "L": + raise Exception("Image must be binary, meaning it must use mode L") + outimage = Image.new(image.mode, image.size, None) + count = _imagingmorph.apply(bytes(self.lut), image.im.id, outimage.im.id) + return count, outimage + + def match(self, image): + """Get a list of coordinates matching the morphological operation on + an image. + + Returns a list of tuples of (x,y) coordinates + of all matching pixels. See :ref:`coordinate-system`.""" + if self.lut is None: + raise Exception("No operator loaded") + + if image.mode != "L": + raise Exception("Image must be binary, meaning it must use mode L") + return _imagingmorph.match(bytes(self.lut), image.im.id) + + def get_on_pixels(self, image): + """Get a list of all turned on pixels in a binary image + + Returns a list of tuples of (x,y) coordinates + of all matching pixels. See :ref:`coordinate-system`.""" + + if image.mode != "L": + raise Exception("Image must be binary, meaning it must use mode L") + return _imagingmorph.get_on_pixels(image.im.id) + + def load_lut(self, filename): + """Load an operator from an mrl file""" + with open(filename, "rb") as f: + self.lut = bytearray(f.read()) + + if len(self.lut) != LUT_SIZE: + self.lut = None + raise Exception("Wrong size operator file!") + + def save_lut(self, filename): + """Save an operator to an mrl file""" + if self.lut is None: + raise Exception("No operator loaded") + with open(filename, "wb") as f: + f.write(self.lut) + + def set_lut(self, lut): + """Set the lut from an external source""" + self.lut = lut diff --git a/venv/Lib/site-packages/PIL/ImageOps.py b/venv/Lib/site-packages/PIL/ImageOps.py new file mode 100644 index 0000000..e4e0840 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageOps.py @@ -0,0 +1,551 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard image operations +# +# History: +# 2001-10-20 fl Created +# 2001-10-23 fl Added autocontrast operator +# 2001-12-18 fl Added Kevin's fit operator +# 2004-03-14 fl Fixed potential division by zero in equalize +# 2005-05-05 fl Fixed equalize for low number of values +# +# Copyright (c) 2001-2004 by Secret Labs AB +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import functools +import operator + +from . import Image + +# +# helpers + + +def _border(border): + if isinstance(border, tuple): + if len(border) == 2: + left, top = right, bottom = border + elif len(border) == 4: + left, top, right, bottom = border + else: + left = top = right = bottom = border + return left, top, right, bottom + + +def _color(color, mode): + if isinstance(color, str): + from . import ImageColor + + color = ImageColor.getcolor(color, mode) + return color + + +def _lut(image, lut): + if image.mode == "P": + # FIXME: apply to lookup table, not image data + raise NotImplementedError("mode P support coming soon") + elif image.mode in ("L", "RGB"): + if image.mode == "RGB" and len(lut) == 256: + lut = lut + lut + lut + return image.point(lut) + else: + raise OSError("not supported for this image mode") + + +# +# actions + + +def autocontrast(image, cutoff=0, ignore=None): + """ + Maximize (normalize) image contrast. This function calculates a + histogram of the input image, removes **cutoff** percent of the + lightest and darkest pixels from the histogram, and remaps the image + so that the darkest pixel becomes black (0), and the lightest + becomes white (255). + + :param image: The image to process. + :param cutoff: How many percent to cut off from the histogram. + :param ignore: The background pixel value (use None for no background). + :return: An image. + """ + histogram = image.histogram() + lut = [] + for layer in range(0, len(histogram), 256): + h = histogram[layer : layer + 256] + if ignore is not None: + # get rid of outliers + try: + h[ignore] = 0 + except TypeError: + # assume sequence + for ix in ignore: + h[ix] = 0 + if cutoff: + # cut off pixels from both ends of the histogram + # get number of pixels + n = 0 + for ix in range(256): + n = n + h[ix] + # remove cutoff% pixels from the low end + cut = n * cutoff // 100 + for lo in range(256): + if cut > h[lo]: + cut = cut - h[lo] + h[lo] = 0 + else: + h[lo] -= cut + cut = 0 + if cut <= 0: + break + # remove cutoff% samples from the hi end + cut = n * cutoff // 100 + for hi in range(255, -1, -1): + if cut > h[hi]: + cut = cut - h[hi] + h[hi] = 0 + else: + h[hi] -= cut + cut = 0 + if cut <= 0: + break + # find lowest/highest samples after preprocessing + for lo in range(256): + if h[lo]: + break + for hi in range(255, -1, -1): + if h[hi]: + break + if hi <= lo: + # don't bother + lut.extend(list(range(256))) + else: + scale = 255.0 / (hi - lo) + offset = -lo * scale + for ix in range(256): + ix = int(ix * scale + offset) + if ix < 0: + ix = 0 + elif ix > 255: + ix = 255 + lut.append(ix) + return _lut(image, lut) + + +def colorize(image, black, white, mid=None, blackpoint=0, whitepoint=255, midpoint=127): + """ + Colorize grayscale image. + This function calculates a color wedge which maps all black pixels in + the source image to the first color and all white pixels to the + second color. If **mid** is specified, it uses three-color mapping. + The **black** and **white** arguments should be RGB tuples or color names; + optionally you can use three-color mapping by also specifying **mid**. + Mapping positions for any of the colors can be specified + (e.g. **blackpoint**), where these parameters are the integer + value corresponding to where the corresponding color should be mapped. + These parameters must have logical order, such that + **blackpoint** <= **midpoint** <= **whitepoint** (if **mid** is specified). + + :param image: The image to colorize. + :param black: The color to use for black input pixels. + :param white: The color to use for white input pixels. + :param mid: The color to use for midtone input pixels. + :param blackpoint: an int value [0, 255] for the black mapping. + :param whitepoint: an int value [0, 255] for the white mapping. + :param midpoint: an int value [0, 255] for the midtone mapping. + :return: An image. + """ + + # Initial asserts + assert image.mode == "L" + if mid is None: + assert 0 <= blackpoint <= whitepoint <= 255 + else: + assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 + + # Define colors from arguments + black = _color(black, "RGB") + white = _color(white, "RGB") + if mid is not None: + mid = _color(mid, "RGB") + + # Empty lists for the mapping + red = [] + green = [] + blue = [] + + # Create the low-end values + for i in range(0, blackpoint): + red.append(black[0]) + green.append(black[1]) + blue.append(black[2]) + + # Create the mapping (2-color) + if mid is None: + + range_map = range(0, whitepoint - blackpoint) + + for i in range_map: + red.append(black[0] + i * (white[0] - black[0]) // len(range_map)) + green.append(black[1] + i * (white[1] - black[1]) // len(range_map)) + blue.append(black[2] + i * (white[2] - black[2]) // len(range_map)) + + # Create the mapping (3-color) + else: + + range_map1 = range(0, midpoint - blackpoint) + range_map2 = range(0, whitepoint - midpoint) + + for i in range_map1: + red.append(black[0] + i * (mid[0] - black[0]) // len(range_map1)) + green.append(black[1] + i * (mid[1] - black[1]) // len(range_map1)) + blue.append(black[2] + i * (mid[2] - black[2]) // len(range_map1)) + for i in range_map2: + red.append(mid[0] + i * (white[0] - mid[0]) // len(range_map2)) + green.append(mid[1] + i * (white[1] - mid[1]) // len(range_map2)) + blue.append(mid[2] + i * (white[2] - mid[2]) // len(range_map2)) + + # Create the high-end values + for i in range(0, 256 - whitepoint): + red.append(white[0]) + green.append(white[1]) + blue.append(white[2]) + + # Return converted image + image = image.convert("RGB") + return _lut(image, red + green + blue) + + +def pad(image, size, method=Image.BICUBIC, color=None, centering=(0.5, 0.5)): + """ + Returns a sized and padded version of the image, expanded to fill the + requested aspect ratio and size. + + :param image: The image to size and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: What resampling method to use. Default is + :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. + :param color: The background color of the padded image. + :param centering: Control the position of the original image within the + padded version. + + (0.5, 0.5) will keep the image centered + (0, 0) will keep the image aligned to the top left + (1, 1) will keep the image aligned to the bottom + right + :return: An image. + """ + + im_ratio = image.width / image.height + dest_ratio = size[0] / size[1] + + if im_ratio == dest_ratio: + out = image.resize(size, resample=method) + else: + out = Image.new(image.mode, size, color) + if im_ratio > dest_ratio: + new_height = int(image.height / image.width * size[0]) + if new_height != size[1]: + image = image.resize((size[0], new_height), resample=method) + + y = int((size[1] - new_height) * max(0, min(centering[1], 1))) + out.paste(image, (0, y)) + else: + new_width = int(image.width / image.height * size[1]) + if new_width != size[0]: + image = image.resize((new_width, size[1]), resample=method) + + x = int((size[0] - new_width) * max(0, min(centering[0], 1))) + out.paste(image, (x, 0)) + return out + + +def crop(image, border=0): + """ + Remove border from image. The same amount of pixels are removed + from all four sides. This function works on all image modes. + + .. seealso:: :py:meth:`~PIL.Image.Image.crop` + + :param image: The image to crop. + :param border: The number of pixels to remove. + :return: An image. + """ + left, top, right, bottom = _border(border) + return image.crop((left, top, image.size[0] - right, image.size[1] - bottom)) + + +def scale(image, factor, resample=Image.BICUBIC): + """ + Returns a rescaled image by a specific factor given in parameter. + A factor greater than 1 expands the image, between 0 and 1 contracts the + image. + + :param image: The image to rescale. + :param factor: The expansion factor, as a float. + :param resample: What resampling method to use. Default is + :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + if factor == 1: + return image.copy() + elif factor <= 0: + raise ValueError("the factor must be greater than 0") + else: + size = (round(factor * image.width), round(factor * image.height)) + return image.resize(size, resample) + + +def deform(image, deformer, resample=Image.BILINEAR): + """ + Deform the image. + + :param image: The image to deform. + :param deformer: A deformer object. Any object that implements a + **getmesh** method can be used. + :param resample: An optional resampling filter. Same values possible as + in the PIL.Image.transform function. + :return: An image. + """ + return image.transform(image.size, Image.MESH, deformer.getmesh(image), resample) + + +def equalize(image, mask=None): + """ + Equalize the image histogram. This function applies a non-linear + mapping to the input image, in order to create a uniform + distribution of grayscale values in the output image. + + :param image: The image to equalize. + :param mask: An optional mask. If given, only the pixels selected by + the mask are included in the analysis. + :return: An image. + """ + if image.mode == "P": + image = image.convert("RGB") + h = image.histogram(mask) + lut = [] + for b in range(0, len(h), 256): + histo = [_f for _f in h[b : b + 256] if _f] + if len(histo) <= 1: + lut.extend(list(range(256))) + else: + step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 + if not step: + lut.extend(list(range(256))) + else: + n = step // 2 + for i in range(256): + lut.append(n // step) + n = n + h[i + b] + return _lut(image, lut) + + +def expand(image, border=0, fill=0): + """ + Add border to the image + + :param image: The image to expand. + :param border: Border width, in pixels. + :param fill: Pixel fill value (a color value). Default is 0 (black). + :return: An image. + """ + left, top, right, bottom = _border(border) + width = left + image.size[0] + right + height = top + image.size[1] + bottom + out = Image.new(image.mode, (width, height), _color(fill, image.mode)) + out.paste(image, (left, top)) + return out + + +def fit(image, size, method=Image.BICUBIC, bleed=0.0, centering=(0.5, 0.5)): + """ + Returns a sized and cropped version of the image, cropped to the + requested aspect ratio and size. + + This function was contributed by Kevin Cazabon. + + :param image: The image to size and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: What resampling method to use. Default is + :py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`. + :param bleed: Remove a border around the outside of the image from all + four edges. The value is a decimal percentage (use 0.01 for + one percent). The default value is 0 (no border). + Cannot be greater than or equal to 0.5. + :param centering: Control the cropping position. Use (0.5, 0.5) for + center cropping (e.g. if cropping the width, take 50% off + of the left side, and therefore 50% off the right side). + (0.0, 0.0) will crop from the top left corner (i.e. if + cropping the width, take all of the crop off of the right + side, and if cropping the height, take all of it off the + bottom). (1.0, 0.0) will crop from the bottom left + corner, etc. (i.e. if cropping the width, take all of the + crop off the left side, and if cropping the height take + none from the top, and therefore all off the bottom). + :return: An image. + """ + + # by Kevin Cazabon, Feb 17/2000 + # kevin@cazabon.com + # http://www.cazabon.com + + # ensure centering is mutable + centering = list(centering) + + if not 0.0 <= centering[0] <= 1.0: + centering[0] = 0.5 + if not 0.0 <= centering[1] <= 1.0: + centering[1] = 0.5 + + if not 0.0 <= bleed < 0.5: + bleed = 0.0 + + # calculate the area to use for resizing and cropping, subtracting + # the 'bleed' around the edges + + # number of pixels to trim off on Top and Bottom, Left and Right + bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) + + live_size = ( + image.size[0] - bleed_pixels[0] * 2, + image.size[1] - bleed_pixels[1] * 2, + ) + + # calculate the aspect ratio of the live_size + live_size_ratio = live_size[0] / live_size[1] + + # calculate the aspect ratio of the output image + output_ratio = size[0] / size[1] + + # figure out if the sides or top/bottom will be cropped off + if live_size_ratio == output_ratio: + # live_size is already the needed ratio + crop_width = live_size[0] + crop_height = live_size[1] + elif live_size_ratio >= output_ratio: + # live_size is wider than what's needed, crop the sides + crop_width = output_ratio * live_size[1] + crop_height = live_size[1] + else: + # live_size is taller than what's needed, crop the top and bottom + crop_width = live_size[0] + crop_height = live_size[0] / output_ratio + + # make the crop + crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering[0] + crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering[1] + + crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) + + # resize the image and return it + return image.resize(size, method, box=crop) + + +def flip(image): + """ + Flip the image vertically (top to bottom). + + :param image: The image to flip. + :return: An image. + """ + return image.transpose(Image.FLIP_TOP_BOTTOM) + + +def grayscale(image): + """ + Convert the image to grayscale. + + :param image: The image to convert. + :return: An image. + """ + return image.convert("L") + + +def invert(image): + """ + Invert (negate) the image. + + :param image: The image to invert. + :return: An image. + """ + lut = [] + for i in range(256): + lut.append(255 - i) + return _lut(image, lut) + + +def mirror(image): + """ + Flip image horizontally (left to right). + + :param image: The image to mirror. + :return: An image. + """ + return image.transpose(Image.FLIP_LEFT_RIGHT) + + +def posterize(image, bits): + """ + Reduce the number of bits for each color channel. + + :param image: The image to posterize. + :param bits: The number of bits to keep for each channel (1-8). + :return: An image. + """ + lut = [] + mask = ~(2 ** (8 - bits) - 1) + for i in range(256): + lut.append(i & mask) + return _lut(image, lut) + + +def solarize(image, threshold=128): + """ + Invert all pixel values above a threshold. + + :param image: The image to solarize. + :param threshold: All pixels above this greyscale level are inverted. + :return: An image. + """ + lut = [] + for i in range(256): + if i < threshold: + lut.append(i) + else: + lut.append(255 - i) + return _lut(image, lut) + + +def exif_transpose(image): + """ + If an image has an EXIF Orientation tag, return a new image that is + transposed accordingly. Otherwise, return a copy of the image. + + :param image: The image to transpose. + :return: An image. + """ + exif = image.getexif() + orientation = exif.get(0x0112) + method = { + 2: Image.FLIP_LEFT_RIGHT, + 3: Image.ROTATE_180, + 4: Image.FLIP_TOP_BOTTOM, + 5: Image.TRANSPOSE, + 6: Image.ROTATE_270, + 7: Image.TRANSVERSE, + 8: Image.ROTATE_90, + }.get(orientation) + if method is not None: + transposed_image = image.transpose(method) + del exif[0x0112] + transposed_image.info["exif"] = exif.tobytes() + return transposed_image + return image.copy() diff --git a/venv/Lib/site-packages/PIL/ImagePalette.py b/venv/Lib/site-packages/PIL/ImagePalette.py new file mode 100644 index 0000000..5dba617 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImagePalette.py @@ -0,0 +1,221 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image palette object +# +# History: +# 1996-03-11 fl Rewritten. +# 1997-01-03 fl Up and running. +# 1997-08-23 fl Added load hack +# 2001-04-16 fl Fixed randint shadow bug in random() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import array + +from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile + + +class ImagePalette: + """ + Color palette for palette mapped images + + :param mode: The mode to use for the Palette. See: + :ref:`concept-modes`. Defaults to "RGB" + :param palette: An optional palette. If given, it must be a bytearray, + an array or a list of ints between 0-255 and of length ``size`` + times the number of colors in ``mode``. The list must be aligned + by channel (All R values must be contiguous in the list before G + and B values.) Defaults to 0 through 255 per channel. + :param size: An optional palette size. If given, it cannot be equal to + or greater than 256. Defaults to 0. + """ + + def __init__(self, mode="RGB", palette=None, size=0): + self.mode = mode + self.rawmode = None # if set, palette contains raw data + self.palette = palette or bytearray(range(256)) * len(self.mode) + self.colors = {} + self.dirty = None + if (size == 0 and len(self.mode) * 256 != len(self.palette)) or ( + size != 0 and size != len(self.palette) + ): + raise ValueError("wrong palette size") + + def copy(self): + new = ImagePalette() + + new.mode = self.mode + new.rawmode = self.rawmode + if self.palette is not None: + new.palette = self.palette[:] + new.colors = self.colors.copy() + new.dirty = self.dirty + + return new + + def getdata(self): + """ + Get palette contents in format suitable for the low-level + ``im.putpalette`` primitive. + + .. warning:: This method is experimental. + """ + if self.rawmode: + return self.rawmode, self.palette + return self.mode + ";L", self.tobytes() + + def tobytes(self): + """Convert palette to bytes. + + .. warning:: This method is experimental. + """ + if self.rawmode: + raise ValueError("palette contains raw palette data") + if isinstance(self.palette, bytes): + return self.palette + arr = array.array("B", self.palette) + if hasattr(arr, "tobytes"): + return arr.tobytes() + return arr.tostring() + + # Declare tostring as an alias for tobytes + tostring = tobytes + + def getcolor(self, color): + """Given an rgb tuple, allocate palette entry. + + .. warning:: This method is experimental. + """ + if self.rawmode: + raise ValueError("palette contains raw palette data") + if isinstance(color, tuple): + try: + return self.colors[color] + except KeyError as e: + # allocate new color slot + if isinstance(self.palette, bytes): + self.palette = bytearray(self.palette) + index = len(self.colors) + if index >= 256: + raise ValueError("cannot allocate more than 256 colors") from e + self.colors[color] = index + self.palette[index] = color[0] + self.palette[index + 256] = color[1] + self.palette[index + 512] = color[2] + self.dirty = 1 + return index + else: + raise ValueError("unknown color specifier: %r" % color) + + def save(self, fp): + """Save palette to text file. + + .. warning:: This method is experimental. + """ + if self.rawmode: + raise ValueError("palette contains raw palette data") + if isinstance(fp, str): + fp = open(fp, "w") + fp.write("# Palette\n") + fp.write("# Mode: %s\n" % self.mode) + for i in range(256): + fp.write("%d" % i) + for j in range(i * len(self.mode), (i + 1) * len(self.mode)): + try: + fp.write(" %d" % self.palette[j]) + except IndexError: + fp.write(" 0") + fp.write("\n") + fp.close() + + +# -------------------------------------------------------------------- +# Internal + + +def raw(rawmode, data): + palette = ImagePalette() + palette.rawmode = rawmode + palette.palette = data + palette.dirty = 1 + return palette + + +# -------------------------------------------------------------------- +# Factories + + +def make_linear_lut(black, white): + lut = [] + if black == 0: + for i in range(256): + lut.append(white * i // 255) + else: + raise NotImplementedError # FIXME + return lut + + +def make_gamma_lut(exp): + lut = [] + for i in range(256): + lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5)) + return lut + + +def negative(mode="RGB"): + palette = list(range(256)) + palette.reverse() + return ImagePalette(mode, palette * len(mode)) + + +def random(mode="RGB"): + from random import randint + + palette = [] + for i in range(256 * len(mode)): + palette.append(randint(0, 255)) + return ImagePalette(mode, palette) + + +def sepia(white="#fff0c0"): + r, g, b = ImageColor.getrgb(white) + r = make_linear_lut(0, r) + g = make_linear_lut(0, g) + b = make_linear_lut(0, b) + return ImagePalette("RGB", r + g + b) + + +def wedge(mode="RGB"): + return ImagePalette(mode, list(range(256)) * len(mode)) + + +def load(filename): + + # FIXME: supports GIMP gradients only + + with open(filename, "rb") as fp: + + for paletteHandler in [ + GimpPaletteFile.GimpPaletteFile, + GimpGradientFile.GimpGradientFile, + PaletteFile.PaletteFile, + ]: + try: + fp.seek(0) + lut = paletteHandler(fp).getpalette() + if lut: + break + except (SyntaxError, ValueError): + # import traceback + # traceback.print_exc() + pass + else: + raise OSError("cannot load palette") + + return lut # data, rawmode diff --git a/venv/Lib/site-packages/PIL/ImagePath.py b/venv/Lib/site-packages/PIL/ImagePath.py new file mode 100644 index 0000000..3d3538c --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImagePath.py @@ -0,0 +1,19 @@ +# +# The Python Imaging Library +# $Id$ +# +# path interface +# +# History: +# 1996-11-04 fl Created +# 2002-04-14 fl Added documentation stub class +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +from . import Image + +Path = Image.core.path diff --git a/venv/Lib/site-packages/PIL/ImageQt.py b/venv/Lib/site-packages/PIL/ImageQt.py new file mode 100644 index 0000000..a15f4ab --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageQt.py @@ -0,0 +1,195 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a simple Qt image interface. +# +# history: +# 2006-06-03 fl: created +# 2006-06-04 fl: inherit from QImage instead of wrapping it +# 2006-06-05 fl: removed toimage helper; move string support to ImageQt +# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) +# +# Copyright (c) 2006 by Secret Labs AB +# Copyright (c) 2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import sys +from io import BytesIO + +from . import Image +from ._util import isPath + +qt_versions = [["5", "PyQt5"], ["side2", "PySide2"]] + +# If a version has already been imported, attempt it first +qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules, reverse=True) +for qt_version, qt_module in qt_versions: + try: + if qt_module == "PyQt5": + from PyQt5.QtGui import QImage, qRgba, QPixmap + from PyQt5.QtCore import QBuffer, QIODevice + elif qt_module == "PySide2": + from PySide2.QtGui import QImage, qRgba, QPixmap + from PySide2.QtCore import QBuffer, QIODevice + except (ImportError, RuntimeError): + continue + qt_is_installed = True + break +else: + qt_is_installed = False + qt_version = None + + +def rgb(r, g, b, a=255): + """(Internal) Turns an RGB color into a Qt compatible color integer.""" + # use qRgb to pack the colors, and then turn the resulting long + # into a negative integer with the same bitpattern. + return qRgba(r, g, b, a) & 0xFFFFFFFF + + +def fromqimage(im): + """ + :param im: A PIL Image object, or a file name + (given either as Python string or a PyQt string object) + """ + buffer = QBuffer() + buffer.open(QIODevice.ReadWrite) + # preserve alpha channel with png + # otherwise ppm is more friendly with Image.open + if im.hasAlphaChannel(): + im.save(buffer, "png") + else: + im.save(buffer, "ppm") + + b = BytesIO() + b.write(buffer.data()) + buffer.close() + b.seek(0) + + return Image.open(b) + + +def fromqpixmap(im): + return fromqimage(im) + # buffer = QBuffer() + # buffer.open(QIODevice.ReadWrite) + # # im.save(buffer) + # # What if png doesn't support some image features like animation? + # im.save(buffer, 'ppm') + # bytes_io = BytesIO() + # bytes_io.write(buffer.data()) + # buffer.close() + # bytes_io.seek(0) + # return Image.open(bytes_io) + + +def align8to32(bytes, width, mode): + """ + converts each scanline of data from 8 bit to 32 bit aligned + """ + + bits_per_pixel = {"1": 1, "L": 8, "P": 8}[mode] + + # calculate bytes per line and the extra padding if needed + bits_per_line = bits_per_pixel * width + full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) + bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) + + extra_padding = -bytes_per_line % 4 + + # already 32 bit aligned by luck + if not extra_padding: + return bytes + + new_data = [] + for i in range(len(bytes) // bytes_per_line): + new_data.append( + bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + + b"\x00" * extra_padding + ) + + return b"".join(new_data) + + +def _toqclass_helper(im): + data = None + colortable = None + + # handle filename, if given instead of image name + if hasattr(im, "toUtf8"): + # FIXME - is this really the best way to do this? + im = str(im.toUtf8(), "utf-8") + if isPath(im): + im = Image.open(im) + + if im.mode == "1": + format = QImage.Format_Mono + elif im.mode == "L": + format = QImage.Format_Indexed8 + colortable = [] + for i in range(256): + colortable.append(rgb(i, i, i)) + elif im.mode == "P": + format = QImage.Format_Indexed8 + colortable = [] + palette = im.getpalette() + for i in range(0, len(palette), 3): + colortable.append(rgb(*palette[i : i + 3])) + elif im.mode == "RGB": + data = im.tobytes("raw", "BGRX") + format = QImage.Format_RGB32 + elif im.mode == "RGBA": + data = im.tobytes("raw", "BGRA") + format = QImage.Format_ARGB32 + else: + raise ValueError("unsupported image mode %r" % im.mode) + + __data = data or align8to32(im.tobytes(), im.size[0], im.mode) + return {"data": __data, "im": im, "format": format, "colortable": colortable} + + +if qt_is_installed: + + class ImageQt(QImage): + def __init__(self, im): + """ + An PIL image wrapper for Qt. This is a subclass of PyQt's QImage + class. + + :param im: A PIL Image object, or a file name (given either as + Python string or a PyQt string object). + """ + im_data = _toqclass_helper(im) + # must keep a reference, or Qt will crash! + # All QImage constructors that take data operate on an existing + # buffer, so this buffer has to hang on for the life of the image. + # Fixes https://github.com/python-pillow/Pillow/issues/1370 + self.__data = im_data["data"] + super().__init__( + self.__data, + im_data["im"].size[0], + im_data["im"].size[1], + im_data["format"], + ) + if im_data["colortable"]: + self.setColorTable(im_data["colortable"]) + + +def toqimage(im): + return ImageQt(im) + + +def toqpixmap(im): + # # This doesn't work. For now using a dumb approach. + # im_data = _toqclass_helper(im) + # result = QPixmap(im_data['im'].size[0], im_data['im'].size[1]) + # result.loadFromData(im_data['data']) + # Fix some strange bug that causes + if im.mode == "RGB": + im = im.convert("RGBA") + + qimage = toqimage(im) + return QPixmap.fromImage(qimage) diff --git a/venv/Lib/site-packages/PIL/ImageSequence.py b/venv/Lib/site-packages/PIL/ImageSequence.py new file mode 100644 index 0000000..9df910a --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageSequence.py @@ -0,0 +1,75 @@ +# +# The Python Imaging Library. +# $Id$ +# +# sequence support classes +# +# history: +# 1997-02-20 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## + + +class Iterator: + """ + This class implements an iterator object that can be used to loop + over an image sequence. + + You can use the ``[]`` operator to access elements by index. This operator + will raise an :py:exc:`IndexError` if you try to access a nonexistent + frame. + + :param im: An image object. + """ + + def __init__(self, im): + if not hasattr(im, "seek"): + raise AttributeError("im must have seek method") + self.im = im + self.position = getattr(self.im, "_min_frame", 0) + + def __getitem__(self, ix): + try: + self.im.seek(ix) + return self.im + except EOFError as e: + raise IndexError from e # end of sequence + + def __iter__(self): + return self + + def __next__(self): + try: + self.im.seek(self.position) + self.position += 1 + return self.im + except EOFError as e: + raise StopIteration from e + + +def all_frames(im, func=None): + """ + Applies a given function to all frames in an image or a list of images. + The frames are returned as a list of separate images. + + :param im: An image, or a list of images. + :param func: The function to apply to all of the image frames. + :returns: A list of images. + """ + if not isinstance(im, list): + im = [im] + + ims = [] + for imSequence in im: + current = imSequence.tell() + + ims += [im_frame.copy() for im_frame in Iterator(imSequence)] + + imSequence.seek(current) + return [func(im) for im in ims] if func else ims diff --git a/venv/Lib/site-packages/PIL/ImageShow.py b/venv/Lib/site-packages/PIL/ImageShow.py new file mode 100644 index 0000000..3ffb4d6 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageShow.py @@ -0,0 +1,238 @@ +# +# The Python Imaging Library. +# $Id$ +# +# im.show() drivers +# +# History: +# 2008-04-06 fl Created +# +# Copyright (c) Secret Labs AB 2008. +# +# See the README file for information on usage and redistribution. +# +import os +import shutil +import subprocess +import sys +import tempfile +from shlex import quote + +from PIL import Image + +_viewers = [] + + +def register(viewer, order=1): + """ + The :py:func:`register` function is used to register additional viewers. + + :param viewer: The viewer to be registered. + :param order: + Zero or a negative integer to prepend this viewer to the list, + a positive integer to append it. + """ + try: + if issubclass(viewer, Viewer): + viewer = viewer() + except TypeError: + pass # raised if viewer wasn't a class + if order > 0: + _viewers.append(viewer) + else: + _viewers.insert(0, viewer) + + +def show(image, title=None, **options): + r""" + Display a given image. + + :param image: An image object. + :param title: Optional title. Not all viewers can display the title. + :param \**options: Additional viewer options. + :returns: ``True`` if a suitable viewer was found, ``False`` otherwise. + """ + for viewer in _viewers: + if viewer.show(image, title=title, **options): + return 1 + return 0 + + +class Viewer: + """Base class for viewers.""" + + # main api + + def show(self, image, **options): + """ + The main function for displaying an image. + Converts the given image to the target format and displays it. + """ + + # save temporary image to disk + if not ( + image.mode in ("1", "RGBA") + or (self.format == "PNG" and image.mode in ("I;16", "LA")) + ): + base = Image.getmodebase(image.mode) + if image.mode != base: + image = image.convert(base) + + return self.show_image(image, **options) + + # hook methods + + format = None + """The format to convert the image into.""" + options = {} + """Additional options used to convert the image.""" + + def get_format(self, image): + """Return format name, or ``None`` to save as PGM/PPM.""" + return self.format + + def get_command(self, file, **options): + """ + Returns the command used to display the file. + Not implemented in the base class. + """ + raise NotImplementedError + + def save_image(self, image): + """Save to temporary file and return filename.""" + return image._dump(format=self.get_format(image), **self.options) + + def show_image(self, image, **options): + """Display the given image.""" + return self.show_file(self.save_image(image), **options) + + def show_file(self, file, **options): + """Display the given file.""" + os.system(self.get_command(file, **options)) + return 1 + + +# -------------------------------------------------------------------- + + +class WindowsViewer(Viewer): + """The default viewer on Windows is the default system application for PNG files.""" + + format = "PNG" + options = {"compress_level": 1} + + def get_command(self, file, **options): + return ( + 'start "Pillow" /WAIT "%s" ' + "&& ping -n 2 127.0.0.1 >NUL " + '&& del /f "%s"' % (file, file) + ) + + +if sys.platform == "win32": + register(WindowsViewer) + + +class MacViewer(Viewer): + """The default viewer on MacOS using ``Preview.app``.""" + + format = "PNG" + options = {"compress_level": 1} + + def get_command(self, file, **options): + # on darwin open returns immediately resulting in the temp + # file removal while app is opening + command = "open -a Preview.app" + command = "({} {}; sleep 20; rm -f {})&".format( + command, quote(file), quote(file) + ) + return command + + def show_file(self, file, **options): + """Display given file""" + fd, path = tempfile.mkstemp() + with os.fdopen(fd, "w") as f: + f.write(file) + with open(path, "r") as f: + subprocess.Popen( + ["im=$(cat); open -a Preview.app $im; sleep 20; rm -f $im"], + shell=True, + stdin=f, + ) + os.remove(path) + return 1 + + +if sys.platform == "darwin": + register(MacViewer) + + +class UnixViewer(Viewer): + format = "PNG" + options = {"compress_level": 1} + + def get_command(self, file, **options): + command = self.get_command_ex(file, **options)[0] + return "({} {}; rm -f {})&".format(command, quote(file), quote(file)) + + def show_file(self, file, **options): + """Display given file""" + fd, path = tempfile.mkstemp() + with os.fdopen(fd, "w") as f: + f.write(file) + with open(path, "r") as f: + command = self.get_command_ex(file, **options)[0] + subprocess.Popen( + ["im=$(cat);" + command + " $im; rm -f $im"], shell=True, stdin=f + ) + os.remove(path) + return 1 + + +class DisplayViewer(UnixViewer): + """The ImageMagick ``display`` command.""" + + def get_command_ex(self, file, **options): + command = executable = "display" + return command, executable + + +class EogViewer(UnixViewer): + """The GNOME Image Viewer ``eog`` command.""" + + def get_command_ex(self, file, **options): + command = executable = "eog" + return command, executable + + +class XVViewer(UnixViewer): + """ + The X Viewer ``xv`` command. + This viewer supports the ``title`` parameter. + """ + + def get_command_ex(self, file, title=None, **options): + # note: xv is pretty outdated. most modern systems have + # imagemagick's display command instead. + command = executable = "xv" + if title: + command += " -name %s" % quote(title) + return command, executable + + +if sys.platform not in ("win32", "darwin"): # unixoids + if shutil.which("display"): + register(DisplayViewer) + if shutil.which("eog"): + register(EogViewer) + if shutil.which("xv"): + register(XVViewer) + +if __name__ == "__main__": + + if len(sys.argv) < 2: + print("Syntax: python ImageShow.py imagefile [title]") + sys.exit() + + with Image.open(sys.argv[1]) as im: + print(show(im, *sys.argv[2:])) diff --git a/venv/Lib/site-packages/PIL/ImageStat.py b/venv/Lib/site-packages/PIL/ImageStat.py new file mode 100644 index 0000000..50bafc9 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageStat.py @@ -0,0 +1,147 @@ +# +# The Python Imaging Library. +# $Id$ +# +# global image statistics +# +# History: +# 1996-04-05 fl Created +# 1997-05-21 fl Added mask; added rms, var, stddev attributes +# 1997-08-05 fl Added median +# 1998-07-05 hk Fixed integer overflow error +# +# Notes: +# This class shows how to implement delayed evaluation of attributes. +# To get a certain value, simply access the corresponding attribute. +# The __getattr__ dispatcher takes care of the rest. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996-97. +# +# See the README file for information on usage and redistribution. +# + +import functools +import math +import operator + + +class Stat: + def __init__(self, image_or_list, mask=None): + try: + if mask: + self.h = image_or_list.histogram(mask) + else: + self.h = image_or_list.histogram() + except AttributeError: + self.h = image_or_list # assume it to be a histogram list + if not isinstance(self.h, list): + raise TypeError("first argument must be image or list") + self.bands = list(range(len(self.h) // 256)) + + def __getattr__(self, id): + """Calculate missing attribute""" + if id[:4] == "_get": + raise AttributeError(id) + # calculate missing attribute + v = getattr(self, "_get" + id)() + setattr(self, id, v) + return v + + def _getextrema(self): + """Get min/max values for each band in the image""" + + def minmax(histogram): + n = 255 + x = 0 + for i in range(256): + if histogram[i]: + n = min(n, i) + x = max(x, i) + return n, x # returns (255, 0) if there's no data in the histogram + + v = [] + for i in range(0, len(self.h), 256): + v.append(minmax(self.h[i:])) + return v + + def _getcount(self): + """Get total number of pixels in each layer""" + + v = [] + for i in range(0, len(self.h), 256): + v.append(functools.reduce(operator.add, self.h[i : i + 256])) + return v + + def _getsum(self): + """Get sum of all pixels in each layer""" + + v = [] + for i in range(0, len(self.h), 256): + layerSum = 0.0 + for j in range(256): + layerSum += j * self.h[i + j] + v.append(layerSum) + return v + + def _getsum2(self): + """Get squared sum of all pixels in each layer""" + + v = [] + for i in range(0, len(self.h), 256): + sum2 = 0.0 + for j in range(256): + sum2 += (j ** 2) * float(self.h[i + j]) + v.append(sum2) + return v + + def _getmean(self): + """Get average pixel level for each layer""" + + v = [] + for i in self.bands: + v.append(self.sum[i] / self.count[i]) + return v + + def _getmedian(self): + """Get median pixel level for each layer""" + + v = [] + for i in self.bands: + s = 0 + half = self.count[i] // 2 + b = i * 256 + for j in range(256): + s = s + self.h[b + j] + if s > half: + break + v.append(j) + return v + + def _getrms(self): + """Get RMS for each layer""" + + v = [] + for i in self.bands: + v.append(math.sqrt(self.sum2[i] / self.count[i])) + return v + + def _getvar(self): + """Get variance for each layer""" + + v = [] + for i in self.bands: + n = self.count[i] + v.append((self.sum2[i] - (self.sum[i] ** 2.0) / n) / n) + return v + + def _getstddev(self): + """Get standard deviation for each layer""" + + v = [] + for i in self.bands: + v.append(math.sqrt(self.var[i])) + return v + + +Global = Stat # compatibility diff --git a/venv/Lib/site-packages/PIL/ImageTk.py b/venv/Lib/site-packages/PIL/ImageTk.py new file mode 100644 index 0000000..ee707cf --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageTk.py @@ -0,0 +1,300 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Tk display interface +# +# History: +# 96-04-08 fl Created +# 96-09-06 fl Added getimage method +# 96-11-01 fl Rewritten, removed image attribute and crop method +# 97-05-09 fl Use PyImagingPaste method instead of image type +# 97-05-12 fl Minor tweaks to match the IFUNC95 interface +# 97-05-17 fl Support the "pilbitmap" booster patch +# 97-06-05 fl Added file= and data= argument to image constructors +# 98-03-09 fl Added width and height methods to Image classes +# 98-07-02 fl Use default mode for "P" images without palette attribute +# 98-07-02 fl Explicitly destroy Tkinter image objects +# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) +# 99-07-26 fl Automatically hook into Tkinter (if possible) +# 99-08-15 fl Hook uses _imagingtk instead of _imaging +# +# Copyright (c) 1997-1999 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import tkinter +from io import BytesIO + +from . import Image + +# -------------------------------------------------------------------- +# Check for Tkinter interface hooks + +_pilbitmap_ok = None + + +def _pilbitmap_check(): + global _pilbitmap_ok + if _pilbitmap_ok is None: + try: + im = Image.new("1", (1, 1)) + tkinter.BitmapImage(data="PIL:%d" % im.im.id) + _pilbitmap_ok = 1 + except tkinter.TclError: + _pilbitmap_ok = 0 + return _pilbitmap_ok + + +def _get_image_from_kw(kw): + source = None + if "file" in kw: + source = kw.pop("file") + elif "data" in kw: + source = BytesIO(kw.pop("data")) + if source: + return Image.open(source) + + +# -------------------------------------------------------------------- +# PhotoImage + + +class PhotoImage: + """ + A Tkinter-compatible photo image. This can be used + everywhere Tkinter expects an image object. If the image is an RGBA + image, pixels having alpha 0 are treated as transparent. + + The constructor takes either a PIL image, or a mode and a size. + Alternatively, you can use the **file** or **data** options to initialize + the photo image object. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. + :param size: If the first argument is a mode string, this defines the size + of the image. + :keyword file: A filename to load the image from (using + ``Image.open(file)``). + :keyword data: An 8-bit string containing image data (as loaded from an + image file). + """ + + def __init__(self, image=None, size=None, **kw): + + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + if hasattr(image, "mode") and hasattr(image, "size"): + # got an image instead of a mode + mode = image.mode + if mode == "P": + # palette mapped data + image.load() + try: + mode = image.palette.mode + except AttributeError: + mode = "RGB" # default + size = image.size + kw["width"], kw["height"] = size + else: + mode = image + image = None + + if mode not in ["1", "L", "RGB", "RGBA"]: + mode = Image.getmodebase(mode) + + self.__mode = mode + self.__size = size + self.__photo = tkinter.PhotoImage(**kw) + self.tk = self.__photo.tk + if image: + self.paste(image) + + def __del__(self): + name = self.__photo.name + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except Exception: + pass # ignore internal errors + + def __str__(self): + """ + Get the Tkinter photo image identifier. This method is automatically + called by Tkinter whenever a PhotoImage object is passed to a Tkinter + method. + + :return: A Tkinter photo image identifier (a string). + """ + return str(self.__photo) + + def width(self): + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self): + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def paste(self, im, box=None): + """ + Paste a PIL image into the photo image. Note that this can + be very slow if the photo image is displayed. + + :param im: A PIL image. The size must match the target region. If the + mode does not match, the image is converted to the mode of + the bitmap image. + :param box: A 4-tuple defining the left, upper, right, and lower pixel + coordinate. See :ref:`coordinate-system`. If None is given + instead of a tuple, all of the image is assumed. + """ + + # convert to blittable + im.load() + image = im.im + if image.isblock() and im.mode == self.__mode: + block = image + else: + block = image.new_block(self.__mode, im.size) + image.convert2(block, image) # convert directly between buffers + + tk = self.__photo.tk + + try: + tk.call("PyImagingPhoto", self.__photo, block.id) + except tkinter.TclError: + # activate Tkinter hook + try: + from . import _imagingtk + + try: + if hasattr(tk, "interp"): + # Required for PyPy, which always has CFFI installed + from cffi import FFI + + ffi = FFI() + + # PyPy is using an FFI CDATA element + # (Pdb) self.tk.interp + # + _imagingtk.tkinit(int(ffi.cast("uintptr_t", tk.interp)), 1) + else: + _imagingtk.tkinit(tk.interpaddr(), 1) + except AttributeError: + _imagingtk.tkinit(id(tk), 0) + tk.call("PyImagingPhoto", self.__photo, block.id) + except (ImportError, AttributeError, tkinter.TclError): + raise # configuration problem; cannot attach to Tkinter + + +# -------------------------------------------------------------------- +# BitmapImage + + +class BitmapImage: + """ + A Tkinter-compatible bitmap image. This can be used everywhere Tkinter + expects an image object. + + The given image must have mode "1". Pixels having value 0 are treated as + transparent. Options, if any, are passed on to Tkinter. The most commonly + used option is **foreground**, which is used to specify the color for the + non-transparent parts. See the Tkinter documentation for information on + how to specify colours. + + :param image: A PIL image. + """ + + def __init__(self, image=None, **kw): + + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + self.__mode = image.mode + self.__size = image.size + + if _pilbitmap_check(): + # fast way (requires the pilbitmap booster patch) + image.load() + kw["data"] = "PIL:%d" % image.im.id + self.__im = image # must keep a reference + else: + # slow but safe way + kw["data"] = image.tobitmap() + self.__photo = tkinter.BitmapImage(**kw) + + def __del__(self): + name = self.__photo.name + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except Exception: + pass # ignore internal errors + + def width(self): + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self): + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def __str__(self): + """ + Get the Tkinter bitmap image identifier. This method is automatically + called by Tkinter whenever a BitmapImage object is passed to a Tkinter + method. + + :return: A Tkinter bitmap image identifier (a string). + """ + return str(self.__photo) + + +def getimage(photo): + """Copies the contents of a PhotoImage to a PIL image memory.""" + im = Image.new("RGBA", (photo.width(), photo.height())) + block = im.im + + photo.tk.call("PyImagingPhotoGet", photo, block.id) + + return im + + +def _show(image, title): + """Helper for the Image.show method.""" + + class UI(tkinter.Label): + def __init__(self, master, im): + if im.mode == "1": + self.image = BitmapImage(im, foreground="white", master=master) + else: + self.image = PhotoImage(im, master=master) + super().__init__(master, image=self.image, bg="black", bd=0) + + if not tkinter._default_root: + raise OSError("tkinter not initialized") + top = tkinter.Toplevel() + if title: + top.title(title) + UI(top, image).pack() diff --git a/venv/Lib/site-packages/PIL/ImageTransform.py b/venv/Lib/site-packages/PIL/ImageTransform.py new file mode 100644 index 0000000..77791ab --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageTransform.py @@ -0,0 +1,102 @@ +# +# The Python Imaging Library. +# $Id$ +# +# transform wrappers +# +# History: +# 2002-04-08 fl Created +# +# Copyright (c) 2002 by Secret Labs AB +# Copyright (c) 2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +class Transform(Image.ImageTransformHandler): + def __init__(self, data): + self.data = data + + def getdata(self): + return self.method, self.data + + def transform(self, size, image, **options): + # can be overridden + method, data = self.getdata() + return image.transform(size, method, data, **options) + + +class AffineTransform(Transform): + """ + Define an affine image transform. + + This function takes a 6-tuple (a, b, c, d, e, f) which contain the first + two rows from an affine transform matrix. For each pixel (x, y) in the + output image, the new value is taken from a position (a x + b y + c, + d x + e y + f) in the input image, rounded to nearest pixel. + + This function can be used to scale, translate, rotate, and shear the + original image. + + See :py:meth:`~PIL.Image.Image.transform` + + :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows + from an affine transform matrix. + """ + + method = Image.AFFINE + + +class ExtentTransform(Transform): + """ + Define a transform to extract a subregion from an image. + + Maps a rectangle (defined by two corners) from the image to a rectangle of + the given size. The resulting image will contain data sampled from between + the corners, such that (x0, y0) in the input image will end up at (0,0) in + the output image, and (x1, y1) at size. + + This method can be used to crop, stretch, shrink, or mirror an arbitrary + rectangle in the current image. It is slightly slower than crop, but about + as fast as a corresponding resize operation. + + See :py:meth:`~PIL.Image.Image.transform` + + :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the + input image's coordinate system. See :ref:`coordinate-system`. + """ + + method = Image.EXTENT + + +class QuadTransform(Transform): + """ + Define a quad image transform. + + Maps a quadrilateral (a region defined by four corners) from the image to a + rectangle of the given size. + + See :py:meth:`~PIL.Image.Image.transform` + + :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the + upper left, lower left, lower right, and upper right corner of the + source quadrilateral. + """ + + method = Image.QUAD + + +class MeshTransform(Transform): + """ + Define a mesh image transform. A mesh transform consists of one or more + individual quad transforms. + + See :py:meth:`~PIL.Image.Image.transform` + + :param data: A list of (bbox, quad) tuples. + """ + + method = Image.MESH diff --git a/venv/Lib/site-packages/PIL/ImageWin.py b/venv/Lib/site-packages/PIL/ImageWin.py new file mode 100644 index 0000000..afba61c --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImageWin.py @@ -0,0 +1,230 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Windows DIB display interface +# +# History: +# 1996-05-20 fl Created +# 1996-09-20 fl Fixed subregion exposure +# 1997-09-21 fl Added draw primitive (for tzPrint) +# 2003-05-21 fl Added experimental Window/ImageWindow classes +# 2003-09-05 fl Added fromstring/tostring methods +# +# Copyright (c) Secret Labs AB 1997-2003. +# Copyright (c) Fredrik Lundh 1996-2003. +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +class HDC: + """ + Wraps an HDC integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods. + """ + + def __init__(self, dc): + self.dc = dc + + def __int__(self): + return self.dc + + +class HWND: + """ + Wraps an HWND integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods, instead of a DC. + """ + + def __init__(self, wnd): + self.wnd = wnd + + def __int__(self): + return self.wnd + + +class Dib: + """ + A Windows bitmap with the given mode and size. The mode can be one of "1", + "L", "P", or "RGB". + + If the display requires a palette, this constructor creates a suitable + palette and associates it with the image. For an "L" image, 128 greylevels + are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together + with 20 greylevels. + + To make sure that palettes work properly under Windows, you must call the + **palette** method upon certain events from Windows. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. The mode can be one of "1", + "L", "P", or "RGB". + :param size: If the first argument is a mode string, this + defines the size of the image. + """ + + def __init__(self, image, size=None): + if hasattr(image, "mode") and hasattr(image, "size"): + mode = image.mode + size = image.size + else: + mode = image + image = None + if mode not in ["1", "L", "P", "RGB"]: + mode = Image.getmodebase(mode) + self.image = Image.core.display(mode, size) + self.mode = mode + self.size = size + if image: + self.paste(image) + + def expose(self, handle): + """ + Copy the bitmap contents to a device context. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. In PythonWin, you can use the + :py:meth:`CDC.GetHandleAttrib` to get a suitable handle. + """ + if isinstance(handle, HWND): + dc = self.image.getdc(handle) + try: + result = self.image.expose(dc) + finally: + self.image.releasedc(handle, dc) + else: + result = self.image.expose(handle) + return result + + def draw(self, handle, dst, src=None): + """ + Same as expose, but allows you to specify where to draw the image, and + what part of it to draw. + + The destination and source areas are given as 4-tuple rectangles. If + the source is omitted, the entire image is copied. If the source and + the destination have different sizes, the image is resized as + necessary. + """ + if not src: + src = (0, 0) + self.size + if isinstance(handle, HWND): + dc = self.image.getdc(handle) + try: + result = self.image.draw(dc, dst, src) + finally: + self.image.releasedc(handle, dc) + else: + result = self.image.draw(handle, dst, src) + return result + + def query_palette(self, handle): + """ + Installs the palette associated with the image in the given device + context. + + This method should be called upon **QUERYNEWPALETTE** and + **PALETTECHANGED** events from Windows. If this method returns a + non-zero value, one or more display palette entries were changed, and + the image should be redrawn. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. + :return: A true value if one or more entries were changed (this + indicates that the image should be redrawn). + """ + if isinstance(handle, HWND): + handle = self.image.getdc(handle) + try: + result = self.image.query_palette(handle) + finally: + self.image.releasedc(handle, handle) + else: + result = self.image.query_palette(handle) + return result + + def paste(self, im, box=None): + """ + Paste a PIL image into the bitmap image. + + :param im: A PIL image. The size must match the target region. + If the mode does not match, the image is converted to the + mode of the bitmap image. + :param box: A 4-tuple defining the left, upper, right, and + lower pixel coordinate. See :ref:`coordinate-system`. If + None is given instead of a tuple, all of the image is + assumed. + """ + im.load() + if self.mode != im.mode: + im = im.convert(self.mode) + if box: + self.image.paste(im.im, box) + else: + self.image.paste(im.im) + + def frombytes(self, buffer): + """ + Load display memory contents from byte data. + + :param buffer: A buffer containing display data (usually + data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) + """ + return self.image.frombytes(buffer) + + def tobytes(self): + """ + Copy display memory contents to bytes object. + + :return: A bytes object containing display data. + """ + return self.image.tobytes() + + +class Window: + """Create a Window with the given title size.""" + + def __init__(self, title="PIL", width=None, height=None): + self.hwnd = Image.core.createwindow( + title, self.__dispatcher, width or 0, height or 0 + ) + + def __dispatcher(self, action, *args): + return getattr(self, "ui_handle_" + action)(*args) + + def ui_handle_clear(self, dc, x0, y0, x1, y1): + pass + + def ui_handle_damage(self, x0, y0, x1, y1): + pass + + def ui_handle_destroy(self): + pass + + def ui_handle_repair(self, dc, x0, y0, x1, y1): + pass + + def ui_handle_resize(self, width, height): + pass + + def mainloop(self): + Image.core.eventloop() + + +class ImageWindow(Window): + """Create an image window which displays the given image.""" + + def __init__(self, image, title="PIL"): + if not isinstance(image, Dib): + image = Dib(image) + self.image = image + width, height = image.size + super().__init__(title, width=width, height=height) + + def ui_handle_repair(self, dc, x0, y0, x1, y1): + self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/venv/Lib/site-packages/PIL/ImtImagePlugin.py b/venv/Lib/site-packages/PIL/ImtImagePlugin.py new file mode 100644 index 0000000..21ffd74 --- /dev/null +++ b/venv/Lib/site-packages/PIL/ImtImagePlugin.py @@ -0,0 +1,93 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IM Tools support for PIL +# +# history: +# 1996-05-27 fl Created (read 8-bit images only) +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# + + +import re + +from . import Image, ImageFile + +# +# -------------------------------------------------------------------- + +field = re.compile(br"([a-z]*) ([^ \r\n]*)") + + +## +# Image plugin for IM Tools images. + + +class ImtImageFile(ImageFile.ImageFile): + + format = "IMT" + format_description = "IM Tools" + + def _open(self): + + # Quick rejection: if there's not a LF among the first + # 100 bytes, this is (probably) not a text header. + + if b"\n" not in self.fp.read(100): + raise SyntaxError("not an IM file") + self.fp.seek(0) + + xsize = ysize = 0 + + while True: + + s = self.fp.read(1) + if not s: + break + + if s == b"\x0C": + + # image data begins + self.tile = [ + ("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1)) + ] + + break + + else: + + # read key/value pair + # FIXME: dangerous, may read whole file + s = s + self.fp.readline() + if len(s) == 1 or len(s) > 100: + break + if s[0] == ord(b"*"): + continue # comment + + m = field.match(s) + if not m: + break + k, v = m.group(1, 2) + if k == "width": + xsize = int(v) + self._size = xsize, ysize + elif k == "height": + ysize = int(v) + self._size = xsize, ysize + elif k == "pixel" and v == "n8": + self.mode = "L" + + +# +# -------------------------------------------------------------------- + +Image.register_open(ImtImageFile.format, ImtImageFile) + +# +# no extension registered (".im" is simply too common) diff --git a/venv/Lib/site-packages/PIL/IptcImagePlugin.py b/venv/Lib/site-packages/PIL/IptcImagePlugin.py new file mode 100644 index 0000000..75e7b5a --- /dev/null +++ b/venv/Lib/site-packages/PIL/IptcImagePlugin.py @@ -0,0 +1,226 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IPTC/NAA file handling +# +# history: +# 1995-10-01 fl Created +# 1998-03-09 fl Cleaned up and added to PIL +# 2002-06-18 fl Added getiptcinfo helper +# +# Copyright (c) Secret Labs AB 1997-2002. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# +import os +import tempfile + +from . import Image, ImageFile +from ._binary import i8, i16be as i16, i32be as i32, o8 + +COMPRESSION = {1: "raw", 5: "jpeg"} + +PAD = o8(0) * 4 + + +# +# Helpers + + +def i(c): + return i32((PAD + c)[-4:]) + + +def dump(c): + for i in c: + print("%02x" % i8(i), end=" ") + print() + + +## +# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields +# from TIFF and JPEG files, use the getiptcinfo function. + + +class IptcImageFile(ImageFile.ImageFile): + + format = "IPTC" + format_description = "IPTC/NAA" + + def getint(self, key): + return i(self.info[key]) + + def field(self): + # + # get a IPTC field header + s = self.fp.read(5) + if not len(s): + return None, 0 + + tag = i8(s[1]), i8(s[2]) + + # syntax + if i8(s[0]) != 0x1C or tag[0] < 1 or tag[0] > 9: + raise SyntaxError("invalid IPTC/NAA file") + + # field size + size = i8(s[3]) + if size > 132: + raise OSError("illegal field length in IPTC/NAA file") + elif size == 128: + size = 0 + elif size > 128: + size = i(self.fp.read(size - 128)) + else: + size = i16(s[3:]) + + return tag, size + + def _open(self): + + # load descriptive fields + while True: + offset = self.fp.tell() + tag, size = self.field() + if not tag or tag == (8, 10): + break + if size: + tagdata = self.fp.read(size) + else: + tagdata = None + if tag in self.info: + if isinstance(self.info[tag], list): + self.info[tag].append(tagdata) + else: + self.info[tag] = [self.info[tag], tagdata] + else: + self.info[tag] = tagdata + + # mode + layers = i8(self.info[(3, 60)][0]) + component = i8(self.info[(3, 60)][1]) + if (3, 65) in self.info: + id = i8(self.info[(3, 65)][0]) - 1 + else: + id = 0 + if layers == 1 and not component: + self.mode = "L" + elif layers == 3 and component: + self.mode = "RGB"[id] + elif layers == 4 and component: + self.mode = "CMYK"[id] + + # size + self._size = self.getint((3, 20)), self.getint((3, 30)) + + # compression + try: + compression = COMPRESSION[self.getint((3, 120))] + except KeyError as e: + raise OSError("Unknown IPTC image compression") from e + + # tile + if tag == (8, 10): + self.tile = [ + ("iptc", (compression, offset), (0, 0, self.size[0], self.size[1])) + ] + + def load(self): + + if len(self.tile) != 1 or self.tile[0][0] != "iptc": + return ImageFile.ImageFile.load(self) + + type, tile, box = self.tile[0] + + encoding, offset = tile + + self.fp.seek(offset) + + # Copy image data to temporary file + o_fd, outfile = tempfile.mkstemp(text=False) + o = os.fdopen(o_fd) + if encoding == "raw": + # To simplify access to the extracted file, + # prepend a PPM header + o.write("P5\n%d %d\n255\n" % self.size) + while True: + type, size = self.field() + if type != (8, 10): + break + while size > 0: + s = self.fp.read(min(size, 8192)) + if not s: + break + o.write(s) + size -= len(s) + o.close() + + try: + with Image.open(outfile) as _im: + _im.load() + self.im = _im.im + finally: + try: + os.unlink(outfile) + except OSError: + pass + + +Image.register_open(IptcImageFile.format, IptcImageFile) + +Image.register_extension(IptcImageFile.format, ".iim") + + +def getiptcinfo(im): + """ + Get IPTC information from TIFF, JPEG, or IPTC file. + + :param im: An image containing IPTC data. + :returns: A dictionary containing IPTC information, or None if + no IPTC information block was found. + """ + from . import TiffImagePlugin, JpegImagePlugin + import io + + data = None + + if isinstance(im, IptcImageFile): + # return info dictionary right away + return im.info + + elif isinstance(im, JpegImagePlugin.JpegImageFile): + # extract the IPTC/NAA resource + photoshop = im.info.get("photoshop") + if photoshop: + data = photoshop.get(0x0404) + + elif isinstance(im, TiffImagePlugin.TiffImageFile): + # get raw data from the IPTC/NAA tag (PhotoShop tags the data + # as 4-byte integers, so we cannot use the get method...) + try: + data = im.tag.tagdata[TiffImagePlugin.IPTC_NAA_CHUNK] + except (AttributeError, KeyError): + pass + + if data is None: + return None # no properties + + # create an IptcImagePlugin object without initializing it + class FakeImage: + pass + + im = FakeImage() + im.__class__ = IptcImageFile + + # parse the IPTC information chunk + im.info = {} + im.fp = io.BytesIO(data) + + try: + im._open() + except (IndexError, KeyError): + pass # expected failure + + return im.info diff --git a/venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py b/venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py new file mode 100644 index 0000000..0b0d433 --- /dev/null +++ b/venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py @@ -0,0 +1,314 @@ +# +# The Python Imaging Library +# $Id$ +# +# JPEG2000 file handling +# +# History: +# 2014-03-12 ajh Created +# +# Copyright (c) 2014 Coriolis Systems Limited +# Copyright (c) 2014 Alastair Houghton +# +# See the README file for information on usage and redistribution. +# +import io +import os +import struct + +from . import Image, ImageFile + + +def _parse_codestream(fp): + """Parse the JPEG 2000 codestream to extract the size and component + count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" + + hdr = fp.read(2) + lsiz = struct.unpack(">H", hdr)[0] + siz = hdr + fp.read(lsiz - 2) + lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( + ">HHIIIIIIIIH", siz + ) + ssiz = [None] * csiz + xrsiz = [None] * csiz + yrsiz = [None] * csiz + for i in range(csiz): + ssiz[i], xrsiz[i], yrsiz[i] = struct.unpack_from(">BBB", siz, 36 + 3 * i) + + size = (xsiz - xosiz, ysiz - yosiz) + if csiz == 1: + if (yrsiz[0] & 0x7F) > 8: + mode = "I;16" + else: + mode = "L" + elif csiz == 2: + mode = "LA" + elif csiz == 3: + mode = "RGB" + elif csiz == 4: + mode = "RGBA" + else: + mode = None + + return (size, mode) + + +def _parse_jp2_header(fp): + """Parse the JP2 header box to extract size, component count and + color space information, returning a (size, mode, mimetype) tuple.""" + + # Find the JP2 header box + header = None + mimetype = None + while True: + lbox, tbox = struct.unpack(">I4s", fp.read(8)) + if lbox == 1: + lbox = struct.unpack(">Q", fp.read(8))[0] + hlen = 16 + else: + hlen = 8 + + if lbox < hlen: + raise SyntaxError("Invalid JP2 header length") + + if tbox == b"jp2h": + header = fp.read(lbox - hlen) + break + elif tbox == b"ftyp": + if fp.read(4) == b"jpx ": + mimetype = "image/jpx" + fp.seek(lbox - hlen - 4, os.SEEK_CUR) + else: + fp.seek(lbox - hlen, os.SEEK_CUR) + + if header is None: + raise SyntaxError("could not find JP2 header") + + size = None + mode = None + bpc = None + nc = None + + hio = io.BytesIO(header) + while True: + lbox, tbox = struct.unpack(">I4s", hio.read(8)) + if lbox == 1: + lbox = struct.unpack(">Q", hio.read(8))[0] + hlen = 16 + else: + hlen = 8 + + content = hio.read(lbox - hlen) + + if tbox == b"ihdr": + height, width, nc, bpc, c, unkc, ipr = struct.unpack(">IIHBBBB", content) + size = (width, height) + if unkc: + if nc == 1 and (bpc & 0x7F) > 8: + mode = "I;16" + elif nc == 1: + mode = "L" + elif nc == 2: + mode = "LA" + elif nc == 3: + mode = "RGB" + elif nc == 4: + mode = "RGBA" + break + elif tbox == b"colr": + meth, prec, approx = struct.unpack_from(">BBB", content) + if meth == 1: + cs = struct.unpack_from(">I", content, 3)[0] + if cs == 16: # sRGB + if nc == 1 and (bpc & 0x7F) > 8: + mode = "I;16" + elif nc == 1: + mode = "L" + elif nc == 3: + mode = "RGB" + elif nc == 4: + mode = "RGBA" + break + elif cs == 17: # grayscale + if nc == 1 and (bpc & 0x7F) > 8: + mode = "I;16" + elif nc == 1: + mode = "L" + elif nc == 2: + mode = "LA" + break + elif cs == 18: # sYCC + if nc == 3: + mode = "RGB" + elif nc == 4: + mode = "RGBA" + break + + if size is None or mode is None: + raise SyntaxError("Malformed jp2 header") + + return (size, mode, mimetype) + + +## +# Image plugin for JPEG2000 images. + + +class Jpeg2KImageFile(ImageFile.ImageFile): + format = "JPEG2000" + format_description = "JPEG 2000 (ISO 15444)" + + def _open(self): + sig = self.fp.read(4) + if sig == b"\xff\x4f\xff\x51": + self.codec = "j2k" + self._size, self.mode = _parse_codestream(self.fp) + else: + sig = sig + self.fp.read(8) + + if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a": + self.codec = "jp2" + header = _parse_jp2_header(self.fp) + self._size, self.mode, self.custom_mimetype = header + else: + raise SyntaxError("not a JPEG 2000 file") + + if self.size is None or self.mode is None: + raise SyntaxError("unable to determine size/mode") + + self._reduce = 0 + self.layers = 0 + + fd = -1 + length = -1 + + try: + fd = self.fp.fileno() + length = os.fstat(fd).st_size + except Exception: + fd = -1 + try: + pos = self.fp.tell() + self.fp.seek(0, io.SEEK_END) + length = self.fp.tell() + self.fp.seek(pos) + except Exception: + length = -1 + + self.tile = [ + ( + "jpeg2k", + (0, 0) + self.size, + 0, + (self.codec, self._reduce, self.layers, fd, length), + ) + ] + + @property + def reduce(self): + # https://github.com/python-pillow/Pillow/issues/4343 found that the + # new Image 'reduce' method was shadowed by this plugin's 'reduce' + # property. This attempts to allow for both scenarios + return self._reduce or super().reduce + + @reduce.setter + def reduce(self, value): + self._reduce = value + + def load(self): + if self.tile and self._reduce: + power = 1 << self._reduce + adjust = power >> 1 + self._size = ( + int((self.size[0] + adjust) / power), + int((self.size[1] + adjust) / power), + ) + + # Update the reduce and layers settings + t = self.tile[0] + t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4]) + self.tile = [(t[0], (0, 0) + self.size, t[2], t3)] + + return ImageFile.ImageFile.load(self) + + +def _accept(prefix): + return ( + prefix[:4] == b"\xff\x4f\xff\x51" + or prefix[:12] == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" + ) + + +# ------------------------------------------------------------ +# Save support + + +def _save(im, fp, filename): + if filename.endswith(".j2k"): + kind = "j2k" + else: + kind = "jp2" + + # Get the keyword arguments + info = im.encoderinfo + + offset = info.get("offset", None) + tile_offset = info.get("tile_offset", None) + tile_size = info.get("tile_size", None) + quality_mode = info.get("quality_mode", "rates") + quality_layers = info.get("quality_layers", None) + if quality_layers is not None and not ( + isinstance(quality_layers, (list, tuple)) + and all( + [ + isinstance(quality_layer, (int, float)) + for quality_layer in quality_layers + ] + ) + ): + raise ValueError("quality_layers must be a sequence of numbers") + + num_resolutions = info.get("num_resolutions", 0) + cblk_size = info.get("codeblock_size", None) + precinct_size = info.get("precinct_size", None) + irreversible = info.get("irreversible", False) + progression = info.get("progression", "LRCP") + cinema_mode = info.get("cinema_mode", "no") + fd = -1 + + if hasattr(fp, "fileno"): + try: + fd = fp.fileno() + except Exception: + fd = -1 + + im.encoderconfig = ( + offset, + tile_offset, + tile_size, + quality_mode, + quality_layers, + num_resolutions, + cblk_size, + precinct_size, + irreversible, + progression, + cinema_mode, + fd, + ) + + ImageFile._save(im, fp, [("jpeg2k", (0, 0) + im.size, 0, kind)]) + + +# ------------------------------------------------------------ +# Registry stuff + + +Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) +Image.register_save(Jpeg2KImageFile.format, _save) + +Image.register_extensions( + Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"] +) + +Image.register_mime(Jpeg2KImageFile.format, "image/jp2") diff --git a/venv/Lib/site-packages/PIL/JpegImagePlugin.py b/venv/Lib/site-packages/PIL/JpegImagePlugin.py new file mode 100644 index 0000000..b4795c3 --- /dev/null +++ b/venv/Lib/site-packages/PIL/JpegImagePlugin.py @@ -0,0 +1,809 @@ +# +# The Python Imaging Library. +# $Id$ +# +# JPEG (JFIF) file handling +# +# See "Digital Compression and Coding of Continuous-Tone Still Images, +# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) +# +# History: +# 1995-09-09 fl Created +# 1995-09-13 fl Added full parser +# 1996-03-25 fl Added hack to use the IJG command line utilities +# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug +# 1996-05-28 fl Added draft support, JFIF version (0.1) +# 1996-12-30 fl Added encoder options, added progression property (0.2) +# 1997-08-27 fl Save mode 1 images as BW (0.3) +# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) +# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) +# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) +# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) +# 2003-04-25 fl Added experimental EXIF decoder (0.5) +# 2003-06-06 fl Added experimental EXIF GPSinfo decoder +# 2003-09-13 fl Extract COM markers +# 2009-09-06 fl Added icc_profile support (from Florian Hoech) +# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) +# 2009-03-08 fl Added subsampling support (from Justin Huff). +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +import array +import io +import os +import struct +import subprocess +import tempfile +import warnings + +from . import Image, ImageFile, TiffImagePlugin +from ._binary import i8, i16be as i16, i32be as i32, o8 +from .JpegPresets import presets + +# +# Parser + + +def Skip(self, marker): + n = i16(self.fp.read(2)) - 2 + ImageFile._safe_read(self.fp, n) + + +def APP(self, marker): + # + # Application marker. Store these in the APP dictionary. + # Also look for well-known application markers. + + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + + app = "APP%d" % (marker & 15) + + self.app[app] = s # compatibility + self.applist.append((app, s)) + + if marker == 0xFFE0 and s[:4] == b"JFIF": + # extract JFIF information + self.info["jfif"] = version = i16(s, 5) # version + self.info["jfif_version"] = divmod(version, 256) + # extract JFIF properties + try: + jfif_unit = i8(s[7]) + jfif_density = i16(s, 8), i16(s, 10) + except Exception: + pass + else: + if jfif_unit == 1: + self.info["dpi"] = jfif_density + self.info["jfif_unit"] = jfif_unit + self.info["jfif_density"] = jfif_density + elif marker == 0xFFE1 and s[:5] == b"Exif\0": + if "exif" not in self.info: + # extract EXIF information (incomplete) + self.info["exif"] = s # FIXME: value will change + elif marker == 0xFFE2 and s[:5] == b"FPXR\0": + # extract FlashPix information (incomplete) + self.info["flashpix"] = s # FIXME: value will change + elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0": + # Since an ICC profile can be larger than the maximum size of + # a JPEG marker (64K), we need provisions to split it into + # multiple markers. The format defined by the ICC specifies + # one or more APP2 markers containing the following data: + # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) + # Marker sequence number 1, 2, etc (1 byte) + # Number of markers Total of APP2's used (1 byte) + # Profile data (remainder of APP2 data) + # Decoders should use the marker sequence numbers to + # reassemble the profile, rather than assuming that the APP2 + # markers appear in the correct sequence. + self.icclist.append(s) + elif marker == 0xFFED and s[:14] == b"Photoshop 3.0\x00": + # parse the image resource block + offset = 14 + photoshop = self.info.setdefault("photoshop", {}) + while s[offset : offset + 4] == b"8BIM": + try: + offset += 4 + # resource code + code = i16(s, offset) + offset += 2 + # resource name (usually empty) + name_len = i8(s[offset]) + # name = s[offset+1:offset+1+name_len] + offset += 1 + name_len + offset += offset & 1 # align + # resource data block + size = i32(s, offset) + offset += 4 + data = s[offset : offset + size] + if code == 0x03ED: # ResolutionInfo + data = { + "XResolution": i32(data[:4]) / 65536, + "DisplayedUnitsX": i16(data[4:8]), + "YResolution": i32(data[8:12]) / 65536, + "DisplayedUnitsY": i16(data[12:]), + } + photoshop[code] = data + offset += size + offset += offset & 1 # align + except struct.error: + break # insufficient data + + elif marker == 0xFFEE and s[:5] == b"Adobe": + self.info["adobe"] = i16(s, 5) + # extract Adobe custom properties + try: + adobe_transform = i8(s[1]) + except Exception: + pass + else: + self.info["adobe_transform"] = adobe_transform + elif marker == 0xFFE2 and s[:4] == b"MPF\0": + # extract MPO information + self.info["mp"] = s[4:] + # offset is current location minus buffer size + # plus constant header size + self.info["mpoffset"] = self.fp.tell() - n + 4 + + # If DPI isn't in JPEG header, fetch from EXIF + if "dpi" not in self.info and "exif" in self.info: + try: + exif = self.getexif() + resolution_unit = exif[0x0128] + x_resolution = exif[0x011A] + try: + dpi = float(x_resolution[0]) / x_resolution[1] + except TypeError: + dpi = x_resolution + if resolution_unit == 3: # cm + # 1 dpcm = 2.54 dpi + dpi *= 2.54 + self.info["dpi"] = int(dpi + 0.5), int(dpi + 0.5) + except (KeyError, SyntaxError, ValueError, ZeroDivisionError): + # SyntaxError for invalid/unreadable EXIF + # KeyError for dpi not included + # ZeroDivisionError for invalid dpi rational value + # ValueError for x_resolution[0] being an invalid float + self.info["dpi"] = 72, 72 + + +def COM(self, marker): + # + # Comment marker. Store these in the APP dictionary. + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + + self.info["comment"] = s + self.app["COM"] = s # compatibility + self.applist.append(("COM", s)) + + +def SOF(self, marker): + # + # Start of frame marker. Defines the size and mode of the + # image. JPEG is colour blind, so we use some simple + # heuristics to map the number of layers to an appropriate + # mode. Note that this could be made a bit brighter, by + # looking for JFIF and Adobe APP markers. + + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + self._size = i16(s[3:]), i16(s[1:]) + + self.bits = i8(s[0]) + if self.bits != 8: + raise SyntaxError("cannot handle %d-bit layers" % self.bits) + + self.layers = i8(s[5]) + if self.layers == 1: + self.mode = "L" + elif self.layers == 3: + self.mode = "RGB" + elif self.layers == 4: + self.mode = "CMYK" + else: + raise SyntaxError("cannot handle %d-layer images" % self.layers) + + if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: + self.info["progressive"] = self.info["progression"] = 1 + + if self.icclist: + # fixup icc profile + self.icclist.sort() # sort by sequence number + if i8(self.icclist[0][13]) == len(self.icclist): + profile = [] + for p in self.icclist: + profile.append(p[14:]) + icc_profile = b"".join(profile) + else: + icc_profile = None # wrong number of fragments + self.info["icc_profile"] = icc_profile + self.icclist = [] + + for i in range(6, len(s), 3): + t = s[i : i + 3] + # 4-tuples: id, vsamp, hsamp, qtable + self.layer.append((t[0], i8(t[1]) // 16, i8(t[1]) & 15, i8(t[2]))) + + +def DQT(self, marker): + # + # Define quantization table. Support baseline 8-bit tables + # only. Note that there might be more than one table in + # each marker. + + # FIXME: The quantization tables can be used to estimate the + # compression quality. + + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + while len(s): + if len(s) < 65: + raise SyntaxError("bad quantization table marker") + v = i8(s[0]) + if v // 16 == 0: + self.quantization[v & 15] = array.array("B", s[1:65]) + s = s[65:] + else: + return # FIXME: add code to read 16-bit tables! + # raise SyntaxError, "bad quantization table element size" + + +# +# JPEG marker table + +MARKER = { + 0xFFC0: ("SOF0", "Baseline DCT", SOF), + 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), + 0xFFC2: ("SOF2", "Progressive DCT", SOF), + 0xFFC3: ("SOF3", "Spatial lossless", SOF), + 0xFFC4: ("DHT", "Define Huffman table", Skip), + 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), + 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), + 0xFFC7: ("SOF7", "Differential spatial", SOF), + 0xFFC8: ("JPG", "Extension", None), + 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), + 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), + 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), + 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), + 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), + 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), + 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), + 0xFFD0: ("RST0", "Restart 0", None), + 0xFFD1: ("RST1", "Restart 1", None), + 0xFFD2: ("RST2", "Restart 2", None), + 0xFFD3: ("RST3", "Restart 3", None), + 0xFFD4: ("RST4", "Restart 4", None), + 0xFFD5: ("RST5", "Restart 5", None), + 0xFFD6: ("RST6", "Restart 6", None), + 0xFFD7: ("RST7", "Restart 7", None), + 0xFFD8: ("SOI", "Start of image", None), + 0xFFD9: ("EOI", "End of image", None), + 0xFFDA: ("SOS", "Start of scan", Skip), + 0xFFDB: ("DQT", "Define quantization table", DQT), + 0xFFDC: ("DNL", "Define number of lines", Skip), + 0xFFDD: ("DRI", "Define restart interval", Skip), + 0xFFDE: ("DHP", "Define hierarchical progression", SOF), + 0xFFDF: ("EXP", "Expand reference component", Skip), + 0xFFE0: ("APP0", "Application segment 0", APP), + 0xFFE1: ("APP1", "Application segment 1", APP), + 0xFFE2: ("APP2", "Application segment 2", APP), + 0xFFE3: ("APP3", "Application segment 3", APP), + 0xFFE4: ("APP4", "Application segment 4", APP), + 0xFFE5: ("APP5", "Application segment 5", APP), + 0xFFE6: ("APP6", "Application segment 6", APP), + 0xFFE7: ("APP7", "Application segment 7", APP), + 0xFFE8: ("APP8", "Application segment 8", APP), + 0xFFE9: ("APP9", "Application segment 9", APP), + 0xFFEA: ("APP10", "Application segment 10", APP), + 0xFFEB: ("APP11", "Application segment 11", APP), + 0xFFEC: ("APP12", "Application segment 12", APP), + 0xFFED: ("APP13", "Application segment 13", APP), + 0xFFEE: ("APP14", "Application segment 14", APP), + 0xFFEF: ("APP15", "Application segment 15", APP), + 0xFFF0: ("JPG0", "Extension 0", None), + 0xFFF1: ("JPG1", "Extension 1", None), + 0xFFF2: ("JPG2", "Extension 2", None), + 0xFFF3: ("JPG3", "Extension 3", None), + 0xFFF4: ("JPG4", "Extension 4", None), + 0xFFF5: ("JPG5", "Extension 5", None), + 0xFFF6: ("JPG6", "Extension 6", None), + 0xFFF7: ("JPG7", "Extension 7", None), + 0xFFF8: ("JPG8", "Extension 8", None), + 0xFFF9: ("JPG9", "Extension 9", None), + 0xFFFA: ("JPG10", "Extension 10", None), + 0xFFFB: ("JPG11", "Extension 11", None), + 0xFFFC: ("JPG12", "Extension 12", None), + 0xFFFD: ("JPG13", "Extension 13", None), + 0xFFFE: ("COM", "Comment", COM), +} + + +def _accept(prefix): + # Magic number was taken from https://en.wikipedia.org/wiki/JPEG + return prefix[0:3] == b"\xFF\xD8\xFF" + + +## +# Image plugin for JPEG and JFIF images. + + +class JpegImageFile(ImageFile.ImageFile): + + format = "JPEG" + format_description = "JPEG (ISO 10918)" + + def _open(self): + + s = self.fp.read(3) + + if not _accept(s): + raise SyntaxError("not a JPEG file") + s = b"\xFF" + + # Create attributes + self.bits = self.layers = 0 + + # JPEG specifics (internal) + self.layer = [] + self.huffman_dc = {} + self.huffman_ac = {} + self.quantization = {} + self.app = {} # compatibility + self.applist = [] + self.icclist = [] + + while True: + + i = i8(s) + if i == 0xFF: + s = s + self.fp.read(1) + i = i16(s) + else: + # Skip non-0xFF junk + s = self.fp.read(1) + continue + + if i in MARKER: + name, description, handler = MARKER[i] + if handler is not None: + handler(self, i) + if i == 0xFFDA: # start of scan + rawmode = self.mode + if self.mode == "CMYK": + rawmode = "CMYK;I" # assume adobe conventions + self.tile = [("jpeg", (0, 0) + self.size, 0, (rawmode, ""))] + # self.__offset = self.fp.tell() + break + s = self.fp.read(1) + elif i == 0 or i == 0xFFFF: + # padded marker or junk; move on + s = b"\xff" + elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) + s = self.fp.read(1) + else: + raise SyntaxError("no marker found") + + def load_read(self, read_bytes): + """ + internal: read more image data + For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker + so libjpeg can finish decoding + """ + s = self.fp.read(read_bytes) + + if not s and ImageFile.LOAD_TRUNCATED_IMAGES: + # Premature EOF. + # Pretend file is finished adding EOI marker + return b"\xFF\xD9" + + return s + + def draft(self, mode, size): + + if len(self.tile) != 1: + return + + # Protect from second call + if self.decoderconfig: + return + + d, e, o, a = self.tile[0] + scale = 1 + original_size = self.size + + if a[0] == "RGB" and mode in ["L", "YCbCr"]: + self.mode = mode + a = mode, "" + + if size: + scale = min(self.size[0] // size[0], self.size[1] // size[1]) + for s in [8, 4, 2, 1]: + if scale >= s: + break + e = ( + e[0], + e[1], + (e[2] - e[0] + s - 1) // s + e[0], + (e[3] - e[1] + s - 1) // s + e[1], + ) + self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s) + scale = s + + self.tile = [(d, e, o, a)] + self.decoderconfig = (scale, 0) + + box = (0, 0, original_size[0] / scale, original_size[1] / scale) + return (self.mode, box) + + def load_djpeg(self): + + # ALTERNATIVE: handle JPEGs via the IJG command line utilities + + f, path = tempfile.mkstemp() + os.close(f) + if os.path.exists(self.filename): + subprocess.check_call(["djpeg", "-outfile", path, self.filename]) + else: + raise ValueError("Invalid Filename") + + try: + with Image.open(path) as _im: + _im.load() + self.im = _im.im + finally: + try: + os.unlink(path) + except OSError: + pass + + self.mode = self.im.mode + self._size = self.im.size + + self.tile = [] + + def _getexif(self): + return _getexif(self) + + def _getmp(self): + return _getmp(self) + + +def _fixup_dict(src_dict): + # Helper function for _getexif() + # returns a dict with any single item tuples/lists as individual values + exif = Image.Exif() + return exif._fixup_dict(src_dict) + + +def _getexif(self): + if "exif" not in self.info: + return None + return dict(self.getexif()) + + +def _getmp(self): + # Extract MP information. This method was inspired by the "highly + # experimental" _getexif version that's been in use for years now, + # itself based on the ImageFileDirectory class in the TIFF plug-in. + + # The MP record essentially consists of a TIFF file embedded in a JPEG + # application marker. + try: + data = self.info["mp"] + except KeyError: + return None + file_contents = io.BytesIO(data) + head = file_contents.read(8) + endianness = ">" if head[:4] == b"\x4d\x4d\x00\x2a" else "<" + # process dictionary + try: + info = TiffImagePlugin.ImageFileDirectory_v2(head) + file_contents.seek(info.next) + info.load(file_contents) + mp = dict(info) + except Exception as e: + raise SyntaxError("malformed MP Index (unreadable directory)") from e + # it's an error not to have a number of images + try: + quant = mp[0xB001] + except KeyError as e: + raise SyntaxError("malformed MP Index (no number of images)") from e + # get MP entries + mpentries = [] + try: + rawmpentries = mp[0xB002] + for entrynum in range(0, quant): + unpackedentry = struct.unpack_from( + "{}LLLHH".format(endianness), rawmpentries, entrynum * 16 + ) + labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2") + mpentry = dict(zip(labels, unpackedentry)) + mpentryattr = { + "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)), + "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)), + "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)), + "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27, + "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24, + "MPType": mpentry["Attribute"] & 0x00FFFFFF, + } + if mpentryattr["ImageDataFormat"] == 0: + mpentryattr["ImageDataFormat"] = "JPEG" + else: + raise SyntaxError("unsupported picture format in MPO") + mptypemap = { + 0x000000: "Undefined", + 0x010001: "Large Thumbnail (VGA Equivalent)", + 0x010002: "Large Thumbnail (Full HD Equivalent)", + 0x020001: "Multi-Frame Image (Panorama)", + 0x020002: "Multi-Frame Image: (Disparity)", + 0x020003: "Multi-Frame Image: (Multi-Angle)", + 0x030000: "Baseline MP Primary Image", + } + mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown") + mpentry["Attribute"] = mpentryattr + mpentries.append(mpentry) + mp[0xB002] = mpentries + except KeyError as e: + raise SyntaxError("malformed MP Index (bad MP Entry)") from e + # Next we should try and parse the individual image unique ID list; + # we don't because I've never seen this actually used in a real MPO + # file and so can't test it. + return mp + + +# -------------------------------------------------------------------- +# stuff to save JPEG files + +RAWMODE = { + "1": "L", + "L": "L", + "RGB": "RGB", + "RGBX": "RGB", + "CMYK": "CMYK;I", # assume adobe conventions + "YCbCr": "YCbCr", +} + +# fmt: off +zigzag_index = ( + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63, +) + +samplings = { + (1, 1, 1, 1, 1, 1): 0, + (2, 1, 1, 1, 1, 1): 1, + (2, 2, 1, 1, 1, 1): 2, +} +# fmt: on + + +def convert_dict_qtables(qtables): + qtables = [qtables[key] for key in range(len(qtables)) if key in qtables] + for idx, table in enumerate(qtables): + qtables[idx] = [table[i] for i in zigzag_index] + return qtables + + +def get_sampling(im): + # There's no subsampling when images have only 1 layer + # (grayscale images) or when they are CMYK (4 layers), + # so set subsampling to the default value. + # + # NOTE: currently Pillow can't encode JPEG to YCCK format. + # If YCCK support is added in the future, subsampling code will have + # to be updated (here and in JpegEncode.c) to deal with 4 layers. + if not hasattr(im, "layers") or im.layers in (1, 4): + return -1 + sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] + return samplings.get(sampling, -1) + + +def _save(im, fp, filename): + + try: + rawmode = RAWMODE[im.mode] + except KeyError as e: + raise OSError("cannot write mode %s as JPEG" % im.mode) from e + + info = im.encoderinfo + + dpi = [round(x) for x in info.get("dpi", (0, 0))] + + quality = info.get("quality", -1) + subsampling = info.get("subsampling", -1) + qtables = info.get("qtables") + + if quality == "keep": + quality = -1 + subsampling = "keep" + qtables = "keep" + elif quality in presets: + preset = presets[quality] + quality = -1 + subsampling = preset.get("subsampling", -1) + qtables = preset.get("quantization") + elif not isinstance(quality, int): + raise ValueError("Invalid quality setting") + else: + if subsampling in presets: + subsampling = presets[subsampling].get("subsampling", -1) + if isinstance(qtables, str) and qtables in presets: + qtables = presets[qtables].get("quantization") + + if subsampling == "4:4:4": + subsampling = 0 + elif subsampling == "4:2:2": + subsampling = 1 + elif subsampling == "4:2:0": + subsampling = 2 + elif subsampling == "4:1:1": + # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. + # Set 4:2:0 if someone is still using that value. + subsampling = 2 + elif subsampling == "keep": + if im.format != "JPEG": + raise ValueError("Cannot use 'keep' when original image is not a JPEG") + subsampling = get_sampling(im) + + def validate_qtables(qtables): + if qtables is None: + return qtables + if isinstance(qtables, str): + try: + lines = [ + int(num) + for line in qtables.splitlines() + for num in line.split("#", 1)[0].split() + ] + except ValueError as e: + raise ValueError("Invalid quantization table") from e + else: + qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] + if isinstance(qtables, (tuple, list, dict)): + if isinstance(qtables, dict): + qtables = convert_dict_qtables(qtables) + elif isinstance(qtables, tuple): + qtables = list(qtables) + if not (0 < len(qtables) < 5): + raise ValueError("None or too many quantization tables") + for idx, table in enumerate(qtables): + try: + if len(table) != 64: + raise TypeError + table = array.array("B", table) + except TypeError as e: + raise ValueError("Invalid quantization table") from e + else: + qtables[idx] = list(table) + return qtables + + if qtables == "keep": + if im.format != "JPEG": + raise ValueError("Cannot use 'keep' when original image is not a JPEG") + qtables = getattr(im, "quantization", None) + qtables = validate_qtables(qtables) + + extra = b"" + + icc_profile = info.get("icc_profile") + if icc_profile: + ICC_OVERHEAD_LEN = 14 + MAX_BYTES_IN_MARKER = 65533 + MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN + markers = [] + while icc_profile: + markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER]) + icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:] + i = 1 + for marker in markers: + size = struct.pack(">H", 2 + ICC_OVERHEAD_LEN + len(marker)) + extra += ( + b"\xFF\xE2" + + size + + b"ICC_PROFILE\0" + + o8(i) + + o8(len(markers)) + + marker + ) + i += 1 + + # "progressive" is the official name, but older documentation + # says "progression" + # FIXME: issue a warning if the wrong form is used (post-1.1.7) + progressive = info.get("progressive", False) or info.get("progression", False) + + optimize = info.get("optimize", False) + + exif = info.get("exif", b"") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + + # get keyword arguments + im.encoderconfig = ( + quality, + progressive, + info.get("smooth", 0), + optimize, + info.get("streamtype", 0), + dpi[0], + dpi[1], + subsampling, + qtables, + extra, + exif, + ) + + # if we optimize, libjpeg needs a buffer big enough to hold the whole image + # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is + # channels*size, this is a value that's been used in a django patch. + # https://github.com/matthewwithanm/django-imagekit/issues/50 + bufsize = 0 + if optimize or progressive: + # CMYK can be bigger + if im.mode == "CMYK": + bufsize = 4 * im.size[0] * im.size[1] + # keep sets quality to -1, but the actual value may be high. + elif quality >= 95 or quality == -1: + bufsize = 2 * im.size[0] * im.size[1] + else: + bufsize = im.size[0] * im.size[1] + + # The EXIF info needs to be written as one block, + APP1, + one spare byte. + # Ensure that our buffer is big enough. Same with the icc_profile block. + bufsize = max(ImageFile.MAXBLOCK, bufsize, len(exif) + 5, len(extra) + 1) + + ImageFile._save(im, fp, [("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize) + + +def _save_cjpeg(im, fp, filename): + # ALTERNATIVE: handle JPEGs via the IJG command line utilities. + tempfile = im._dump() + subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) + try: + os.unlink(tempfile) + except OSError: + pass + + +## +# Factory for making JPEG and MPO instances +def jpeg_factory(fp=None, filename=None): + im = JpegImageFile(fp, filename) + try: + mpheader = im._getmp() + if mpheader[45057] > 1: + # It's actually an MPO + from .MpoImagePlugin import MpoImageFile + + # Don't reload everything, just convert it. + im = MpoImageFile.adopt(im, mpheader) + except (TypeError, IndexError): + # It is really a JPEG + pass + except SyntaxError: + warnings.warn( + "Image appears to be a malformed MPO file, it will be " + "interpreted as a base JPEG file" + ) + return im + + +# --------------------------------------------------------------------- +# Registry stuff + +Image.register_open(JpegImageFile.format, jpeg_factory, _accept) +Image.register_save(JpegImageFile.format, _save) + +Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) + +Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/venv/Lib/site-packages/PIL/JpegPresets.py b/venv/Lib/site-packages/PIL/JpegPresets.py new file mode 100644 index 0000000..09691d7 --- /dev/null +++ b/venv/Lib/site-packages/PIL/JpegPresets.py @@ -0,0 +1,248 @@ +""" +JPEG quality settings equivalent to the Photoshop settings. +Can be used when saving JPEG files. + +The following presets are available by default: +``web_low``, ``web_medium``, ``web_high``, ``web_very_high``, ``web_maximum``, +``low``, ``medium``, ``high``, ``maximum``. +More presets can be added to the :py:data:`presets` dict if needed. + +To apply the preset, specify:: + + quality="preset_name" + +To apply only the quantization table:: + + qtables="preset_name" + +To apply only the subsampling setting:: + + subsampling="preset_name" + +Example:: + + im.save("image_name.jpg", quality="web_high") + +Subsampling +----------- + +Subsampling is the practice of encoding images by implementing less resolution +for chroma information than for luma information. +(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) + +Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and +4:2:0. + +You can get the subsampling of a JPEG with the +`JpegImagePlugin.get_sampling(im)` function. + +In JPEG compressed data a JPEG marker is used instead of an EXIF tag. +(ref.: https://www.exiv2.org/tags.html) + + +Quantization tables +------------------- + +They are values use by the DCT (Discrete cosine transform) to remove +*unnecessary* information from the image (the lossy part of the compression). +(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, +https://en.wikipedia.org/wiki/JPEG#Quantization) + +You can get the quantization tables of a JPEG with:: + + im.quantization + +This will return a dict with a number of arrays. You can pass this dict +directly as the qtables argument when saving a JPEG. + +The tables format between im.quantization and quantization in presets differ in +3 ways: + +1. The base container of the preset is a list with sublists instead of dict. + dict[0] -> list[0], dict[1] -> list[1], ... +2. Each table in a preset is a list instead of an array. +3. The zigzag order is remove in the preset (needed by libjpeg >= 6a). + +You can convert the dict format to the preset format with the +`JpegImagePlugin.convert_dict_qtables(dict_qtables)` function. + +Libjpeg ref.: +https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html + +""" + +# fmt: off +presets = { + 'web_low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [20, 16, 25, 39, 50, 46, 62, 68, + 16, 18, 23, 38, 38, 53, 65, 68, + 25, 23, 31, 38, 53, 65, 68, 68, + 39, 38, 38, 53, 65, 68, 68, 68, + 50, 38, 53, 65, 68, 68, 68, 68, + 46, 53, 65, 68, 68, 68, 68, 68, + 62, 65, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68], + [21, 25, 32, 38, 54, 68, 68, 68, + 25, 28, 24, 38, 54, 68, 68, 68, + 32, 24, 32, 43, 66, 68, 68, 68, + 38, 38, 43, 53, 68, 68, 68, 68, + 54, 54, 66, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68] + ]}, + 'web_medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [16, 11, 11, 16, 23, 27, 31, 30, + 11, 12, 12, 15, 20, 23, 23, 30, + 11, 12, 13, 16, 23, 26, 35, 47, + 16, 15, 16, 23, 26, 37, 47, 64, + 23, 20, 23, 26, 39, 51, 64, 64, + 27, 23, 26, 37, 51, 64, 64, 64, + 31, 23, 35, 47, 64, 64, 64, 64, + 30, 30, 47, 64, 64, 64, 64, 64], + [17, 15, 17, 21, 20, 26, 38, 48, + 15, 19, 18, 17, 20, 26, 35, 43, + 17, 18, 20, 22, 26, 30, 46, 53, + 21, 17, 22, 28, 30, 39, 53, 64, + 20, 20, 26, 30, 39, 48, 64, 64, + 26, 26, 30, 39, 48, 63, 64, 64, + 38, 35, 46, 53, 64, 64, 64, 64, + 48, 43, 53, 64, 64, 64, 64, 64] + ]}, + 'web_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 14, 19, + 6, 6, 6, 11, 12, 15, 19, 28, + 9, 8, 10, 12, 16, 20, 27, 31, + 11, 10, 12, 15, 20, 27, 31, 31, + 12, 12, 14, 19, 27, 31, 31, 31, + 16, 12, 19, 28, 31, 31, 31, 31], + [7, 7, 13, 24, 26, 31, 31, 31, + 7, 12, 16, 21, 31, 31, 31, 31, + 13, 16, 17, 31, 31, 31, 31, 31, + 24, 21, 31, 31, 31, 31, 31, 31, + 26, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31] + ]}, + 'web_very_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 11, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 11, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'web_maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 2, 2, 3, + 1, 1, 1, 1, 2, 2, 3, 3, + 1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 2, 2, 3, 3, 3, 3], + [1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 1, 2, 3, 3, 3, 3, + 1, 1, 1, 3, 3, 3, 3, 3, + 2, 2, 3, 3, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3] + ]}, + 'low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [18, 14, 14, 21, 30, 35, 34, 17, + 14, 16, 16, 19, 26, 23, 12, 12, + 14, 16, 17, 21, 23, 12, 12, 12, + 21, 19, 21, 23, 12, 12, 12, 12, + 30, 26, 23, 12, 12, 12, 12, 12, + 35, 23, 12, 12, 12, 12, 12, 12, + 34, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [20, 19, 22, 27, 20, 20, 17, 17, + 19, 25, 23, 14, 14, 12, 12, 12, + 22, 23, 14, 14, 12, 12, 12, 12, + 27, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [12, 8, 8, 12, 17, 21, 24, 17, + 8, 9, 9, 11, 15, 19, 12, 12, + 8, 9, 10, 12, 19, 12, 12, 12, + 12, 11, 12, 21, 12, 12, 12, 12, + 17, 15, 19, 12, 12, 12, 12, 12, + 21, 19, 12, 12, 12, 12, 12, 12, + 24, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [13, 11, 13, 16, 20, 20, 17, 17, + 11, 14, 14, 14, 14, 12, 12, 12, + 13, 14, 14, 14, 12, 12, 12, 12, + 16, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 12, 12, + 6, 6, 6, 11, 12, 12, 12, 12, + 9, 8, 10, 12, 12, 12, 12, 12, + 11, 10, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 16, 12, 12, 12, 12, 12, 12, 12], + [7, 7, 13, 24, 20, 20, 17, 17, + 7, 12, 16, 14, 14, 12, 12, 12, + 13, 16, 14, 14, 12, 12, 12, 12, + 24, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 10, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 10, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, +} +# fmt: on diff --git a/venv/Lib/site-packages/PIL/McIdasImagePlugin.py b/venv/Lib/site-packages/PIL/McIdasImagePlugin.py new file mode 100644 index 0000000..cd047fe --- /dev/null +++ b/venv/Lib/site-packages/PIL/McIdasImagePlugin.py @@ -0,0 +1,75 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Basic McIdas support for PIL +# +# History: +# 1997-05-05 fl Created (8-bit images only) +# 2009-03-08 fl Added 16/32-bit support. +# +# Thanks to Richard Jones and Craig Swank for specs and samples. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +import struct + +from . import Image, ImageFile + + +def _accept(s): + return s[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" + + +## +# Image plugin for McIdas area images. + + +class McIdasImageFile(ImageFile.ImageFile): + + format = "MCIDAS" + format_description = "McIdas area file" + + def _open(self): + + # parse area file directory + s = self.fp.read(256) + if not _accept(s) or len(s) != 256: + raise SyntaxError("not an McIdas area file") + + self.area_descriptor_raw = s + self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) + + # get mode + if w[11] == 1: + mode = rawmode = "L" + elif w[11] == 2: + # FIXME: add memory map support + mode = "I" + rawmode = "I;16B" + elif w[11] == 4: + # FIXME: add memory map support + mode = "I" + rawmode = "I;32B" + else: + raise SyntaxError("unsupported McIdas format") + + self.mode = mode + self._size = w[10], w[9] + + offset = w[34] + w[15] + stride = w[15] + w[10] * w[11] * w[14] + + self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))] + + +# -------------------------------------------------------------------- +# registry + +Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) + +# no default extension diff --git a/venv/Lib/site-packages/PIL/MicImagePlugin.py b/venv/Lib/site-packages/PIL/MicImagePlugin.py new file mode 100644 index 0000000..2aed260 --- /dev/null +++ b/venv/Lib/site-packages/PIL/MicImagePlugin.py @@ -0,0 +1,107 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Microsoft Image Composer support for PIL +# +# Notes: +# uses TiffImagePlugin.py to read the actual image streams +# +# History: +# 97-01-20 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + + +import olefile + +from . import Image, TiffImagePlugin + +# +# -------------------------------------------------------------------- + + +def _accept(prefix): + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for Microsoft's Image Composer file format. + + +class MicImageFile(TiffImagePlugin.TiffImageFile): + + format = "MIC" + format_description = "Microsoft Image Composer" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # read the OLE directory and see if this is a likely + # to be a Microsoft Image Composer file + + try: + self.ole = olefile.OleFileIO(self.fp) + except OSError as e: + raise SyntaxError("not an MIC file; invalid OLE file") from e + + # find ACI subfiles with Image members (maybe not the + # best way to identify MIC files, but what the... ;-) + + self.images = [] + for path in self.ole.listdir(): + if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image": + self.images.append(path) + + # if we didn't find any images, this is probably not + # an MIC file. + if not self.images: + raise SyntaxError("not an MIC file; no image entries") + + self.__fp = self.fp + self.frame = None + self._n_frames = len(self.images) + self.is_animated = self._n_frames > 1 + + if len(self.images) > 1: + self.category = Image.CONTAINER + + self.seek(0) + + def seek(self, frame): + if not self._seek_check(frame): + return + try: + filename = self.images[frame] + except IndexError as e: + raise EOFError("no such frame") from e + + self.fp = self.ole.openstream(filename) + + TiffImagePlugin.TiffImageFile._open(self) + + self.frame = frame + + def tell(self): + return self.frame + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + +# +# -------------------------------------------------------------------- + +Image.register_open(MicImageFile.format, MicImageFile, _accept) + +Image.register_extension(MicImageFile.format, ".mic") diff --git a/venv/Lib/site-packages/PIL/MpegImagePlugin.py b/venv/Lib/site-packages/PIL/MpegImagePlugin.py new file mode 100644 index 0000000..a358dfd --- /dev/null +++ b/venv/Lib/site-packages/PIL/MpegImagePlugin.py @@ -0,0 +1,83 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPEG file handling +# +# History: +# 95-09-09 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile +from ._binary import i8 + +# +# Bitstream parser + + +class BitStream: + def __init__(self, fp): + self.fp = fp + self.bits = 0 + self.bitbuffer = 0 + + def next(self): + return i8(self.fp.read(1)) + + def peek(self, bits): + while self.bits < bits: + c = self.next() + if c < 0: + self.bits = 0 + continue + self.bitbuffer = (self.bitbuffer << 8) + c + self.bits += 8 + return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 + + def skip(self, bits): + while self.bits < bits: + self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) + self.bits += 8 + self.bits = self.bits - bits + + def read(self, bits): + v = self.peek(bits) + self.bits = self.bits - bits + return v + + +## +# Image plugin for MPEG streams. This plugin can identify a stream, +# but it cannot read it. + + +class MpegImageFile(ImageFile.ImageFile): + + format = "MPEG" + format_description = "MPEG" + + def _open(self): + + s = BitStream(self.fp) + + if s.read(32) != 0x1B3: + raise SyntaxError("not an MPEG file") + + self.mode = "RGB" + self._size = s.read(12), s.read(12) + + +# -------------------------------------------------------------------- +# Registry stuff + +Image.register_open(MpegImageFile.format, MpegImageFile) + +Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) + +Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/venv/Lib/site-packages/PIL/MpoImagePlugin.py b/venv/Lib/site-packages/PIL/MpoImagePlugin.py new file mode 100644 index 0000000..575cc9c --- /dev/null +++ b/venv/Lib/site-packages/PIL/MpoImagePlugin.py @@ -0,0 +1,134 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPO file handling +# +# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the +# Camera & Imaging Products Association) +# +# The multi-picture object combines multiple JPEG images (with a modified EXIF +# data format) into a single file. While it can theoretically be used much like +# a GIF animation, it is commonly used to represent 3D photographs and is (as +# of this writing) the most commonly used format by 3D cameras. +# +# History: +# 2014-03-13 Feneric Created +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile, JpegImagePlugin +from ._binary import i16be as i16 + + +def _accept(prefix): + return JpegImagePlugin._accept(prefix) + + +def _save(im, fp, filename): + # Note that we can only save the current frame at present + return JpegImagePlugin._save(im, fp, filename) + + +## +# Image plugin for MPO images. + + +class MpoImageFile(JpegImagePlugin.JpegImageFile): + + format = "MPO" + format_description = "MPO (CIPA DC-007)" + _close_exclusive_fp_after_loading = False + + def _open(self): + self.fp.seek(0) # prep the fp in order to pass the JPEG test + JpegImagePlugin.JpegImageFile._open(self) + self._after_jpeg_open() + + def _after_jpeg_open(self, mpheader=None): + self.mpinfo = mpheader if mpheader is not None else self._getmp() + self.n_frames = self.mpinfo[0xB001] + self.__mpoffsets = [ + mpent["DataOffset"] + self.info["mpoffset"] for mpent in self.mpinfo[0xB002] + ] + self.__mpoffsets[0] = 0 + # Note that the following assertion will only be invalid if something + # gets broken within JpegImagePlugin. + assert self.n_frames == len(self.__mpoffsets) + del self.info["mpoffset"] # no longer needed + self.is_animated = self.n_frames > 1 + self.__fp = self.fp # FIXME: hack + self.__fp.seek(self.__mpoffsets[0]) # get ready to read first frame + self.__frame = 0 + self.offset = 0 + # for now we can only handle reading and individual frame extraction + self.readonly = 1 + + def load_seek(self, pos): + self.__fp.seek(pos) + + def seek(self, frame): + if not self._seek_check(frame): + return + self.fp = self.__fp + self.offset = self.__mpoffsets[frame] + + self.fp.seek(self.offset + 2) # skip SOI marker + segment = self.fp.read(2) + if not segment: + raise ValueError("No data found for frame") + if i16(segment) == 0xFFE1: # APP1 + n = i16(self.fp.read(2)) - 2 + self.info["exif"] = ImageFile._safe_read(self.fp, n) + + exif = self.getexif() + if 40962 in exif and 40963 in exif: + self._size = (exif[40962], exif[40963]) + elif "exif" in self.info: + del self.info["exif"] + + self.tile = [("jpeg", (0, 0) + self.size, self.offset, (self.mode, ""))] + self.__frame = frame + + def tell(self): + return self.__frame + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + @staticmethod + def adopt(jpeg_instance, mpheader=None): + """ + Transform the instance of JpegImageFile into + an instance of MpoImageFile. + After the call, the JpegImageFile is extended + to be an MpoImageFile. + + This is essentially useful when opening a JPEG + file that reveals itself as an MPO, to avoid + double call to _open. + """ + jpeg_instance.__class__ = MpoImageFile + jpeg_instance._after_jpeg_open(mpheader) + return jpeg_instance + + +# --------------------------------------------------------------------- +# Registry stuff + +# Note that since MPO shares a factory with JPEG, we do not need to do a +# separate registration for it here. +# Image.register_open(MpoImageFile.format, +# JpegImagePlugin.jpeg_factory, _accept) +Image.register_save(MpoImageFile.format, _save) + +Image.register_extension(MpoImageFile.format, ".mpo") + +Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/venv/Lib/site-packages/PIL/MspImagePlugin.py b/venv/Lib/site-packages/PIL/MspImagePlugin.py new file mode 100644 index 0000000..ca95721 --- /dev/null +++ b/venv/Lib/site-packages/PIL/MspImagePlugin.py @@ -0,0 +1,193 @@ +# +# The Python Imaging Library. +# +# MSP file handling +# +# This is the format used by the Paint program in Windows 1 and 2. +# +# History: +# 95-09-05 fl Created +# 97-01-03 fl Read/write MSP images +# 17-02-21 es Fixed RLE interpretation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-97. +# Copyright (c) Eric Soroos 2017. +# +# See the README file for information on usage and redistribution. +# +# More info on this format: https://archive.org/details/gg243631 +# Page 313: +# Figure 205. Windows Paint Version 1: "DanM" Format +# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 +# +# See also: http://www.fileformat.info/format/mspaint/egff.htm + +import io +import struct + +from . import Image, ImageFile +from ._binary import i8, i16le as i16, o16le as o16 + +# +# read MSP files + + +def _accept(prefix): + return prefix[:4] in [b"DanM", b"LinS"] + + +## +# Image plugin for Windows MSP images. This plugin supports both +# uncompressed (Windows 1.0). + + +class MspImageFile(ImageFile.ImageFile): + + format = "MSP" + format_description = "Windows Paint" + + def _open(self): + + # Header + s = self.fp.read(32) + if not _accept(s): + raise SyntaxError("not an MSP file") + + # Header checksum + checksum = 0 + for i in range(0, 32, 2): + checksum = checksum ^ i16(s[i : i + 2]) + if checksum != 0: + raise SyntaxError("bad MSP checksum") + + self.mode = "1" + self._size = i16(s[4:]), i16(s[6:]) + + if s[:4] == b"DanM": + self.tile = [("raw", (0, 0) + self.size, 32, ("1", 0, 1))] + else: + self.tile = [("MSP", (0, 0) + self.size, 32, None)] + + +class MspDecoder(ImageFile.PyDecoder): + # The algo for the MSP decoder is from + # http://www.fileformat.info/format/mspaint/egff.htm + # cc-by-attribution -- That page references is taken from the + # Encyclopedia of Graphics File Formats and is licensed by + # O'Reilly under the Creative Common/Attribution license + # + # For RLE encoded files, the 32byte header is followed by a scan + # line map, encoded as one 16bit word of encoded byte length per + # line. + # + # NOTE: the encoded length of the line can be 0. This was not + # handled in the previous version of this encoder, and there's no + # mention of how to handle it in the documentation. From the few + # examples I've seen, I've assumed that it is a fill of the + # background color, in this case, white. + # + # + # Pseudocode of the decoder: + # Read a BYTE value as the RunType + # If the RunType value is zero + # Read next byte as the RunCount + # Read the next byte as the RunValue + # Write the RunValue byte RunCount times + # If the RunType value is non-zero + # Use this value as the RunCount + # Read and write the next RunCount bytes literally + # + # e.g.: + # 0x00 03 ff 05 00 01 02 03 04 + # would yield the bytes: + # 0xff ff ff 00 01 02 03 04 + # + # which are then interpreted as a bit packed mode '1' image + + _pulls_fd = True + + def decode(self, buffer): + + img = io.BytesIO() + blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) + try: + self.fd.seek(32) + rowmap = struct.unpack_from( + "<%dH" % (self.state.ysize), self.fd.read(self.state.ysize * 2) + ) + except struct.error as e: + raise OSError("Truncated MSP file in row map") from e + + for x, rowlen in enumerate(rowmap): + try: + if rowlen == 0: + img.write(blank_line) + continue + row = self.fd.read(rowlen) + if len(row) != rowlen: + raise OSError( + "Truncated MSP file, expected %d bytes on row %s", (rowlen, x) + ) + idx = 0 + while idx < rowlen: + runtype = i8(row[idx]) + idx += 1 + if runtype == 0: + (runcount, runval) = struct.unpack_from("Bc", row, idx) + img.write(runval * runcount) + idx += 2 + else: + runcount = runtype + img.write(row[idx : idx + runcount]) + idx += runcount + + except struct.error as e: + raise OSError("Corrupted MSP file in row %d" % x) from e + + self.set_as_raw(img.getvalue(), ("1", 0, 1)) + + return 0, 0 + + +Image.register_decoder("MSP", MspDecoder) + + +# +# write MSP files (uncompressed only) + + +def _save(im, fp, filename): + + if im.mode != "1": + raise OSError("cannot write mode %s as MSP" % im.mode) + + # create MSP header + header = [0] * 16 + + header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 + header[2], header[3] = im.size + header[4], header[5] = 1, 1 + header[6], header[7] = 1, 1 + header[8], header[9] = im.size + + checksum = 0 + for h in header: + checksum = checksum ^ h + header[12] = checksum # FIXME: is this the right field? + + # header + for h in header: + fp.write(o16(h)) + + # image body + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 32, ("1", 0, 1))]) + + +# +# registry + +Image.register_open(MspImageFile.format, MspImageFile, _accept) +Image.register_save(MspImageFile.format, _save) + +Image.register_extension(MspImageFile.format, ".msp") diff --git a/venv/Lib/site-packages/PIL/PSDraw.py b/venv/Lib/site-packages/PIL/PSDraw.py new file mode 100644 index 0000000..762d31e --- /dev/null +++ b/venv/Lib/site-packages/PIL/PSDraw.py @@ -0,0 +1,237 @@ +# +# The Python Imaging Library +# $Id$ +# +# simple postscript graphics interface +# +# History: +# 1996-04-20 fl Created +# 1999-01-10 fl Added gsave/grestore to image method +# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) +# +# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +import sys + +from . import EpsImagePlugin + +## +# Simple Postscript graphics interface. + + +class PSDraw: + """ + Sets up printing to the given file. If **fp** is omitted, + :py:attr:`sys.stdout` is assumed. + """ + + def __init__(self, fp=None): + if not fp: + fp = sys.stdout + self.fp = fp + + def _fp_write(self, to_write): + if self.fp == sys.stdout: + self.fp.write(to_write) + else: + self.fp.write(bytes(to_write, "UTF-8")) + + def begin_document(self, id=None): + """Set up printing of a document. (Write Postscript DSC header.)""" + # FIXME: incomplete + self._fp_write( + "%!PS-Adobe-3.0\n" + "save\n" + "/showpage { } def\n" + "%%EndComments\n" + "%%BeginDocument\n" + ) + # self._fp_write(ERROR_PS) # debugging! + self._fp_write(EDROFF_PS) + self._fp_write(VDI_PS) + self._fp_write("%%EndProlog\n") + self.isofont = {} + + def end_document(self): + """Ends printing. (Write Postscript DSC footer.)""" + self._fp_write("%%EndDocument\nrestore showpage\n%%End\n") + if hasattr(self.fp, "flush"): + self.fp.flush() + + def setfont(self, font, size): + """ + Selects which font to use. + + :param font: A Postscript font name + :param size: Size in points. + """ + if font not in self.isofont: + # reencode font + self._fp_write("/PSDraw-{} ISOLatin1Encoding /{} E\n".format(font, font)) + self.isofont[font] = 1 + # rough + self._fp_write("/F0 %d /PSDraw-%s F\n" % (size, font)) + + def line(self, xy0, xy1): + """ + Draws a line between the two points. Coordinates are given in + Postscript point coordinates (72 points per inch, (0, 0) is the lower + left corner of the page). + """ + xy = xy0 + xy1 + self._fp_write("%d %d %d %d Vl\n" % xy) + + def rectangle(self, box): + """ + Draws a rectangle. + + :param box: A 4-tuple of integers whose order and function is currently + undocumented. + + Hint: the tuple is passed into this format string: + + .. code-block:: python + + %d %d M %d %d 0 Vr\n + """ + self._fp_write("%d %d M %d %d 0 Vr\n" % box) + + def text(self, xy, text): + """ + Draws text at the given position. You must use + :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. + """ + text = "\\(".join(text.split("(")) + text = "\\)".join(text.split(")")) + xy = xy + (text,) + self._fp_write("%d %d M (%s) S\n" % xy) + + def image(self, box, im, dpi=None): + """Draw a PIL image, centered in the given box.""" + # default resolution depends on mode + if not dpi: + if im.mode == "1": + dpi = 200 # fax + else: + dpi = 100 # greyscale + # image size (on paper) + x = im.size[0] * 72 / dpi + y = im.size[1] * 72 / dpi + # max allowed size + xmax = float(box[2] - box[0]) + ymax = float(box[3] - box[1]) + if x > xmax: + y = y * xmax / x + x = xmax + if y > ymax: + x = x * ymax / y + y = ymax + dx = (xmax - x) / 2 + box[0] + dy = (ymax - y) / 2 + box[1] + self._fp_write("gsave\n{:f} {:f} translate\n".format(dx, dy)) + if (x, y) != im.size: + # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) + sx = x / im.size[0] + sy = y / im.size[1] + self._fp_write("{:f} {:f} scale\n".format(sx, sy)) + EpsImagePlugin._save(im, self.fp, None, 0) + self._fp_write("\ngrestore\n") + + +# -------------------------------------------------------------------- +# Postscript driver + +# +# EDROFF.PS -- Postscript driver for Edroff 2 +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + + +EDROFF_PS = """\ +/S { show } bind def +/P { moveto show } bind def +/M { moveto } bind def +/X { 0 rmoveto } bind def +/Y { 0 exch rmoveto } bind def +/E { findfont + dup maxlength dict begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + /Encoding exch def + dup /FontName exch def + currentdict end definefont pop +} bind def +/F { findfont exch scalefont dup setfont + [ exch /setfont cvx ] cvx bind def +} bind def +""" + +# +# VDI.PS -- Postscript driver for VDI meta commands +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + +VDI_PS = """\ +/Vm { moveto } bind def +/Va { newpath arcn stroke } bind def +/Vl { moveto lineto stroke } bind def +/Vc { newpath 0 360 arc closepath } bind def +/Vr { exch dup 0 rlineto + exch dup neg 0 exch rlineto + exch neg 0 rlineto + 0 exch rlineto + 100 div setgray fill 0 setgray } bind def +/Tm matrix def +/Ve { Tm currentmatrix pop + translate scale newpath 0 0 .5 0 360 arc closepath + Tm setmatrix +} bind def +/Vf { currentgray exch setgray fill setgray } bind def +""" + +# +# ERROR.PS -- Error handler +# +# History: +# 89-11-21 fl: created (pslist 1.10) +# + +ERROR_PS = """\ +/landscape false def +/errorBUF 200 string def +/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def +errordict begin /handleerror { + initmatrix /Courier findfont 10 scalefont setfont + newpath 72 720 moveto $error begin /newerror false def + (PostScript Error) show errorNL errorNL + (Error: ) show + /errorname load errorBUF cvs show errorNL errorNL + (Command: ) show + /command load dup type /stringtype ne { errorBUF cvs } if show + errorNL errorNL + (VMstatus: ) show + vmstatus errorBUF cvs show ( bytes available, ) show + errorBUF cvs show ( bytes used at level ) show + errorBUF cvs show errorNL errorNL + (Operand stargck: ) show errorNL /ostargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall errorNL + (Execution stargck: ) show errorNL /estargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall + end showpage +} def end +""" diff --git a/venv/Lib/site-packages/PIL/PaletteFile.py b/venv/Lib/site-packages/PIL/PaletteFile.py new file mode 100644 index 0000000..6ccaa1f --- /dev/null +++ b/venv/Lib/site-packages/PIL/PaletteFile.py @@ -0,0 +1,53 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read simple, teragon-style palette files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from ._binary import o8 + + +class PaletteFile: + """File handler for Teragon-style palette files.""" + + rawmode = "RGB" + + def __init__(self, fp): + + self.palette = [(i, i, i) for i in range(256)] + + while True: + + s = fp.readline() + + if not s: + break + if s[0:1] == b"#": + continue + if len(s) > 100: + raise SyntaxError("bad palette file") + + v = [int(x) for x in s.split()] + try: + [i, r, g, b] = v + except ValueError: + [i, r] = v + g = b = r + + if 0 <= i <= 255: + self.palette[i] = o8(r) + o8(g) + o8(b) + + self.palette = b"".join(self.palette) + + def getpalette(self): + + return self.palette, self.rawmode diff --git a/venv/Lib/site-packages/PIL/PalmImagePlugin.py b/venv/Lib/site-packages/PIL/PalmImagePlugin.py new file mode 100644 index 0000000..9fc55d7 --- /dev/null +++ b/venv/Lib/site-packages/PIL/PalmImagePlugin.py @@ -0,0 +1,226 @@ +# +# The Python Imaging Library. +# $Id$ +# + +## +# Image plugin for Palm pixmap images (output only). +## + +from . import Image, ImageFile +from ._binary import o8, o16be as o16b + +# fmt: off +_Palm8BitColormapValues = ( + (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), + (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), + (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), + (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), + (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), + (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), + (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), + (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), + (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), + (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), + (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), + (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), + (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), + (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), + (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), + (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), + (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), + (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), + (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), + (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), + (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), + (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), + (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), + (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), + (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), + (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), + (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), + (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), + (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), + (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), + (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), + (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), + (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), + (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), + (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), + (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), + (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), + (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), + (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), + (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), + (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), + (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), + (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), + (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), + (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), + (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), + (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), + (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), + (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), + (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), + (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), + (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), + (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), + (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), + (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), + (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), + (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), + (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)) +# fmt: on + + +# so build a prototype image to be used for palette resampling +def build_prototype_image(): + image = Image.new("L", (1, len(_Palm8BitColormapValues))) + image.putdata(list(range(len(_Palm8BitColormapValues)))) + palettedata = () + for colormapValue in _Palm8BitColormapValues: + palettedata += colormapValue + palettedata += (0, 0, 0) * (256 - len(_Palm8BitColormapValues)) + image.putpalette(palettedata) + return image + + +Palm8BitColormapImage = build_prototype_image() + +# OK, we now have in Palm8BitColormapImage, +# a "P"-mode image with the right palette +# +# -------------------------------------------------------------------- + +_FLAGS = {"custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000} + +_COMPRESSION_TYPES = {"none": 0xFF, "rle": 0x01, "scanline": 0x00} + + +# +# -------------------------------------------------------------------- + +## +# (Internal) Image save plugin for the Palm format. + + +def _save(im, fp, filename): + + if im.mode == "P": + + # we assume this is a color Palm image with the standard colormap, + # unless the "info" dict has a "custom-colormap" field + + rawmode = "P" + bpp = 8 + version = 1 + + elif im.mode == "L": + if im.encoderinfo.get("bpp") in (1, 2, 4): + # this is 8-bit grayscale, so we shift it to get the high-order bits, + # and invert it because + # Palm does greyscale from white (0) to black (1) + bpp = im.encoderinfo["bpp"] + im = im.point( + lambda x, shift=8 - bpp, maxval=(1 << bpp) - 1: maxval - (x >> shift) + ) + elif im.info.get("bpp") in (1, 2, 4): + # here we assume that even though the inherent mode is 8-bit grayscale, + # only the lower bpp bits are significant. + # We invert them to match the Palm. + bpp = im.info["bpp"] + im = im.point(lambda x, maxval=(1 << bpp) - 1: maxval - (x & maxval)) + else: + raise OSError("cannot write mode %s as Palm" % im.mode) + + # we ignore the palette here + im.mode = "P" + rawmode = "P;" + str(bpp) + version = 1 + + elif im.mode == "1": + + # monochrome -- write it inverted, as is the Palm standard + rawmode = "1;I" + bpp = 1 + version = 0 + + else: + + raise OSError("cannot write mode %s as Palm" % im.mode) + + # + # make sure image data is available + im.load() + + # write header + + cols = im.size[0] + rows = im.size[1] + + rowbytes = int((cols + (16 // bpp - 1)) / (16 // bpp)) * 2 + transparent_index = 0 + compression_type = _COMPRESSION_TYPES["none"] + + flags = 0 + if im.mode == "P" and "custom-colormap" in im.info: + flags = flags & _FLAGS["custom-colormap"] + colormapsize = 4 * 256 + 2 + colormapmode = im.palette.mode + colormap = im.getdata().getpalette() + else: + colormapsize = 0 + + if "offset" in im.info: + offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 + else: + offset = 0 + + fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) + fp.write(o8(bpp)) + fp.write(o8(version)) + fp.write(o16b(offset)) + fp.write(o8(transparent_index)) + fp.write(o8(compression_type)) + fp.write(o16b(0)) # reserved by Palm + + # now write colormap if necessary + + if colormapsize > 0: + fp.write(o16b(256)) + for i in range(256): + fp.write(o8(i)) + if colormapmode == "RGB": + fp.write( + o8(colormap[3 * i]) + + o8(colormap[3 * i + 1]) + + o8(colormap[3 * i + 2]) + ) + elif colormapmode == "RGBA": + fp.write( + o8(colormap[4 * i]) + + o8(colormap[4 * i + 1]) + + o8(colormap[4 * i + 2]) + ) + + # now convert data to raw form + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, rowbytes, 1))]) + + if hasattr(fp, "flush"): + fp.flush() + + +# +# -------------------------------------------------------------------- + +Image.register_save("Palm", _save) + +Image.register_extension("Palm", ".palm") + +Image.register_mime("Palm", "image/palm") diff --git a/venv/Lib/site-packages/PIL/PcdImagePlugin.py b/venv/Lib/site-packages/PIL/PcdImagePlugin.py new file mode 100644 index 0000000..625f556 --- /dev/null +++ b/venv/Lib/site-packages/PIL/PcdImagePlugin.py @@ -0,0 +1,64 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCD file handling +# +# History: +# 96-05-10 fl Created +# 96-05-27 fl Added draft mode (128x192, 256x384) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile +from ._binary import i8 + +## +# Image plugin for PhotoCD images. This plugin only reads the 768x512 +# image from the file; higher resolutions are encoded in a proprietary +# encoding. + + +class PcdImageFile(ImageFile.ImageFile): + + format = "PCD" + format_description = "Kodak PhotoCD" + + def _open(self): + + # rough + self.fp.seek(2048) + s = self.fp.read(2048) + + if s[:4] != b"PCD_": + raise SyntaxError("not a PCD file") + + orientation = i8(s[1538]) & 3 + self.tile_post_rotate = None + if orientation == 1: + self.tile_post_rotate = 90 + elif orientation == 3: + self.tile_post_rotate = -90 + + self.mode = "RGB" + self._size = 768, 512 # FIXME: not correct for rotated images! + self.tile = [("pcd", (0, 0) + self.size, 96 * 2048, None)] + + def load_end(self): + if self.tile_post_rotate: + # Handle rotated PCDs + self.im = self.im.rotate(self.tile_post_rotate) + self._size = self.im.size + + +# +# registry + +Image.register_open(PcdImageFile.format, PcdImageFile) + +Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/venv/Lib/site-packages/PIL/PcfFontFile.py b/venv/Lib/site-packages/PIL/PcfFontFile.py new file mode 100644 index 0000000..f8836ad --- /dev/null +++ b/venv/Lib/site-packages/PIL/PcfFontFile.py @@ -0,0 +1,244 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library +# $Id$ +# +# portable compiled font file parser +# +# history: +# 1997-08-19 fl created +# 2003-09-13 fl fixed loading of unicode fonts +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +import io + +from . import FontFile, Image +from ._binary import i8, i16be as b16, i16le as l16, i32be as b32, i32le as l32 + +# -------------------------------------------------------------------- +# declarations + +PCF_MAGIC = 0x70636601 # "\x01fcp" + +PCF_PROPERTIES = 1 << 0 +PCF_ACCELERATORS = 1 << 1 +PCF_METRICS = 1 << 2 +PCF_BITMAPS = 1 << 3 +PCF_INK_METRICS = 1 << 4 +PCF_BDF_ENCODINGS = 1 << 5 +PCF_SWIDTHS = 1 << 6 +PCF_GLYPH_NAMES = 1 << 7 +PCF_BDF_ACCELERATORS = 1 << 8 + +BYTES_PER_ROW = [ + lambda bits: ((bits + 7) >> 3), + lambda bits: ((bits + 15) >> 3) & ~1, + lambda bits: ((bits + 31) >> 3) & ~3, + lambda bits: ((bits + 63) >> 3) & ~7, +] + + +def sz(s, o): + return s[o : s.index(b"\0", o)] + + +class PcfFontFile(FontFile.FontFile): + """Font file plugin for the X11 PCF format.""" + + name = "name" + + def __init__(self, fp, charset_encoding="iso8859-1"): + + self.charset_encoding = charset_encoding + + magic = l32(fp.read(4)) + if magic != PCF_MAGIC: + raise SyntaxError("not a PCF file") + + super().__init__() + + count = l32(fp.read(4)) + self.toc = {} + for i in range(count): + type = l32(fp.read(4)) + self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) + + self.fp = fp + + self.info = self._load_properties() + + metrics = self._load_metrics() + bitmaps = self._load_bitmaps(metrics) + encoding = self._load_encoding() + + # + # create glyph structure + + for ch in range(256): + ix = encoding[ch] + if ix is not None: + x, y, l, r, w, a, d, f = metrics[ix] + glyph = (w, 0), (l, d - y, x + l, d), (0, 0, x, y), bitmaps[ix] + self.glyph[ch] = glyph + + def _getformat(self, tag): + + format, size, offset = self.toc[tag] + + fp = self.fp + fp.seek(offset) + + format = l32(fp.read(4)) + + if format & 4: + i16, i32 = b16, b32 + else: + i16, i32 = l16, l32 + + return fp, format, i16, i32 + + def _load_properties(self): + + # + # font properties + + properties = {} + + fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) + + nprops = i32(fp.read(4)) + + # read property description + p = [] + for i in range(nprops): + p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4)))) + if nprops & 3: + fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad + + data = fp.read(i32(fp.read(4))) + + for k, s, v in p: + k = sz(data, k) + if s: + v = sz(data, v) + properties[k] = v + + return properties + + def _load_metrics(self): + + # + # font metrics + + metrics = [] + + fp, format, i16, i32 = self._getformat(PCF_METRICS) + + append = metrics.append + + if (format & 0xFF00) == 0x100: + + # "compressed" metrics + for i in range(i16(fp.read(2))): + left = i8(fp.read(1)) - 128 + right = i8(fp.read(1)) - 128 + width = i8(fp.read(1)) - 128 + ascent = i8(fp.read(1)) - 128 + descent = i8(fp.read(1)) - 128 + xsize = right - left + ysize = ascent + descent + append((xsize, ysize, left, right, width, ascent, descent, 0)) + + else: + + # "jumbo" metrics + for i in range(i32(fp.read(4))): + left = i16(fp.read(2)) + right = i16(fp.read(2)) + width = i16(fp.read(2)) + ascent = i16(fp.read(2)) + descent = i16(fp.read(2)) + attributes = i16(fp.read(2)) + xsize = right - left + ysize = ascent + descent + append((xsize, ysize, left, right, width, ascent, descent, attributes)) + + return metrics + + def _load_bitmaps(self, metrics): + + # + # bitmap data + + bitmaps = [] + + fp, format, i16, i32 = self._getformat(PCF_BITMAPS) + + nbitmaps = i32(fp.read(4)) + + if nbitmaps != len(metrics): + raise OSError("Wrong number of bitmaps") + + offsets = [] + for i in range(nbitmaps): + offsets.append(i32(fp.read(4))) + + bitmapSizes = [] + for i in range(4): + bitmapSizes.append(i32(fp.read(4))) + + # byteorder = format & 4 # non-zero => MSB + bitorder = format & 8 # non-zero => MSB + padindex = format & 3 + + bitmapsize = bitmapSizes[padindex] + offsets.append(bitmapsize) + + data = fp.read(bitmapsize) + + pad = BYTES_PER_ROW[padindex] + mode = "1;R" + if bitorder: + mode = "1" + + for i in range(nbitmaps): + x, y, l, r, w, a, d, f = metrics[i] + b, e = offsets[i], offsets[i + 1] + bitmaps.append(Image.frombytes("1", (x, y), data[b:e], "raw", mode, pad(x))) + + return bitmaps + + def _load_encoding(self): + + # map character code to bitmap index + encoding = [None] * 256 + + fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) + + firstCol, lastCol = i16(fp.read(2)), i16(fp.read(2)) + firstRow, lastRow = i16(fp.read(2)), i16(fp.read(2)) + + i16(fp.read(2)) # default + + nencoding = (lastCol - firstCol + 1) * (lastRow - firstRow + 1) + + encodingOffsets = [i16(fp.read(2)) for _ in range(nencoding)] + + for i in range(firstCol, len(encoding)): + try: + encodingOffset = encodingOffsets[ + ord(bytearray([i]).decode(self.charset_encoding)) + ] + if encodingOffset != 0xFFFF: + encoding[i] = encodingOffset + except UnicodeDecodeError: + # character is not supported in selected encoding + pass + + return encoding diff --git a/venv/Lib/site-packages/PIL/PcxImagePlugin.py b/venv/Lib/site-packages/PIL/PcxImagePlugin.py new file mode 100644 index 0000000..f7ae3bf --- /dev/null +++ b/venv/Lib/site-packages/PIL/PcxImagePlugin.py @@ -0,0 +1,206 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCX file handling +# +# This format was originally used by ZSoft's popular PaintBrush +# program for the IBM PC. It is also supported by many MS-DOS and +# Windows applications, including the Windows PaintBrush program in +# Windows 3. +# +# history: +# 1995-09-01 fl Created +# 1996-05-20 fl Fixed RGB support +# 1997-01-03 fl Fixed 2-bit and 4-bit support +# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) +# 1999-02-07 fl Added write support +# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust +# 2002-07-30 fl Seek from to current position, not beginning of file +# 2003-06-03 fl Extract DPI settings (info["dpi"]) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +import io +import logging + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, o8, o16le as o16 + +logger = logging.getLogger(__name__) + + +def _accept(prefix): + return i8(prefix[0]) == 10 and i8(prefix[1]) in [0, 2, 3, 5] + + +## +# Image plugin for Paintbrush images. + + +class PcxImageFile(ImageFile.ImageFile): + + format = "PCX" + format_description = "Paintbrush" + + def _open(self): + + # header + s = self.fp.read(128) + if not _accept(s): + raise SyntaxError("not a PCX file") + + # image + bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1 + if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: + raise SyntaxError("bad PCX image size") + logger.debug("BBox: %s %s %s %s", *bbox) + + # format + version = i8(s[1]) + bits = i8(s[3]) + planes = i8(s[65]) + stride = i16(s, 66) + logger.debug( + "PCX version %s, bits %s, planes %s, stride %s", + version, + bits, + planes, + stride, + ) + + self.info["dpi"] = i16(s, 12), i16(s, 14) + + if bits == 1 and planes == 1: + mode = rawmode = "1" + + elif bits == 1 and planes in (2, 4): + mode = "P" + rawmode = "P;%dL" % planes + self.palette = ImagePalette.raw("RGB", s[16:64]) + + elif version == 5 and bits == 8 and planes == 1: + mode = rawmode = "L" + # FIXME: hey, this doesn't work with the incremental loader !!! + self.fp.seek(-769, io.SEEK_END) + s = self.fp.read(769) + if len(s) == 769 and i8(s[0]) == 12: + # check if the palette is linear greyscale + for i in range(256): + if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: + mode = rawmode = "P" + break + if mode == "P": + self.palette = ImagePalette.raw("RGB", s[1:]) + self.fp.seek(128) + + elif version == 5 and bits == 8 and planes == 3: + mode = "RGB" + rawmode = "RGB;L" + + else: + raise OSError("unknown PCX mode") + + self.mode = mode + self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] + + bbox = (0, 0) + self.size + logger.debug("size: %sx%s", *self.size) + + self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))] + + +# -------------------------------------------------------------------- +# save PCX files + + +SAVE = { + # mode: (version, bits, planes, raw mode) + "1": (2, 1, 1, "1"), + "L": (5, 8, 1, "L"), + "P": (5, 8, 1, "P"), + "RGB": (5, 8, 3, "RGB;L"), +} + + +def _save(im, fp, filename): + + try: + version, bits, planes, rawmode = SAVE[im.mode] + except KeyError as e: + raise ValueError("Cannot save %s images as PCX" % im.mode) from e + + # bytes per plane + stride = (im.size[0] * bits + 7) // 8 + # stride should be even + stride += stride % 2 + # Stride needs to be kept in sync with the PcxEncode.c version. + # Ideally it should be passed in in the state, but the bytes value + # gets overwritten. + + logger.debug( + "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", + im.size[0], + bits, + stride, + ) + + # under windows, we could determine the current screen size with + # "Image.core.display_mode()[1]", but I think that's overkill... + + screen = im.size + + dpi = 100, 100 + + # PCX header + fp.write( + o8(10) + + o8(version) + + o8(1) + + o8(bits) + + o16(0) + + o16(0) + + o16(im.size[0] - 1) + + o16(im.size[1] - 1) + + o16(dpi[0]) + + o16(dpi[1]) + + b"\0" * 24 + + b"\xFF" * 24 + + b"\0" + + o8(planes) + + o16(stride) + + o16(1) + + o16(screen[0]) + + o16(screen[1]) + + b"\0" * 54 + ) + + assert fp.tell() == 128 + + ImageFile._save(im, fp, [("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))]) + + if im.mode == "P": + # colour palette + fp.write(o8(12)) + fp.write(im.im.getpalette("RGB", "RGB")) # 768 bytes + elif im.mode == "L": + # greyscale palette + fp.write(o8(12)) + for i in range(256): + fp.write(o8(i) * 3) + + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PcxImageFile.format, PcxImageFile, _accept) +Image.register_save(PcxImageFile.format, _save) + +Image.register_extension(PcxImageFile.format, ".pcx") + +Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/venv/Lib/site-packages/PIL/PdfImagePlugin.py b/venv/Lib/site-packages/PIL/PdfImagePlugin.py new file mode 100644 index 0000000..47500ba --- /dev/null +++ b/venv/Lib/site-packages/PIL/PdfImagePlugin.py @@ -0,0 +1,243 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PDF (Acrobat) file handling +# +# History: +# 1996-07-16 fl Created +# 1997-01-18 fl Fixed header +# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. +# 2004-02-24 fl Fixes for 1 and P images. +# +# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996-1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## +# Image plugin for PDF images (output only). +## + +import io +import os +import time + +from . import Image, ImageFile, ImageSequence, PdfParser, __version__ + +# +# -------------------------------------------------------------------- + +# object ids: +# 1. catalogue +# 2. pages +# 3. image +# 4. page +# 5. page contents + + +def _save_all(im, fp, filename): + _save(im, fp, filename, save_all=True) + + +## +# (Internal) Image save plugin for the PDF format. + + +def _save(im, fp, filename, save_all=False): + is_appending = im.encoderinfo.get("append", False) + if is_appending: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b") + else: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b") + + resolution = im.encoderinfo.get("resolution", 72.0) + + info = { + "title": None + if is_appending + else os.path.splitext(os.path.basename(filename))[0], + "author": None, + "subject": None, + "keywords": None, + "creator": None, + "producer": None, + "creationDate": None if is_appending else time.gmtime(), + "modDate": None if is_appending else time.gmtime(), + } + for k, default in info.items(): + v = im.encoderinfo.get(k) if k in im.encoderinfo else default + if v: + existing_pdf.info[k[0].upper() + k[1:]] = v + + # + # make sure image data is available + im.load() + + existing_pdf.start_writing() + existing_pdf.write_header() + existing_pdf.write_comment("created by Pillow {} PDF driver".format(__version__)) + + # + # pages + ims = [im] + if save_all: + append_images = im.encoderinfo.get("append_images", []) + for append_im in append_images: + append_im.encoderinfo = im.encoderinfo.copy() + ims.append(append_im) + numberOfPages = 0 + image_refs = [] + page_refs = [] + contents_refs = [] + for im in ims: + im_numberOfPages = 1 + if save_all: + try: + im_numberOfPages = im.n_frames + except AttributeError: + # Image format does not have n_frames. + # It is a single frame image + pass + numberOfPages += im_numberOfPages + for i in range(im_numberOfPages): + image_refs.append(existing_pdf.next_object_id(0)) + page_refs.append(existing_pdf.next_object_id(0)) + contents_refs.append(existing_pdf.next_object_id(0)) + existing_pdf.pages.append(page_refs[-1]) + + # + # catalog and list of pages + existing_pdf.write_catalog() + + pageNumber = 0 + for imSequence in ims: + im_pages = ImageSequence.Iterator(imSequence) if save_all else [imSequence] + for im in im_pages: + # FIXME: Should replace ASCIIHexDecode with RunLengthDecode + # (packbits) or LZWDecode (tiff/lzw compression). Note that + # PDF 1.2 also supports Flatedecode (zip compression). + + bits = 8 + params = None + + if im.mode == "1": + filter = "ASCIIHexDecode" + colorspace = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + bits = 1 + elif im.mode == "L": + filter = "DCTDecode" + # params = "<< /Predictor 15 /Columns %d >>" % (width-2) + colorspace = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "P": + filter = "ASCIIHexDecode" + palette = im.im.getpalette("RGB") + colorspace = [ + PdfParser.PdfName("Indexed"), + PdfParser.PdfName("DeviceRGB"), + 255, + PdfParser.PdfBinary(palette), + ] + procset = "ImageI" # indexed color + elif im.mode == "RGB": + filter = "DCTDecode" + colorspace = PdfParser.PdfName("DeviceRGB") + procset = "ImageC" # color images + elif im.mode == "CMYK": + filter = "DCTDecode" + colorspace = PdfParser.PdfName("DeviceCMYK") + procset = "ImageC" # color images + else: + raise ValueError("cannot save mode %s" % im.mode) + + # + # image + + op = io.BytesIO() + + if filter == "ASCIIHexDecode": + if bits == 1: + # FIXME: the hex encoder doesn't support packed 1-bit + # images; do things the hard way... + data = im.tobytes("raw", "1") + im = Image.new("L", im.size) + im.putdata(data) + ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)]) + elif filter == "DCTDecode": + Image.SAVE["JPEG"](im, op, filename) + elif filter == "FlateDecode": + ImageFile._save(im, op, [("zip", (0, 0) + im.size, 0, im.mode)]) + elif filter == "RunLengthDecode": + ImageFile._save(im, op, [("packbits", (0, 0) + im.size, 0, im.mode)]) + else: + raise ValueError("unsupported PDF filter (%s)" % filter) + + # + # Get image characteristics + + width, height = im.size + + existing_pdf.write_obj( + image_refs[pageNumber], + stream=op.getvalue(), + Type=PdfParser.PdfName("XObject"), + Subtype=PdfParser.PdfName("Image"), + Width=width, # * 72.0 / resolution, + Height=height, # * 72.0 / resolution, + Filter=PdfParser.PdfName(filter), + BitsPerComponent=bits, + DecodeParams=params, + ColorSpace=colorspace, + ) + + # + # page + + existing_pdf.write_page( + page_refs[pageNumber], + Resources=PdfParser.PdfDict( + ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], + XObject=PdfParser.PdfDict(image=image_refs[pageNumber]), + ), + MediaBox=[ + 0, + 0, + int(width * 72.0 / resolution), + int(height * 72.0 / resolution), + ], + Contents=contents_refs[pageNumber], + ) + + # + # page contents + + page_contents = b"q %d 0 0 %d 0 0 cm /image Do Q\n" % ( + int(width * 72.0 / resolution), + int(height * 72.0 / resolution), + ) + + existing_pdf.write_obj(contents_refs[pageNumber], stream=page_contents) + + pageNumber += 1 + + # + # trailer + existing_pdf.write_xref_and_trailer() + if hasattr(fp, "flush"): + fp.flush() + existing_pdf.close() + + +# +# -------------------------------------------------------------------- + + +Image.register_save("PDF", _save) +Image.register_save_all("PDF", _save_all) + +Image.register_extension("PDF", ".pdf") + +Image.register_mime("PDF", "application/pdf") diff --git a/venv/Lib/site-packages/PIL/PdfParser.py b/venv/Lib/site-packages/PIL/PdfParser.py new file mode 100644 index 0000000..3c343c5 --- /dev/null +++ b/venv/Lib/site-packages/PIL/PdfParser.py @@ -0,0 +1,995 @@ +import calendar +import codecs +import collections +import mmap +import os +import re +import time +import zlib + + +# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set +# on page 656 +def encode_text(s): + return codecs.BOM_UTF16_BE + s.encode("utf_16_be") + + +PDFDocEncoding = { + 0x16: "\u0017", + 0x18: "\u02D8", + 0x19: "\u02C7", + 0x1A: "\u02C6", + 0x1B: "\u02D9", + 0x1C: "\u02DD", + 0x1D: "\u02DB", + 0x1E: "\u02DA", + 0x1F: "\u02DC", + 0x80: "\u2022", + 0x81: "\u2020", + 0x82: "\u2021", + 0x83: "\u2026", + 0x84: "\u2014", + 0x85: "\u2013", + 0x86: "\u0192", + 0x87: "\u2044", + 0x88: "\u2039", + 0x89: "\u203A", + 0x8A: "\u2212", + 0x8B: "\u2030", + 0x8C: "\u201E", + 0x8D: "\u201C", + 0x8E: "\u201D", + 0x8F: "\u2018", + 0x90: "\u2019", + 0x91: "\u201A", + 0x92: "\u2122", + 0x93: "\uFB01", + 0x94: "\uFB02", + 0x95: "\u0141", + 0x96: "\u0152", + 0x97: "\u0160", + 0x98: "\u0178", + 0x99: "\u017D", + 0x9A: "\u0131", + 0x9B: "\u0142", + 0x9C: "\u0153", + 0x9D: "\u0161", + 0x9E: "\u017E", + 0xA0: "\u20AC", +} + + +def decode_text(b): + if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: + return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") + else: + return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) + + +class PdfFormatError(RuntimeError): + """An error that probably indicates a syntactic or semantic error in the + PDF file structure""" + + pass + + +def check_format_condition(condition, error_message): + if not condition: + raise PdfFormatError(error_message) + + +class IndirectReference( + collections.namedtuple("IndirectReferenceTuple", ["object_id", "generation"]) +): + def __str__(self): + return "%s %s R" % self + + def __bytes__(self): + return self.__str__().encode("us-ascii") + + def __eq__(self, other): + return ( + other.__class__ is self.__class__ + and other.object_id == self.object_id + and other.generation == self.generation + ) + + def __ne__(self, other): + return not (self == other) + + def __hash__(self): + return hash((self.object_id, self.generation)) + + +class IndirectObjectDef(IndirectReference): + def __str__(self): + return "%s %s obj" % self + + +class XrefTable: + def __init__(self): + self.existing_entries = {} # object ID => (offset, generation) + self.new_entries = {} # object ID => (offset, generation) + self.deleted_entries = {0: 65536} # object ID => generation + self.reading_finished = False + + def __setitem__(self, key, value): + if self.reading_finished: + self.new_entries[key] = value + else: + self.existing_entries[key] = value + if key in self.deleted_entries: + del self.deleted_entries[key] + + def __getitem__(self, key): + try: + return self.new_entries[key] + except KeyError: + return self.existing_entries[key] + + def __delitem__(self, key): + if key in self.new_entries: + generation = self.new_entries[key][1] + 1 + del self.new_entries[key] + self.deleted_entries[key] = generation + elif key in self.existing_entries: + generation = self.existing_entries[key][1] + 1 + self.deleted_entries[key] = generation + elif key in self.deleted_entries: + generation = self.deleted_entries[key] + else: + raise IndexError( + "object ID " + str(key) + " cannot be deleted because it doesn't exist" + ) + + def __contains__(self, key): + return key in self.existing_entries or key in self.new_entries + + def __len__(self): + return len( + set(self.existing_entries.keys()) + | set(self.new_entries.keys()) + | set(self.deleted_entries.keys()) + ) + + def keys(self): + return ( + set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) + ) | set(self.new_entries.keys()) + + def write(self, f): + keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + deleted_keys = sorted(set(self.deleted_entries.keys())) + startxref = f.tell() + f.write(b"xref\n") + while keys: + # find a contiguous sequence of object IDs + prev = None + for index, key in enumerate(keys): + if prev is None or prev + 1 == key: + prev = key + else: + contiguous_keys = keys[:index] + keys = keys[index:] + break + else: + contiguous_keys = keys + keys = None + f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) + for object_id in contiguous_keys: + if object_id in self.new_entries: + f.write(b"%010d %05d n \n" % self.new_entries[object_id]) + else: + this_deleted_object_id = deleted_keys.pop(0) + check_format_condition( + object_id == this_deleted_object_id, + "expected the next deleted object ID to be %s, instead found %s" + % (object_id, this_deleted_object_id), + ) + try: + next_in_linked_list = deleted_keys[0] + except IndexError: + next_in_linked_list = 0 + f.write( + b"%010d %05d f \n" + % (next_in_linked_list, self.deleted_entries[object_id]) + ) + return startxref + + +class PdfName: + def __init__(self, name): + if isinstance(name, PdfName): + self.name = name.name + elif isinstance(name, bytes): + self.name = name + else: + self.name = name.encode("us-ascii") + + def name_as_str(self): + return self.name.decode("us-ascii") + + def __eq__(self, other): + return ( + isinstance(other, PdfName) and other.name == self.name + ) or other == self.name + + def __hash__(self): + return hash(self.name) + + def __repr__(self): + return "PdfName(%s)" % repr(self.name) + + @classmethod + def from_pdf_stream(cls, data): + return cls(PdfParser.interpret_name(data)) + + allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} + + def __bytes__(self): + result = bytearray(b"/") + for b in self.name: + if b in self.allowed_chars: + result.append(b) + else: + result.extend(b"#%02X" % b) + return bytes(result) + + +class PdfArray(list): + def __bytes__(self): + return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" + + +class PdfDict(collections.UserDict): + def __setattr__(self, key, value): + if key == "data": + collections.UserDict.__setattr__(self, key, value) + else: + self[key.encode("us-ascii")] = value + + def __getattr__(self, key): + try: + value = self[key.encode("us-ascii")] + except KeyError as e: + raise AttributeError(key) from e + if isinstance(value, bytes): + value = decode_text(value) + if key.endswith("Date"): + if value.startswith("D:"): + value = value[2:] + + relationship = "Z" + if len(value) > 17: + relationship = value[14] + offset = int(value[15:17]) * 60 + if len(value) > 20: + offset += int(value[18:20]) + + format = "%Y%m%d%H%M%S"[: len(value) - 2] + value = time.strptime(value[: len(format) + 2], format) + if relationship in ["+", "-"]: + offset *= 60 + if relationship == "+": + offset *= -1 + value = time.gmtime(calendar.timegm(value) + offset) + return value + + def __bytes__(self): + out = bytearray(b"<<") + for key, value in self.items(): + if value is None: + continue + value = pdf_repr(value) + out.extend(b"\n") + out.extend(bytes(PdfName(key))) + out.extend(b" ") + out.extend(value) + out.extend(b"\n>>") + return bytes(out) + + +class PdfBinary: + def __init__(self, data): + self.data = data + + def __bytes__(self): + return b"<%s>" % b"".join(b"%02X" % b for b in self.data) + + +class PdfStream: + def __init__(self, dictionary, buf): + self.dictionary = dictionary + self.buf = buf + + def decode(self): + try: + filter = self.dictionary.Filter + except AttributeError: + return self.buf + if filter == b"FlateDecode": + try: + expected_length = self.dictionary.DL + except AttributeError: + expected_length = self.dictionary.Length + return zlib.decompress(self.buf, bufsize=int(expected_length)) + else: + raise NotImplementedError( + "stream filter %s unknown/unsupported" % repr(self.dictionary.Filter) + ) + + +def pdf_repr(x): + if x is True: + return b"true" + elif x is False: + return b"false" + elif x is None: + return b"null" + elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): + return bytes(x) + elif isinstance(x, int): + return str(x).encode("us-ascii") + elif isinstance(x, time.struct_time): + return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" + elif isinstance(x, dict): + return bytes(PdfDict(x)) + elif isinstance(x, list): + return bytes(PdfArray(x)) + elif isinstance(x, str): + return pdf_repr(encode_text(x)) + elif isinstance(x, bytes): + # XXX escape more chars? handle binary garbage + x = x.replace(b"\\", b"\\\\") + x = x.replace(b"(", b"\\(") + x = x.replace(b")", b"\\)") + return b"(" + x + b")" + else: + return bytes(x) + + +class PdfParser: + """Based on + https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf + Supports PDF up to 1.4 + """ + + def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): + if buf and f: + raise RuntimeError("specify buf or f or filename, but not both buf and f") + self.filename = filename + self.buf = buf + self.f = f + self.start_offset = start_offset + self.should_close_buf = False + self.should_close_file = False + if filename is not None and f is None: + self.f = f = open(filename, mode) + self.should_close_file = True + if f is not None: + self.buf = buf = self.get_buf_from_file(f) + self.should_close_buf = True + if not filename and hasattr(f, "name"): + self.filename = f.name + self.cached_objects = {} + if buf: + self.read_pdf_info() + else: + self.file_size_total = self.file_size_this = 0 + self.root = PdfDict() + self.root_ref = None + self.info = PdfDict() + self.info_ref = None + self.page_tree_root = {} + self.pages = [] + self.orig_pages = [] + self.pages_ref = None + self.last_xref_section_offset = None + self.trailer_dict = {} + self.xref_table = XrefTable() + self.xref_table.reading_finished = True + if f: + self.seek_end() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + return False # do not suppress exceptions + + def start_writing(self): + self.close_buf() + self.seek_end() + + def close_buf(self): + try: + self.buf.close() + except AttributeError: + pass + self.buf = None + + def close(self): + if self.should_close_buf: + self.close_buf() + if self.f is not None and self.should_close_file: + self.f.close() + self.f = None + + def seek_end(self): + self.f.seek(0, os.SEEK_END) + + def write_header(self): + self.f.write(b"%PDF-1.4\n") + + def write_comment(self, s): + self.f.write(("% {}\n".format(s)).encode("utf-8")) + + def write_catalog(self): + self.del_root() + self.root_ref = self.next_object_id(self.f.tell()) + self.pages_ref = self.next_object_id(0) + self.rewrite_pages() + self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) + self.write_obj( + self.pages_ref, + Type=PdfName(b"Pages"), + Count=len(self.pages), + Kids=self.pages, + ) + return self.root_ref + + def rewrite_pages(self): + pages_tree_nodes_to_delete = [] + for i, page_ref in enumerate(self.orig_pages): + page_info = self.cached_objects[page_ref] + del self.xref_table[page_ref.object_id] + pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) + if page_ref not in self.pages: + # the page has been deleted + continue + # make dict keys into strings for passing to write_page + stringified_page_info = {} + for key, value in page_info.items(): + # key should be a PdfName + stringified_page_info[key.name_as_str()] = value + stringified_page_info["Parent"] = self.pages_ref + new_page_ref = self.write_page(None, **stringified_page_info) + for j, cur_page_ref in enumerate(self.pages): + if cur_page_ref == page_ref: + # replace the page reference with the new one + self.pages[j] = new_page_ref + # delete redundant Pages tree nodes from xref table + for pages_tree_node_ref in pages_tree_nodes_to_delete: + while pages_tree_node_ref: + pages_tree_node = self.cached_objects[pages_tree_node_ref] + if pages_tree_node_ref.object_id in self.xref_table: + del self.xref_table[pages_tree_node_ref.object_id] + pages_tree_node_ref = pages_tree_node.get(b"Parent", None) + self.orig_pages = [] + + def write_xref_and_trailer(self, new_root_ref=None): + if new_root_ref: + self.del_root() + self.root_ref = new_root_ref + if self.info: + self.info_ref = self.write_obj(None, self.info) + start_xref = self.xref_table.write(self.f) + num_entries = len(self.xref_table) + trailer_dict = {b"Root": self.root_ref, b"Size": num_entries} + if self.last_xref_section_offset is not None: + trailer_dict[b"Prev"] = self.last_xref_section_offset + if self.info: + trailer_dict[b"Info"] = self.info_ref + self.last_xref_section_offset = start_xref + self.f.write( + b"trailer\n" + + bytes(PdfDict(trailer_dict)) + + b"\nstartxref\n%d\n%%%%EOF" % start_xref + ) + + def write_page(self, ref, *objs, **dict_obj): + if isinstance(ref, int): + ref = self.pages[ref] + if "Type" not in dict_obj: + dict_obj["Type"] = PdfName(b"Page") + if "Parent" not in dict_obj: + dict_obj["Parent"] = self.pages_ref + return self.write_obj(ref, *objs, **dict_obj) + + def write_obj(self, ref, *objs, **dict_obj): + f = self.f + if ref is None: + ref = self.next_object_id(f.tell()) + else: + self.xref_table[ref.object_id] = (f.tell(), ref.generation) + f.write(bytes(IndirectObjectDef(*ref))) + stream = dict_obj.pop("stream", None) + if stream is not None: + dict_obj["Length"] = len(stream) + if dict_obj: + f.write(pdf_repr(dict_obj)) + for obj in objs: + f.write(pdf_repr(obj)) + if stream is not None: + f.write(b"stream\n") + f.write(stream) + f.write(b"\nendstream\n") + f.write(b"endobj\n") + return ref + + def del_root(self): + if self.root_ref is None: + return + del self.xref_table[self.root_ref.object_id] + del self.xref_table[self.root[b"Pages"].object_id] + + @staticmethod + def get_buf_from_file(f): + if hasattr(f, "getbuffer"): + return f.getbuffer() + elif hasattr(f, "getvalue"): + return f.getvalue() + else: + try: + return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + except ValueError: # cannot mmap an empty file + return b"" + + def read_pdf_info(self): + self.file_size_total = len(self.buf) + self.file_size_this = self.file_size_total - self.start_offset + self.read_trailer() + self.root_ref = self.trailer_dict[b"Root"] + self.info_ref = self.trailer_dict.get(b"Info", None) + self.root = PdfDict(self.read_indirect(self.root_ref)) + if self.info_ref is None: + self.info = PdfDict() + else: + self.info = PdfDict(self.read_indirect(self.info_ref)) + check_format_condition(b"Type" in self.root, "/Type missing in Root") + check_format_condition( + self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" + ) + check_format_condition(b"Pages" in self.root, "/Pages missing in Root") + check_format_condition( + isinstance(self.root[b"Pages"], IndirectReference), + "/Pages in Root is not an indirect reference", + ) + self.pages_ref = self.root[b"Pages"] + self.page_tree_root = self.read_indirect(self.pages_ref) + self.pages = self.linearize_page_tree(self.page_tree_root) + # save the original list of page references + # in case the user modifies, adds or deletes some pages + # and we need to rewrite the pages and their list + self.orig_pages = self.pages[:] + + def next_object_id(self, offset=None): + try: + # TODO: support reuse of deleted objects + reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) + except ValueError: + reference = IndirectReference(1, 0) + if offset is not None: + self.xref_table[reference.object_id] = (offset, 0) + return reference + + delimiter = br"[][()<>{}/%]" + delimiter_or_ws = br"[][()<>{}/%\000\011\012\014\015\040]" + whitespace = br"[\000\011\012\014\015\040]" + whitespace_or_hex = br"[\000\011\012\014\015\0400-9a-fA-F]" + whitespace_optional = whitespace + b"*" + whitespace_mandatory = whitespace + b"+" + newline_only = br"[\r\n]+" + newline = whitespace_optional + newline_only + whitespace_optional + re_trailer_end = re.compile( + whitespace_mandatory + + br"trailer" + + whitespace_optional + + br"\<\<(.*\>\>)" + + newline + + br"startxref" + + newline + + br"([0-9]+)" + + newline + + br"%%EOF" + + whitespace_optional + + br"$", + re.DOTALL, + ) + re_trailer_prev = re.compile( + whitespace_optional + + br"trailer" + + whitespace_optional + + br"\<\<(.*?\>\>)" + + newline + + br"startxref" + + newline + + br"([0-9]+)" + + newline + + br"%%EOF" + + whitespace_optional, + re.DOTALL, + ) + + def read_trailer(self): + search_start_offset = len(self.buf) - 16384 + if search_start_offset < self.start_offset: + search_start_offset = self.start_offset + m = self.re_trailer_end.search(self.buf, search_start_offset) + check_format_condition(m, "trailer end not found") + # make sure we found the LAST trailer + last_match = m + while m: + last_match = m + m = self.re_trailer_end.search(self.buf, m.start() + 16) + if not m: + m = last_match + trailer_data = m.group(1) + self.last_xref_section_offset = int(m.group(2)) + self.trailer_dict = self.interpret_trailer(trailer_data) + self.xref_table = XrefTable() + self.read_xref_table(xref_section_offset=self.last_xref_section_offset) + if b"Prev" in self.trailer_dict: + self.read_prev_trailer(self.trailer_dict[b"Prev"]) + + def read_prev_trailer(self, xref_section_offset): + trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) + m = self.re_trailer_prev.search( + self.buf[trailer_offset : trailer_offset + 16384] + ) + check_format_condition(m, "previous trailer not found") + trailer_data = m.group(1) + check_format_condition( + int(m.group(2)) == xref_section_offset, + "xref section offset in previous trailer doesn't match what was expected", + ) + trailer_dict = self.interpret_trailer(trailer_data) + if b"Prev" in trailer_dict: + self.read_prev_trailer(trailer_dict[b"Prev"]) + + re_whitespace_optional = re.compile(whitespace_optional) + re_name = re.compile( + whitespace_optional + + br"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" + + delimiter_or_ws + + br")" + ) + re_dict_start = re.compile(whitespace_optional + br"\<\<") + re_dict_end = re.compile(whitespace_optional + br"\>\>" + whitespace_optional) + + @classmethod + def interpret_trailer(cls, trailer_data): + trailer = {} + offset = 0 + while True: + m = cls.re_name.match(trailer_data, offset) + if not m: + m = cls.re_dict_end.match(trailer_data, offset) + check_format_condition( + m and m.end() == len(trailer_data), + "name not found in trailer, remaining data: " + + repr(trailer_data[offset:]), + ) + break + key = cls.interpret_name(m.group(1)) + value, offset = cls.get_value(trailer_data, m.end()) + trailer[key] = value + check_format_condition( + b"Size" in trailer and isinstance(trailer[b"Size"], int), + "/Size not in trailer or not an integer", + ) + check_format_condition( + b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), + "/Root not in trailer or not an indirect reference", + ) + return trailer + + re_hashes_in_name = re.compile(br"([^#]*)(#([0-9a-fA-F]{2}))?") + + @classmethod + def interpret_name(cls, raw, as_text=False): + name = b"" + for m in cls.re_hashes_in_name.finditer(raw): + if m.group(3): + name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) + else: + name += m.group(1) + if as_text: + return name.decode("utf-8") + else: + return bytes(name) + + re_null = re.compile(whitespace_optional + br"null(?=" + delimiter_or_ws + br")") + re_true = re.compile(whitespace_optional + br"true(?=" + delimiter_or_ws + br")") + re_false = re.compile(whitespace_optional + br"false(?=" + delimiter_or_ws + br")") + re_int = re.compile( + whitespace_optional + br"([-+]?[0-9]+)(?=" + delimiter_or_ws + br")" + ) + re_real = re.compile( + whitespace_optional + + br"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" + + delimiter_or_ws + + br")" + ) + re_array_start = re.compile(whitespace_optional + br"\[") + re_array_end = re.compile(whitespace_optional + br"]") + re_string_hex = re.compile( + whitespace_optional + br"\<(" + whitespace_or_hex + br"*)\>" + ) + re_string_lit = re.compile(whitespace_optional + br"\(") + re_indirect_reference = re.compile( + whitespace_optional + + br"([-+]?[0-9]+)" + + whitespace_mandatory + + br"([-+]?[0-9]+)" + + whitespace_mandatory + + br"R(?=" + + delimiter_or_ws + + br")" + ) + re_indirect_def_start = re.compile( + whitespace_optional + + br"([-+]?[0-9]+)" + + whitespace_mandatory + + br"([-+]?[0-9]+)" + + whitespace_mandatory + + br"obj(?=" + + delimiter_or_ws + + br")" + ) + re_indirect_def_end = re.compile( + whitespace_optional + br"endobj(?=" + delimiter_or_ws + br")" + ) + re_comment = re.compile( + br"(" + whitespace_optional + br"%[^\r\n]*" + newline + br")*" + ) + re_stream_start = re.compile(whitespace_optional + br"stream\r?\n") + re_stream_end = re.compile( + whitespace_optional + br"endstream(?=" + delimiter_or_ws + br")" + ) + + @classmethod + def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): + if max_nesting == 0: + return None, None + m = cls.re_comment.match(data, offset) + if m: + offset = m.end() + m = cls.re_indirect_def_start.match(data, offset) + if m: + check_format_condition( + int(m.group(1)) > 0, + "indirect object definition: object ID must be greater than 0", + ) + check_format_condition( + int(m.group(2)) >= 0, + "indirect object definition: generation must be non-negative", + ) + check_format_condition( + expect_indirect is None + or expect_indirect + == IndirectReference(int(m.group(1)), int(m.group(2))), + "indirect object definition different than expected", + ) + object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting - 1) + if offset is None: + return object, None + m = cls.re_indirect_def_end.match(data, offset) + check_format_condition(m, "indirect object definition end not found") + return object, m.end() + check_format_condition( + not expect_indirect, "indirect object definition not found" + ) + m = cls.re_indirect_reference.match(data, offset) + if m: + check_format_condition( + int(m.group(1)) > 0, + "indirect object reference: object ID must be greater than 0", + ) + check_format_condition( + int(m.group(2)) >= 0, + "indirect object reference: generation must be non-negative", + ) + return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() + m = cls.re_dict_start.match(data, offset) + if m: + offset = m.end() + result = {} + m = cls.re_dict_end.match(data, offset) + while not m: + key, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) + if offset is None: + return result, None + value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) + result[key] = value + if offset is None: + return result, None + m = cls.re_dict_end.match(data, offset) + offset = m.end() + m = cls.re_stream_start.match(data, offset) + if m: + try: + stream_len = int(result[b"Length"]) + except (TypeError, KeyError, ValueError) as e: + raise PdfFormatError( + "bad or missing Length in stream dict (%r)" + % result.get(b"Length", None) + ) from e + stream_data = data[m.end() : m.end() + stream_len] + m = cls.re_stream_end.match(data, m.end() + stream_len) + check_format_condition(m, "stream end not found") + offset = m.end() + result = PdfStream(PdfDict(result), stream_data) + else: + result = PdfDict(result) + return result, offset + m = cls.re_array_start.match(data, offset) + if m: + offset = m.end() + result = [] + m = cls.re_array_end.match(data, offset) + while not m: + value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) + result.append(value) + if offset is None: + return result, None + m = cls.re_array_end.match(data, offset) + return result, m.end() + m = cls.re_null.match(data, offset) + if m: + return None, m.end() + m = cls.re_true.match(data, offset) + if m: + return True, m.end() + m = cls.re_false.match(data, offset) + if m: + return False, m.end() + m = cls.re_name.match(data, offset) + if m: + return PdfName(cls.interpret_name(m.group(1))), m.end() + m = cls.re_int.match(data, offset) + if m: + return int(m.group(1)), m.end() + m = cls.re_real.match(data, offset) + if m: + # XXX Decimal instead of float??? + return float(m.group(1)), m.end() + m = cls.re_string_hex.match(data, offset) + if m: + # filter out whitespace + hex_string = bytearray( + [b for b in m.group(1) if b in b"0123456789abcdefABCDEF"] + ) + if len(hex_string) % 2 == 1: + # append a 0 if the length is not even - yes, at the end + hex_string.append(ord(b"0")) + return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() + m = cls.re_string_lit.match(data, offset) + if m: + return cls.get_literal_string(data, m.end()) + # return None, offset # fallback (only for debugging) + raise PdfFormatError("unrecognized object: " + repr(data[offset : offset + 32])) + + re_lit_str_token = re.compile( + br"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" + ) + escaped_chars = { + b"n": b"\n", + b"r": b"\r", + b"t": b"\t", + b"b": b"\b", + b"f": b"\f", + b"(": b"(", + b")": b")", + b"\\": b"\\", + ord(b"n"): b"\n", + ord(b"r"): b"\r", + ord(b"t"): b"\t", + ord(b"b"): b"\b", + ord(b"f"): b"\f", + ord(b"("): b"(", + ord(b")"): b")", + ord(b"\\"): b"\\", + } + + @classmethod + def get_literal_string(cls, data, offset): + nesting_depth = 0 + result = bytearray() + for m in cls.re_lit_str_token.finditer(data, offset): + result.extend(data[offset : m.start()]) + if m.group(1): + result.extend(cls.escaped_chars[m.group(1)[1]]) + elif m.group(2): + result.append(int(m.group(2)[1:], 8)) + elif m.group(3): + pass + elif m.group(5): + result.extend(b"\n") + elif m.group(6): + result.extend(b"(") + nesting_depth += 1 + elif m.group(7): + if nesting_depth == 0: + return bytes(result), m.end() + result.extend(b")") + nesting_depth -= 1 + offset = m.end() + raise PdfFormatError("unfinished literal string") + + re_xref_section_start = re.compile(whitespace_optional + br"xref" + newline) + re_xref_subsection_start = re.compile( + whitespace_optional + + br"([0-9]+)" + + whitespace_mandatory + + br"([0-9]+)" + + whitespace_optional + + newline_only + ) + re_xref_entry = re.compile(br"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") + + def read_xref_table(self, xref_section_offset): + subsection_found = False + m = self.re_xref_section_start.match( + self.buf, xref_section_offset + self.start_offset + ) + check_format_condition(m, "xref section start not found") + offset = m.end() + while True: + m = self.re_xref_subsection_start.match(self.buf, offset) + if not m: + check_format_condition( + subsection_found, "xref subsection start not found" + ) + break + subsection_found = True + offset = m.end() + first_object = int(m.group(1)) + num_objects = int(m.group(2)) + for i in range(first_object, first_object + num_objects): + m = self.re_xref_entry.match(self.buf, offset) + check_format_condition(m, "xref entry not found") + offset = m.end() + is_free = m.group(3) == b"f" + generation = int(m.group(2)) + if not is_free: + new_entry = (int(m.group(1)), generation) + check_format_condition( + i not in self.xref_table or self.xref_table[i] == new_entry, + "xref entry duplicated (and not identical)", + ) + self.xref_table[i] = new_entry + return offset + + def read_indirect(self, ref, max_nesting=-1): + offset, generation = self.xref_table[ref[0]] + check_format_condition( + generation == ref[1], + "expected to find generation %s for object ID %s in xref table, " + "instead found generation %s at offset %s" + % (ref[1], ref[0], generation, offset), + ) + value = self.get_value( + self.buf, + offset + self.start_offset, + expect_indirect=IndirectReference(*ref), + max_nesting=max_nesting, + )[0] + self.cached_objects[ref] = value + return value + + def linearize_page_tree(self, node=None): + if node is None: + node = self.page_tree_root + check_format_condition( + node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" + ) + pages = [] + for kid in node[b"Kids"]: + kid_object = self.read_indirect(kid) + if kid_object[b"Type"] == b"Page": + pages.append(kid) + else: + pages.extend(self.linearize_page_tree(node=kid_object)) + return pages diff --git a/venv/Lib/site-packages/PIL/PixarImagePlugin.py b/venv/Lib/site-packages/PIL/PixarImagePlugin.py new file mode 100644 index 0000000..91f0314 --- /dev/null +++ b/venv/Lib/site-packages/PIL/PixarImagePlugin.py @@ -0,0 +1,70 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIXAR raster support for PIL +# +# history: +# 97-01-29 fl Created +# +# notes: +# This is incomplete; it is based on a few samples created with +# Photoshop 2.5 and 3.0, and a summary description provided by +# Greg Coats . Hopefully, "L" and +# "RGBA" support will be added in future versions. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile +from ._binary import i16le as i16 + +# +# helpers + + +def _accept(prefix): + return prefix[:4] == b"\200\350\000\000" + + +## +# Image plugin for PIXAR raster images. + + +class PixarImageFile(ImageFile.ImageFile): + + format = "PIXAR" + format_description = "PIXAR raster image" + + def _open(self): + + # assuming a 4-byte magic label + s = self.fp.read(4) + if not _accept(s): + raise SyntaxError("not a PIXAR file") + + # read rest of header + s = s + self.fp.read(508) + + self._size = i16(s[418:420]), i16(s[416:418]) + + # get channel/depth descriptions + mode = i16(s[424:426]), i16(s[426:428]) + + if mode == (14, 2): + self.mode = "RGB" + # FIXME: to be continued... + + # create tile descriptor (assuming "dumped") + self.tile = [("raw", (0, 0) + self.size, 1024, (self.mode, 0, 1))] + + +# +# -------------------------------------------------------------------- + +Image.register_open(PixarImageFile.format, PixarImageFile, _accept) + +Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/venv/Lib/site-packages/PIL/PngImagePlugin.py b/venv/Lib/site-packages/PIL/PngImagePlugin.py new file mode 100644 index 0000000..e027953 --- /dev/null +++ b/venv/Lib/site-packages/PIL/PngImagePlugin.py @@ -0,0 +1,1333 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PNG support code +# +# See "PNG (Portable Network Graphics) Specification, version 1.0; +# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). +# +# history: +# 1996-05-06 fl Created (couldn't resist it) +# 1996-12-14 fl Upgraded, added read and verify support (0.2) +# 1996-12-15 fl Separate PNG stream parser +# 1996-12-29 fl Added write support, added getchunks +# 1996-12-30 fl Eliminated circular references in decoder (0.3) +# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) +# 2001-02-08 fl Added transparency support (from Zircon) (0.5) +# 2001-04-16 fl Don't close data source in "open" method (0.6) +# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) +# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) +# 2004-09-20 fl Added PngInfo chunk container +# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) +# 2008-08-13 fl Added tRNS support for RGB images +# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) +# 2009-03-08 fl Added zTXT support (from Lowell Alleman) +# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) +# +# Copyright (c) 1997-2009 by Secret Labs AB +# Copyright (c) 1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import itertools +import logging +import re +import struct +import warnings +import zlib + +from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence +from ._binary import i8, i16be as i16, i32be as i32, o8, o16be as o16, o32be as o32 + +logger = logging.getLogger(__name__) + +is_cid = re.compile(br"\w\w\w\w").match + + +_MAGIC = b"\211PNG\r\n\032\n" + + +_MODES = { + # supported bits/color combinations, and corresponding modes/rawmodes + # Greyscale + (1, 0): ("1", "1"), + (2, 0): ("L", "L;2"), + (4, 0): ("L", "L;4"), + (8, 0): ("L", "L"), + (16, 0): ("I", "I;16B"), + # Truecolour + (8, 2): ("RGB", "RGB"), + (16, 2): ("RGB", "RGB;16B"), + # Indexed-colour + (1, 3): ("P", "P;1"), + (2, 3): ("P", "P;2"), + (4, 3): ("P", "P;4"), + (8, 3): ("P", "P"), + # Greyscale with alpha + (8, 4): ("LA", "LA"), + (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available + # Truecolour with alpha + (8, 6): ("RGBA", "RGBA"), + (16, 6): ("RGBA", "RGBA;16B"), +} + + +_simple_palette = re.compile(b"^\xff*\x00\xff*$") + +# Maximum decompressed size for a iTXt or zTXt chunk. +# Eliminates decompression bombs where compressed chunks can expand 1000x +MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK +# Set the maximum total text chunk size. +MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK + + +# APNG frame disposal modes +APNG_DISPOSE_OP_NONE = 0 +APNG_DISPOSE_OP_BACKGROUND = 1 +APNG_DISPOSE_OP_PREVIOUS = 2 + +# APNG frame blend modes +APNG_BLEND_OP_SOURCE = 0 +APNG_BLEND_OP_OVER = 1 + + +def _safe_zlib_decompress(s): + dobj = zlib.decompressobj() + plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) + if dobj.unconsumed_tail: + raise ValueError("Decompressed Data Too Large") + return plaintext + + +def _crc32(data, seed=0): + return zlib.crc32(data, seed) & 0xFFFFFFFF + + +# -------------------------------------------------------------------- +# Support classes. Suitable for PNG and related formats like MNG etc. + + +class ChunkStream: + def __init__(self, fp): + + self.fp = fp + self.queue = [] + + def read(self): + """Fetch a new chunk. Returns header information.""" + cid = None + + if self.queue: + cid, pos, length = self.queue.pop() + self.fp.seek(pos) + else: + s = self.fp.read(8) + cid = s[4:] + pos = self.fp.tell() + length = i32(s) + + if not is_cid(cid): + if not ImageFile.LOAD_TRUNCATED_IMAGES: + raise SyntaxError("broken PNG file (chunk %s)" % repr(cid)) + + return cid, pos, length + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + self.queue = self.crc = self.fp = None + + def push(self, cid, pos, length): + + self.queue.append((cid, pos, length)) + + def call(self, cid, pos, length): + """Call the appropriate chunk handler""" + + logger.debug("STREAM %r %s %s", cid, pos, length) + return getattr(self, "chunk_" + cid.decode("ascii"))(pos, length) + + def crc(self, cid, data): + """Read and verify checksum""" + + # Skip CRC checks for ancillary chunks if allowed to load truncated + # images + # 5th byte of first char is 1 [specs, section 5.4] + if ImageFile.LOAD_TRUNCATED_IMAGES and (i8(cid[0]) >> 5 & 1): + self.crc_skip(cid, data) + return + + try: + crc1 = _crc32(data, _crc32(cid)) + crc2 = i32(self.fp.read(4)) + if crc1 != crc2: + raise SyntaxError("broken PNG file (bad header checksum in %r)" % cid) + except struct.error as e: + raise SyntaxError( + "broken PNG file (incomplete checksum in %r)" % cid + ) from e + + def crc_skip(self, cid, data): + """Read checksum. Used if the C module is not present""" + + self.fp.read(4) + + def verify(self, endchunk=b"IEND"): + + # Simple approach; just calculate checksum for all remaining + # blocks. Must be called directly after open. + + cids = [] + + while True: + try: + cid, pos, length = self.read() + except struct.error as e: + raise OSError("truncated PNG file") from e + + if cid == endchunk: + break + self.crc(cid, ImageFile._safe_read(self.fp, length)) + cids.append(cid) + + return cids + + +class iTXt(str): + """ + Subclass of string to allow iTXt chunks to look like strings while + keeping their extra information + + """ + + @staticmethod + def __new__(cls, text, lang=None, tkey=None): + """ + :param cls: the class to use when creating the instance + :param text: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + """ + + self = str.__new__(cls, text) + self.lang = lang + self.tkey = tkey + return self + + +class PngInfo: + """ + PNG chunk container (for use with save(pnginfo=)) + + """ + + def __init__(self): + self.chunks = [] + + def add(self, cid, data): + """Appends an arbitrary chunk. Use with caution. + + :param cid: a byte string, 4 bytes long. + :param data: a byte string of the encoded data + + """ + + self.chunks.append((cid, data)) + + def add_itxt(self, key, value, lang="", tkey="", zip=False): + """Appends an iTXt chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + :param zip: compression flag + + """ + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + if not isinstance(value, bytes): + value = value.encode("utf-8", "strict") + if not isinstance(lang, bytes): + lang = lang.encode("utf-8", "strict") + if not isinstance(tkey, bytes): + tkey = tkey.encode("utf-8", "strict") + + if zip: + self.add( + b"iTXt", + key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value), + ) + else: + self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value) + + def add_text(self, key, value, zip=False): + """Appends a text chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key, text or an + :py:class:`PIL.PngImagePlugin.iTXt` instance + :param zip: compression flag + + """ + if isinstance(value, iTXt): + return self.add_itxt(key, value, value.lang, value.tkey, zip=zip) + + # The tEXt chunk stores latin-1 text + if not isinstance(value, bytes): + try: + value = value.encode("latin-1", "strict") + except UnicodeError: + return self.add_itxt(key, value, zip=zip) + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + + if zip: + self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) + else: + self.add(b"tEXt", key + b"\0" + value) + + +# -------------------------------------------------------------------- +# PNG image stream (IHDR/IEND) + + +class PngStream(ChunkStream): + def __init__(self, fp): + super().__init__(fp) + + # local copies of Image attributes + self.im_info = {} + self.im_text = {} + self.im_size = (0, 0) + self.im_mode = None + self.im_tile = None + self.im_palette = None + self.im_custom_mimetype = None + self.im_n_frames = None + self._seq_num = None + self.rewind_state = None + + self.text_memory = 0 + + def check_text_memory(self, chunklen): + self.text_memory += chunklen + if self.text_memory > MAX_TEXT_MEMORY: + raise ValueError( + "Too much memory used in text chunks: %s>MAX_TEXT_MEMORY" + % self.text_memory + ) + + def save_rewind(self): + self.rewind_state = { + "info": self.im_info.copy(), + "tile": self.im_tile, + "seq_num": self._seq_num, + } + + def rewind(self): + self.im_info = self.rewind_state["info"] + self.im_tile = self.rewind_state["tile"] + self._seq_num = self.rewind_state["seq_num"] + + def chunk_iCCP(self, pos, length): + + # ICC profile + s = ImageFile._safe_read(self.fp, length) + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + i = s.find(b"\0") + logger.debug("iCCP profile name %r", s[:i]) + logger.debug("Compression method %s", i8(s[i])) + comp_method = i8(s[i]) + if comp_method != 0: + raise SyntaxError( + "Unknown compression method %s in iCCP chunk" % comp_method + ) + try: + icc_profile = _safe_zlib_decompress(s[i + 2 :]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + icc_profile = None + else: + raise + except zlib.error: + icc_profile = None # FIXME + self.im_info["icc_profile"] = icc_profile + return s + + def chunk_IHDR(self, pos, length): + + # image header + s = ImageFile._safe_read(self.fp, length) + self.im_size = i32(s), i32(s[4:]) + try: + self.im_mode, self.im_rawmode = _MODES[(i8(s[8]), i8(s[9]))] + except Exception: + pass + if i8(s[12]): + self.im_info["interlace"] = 1 + if i8(s[11]): + raise SyntaxError("unknown filter category") + return s + + def chunk_IDAT(self, pos, length): + + # image data + if "bbox" in self.im_info: + tile = [("zip", self.im_info["bbox"], pos, self.im_rawmode)] + else: + if self.im_n_frames is not None: + self.im_info["default_image"] = True + tile = [("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] + self.im_tile = tile + self.im_idat = length + raise EOFError + + def chunk_IEND(self, pos, length): + + # end of PNG image + raise EOFError + + def chunk_PLTE(self, pos, length): + + # palette + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + self.im_palette = "RGB", s + return s + + def chunk_tRNS(self, pos, length): + + # transparency + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + if _simple_palette.match(s): + # tRNS contains only one full-transparent entry, + # other entries are full opaque + i = s.find(b"\0") + if i >= 0: + self.im_info["transparency"] = i + else: + # otherwise, we have a byte string with one alpha value + # for each palette entry + self.im_info["transparency"] = s + elif self.im_mode in ("1", "L", "I"): + self.im_info["transparency"] = i16(s) + elif self.im_mode == "RGB": + self.im_info["transparency"] = i16(s), i16(s[2:]), i16(s[4:]) + return s + + def chunk_gAMA(self, pos, length): + # gamma setting + s = ImageFile._safe_read(self.fp, length) + self.im_info["gamma"] = i32(s) / 100000.0 + return s + + def chunk_cHRM(self, pos, length): + # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 + # WP x,y, Red x,y, Green x,y Blue x,y + + s = ImageFile._safe_read(self.fp, length) + raw_vals = struct.unpack(">%dI" % (len(s) // 4), s) + self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) + return s + + def chunk_sRGB(self, pos, length): + # srgb rendering intent, 1 byte + # 0 perceptual + # 1 relative colorimetric + # 2 saturation + # 3 absolute colorimetric + + s = ImageFile._safe_read(self.fp, length) + self.im_info["srgb"] = i8(s) + return s + + def chunk_pHYs(self, pos, length): + + # pixels per unit + s = ImageFile._safe_read(self.fp, length) + px, py = i32(s), i32(s[4:]) + unit = i8(s[8]) + if unit == 1: # meter + dpi = int(px * 0.0254 + 0.5), int(py * 0.0254 + 0.5) + self.im_info["dpi"] = dpi + elif unit == 0: + self.im_info["aspect"] = px, py + return s + + def chunk_tEXt(self, pos, length): + + # text + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + # fallback for broken tEXt tags + k = s + v = b"" + if k: + k = k.decode("latin-1", "strict") + v = v.decode("latin-1", "replace") + + self.im_info[k] = self.im_text[k] = v + self.check_text_memory(len(v)) + + return s + + def chunk_zTXt(self, pos, length): + + # compressed text + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + k = s + v = b"" + if v: + comp_method = i8(v[0]) + else: + comp_method = 0 + if comp_method != 0: + raise SyntaxError( + "Unknown compression method %s in zTXt chunk" % comp_method + ) + try: + v = _safe_zlib_decompress(v[1:]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + v = b"" + else: + raise + except zlib.error: + v = b"" + + if k: + k = k.decode("latin-1", "strict") + v = v.decode("latin-1", "replace") + + self.im_info[k] = self.im_text[k] = v + self.check_text_memory(len(v)) + + return s + + def chunk_iTXt(self, pos, length): + + # international text + r = s = ImageFile._safe_read(self.fp, length) + try: + k, r = r.split(b"\0", 1) + except ValueError: + return s + if len(r) < 2: + return s + cf, cm, r = i8(r[0]), i8(r[1]), r[2:] + try: + lang, tk, v = r.split(b"\0", 2) + except ValueError: + return s + if cf != 0: + if cm == 0: + try: + v = _safe_zlib_decompress(v) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + else: + raise + except zlib.error: + return s + else: + return s + try: + k = k.decode("latin-1", "strict") + lang = lang.decode("utf-8", "strict") + tk = tk.decode("utf-8", "strict") + v = v.decode("utf-8", "strict") + except UnicodeError: + return s + + self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk) + self.check_text_memory(len(v)) + + return s + + def chunk_eXIf(self, pos, length): + s = ImageFile._safe_read(self.fp, length) + self.im_info["exif"] = b"Exif\x00\x00" + s + return s + + # APNG chunks + def chunk_acTL(self, pos, length): + s = ImageFile._safe_read(self.fp, length) + if self.im_n_frames is not None: + self.im_n_frames = None + warnings.warn("Invalid APNG, will use default PNG image if possible") + return s + n_frames = i32(s) + if n_frames == 0 or n_frames > 0x80000000: + warnings.warn("Invalid APNG, will use default PNG image if possible") + return s + self.im_n_frames = n_frames + self.im_info["loop"] = i32(s[4:]) + self.im_custom_mimetype = "image/apng" + return s + + def chunk_fcTL(self, pos, length): + s = ImageFile._safe_read(self.fp, length) + seq = i32(s) + if (self._seq_num is None and seq != 0) or ( + self._seq_num is not None and self._seq_num != seq - 1 + ): + raise SyntaxError("APNG contains frame sequence errors") + self._seq_num = seq + width, height = i32(s[4:]), i32(s[8:]) + px, py = i32(s[12:]), i32(s[16:]) + im_w, im_h = self.im_size + if px + width > im_w or py + height > im_h: + raise SyntaxError("APNG contains invalid frames") + self.im_info["bbox"] = (px, py, px + width, py + height) + delay_num, delay_den = i16(s[20:]), i16(s[22:]) + if delay_den == 0: + delay_den = 100 + self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 + self.im_info["disposal"] = i8(s[24]) + self.im_info["blend"] = i8(s[25]) + return s + + def chunk_fdAT(self, pos, length): + s = ImageFile._safe_read(self.fp, 4) + seq = i32(s) + if self._seq_num != seq - 1: + raise SyntaxError("APNG contains frame sequence errors") + self._seq_num = seq + return self.chunk_IDAT(pos + 4, length - 4) + + +# -------------------------------------------------------------------- +# PNG reader + + +def _accept(prefix): + return prefix[:8] == _MAGIC + + +## +# Image plugin for PNG images. + + +class PngImageFile(ImageFile.ImageFile): + + format = "PNG" + format_description = "Portable network graphics" + + def _open(self): + + if not _accept(self.fp.read(8)): + raise SyntaxError("not a PNG file") + self.__fp = self.fp + self.__frame = 0 + + # + # Parse headers up to the first IDAT or fDAT chunk + + self.png = PngStream(self.fp) + + while True: + + # + # get next chunk + + cid, pos, length = self.png.read() + + try: + s = self.png.call(cid, pos, length) + except EOFError: + break + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + s = ImageFile._safe_read(self.fp, length) + + self.png.crc(cid, s) + + # + # Copy relevant attributes from the PngStream. An alternative + # would be to let the PngStream class modify these attributes + # directly, but that introduces circular references which are + # difficult to break if things go wrong in the decoder... + # (believe me, I've tried ;-) + + self.mode = self.png.im_mode + self._size = self.png.im_size + self.info = self.png.im_info + self._text = None + self.tile = self.png.im_tile + self.custom_mimetype = self.png.im_custom_mimetype + self.n_frames = self.png.im_n_frames or 1 + self.default_image = self.info.get("default_image", False) + + if self.png.im_palette: + rawmode, data = self.png.im_palette + self.palette = ImagePalette.raw(rawmode, data) + + if cid == b"fdAT": + self.__prepare_idat = length - 4 + else: + self.__prepare_idat = length # used by load_prepare() + + if self.png.im_n_frames is not None: + self._close_exclusive_fp_after_loading = False + self.png.save_rewind() + self.__rewind_idat = self.__prepare_idat + self.__rewind = self.__fp.tell() + if self.default_image: + # IDAT chunk contains default image and not first animation frame + self.n_frames += 1 + self._seek(0) + self.is_animated = self.n_frames > 1 + + @property + def text(self): + # experimental + if self._text is None: + # iTxt, tEXt and zTXt chunks may appear at the end of the file + # So load the file to ensure that they are read + if self.is_animated: + frame = self.__frame + # for APNG, seek to the final frame before loading + self.seek(self.n_frames - 1) + self.load() + if self.is_animated: + self.seek(frame) + return self._text + + def verify(self): + """Verify PNG file""" + + if self.fp is None: + raise RuntimeError("verify must be called directly after open") + + # back up to beginning of IDAT block + self.fp.seek(self.tile[0][2] - 8) + + self.png.verify() + self.png.close() + + if self._exclusive_fp: + self.fp.close() + self.fp = None + + def seek(self, frame): + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0, True) + + last_frame = self.__frame + for f in range(self.__frame + 1, frame + 1): + try: + self._seek(f) + except EOFError as e: + self.seek(last_frame) + raise EOFError("no more images in APNG file") from e + + def _seek(self, frame, rewind=False): + if frame == 0: + if rewind: + self.__fp.seek(self.__rewind) + self.png.rewind() + self.__prepare_idat = self.__rewind_idat + self.im = None + if self.pyaccess: + self.pyaccess = None + self.info = self.png.im_info + self.tile = self.png.im_tile + self.fp = self.__fp + self._prev_im = None + self.dispose = None + self.default_image = self.info.get("default_image", False) + self.dispose_op = self.info.get("disposal") + self.blend_op = self.info.get("blend") + self.dispose_extent = self.info.get("bbox") + self.__frame = 0 + return + else: + if frame != self.__frame + 1: + raise ValueError("cannot seek to frame %d" % frame) + + # ensure previous frame was loaded + self.load() + + self.fp = self.__fp + + # advance to the next frame + if self.__prepare_idat: + ImageFile._safe_read(self.fp, self.__prepare_idat) + self.__prepare_idat = 0 + frame_start = False + while True: + self.fp.read(4) # CRC + + try: + cid, pos, length = self.png.read() + except (struct.error, SyntaxError): + break + + if cid == b"IEND": + raise EOFError("No more images in APNG file") + if cid == b"fcTL": + if frame_start: + # there must be at least one fdAT chunk between fcTL chunks + raise SyntaxError("APNG missing frame data") + frame_start = True + + try: + self.png.call(cid, pos, length) + except UnicodeDecodeError: + break + except EOFError: + if cid == b"fdAT": + length -= 4 + if frame_start: + self.__prepare_idat = length + break + ImageFile._safe_read(self.fp, length) + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + ImageFile._safe_read(self.fp, length) + + self.__frame = frame + self.tile = self.png.im_tile + self.dispose_op = self.info.get("disposal") + self.blend_op = self.info.get("blend") + self.dispose_extent = self.info.get("bbox") + + if not self.tile: + raise EOFError + + def tell(self): + return self.__frame + + def load_prepare(self): + """internal: prepare to read PNG file""" + + if self.info.get("interlace"): + self.decoderconfig = self.decoderconfig + (1,) + + self.__idat = self.__prepare_idat # used by load_read() + ImageFile.ImageFile.load_prepare(self) + + def load_read(self, read_bytes): + """internal: read more image data""" + + while self.__idat == 0: + # end of chunk, skip forward to next one + + self.fp.read(4) # CRC + + cid, pos, length = self.png.read() + + if cid not in [b"IDAT", b"DDAT", b"fdAT"]: + self.png.push(cid, pos, length) + return b"" + + if cid == b"fdAT": + try: + self.png.call(cid, pos, length) + except EOFError: + pass + self.__idat = length - 4 # sequence_num has already been read + else: + self.__idat = length # empty chunks are allowed + + # read more data from this chunk + if read_bytes <= 0: + read_bytes = self.__idat + else: + read_bytes = min(read_bytes, self.__idat) + + self.__idat = self.__idat - read_bytes + + return self.fp.read(read_bytes) + + def load_end(self): + """internal: finished reading image data""" + while True: + self.fp.read(4) # CRC + + try: + cid, pos, length = self.png.read() + except (struct.error, SyntaxError): + break + + if cid == b"IEND": + break + elif cid == b"fcTL" and self.is_animated: + # start of the next frame, stop reading + self.__prepare_idat = 0 + self.png.push(cid, pos, length) + break + + try: + self.png.call(cid, pos, length) + except UnicodeDecodeError: + break + except EOFError: + if cid == b"fdAT": + length -= 4 + ImageFile._safe_read(self.fp, length) + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + ImageFile._safe_read(self.fp, length) + self._text = self.png.im_text + if not self.is_animated: + self.png.close() + self.png = None + else: + # setup frame disposal (actual disposal done when needed in _seek()) + if self._prev_im is None and self.dispose_op == APNG_DISPOSE_OP_PREVIOUS: + self.dispose_op = APNG_DISPOSE_OP_BACKGROUND + + if self.dispose_op == APNG_DISPOSE_OP_PREVIOUS: + dispose = self._prev_im.copy() + dispose = self._crop(dispose, self.dispose_extent) + elif self.dispose_op == APNG_DISPOSE_OP_BACKGROUND: + dispose = Image.core.fill(self.im.mode, self.size) + dispose = self._crop(dispose, self.dispose_extent) + else: + dispose = None + + if self._prev_im and self.blend_op == APNG_BLEND_OP_OVER: + updated = self._crop(self.im, self.dispose_extent) + self._prev_im.paste( + updated, self.dispose_extent, updated.convert("RGBA") + ) + self.im = self._prev_im + if self.pyaccess: + self.pyaccess = None + self._prev_im = self.im.copy() + + if dispose: + self._prev_im.paste(dispose, self.dispose_extent) + + def _getexif(self): + if "exif" not in self.info: + self.load() + if "exif" not in self.info and "Raw profile type exif" not in self.info: + return None + return dict(self.getexif()) + + def getexif(self): + if "exif" not in self.info: + self.load() + + return super().getexif() + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + +# -------------------------------------------------------------------- +# PNG writer + +_OUTMODES = { + # supported PIL modes, and corresponding rawmodes/bits/color combinations + "1": ("1", b"\x01\x00"), + "L;1": ("L;1", b"\x01\x00"), + "L;2": ("L;2", b"\x02\x00"), + "L;4": ("L;4", b"\x04\x00"), + "L": ("L", b"\x08\x00"), + "LA": ("LA", b"\x08\x04"), + "I": ("I;16B", b"\x10\x00"), + "I;16": ("I;16B", b"\x10\x00"), + "P;1": ("P;1", b"\x01\x03"), + "P;2": ("P;2", b"\x02\x03"), + "P;4": ("P;4", b"\x04\x03"), + "P": ("P", b"\x08\x03"), + "RGB": ("RGB", b"\x08\x02"), + "RGBA": ("RGBA", b"\x08\x06"), +} + + +def putchunk(fp, cid, *data): + """Write a PNG chunk (including CRC field)""" + + data = b"".join(data) + + fp.write(o32(len(data)) + cid) + fp.write(data) + crc = _crc32(data, _crc32(cid)) + fp.write(o32(crc)) + + +class _idat: + # wrap output from the encoder in IDAT chunks + + def __init__(self, fp, chunk): + self.fp = fp + self.chunk = chunk + + def write(self, data): + self.chunk(self.fp, b"IDAT", data) + + +class _fdat: + # wrap encoder output in fdAT chunks + + def __init__(self, fp, chunk, seq_num): + self.fp = fp + self.chunk = chunk + self.seq_num = seq_num + + def write(self, data): + self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) + self.seq_num += 1 + + +def _write_multiple_frames(im, fp, chunk, rawmode): + default_image = im.encoderinfo.get("default_image", im.info.get("default_image")) + duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) + loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) + disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) + blend = im.encoderinfo.get("blend", im.info.get("blend")) + + if default_image: + chain = itertools.chain(im.encoderinfo.get("append_images", [])) + else: + chain = itertools.chain([im], im.encoderinfo.get("append_images", [])) + + im_frames = [] + frame_count = 0 + for im_seq in chain: + for im_frame in ImageSequence.Iterator(im_seq): + im_frame = im_frame.copy() + if im_frame.mode != im.mode: + if im.mode == "P": + im_frame = im_frame.convert(im.mode, palette=im.palette) + else: + im_frame = im_frame.convert(im.mode) + encoderinfo = im.encoderinfo.copy() + if isinstance(duration, (list, tuple)): + encoderinfo["duration"] = duration[frame_count] + if isinstance(disposal, (list, tuple)): + encoderinfo["disposal"] = disposal[frame_count] + if isinstance(blend, (list, tuple)): + encoderinfo["blend"] = blend[frame_count] + frame_count += 1 + + if im_frames: + previous = im_frames[-1] + prev_disposal = previous["encoderinfo"].get("disposal") + prev_blend = previous["encoderinfo"].get("blend") + if prev_disposal == APNG_DISPOSE_OP_PREVIOUS and len(im_frames) < 2: + prev_disposal = APNG_DISPOSE_OP_BACKGROUND + + if prev_disposal == APNG_DISPOSE_OP_BACKGROUND: + base_im = previous["im"] + dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) + bbox = previous["bbox"] + if bbox: + dispose = dispose.crop(bbox) + else: + bbox = (0, 0) + im.size + base_im.paste(dispose, bbox) + elif prev_disposal == APNG_DISPOSE_OP_PREVIOUS: + base_im = im_frames[-2]["im"] + else: + base_im = previous["im"] + delta = ImageChops.subtract_modulo( + im_frame.convert("RGB"), base_im.convert("RGB") + ) + bbox = delta.getbbox() + if ( + not bbox + and prev_disposal == encoderinfo.get("disposal") + and prev_blend == encoderinfo.get("blend") + ): + duration = encoderinfo.get("duration", 0) + if duration: + if "duration" in previous["encoderinfo"]: + previous["encoderinfo"]["duration"] += duration + else: + previous["encoderinfo"]["duration"] = duration + continue + else: + bbox = None + im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) + + # animation control + chunk( + fp, b"acTL", o32(len(im_frames)), o32(loop), # 0: num_frames # 4: num_plays + ) + + # default image IDAT (if it exists) + if default_image: + ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) + + seq_num = 0 + for frame, frame_data in enumerate(im_frames): + im_frame = frame_data["im"] + if not frame_data["bbox"]: + bbox = (0, 0) + im_frame.size + else: + bbox = frame_data["bbox"] + im_frame = im_frame.crop(bbox) + size = im_frame.size + duration = int(round(frame_data["encoderinfo"].get("duration", 0))) + disposal = frame_data["encoderinfo"].get("disposal", APNG_DISPOSE_OP_NONE) + blend = frame_data["encoderinfo"].get("blend", APNG_BLEND_OP_SOURCE) + # frame control + chunk( + fp, + b"fcTL", + o32(seq_num), # sequence_number + o32(size[0]), # width + o32(size[1]), # height + o32(bbox[0]), # x_offset + o32(bbox[1]), # y_offset + o16(duration), # delay_numerator + o16(1000), # delay_denominator + o8(disposal), # dispose_op + o8(blend), # blend_op + ) + seq_num += 1 + # frame data + if frame == 0 and not default_image: + # first frame must be in IDAT chunks for backwards compatibility + ImageFile._save( + im_frame, + _idat(fp, chunk), + [("zip", (0, 0) + im_frame.size, 0, rawmode)], + ) + else: + fdat_chunks = _fdat(fp, chunk, seq_num) + ImageFile._save( + im_frame, fdat_chunks, [("zip", (0, 0) + im_frame.size, 0, rawmode)], + ) + seq_num = fdat_chunks.seq_num + + +def _save_all(im, fp, filename): + _save(im, fp, filename, save_all=True) + + +def _save(im, fp, filename, chunk=putchunk, save_all=False): + # save an image to disk (called by the save method) + + mode = im.mode + + if mode == "P": + + # + # attempt to minimize storage requirements for palette images + if "bits" in im.encoderinfo: + # number of bits specified by user + colors = 1 << im.encoderinfo["bits"] + else: + # check palette contents + if im.palette: + colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 2) + else: + colors = 256 + + if colors <= 2: + bits = 1 + elif colors <= 4: + bits = 2 + elif colors <= 16: + bits = 4 + else: + bits = 8 + if bits != 8: + mode = "%s;%d" % (mode, bits) + + # encoder options + im.encoderconfig = ( + im.encoderinfo.get("optimize", False), + im.encoderinfo.get("compress_level", -1), + im.encoderinfo.get("compress_type", -1), + im.encoderinfo.get("dictionary", b""), + ) + + # get the corresponding PNG mode + try: + rawmode, mode = _OUTMODES[mode] + except KeyError as e: + raise OSError("cannot write mode %s as PNG" % mode) from e + + # + # write minimal PNG file + + fp.write(_MAGIC) + + chunk( + fp, + b"IHDR", + o32(im.size[0]), # 0: size + o32(im.size[1]), + mode, # 8: depth/type + b"\0", # 10: compression + b"\0", # 11: filter category + b"\0", # 12: interlace flag + ) + + chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] + + icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + # ICC profile + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + name = b"ICC Profile" + data = name + b"\0\0" + zlib.compress(icc) + chunk(fp, b"iCCP", data) + + # You must either have sRGB or iCCP. + # Disallow sRGB chunks when an iCCP-chunk has been emitted. + chunks.remove(b"sRGB") + + info = im.encoderinfo.get("pnginfo") + if info: + chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] + for cid, data in info.chunks: + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + elif cid in chunks_multiple_allowed: + chunk(fp, cid, data) + + if im.mode == "P": + palette_byte_number = (2 ** bits) * 3 + palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] + while len(palette_bytes) < palette_byte_number: + palette_bytes += b"\0" + chunk(fp, b"PLTE", palette_bytes) + + transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None)) + + if transparency or transparency == 0: + if im.mode == "P": + # limit to actual palette size + alpha_bytes = 2 ** bits + if isinstance(transparency, bytes): + chunk(fp, b"tRNS", transparency[:alpha_bytes]) + else: + transparency = max(0, min(255, transparency)) + alpha = b"\xFF" * transparency + b"\0" + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + elif im.mode in ("1", "L", "I"): + transparency = max(0, min(65535, transparency)) + chunk(fp, b"tRNS", o16(transparency)) + elif im.mode == "RGB": + red, green, blue = transparency + chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) + else: + if "transparency" in im.encoderinfo: + # don't bother with transparency if it's an RGBA + # and it's in the info dict. It's probably just stale. + raise OSError("cannot use transparency for this mode") + else: + if im.mode == "P" and im.im.getpalettemode() == "RGBA": + alpha = im.im.getpalette("RGBA", "A") + alpha_bytes = 2 ** bits + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + + dpi = im.encoderinfo.get("dpi") + if dpi: + chunk( + fp, + b"pHYs", + o32(int(dpi[0] / 0.0254 + 0.5)), + o32(int(dpi[1] / 0.0254 + 0.5)), + b"\x01", + ) + + if info: + chunks = [b"bKGD", b"hIST"] + for cid, data in info.chunks: + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + + exif = im.encoderinfo.get("exif", im.info.get("exif")) + if exif: + if isinstance(exif, Image.Exif): + exif = exif.tobytes(8) + if exif.startswith(b"Exif\x00\x00"): + exif = exif[6:] + chunk(fp, b"eXIf", exif) + + if save_all: + _write_multiple_frames(im, fp, chunk, rawmode) + else: + ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) + + chunk(fp, b"IEND", b"") + + if hasattr(fp, "flush"): + fp.flush() + + +# -------------------------------------------------------------------- +# PNG chunk converter + + +def getchunks(im, **params): + """Return a list of PNG chunks representing this image.""" + + class collector: + data = [] + + def write(self, data): + pass + + def append(self, chunk): + self.data.append(chunk) + + def append(fp, cid, *data): + data = b"".join(data) + crc = o32(_crc32(data, _crc32(cid))) + fp.append((cid, data, crc)) + + fp = collector() + + try: + im.encoderinfo = params + _save(im, fp, None, append) + finally: + del im.encoderinfo + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(PngImageFile.format, PngImageFile, _accept) +Image.register_save(PngImageFile.format, _save) +Image.register_save_all(PngImageFile.format, _save_all) + +Image.register_extensions(PngImageFile.format, [".png", ".apng"]) + +Image.register_mime(PngImageFile.format, "image/png") diff --git a/venv/Lib/site-packages/PIL/PpmImagePlugin.py b/venv/Lib/site-packages/PIL/PpmImagePlugin.py new file mode 100644 index 0000000..35a77ba --- /dev/null +++ b/venv/Lib/site-packages/PIL/PpmImagePlugin.py @@ -0,0 +1,164 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PPM support for PIL +# +# History: +# 96-03-24 fl Created +# 98-03-06 fl Write RGBA images (as RGB, that is) +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile + +# +# -------------------------------------------------------------------- + +b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" + +MODES = { + # standard + b"P4": "1", + b"P5": "L", + b"P6": "RGB", + # extensions + b"P0CMYK": "CMYK", + # PIL extensions (for test purposes only) + b"PyP": "P", + b"PyRGBA": "RGBA", + b"PyCMYK": "CMYK", +} + + +def _accept(prefix): + return prefix[0:1] == b"P" and prefix[1] in b"0456y" + + +## +# Image plugin for PBM, PGM, and PPM images. + + +class PpmImageFile(ImageFile.ImageFile): + + format = "PPM" + format_description = "Pbmplus image" + + def _token(self, s=b""): + while True: # read until next whitespace + c = self.fp.read(1) + if not c or c in b_whitespace: + break + if c > b"\x79": + raise ValueError("Expected ASCII value, found binary") + s = s + c + if len(s) > 9: + raise ValueError("Expected int, got > 9 digits") + return s + + def _open(self): + + # check magic + s = self.fp.read(1) + if s != b"P": + raise SyntaxError("not a PPM file") + magic_number = self._token(s) + mode = MODES[magic_number] + + self.custom_mimetype = { + b"P4": "image/x-portable-bitmap", + b"P5": "image/x-portable-graymap", + b"P6": "image/x-portable-pixmap", + }.get(magic_number) + + if mode == "1": + self.mode = "1" + rawmode = "1;I" + else: + self.mode = rawmode = mode + + for ix in range(3): + while True: + while True: + s = self.fp.read(1) + if s not in b_whitespace: + break + if s == b"": + raise ValueError("File does not extend beyond magic number") + if s != b"#": + break + s = self.fp.readline() + s = int(self._token(s)) + if ix == 0: + xsize = s + elif ix == 1: + ysize = s + if mode == "1": + break + elif ix == 2: + # maxgrey + if s > 255: + if not mode == "L": + raise ValueError("Too many colors for band: %s" % s) + if s < 2 ** 16: + self.mode = "I" + rawmode = "I;16B" + else: + self.mode = "I" + rawmode = "I;32B" + + self._size = xsize, ysize + self.tile = [("raw", (0, 0, xsize, ysize), self.fp.tell(), (rawmode, 0, 1))] + + +# +# -------------------------------------------------------------------- + + +def _save(im, fp, filename): + if im.mode == "1": + rawmode, head = "1;I", b"P4" + elif im.mode == "L": + rawmode, head = "L", b"P5" + elif im.mode == "I": + if im.getextrema()[1] < 2 ** 16: + rawmode, head = "I;16B", b"P5" + else: + rawmode, head = "I;32B", b"P5" + elif im.mode == "RGB": + rawmode, head = "RGB", b"P6" + elif im.mode == "RGBA": + rawmode, head = "RGB", b"P6" + else: + raise OSError("cannot write mode %s as PPM" % im.mode) + fp.write(head + ("\n%d %d\n" % im.size).encode("ascii")) + if head == b"P6": + fp.write(b"255\n") + if head == b"P5": + if rawmode == "L": + fp.write(b"255\n") + elif rawmode == "I;16B": + fp.write(b"65535\n") + elif rawmode == "I;32B": + fp.write(b"2147483648\n") + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) + + # ALTERNATIVE: save via builtin debug function + # im._dump(filename) + + +# +# -------------------------------------------------------------------- + + +Image.register_open(PpmImageFile.format, PpmImageFile, _accept) +Image.register_save(PpmImageFile.format, _save) + +Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm"]) + +Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/venv/Lib/site-packages/PIL/PsdImagePlugin.py b/venv/Lib/site-packages/PIL/PsdImagePlugin.py new file mode 100644 index 0000000..f019bb6 --- /dev/null +++ b/venv/Lib/site-packages/PIL/PsdImagePlugin.py @@ -0,0 +1,309 @@ +# +# The Python Imaging Library +# $Id$ +# +# Adobe PSD 2.5/3.0 file handling +# +# History: +# 1995-09-01 fl Created +# 1997-01-03 fl Read most PSD images +# 1997-01-18 fl Fixed P and CMYK support +# 2001-10-21 fl Added seek/tell support (for layers) +# +# Copyright (c) 1997-2001 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import io + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16be as i16, i32be as i32 + +MODES = { + # (photoshop mode, bits) -> (pil mode, required channels) + (0, 1): ("1", 1), + (0, 8): ("L", 1), + (1, 8): ("L", 1), + (2, 8): ("P", 1), + (3, 8): ("RGB", 3), + (4, 8): ("CMYK", 4), + (7, 8): ("L", 1), # FIXME: multilayer + (8, 8): ("L", 1), # duotone + (9, 8): ("LAB", 3), +} + + +# --------------------------------------------------------------------. +# read PSD images + + +def _accept(prefix): + return prefix[:4] == b"8BPS" + + +## +# Image plugin for Photoshop images. + + +class PsdImageFile(ImageFile.ImageFile): + + format = "PSD" + format_description = "Adobe Photoshop" + _close_exclusive_fp_after_loading = False + + def _open(self): + + read = self.fp.read + + # + # header + + s = read(26) + if not _accept(s) or i16(s[4:]) != 1: + raise SyntaxError("not a PSD file") + + psd_bits = i16(s[22:]) + psd_channels = i16(s[12:]) + psd_mode = i16(s[24:]) + + mode, channels = MODES[(psd_mode, psd_bits)] + + if channels > psd_channels: + raise OSError("not enough channels") + + self.mode = mode + self._size = i32(s[18:]), i32(s[14:]) + + # + # color mode data + + size = i32(read(4)) + if size: + data = read(size) + if mode == "P" and size == 768: + self.palette = ImagePalette.raw("RGB;L", data) + + # + # image resources + + self.resources = [] + + size = i32(read(4)) + if size: + # load resources + end = self.fp.tell() + size + while self.fp.tell() < end: + read(4) # signature + id = i16(read(2)) + name = read(i8(read(1))) + if not (len(name) & 1): + read(1) # padding + data = read(i32(read(4))) + if len(data) & 1: + read(1) # padding + self.resources.append((id, name, data)) + if id == 1039: # ICC profile + self.info["icc_profile"] = data + + # + # layer and mask information + + self.layers = [] + + size = i32(read(4)) + if size: + end = self.fp.tell() + size + size = i32(read(4)) + if size: + self.layers = _layerinfo(self.fp) + self.fp.seek(end) + self.n_frames = len(self.layers) + self.is_animated = self.n_frames > 1 + + # + # image descriptor + + self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) + + # keep the file open + self.__fp = self.fp + self.frame = 1 + self._min_frame = 1 + + def seek(self, layer): + if not self._seek_check(layer): + return + + # seek to given layer (1..max) + try: + name, mode, bbox, tile = self.layers[layer - 1] + self.mode = mode + self.tile = tile + self.frame = layer + self.fp = self.__fp + return name, bbox + except IndexError as e: + raise EOFError("no such layer") from e + + def tell(self): + # return layer number (0=image, 1..max=layers) + return self.frame + + def load_prepare(self): + # create image memory if necessary + if not self.im or self.im.mode != self.mode or self.im.size != self.size: + self.im = Image.core.fill(self.mode, self.size, 0) + # create palette (optional) + if self.mode == "P": + Image.Image.load(self) + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + +def _layerinfo(file): + # read layerinfo block + layers = [] + read = file.read + for i in range(abs(i16(read(2)))): + + # bounding box + y0 = i32(read(4)) + x0 = i32(read(4)) + y1 = i32(read(4)) + x1 = i32(read(4)) + + # image info + info = [] + mode = [] + types = list(range(i16(read(2)))) + if len(types) > 4: + continue + + for i in types: + type = i16(read(2)) + + if type == 65535: + m = "A" + else: + m = "RGBA"[type] + + mode.append(m) + size = i32(read(4)) + info.append((m, size)) + + # figure out the image mode + mode.sort() + if mode == ["R"]: + mode = "L" + elif mode == ["B", "G", "R"]: + mode = "RGB" + elif mode == ["A", "B", "G", "R"]: + mode = "RGBA" + else: + mode = None # unknown + + # skip over blend flags and extra information + read(12) # filler + name = "" + size = i32(read(4)) # length of the extra data field + combined = 0 + if size: + data_end = file.tell() + size + + length = i32(read(4)) + if length: + file.seek(length - 16, io.SEEK_CUR) + combined += length + 4 + + length = i32(read(4)) + if length: + file.seek(length, io.SEEK_CUR) + combined += length + 4 + + length = i8(read(1)) + if length: + # Don't know the proper encoding, + # Latin-1 should be a good guess + name = read(length).decode("latin-1", "replace") + combined += length + 1 + + file.seek(data_end) + layers.append((name, mode, (x0, y0, x1, y1))) + + # get tiles + i = 0 + for name, mode, bbox in layers: + tile = [] + for m in mode: + t = _maketile(file, m, bbox, 1) + if t: + tile.extend(t) + layers[i] = name, mode, bbox, tile + i += 1 + + return layers + + +def _maketile(file, mode, bbox, channels): + + tile = None + read = file.read + + compression = i16(read(2)) + + xsize = bbox[2] - bbox[0] + ysize = bbox[3] - bbox[1] + + offset = file.tell() + + if compression == 0: + # + # raw compression + tile = [] + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tile.append(("raw", bbox, offset, layer)) + offset = offset + xsize * ysize + + elif compression == 1: + # + # packbits compression + i = 0 + tile = [] + bytecount = read(channels * ysize * 2) + offset = file.tell() + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tile.append(("packbits", bbox, offset, layer)) + for y in range(ysize): + offset = offset + i16(bytecount[i : i + 2]) + i += 2 + + file.seek(offset) + + if offset & 1: + read(1) # padding + + return tile + + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PsdImageFile.format, PsdImageFile, _accept) + +Image.register_extension(PsdImageFile.format, ".psd") diff --git a/venv/Lib/site-packages/PIL/PyAccess.py b/venv/Lib/site-packages/PIL/PyAccess.py new file mode 100644 index 0000000..494f5f9 --- /dev/null +++ b/venv/Lib/site-packages/PIL/PyAccess.py @@ -0,0 +1,352 @@ +# +# The Python Imaging Library +# Pillow fork +# +# Python implementation of the PixelAccess Object +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# Copyright (c) 2013 Eric Soroos +# +# See the README file for information on usage and redistribution +# + +# Notes: +# +# * Implements the pixel access object following Access. +# * Does not implement the line functions, as they don't appear to be used +# * Taking only the tuple form, which is used from python. +# * Fill.c uses the integer form, but it's still going to use the old +# Access.c implementation. +# + +import logging +import sys + +try: + from cffi import FFI + + defs = """ + struct Pixel_RGBA { + unsigned char r,g,b,a; + }; + struct Pixel_I16 { + unsigned char l,r; + }; + """ + ffi = FFI() + ffi.cdef(defs) +except ImportError as ex: + # Allow error import for doc purposes, but error out when accessing + # anything in core. + from ._util import deferred_error + + FFI = ffi = deferred_error(ex) + +logger = logging.getLogger(__name__) + + +class PyAccess: + def __init__(self, img, readonly=False): + vals = dict(img.im.unsafe_ptrs) + self.readonly = readonly + self.image8 = ffi.cast("unsigned char **", vals["image8"]) + self.image32 = ffi.cast("int **", vals["image32"]) + self.image = ffi.cast("unsigned char **", vals["image"]) + self.xsize, self.ysize = img.im.size + + # Keep pointer to im object to prevent dereferencing. + self._im = img.im + if self._im.mode == "P": + self._palette = img.palette + + # Debugging is polluting test traces, only useful here + # when hacking on PyAccess + # logger.debug("%s", vals) + self._post_init() + + def _post_init(self): + pass + + def __setitem__(self, xy, color): + """ + Modifies the pixel at x,y. The color is given as a single + numerical value for single band images, and a tuple for + multi-band images + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :param color: The pixel value. + """ + if self.readonly: + raise ValueError("Attempt to putpixel a read only image") + (x, y) = xy + if x < 0: + x = self.xsize + x + if y < 0: + y = self.ysize + y + (x, y) = self.check_xy((x, y)) + + if ( + self._im.mode == "P" + and isinstance(color, (list, tuple)) + and len(color) in [3, 4] + ): + # RGB or RGBA value for a P image + color = self._palette.getcolor(color) + + return self.set_pixel(x, y, color) + + def __getitem__(self, xy): + """ + Returns the pixel at x,y. The pixel is returned as a single + value for single band images or a tuple for multiple band + images + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :returns: a pixel value for single band images, a tuple of + pixel values for multiband images. + """ + (x, y) = xy + if x < 0: + x = self.xsize + x + if y < 0: + y = self.ysize + y + (x, y) = self.check_xy((x, y)) + return self.get_pixel(x, y) + + putpixel = __setitem__ + getpixel = __getitem__ + + def check_xy(self, xy): + (x, y) = xy + if not (0 <= x < self.xsize and 0 <= y < self.ysize): + raise ValueError("pixel location out of range") + return xy + + +class _PyAccess32_2(PyAccess): + """ PA, LA, stored in first and last bytes of a 32 bit word """ + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return (pixel.r, pixel.a) + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.a = min(color[1], 255) + + +class _PyAccess32_3(PyAccess): + """ RGB and friends, stored in the first three bytes of a 32 bit word """ + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return (pixel.r, pixel.g, pixel.b) + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.g = min(color[1], 255) + pixel.b = min(color[2], 255) + pixel.a = 255 + + +class _PyAccess32_4(PyAccess): + """ RGBA etc, all 4 bytes of a 32 bit word """ + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return (pixel.r, pixel.g, pixel.b, pixel.a) + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.g = min(color[1], 255) + pixel.b = min(color[2], 255) + pixel.a = min(color[3], 255) + + +class _PyAccess8(PyAccess): + """ 1, L, P, 8 bit images stored as uint8 """ + + def _post_init(self, *args, **kwargs): + self.pixels = self.image8 + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # integer + self.pixels[y][x] = min(color, 255) + except TypeError: + # tuple + self.pixels[y][x] = min(color[0], 255) + + +class _PyAccessI16_N(PyAccess): + """ I;16 access, native bitendian without conversion """ + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("unsigned short **", self.image) + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # integer + self.pixels[y][x] = min(color, 65535) + except TypeError: + # tuple + self.pixels[y][x] = min(color[0], 65535) + + +class _PyAccessI16_L(PyAccess): + """ I;16L access, with conversion """ + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_I16 **", self.image) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return pixel.l + pixel.r * 256 + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + try: + color = min(color, 65535) + except TypeError: + color = min(color[0], 65535) + + pixel.l = color & 0xFF # noqa: E741 + pixel.r = color >> 8 + + +class _PyAccessI16_B(PyAccess): + """ I;16B access, with conversion """ + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_I16 **", self.image) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return pixel.l * 256 + pixel.r + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + try: + color = min(color, 65535) + except Exception: + color = min(color[0], 65535) + + pixel.l = color >> 8 # noqa: E741 + pixel.r = color & 0xFF + + +class _PyAccessI32_N(PyAccess): + """ Signed Int32 access, native endian """ + + def _post_init(self, *args, **kwargs): + self.pixels = self.image32 + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + self.pixels[y][x] = color + + +class _PyAccessI32_Swap(PyAccess): + """ I;32L/B access, with byteswapping conversion """ + + def _post_init(self, *args, **kwargs): + self.pixels = self.image32 + + def reverse(self, i): + orig = ffi.new("int *", i) + chars = ffi.cast("unsigned char *", orig) + chars[0], chars[1], chars[2], chars[3] = chars[3], chars[2], chars[1], chars[0] + return ffi.cast("int *", chars)[0] + + def get_pixel(self, x, y): + return self.reverse(self.pixels[y][x]) + + def set_pixel(self, x, y, color): + self.pixels[y][x] = self.reverse(color) + + +class _PyAccessF(PyAccess): + """ 32 bit float access """ + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("float **", self.image32) + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # not a tuple + self.pixels[y][x] = color + except TypeError: + # tuple + self.pixels[y][x] = color[0] + + +mode_map = { + "1": _PyAccess8, + "L": _PyAccess8, + "P": _PyAccess8, + "LA": _PyAccess32_2, + "La": _PyAccess32_2, + "PA": _PyAccess32_2, + "RGB": _PyAccess32_3, + "LAB": _PyAccess32_3, + "HSV": _PyAccess32_3, + "YCbCr": _PyAccess32_3, + "RGBA": _PyAccess32_4, + "RGBa": _PyAccess32_4, + "RGBX": _PyAccess32_4, + "CMYK": _PyAccess32_4, + "F": _PyAccessF, + "I": _PyAccessI32_N, +} + +if sys.byteorder == "little": + mode_map["I;16"] = _PyAccessI16_N + mode_map["I;16L"] = _PyAccessI16_N + mode_map["I;16B"] = _PyAccessI16_B + + mode_map["I;32L"] = _PyAccessI32_N + mode_map["I;32B"] = _PyAccessI32_Swap +else: + mode_map["I;16"] = _PyAccessI16_L + mode_map["I;16L"] = _PyAccessI16_L + mode_map["I;16B"] = _PyAccessI16_N + + mode_map["I;32L"] = _PyAccessI32_Swap + mode_map["I;32B"] = _PyAccessI32_N + + +def new(img, readonly=False): + access_type = mode_map.get(img.mode, None) + if not access_type: + logger.debug("PyAccess Not Implemented: %s", img.mode) + return None + return access_type(img, readonly) diff --git a/venv/Lib/site-packages/PIL/SgiImagePlugin.py b/venv/Lib/site-packages/PIL/SgiImagePlugin.py new file mode 100644 index 0000000..ec9855e --- /dev/null +++ b/venv/Lib/site-packages/PIL/SgiImagePlugin.py @@ -0,0 +1,230 @@ +# +# The Python Imaging Library. +# $Id$ +# +# SGI image file handling +# +# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. +# +# +# +# History: +# 2017-22-07 mb Add RLE decompression +# 2016-16-10 mb Add save method without compression +# 1995-09-10 fl Created +# +# Copyright (c) 2016 by Mickael Bonfill. +# Copyright (c) 2008 by Karsten Hiddemann. +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1995 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +import os +import struct + +from . import Image, ImageFile +from ._binary import i8, i16be as i16, o8 + + +def _accept(prefix): + return len(prefix) >= 2 and i16(prefix) == 474 + + +MODES = { + (1, 1, 1): "L", + (1, 2, 1): "L", + (2, 1, 1): "L;16B", + (2, 2, 1): "L;16B", + (1, 3, 3): "RGB", + (2, 3, 3): "RGB;16B", + (1, 3, 4): "RGBA", + (2, 3, 4): "RGBA;16B", +} + + +## +# Image plugin for SGI images. +class SgiImageFile(ImageFile.ImageFile): + + format = "SGI" + format_description = "SGI Image File Format" + + def _open(self): + + # HEAD + headlen = 512 + s = self.fp.read(headlen) + + if not _accept(s): + raise ValueError("Not an SGI image file") + + # compression : verbatim or RLE + compression = i8(s[2]) + + # bpc : 1 or 2 bytes (8bits or 16bits) + bpc = i8(s[3]) + + # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) + dimension = i16(s[4:]) + + # xsize : width + xsize = i16(s[6:]) + + # ysize : height + ysize = i16(s[8:]) + + # zsize : channels count + zsize = i16(s[10:]) + + # layout + layout = bpc, dimension, zsize + + # determine mode from bits/zsize + rawmode = "" + try: + rawmode = MODES[layout] + except KeyError: + pass + + if rawmode == "": + raise ValueError("Unsupported SGI image mode") + + self._size = xsize, ysize + self.mode = rawmode.split(";")[0] + if self.mode == "RGB": + self.custom_mimetype = "image/rgb" + + # orientation -1 : scanlines begins at the bottom-left corner + orientation = -1 + + # decoder info + if compression == 0: + pagesize = xsize * ysize * bpc + if bpc == 2: + self.tile = [ + ("SGI16", (0, 0) + self.size, headlen, (self.mode, 0, orientation)) + ] + else: + self.tile = [] + offset = headlen + for layer in self.mode: + self.tile.append( + ("raw", (0, 0) + self.size, offset, (layer, 0, orientation)) + ) + offset += pagesize + elif compression == 1: + self.tile = [ + ("sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc)) + ] + + +def _save(im, fp, filename): + if im.mode != "RGB" and im.mode != "RGBA" and im.mode != "L": + raise ValueError("Unsupported SGI image mode") + + # Get the keyword arguments + info = im.encoderinfo + + # Byte-per-pixel precision, 1 = 8bits per pixel + bpc = info.get("bpc", 1) + + if bpc not in (1, 2): + raise ValueError("Unsupported number of bytes per pixel") + + # Flip the image, since the origin of SGI file is the bottom-left corner + orientation = -1 + # Define the file as SGI File Format + magicNumber = 474 + # Run-Length Encoding Compression - Unsupported at this time + rle = 0 + + # Number of dimensions (x,y,z) + dim = 3 + # X Dimension = width / Y Dimension = height + x, y = im.size + if im.mode == "L" and y == 1: + dim = 1 + elif im.mode == "L": + dim = 2 + # Z Dimension: Number of channels + z = len(im.mode) + + if dim == 1 or dim == 2: + z = 1 + + # assert we've got the right number of bands. + if len(im.getbands()) != z: + raise ValueError( + "incorrect number of bands in SGI write: {} vs {}".format( + z, len(im.getbands()) + ) + ) + + # Minimum Byte value + pinmin = 0 + # Maximum Byte value (255 = 8bits per pixel) + pinmax = 255 + # Image name (79 characters max, truncated below in write) + imgName = os.path.splitext(os.path.basename(filename))[0] + imgName = imgName.encode("ascii", "ignore") + # Standard representation of pixel in the file + colormap = 0 + fp.write(struct.pack(">h", magicNumber)) + fp.write(o8(rle)) + fp.write(o8(bpc)) + fp.write(struct.pack(">H", dim)) + fp.write(struct.pack(">H", x)) + fp.write(struct.pack(">H", y)) + fp.write(struct.pack(">H", z)) + fp.write(struct.pack(">l", pinmin)) + fp.write(struct.pack(">l", pinmax)) + fp.write(struct.pack("4s", b"")) # dummy + fp.write(struct.pack("79s", imgName)) # truncates to 79 chars + fp.write(struct.pack("s", b"")) # force null byte after imgname + fp.write(struct.pack(">l", colormap)) + fp.write(struct.pack("404s", b"")) # dummy + + rawmode = "L" + if bpc == 2: + rawmode = "L;16B" + + for channel in im.split(): + fp.write(channel.tobytes("raw", rawmode, 0, orientation)) + + fp.close() + + +class SGI16Decoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer): + rawmode, stride, orientation = self.args + pagesize = self.state.xsize * self.state.ysize + zsize = len(self.mode) + self.fd.seek(512) + + for band in range(zsize): + channel = Image.new("L", (self.state.xsize, self.state.ysize)) + channel.frombytes( + self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation + ) + self.im.putband(channel.im, band) + + return -1, 0 + + +# +# registry + + +Image.register_decoder("SGI16", SGI16Decoder) +Image.register_open(SgiImageFile.format, SgiImageFile, _accept) +Image.register_save(SgiImageFile.format, _save) +Image.register_mime(SgiImageFile.format, "image/sgi") + +Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) + +# End of file diff --git a/venv/Lib/site-packages/PIL/SpiderImagePlugin.py b/venv/Lib/site-packages/PIL/SpiderImagePlugin.py new file mode 100644 index 0000000..56aac29 --- /dev/null +++ b/venv/Lib/site-packages/PIL/SpiderImagePlugin.py @@ -0,0 +1,324 @@ +# +# The Python Imaging Library. +# +# SPIDER image file handling +# +# History: +# 2004-08-02 Created BB +# 2006-03-02 added save method +# 2006-03-13 added support for stack images +# +# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. +# Copyright (c) 2004 by William Baxter. +# Copyright (c) 2004 by Secret Labs AB. +# Copyright (c) 2004 by Fredrik Lundh. +# + +## +# Image plugin for the Spider image format. This format is is used +# by the SPIDER software, in processing image data from electron +# microscopy and tomography. +## + +# +# SpiderImagePlugin.py +# +# The Spider image format is used by SPIDER software, in processing +# image data from electron microscopy and tomography. +# +# Spider home page: +# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html +# +# Details about the Spider image format: +# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html +# +import os +import struct +import sys + +from PIL import Image, ImageFile + + +def isInt(f): + try: + i = int(f) + if f - i == 0: + return 1 + else: + return 0 + except (ValueError, OverflowError): + return 0 + + +iforms = [1, 3, -11, -12, -21, -22] + + +# There is no magic number to identify Spider files, so just check a +# series of header locations to see if they have reasonable values. +# Returns no. of bytes in the header, if it is a valid Spider header, +# otherwise returns 0 + + +def isSpiderHeader(t): + h = (99,) + t # add 1 value so can use spider header index start=1 + # header values 1,2,5,12,13,22,23 should be integers + for i in [1, 2, 5, 12, 13, 22, 23]: + if not isInt(h[i]): + return 0 + # check iform + iform = int(h[5]) + if iform not in iforms: + return 0 + # check other header values + labrec = int(h[13]) # no. records in file header + labbyt = int(h[22]) # total no. of bytes in header + lenbyt = int(h[23]) # record length in bytes + if labbyt != (labrec * lenbyt): + return 0 + # looks like a valid header + return labbyt + + +def isSpiderImage(filename): + with open(filename, "rb") as fp: + f = fp.read(92) # read 23 * 4 bytes + t = struct.unpack(">23f", f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + t = struct.unpack("<23f", f) # little-endian + hdrlen = isSpiderHeader(t) + return hdrlen + + +class SpiderImageFile(ImageFile.ImageFile): + + format = "SPIDER" + format_description = "Spider 2D image" + _close_exclusive_fp_after_loading = False + + def _open(self): + # check header + n = 27 * 4 # read 27 float values + f = self.fp.read(n) + + try: + self.bigendian = 1 + t = struct.unpack(">27f", f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + self.bigendian = 0 + t = struct.unpack("<27f", f) # little-endian + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + raise SyntaxError("not a valid Spider file") + except struct.error as e: + raise SyntaxError("not a valid Spider file") from e + + h = (99,) + t # add 1 value : spider header index starts at 1 + iform = int(h[5]) + if iform != 1: + raise SyntaxError("not a Spider 2D image") + + self._size = int(h[12]), int(h[2]) # size in pixels (width, height) + self.istack = int(h[24]) + self.imgnumber = int(h[27]) + + if self.istack == 0 and self.imgnumber == 0: + # stk=0, img=0: a regular 2D image + offset = hdrlen + self._nimages = 1 + elif self.istack > 0 and self.imgnumber == 0: + # stk>0, img=0: Opening the stack for the first time + self.imgbytes = int(h[12]) * int(h[2]) * 4 + self.hdrlen = hdrlen + self._nimages = int(h[26]) + # Point to the first image in the stack + offset = hdrlen * 2 + self.imgnumber = 1 + elif self.istack == 0 and self.imgnumber > 0: + # stk=0, img>0: an image within the stack + offset = hdrlen + self.stkoffset + self.istack = 2 # So Image knows it's still a stack + else: + raise SyntaxError("inconsistent stack header values") + + if self.bigendian: + self.rawmode = "F;32BF" + else: + self.rawmode = "F;32F" + self.mode = "F" + + self.tile = [("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1))] + self.__fp = self.fp # FIXME: hack + + @property + def n_frames(self): + return self._nimages + + @property + def is_animated(self): + return self._nimages > 1 + + # 1st image index is zero (although SPIDER imgnumber starts at 1) + def tell(self): + if self.imgnumber < 1: + return 0 + else: + return self.imgnumber - 1 + + def seek(self, frame): + if self.istack == 0: + raise EOFError("attempt to seek in a non-stack file") + if not self._seek_check(frame): + return + self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) + self.fp = self.__fp + self.fp.seek(self.stkoffset) + self._open() + + # returns a byte image after rescaling to 0..255 + def convert2byte(self, depth=255): + (minimum, maximum) = self.getextrema() + m = 1 + if maximum != minimum: + m = depth / (maximum - minimum) + b = -m * minimum + return self.point(lambda i, m=m, b=b: i * m + b).convert("L") + + # returns a ImageTk.PhotoImage object, after rescaling to 0..255 + def tkPhotoImage(self): + from PIL import ImageTk + + return ImageTk.PhotoImage(self.convert2byte(), palette=256) + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + +# -------------------------------------------------------------------- +# Image series + +# given a list of filenames, return a list of images +def loadImageSeries(filelist=None): + """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" + if filelist is None or len(filelist) < 1: + return + + imglist = [] + for img in filelist: + if not os.path.exists(img): + print("unable to find %s" % img) + continue + try: + with Image.open(img) as im: + im = im.convert2byte() + except Exception: + if not isSpiderImage(img): + print(img + " is not a Spider image file") + continue + im.info["filename"] = img + imglist.append(im) + return imglist + + +# -------------------------------------------------------------------- +# For saving images in Spider format + + +def makeSpiderHeader(im): + nsam, nrow = im.size + lenbyt = nsam * 4 # There are labrec records in the header + labrec = int(1024 / lenbyt) + if 1024 % lenbyt != 0: + labrec += 1 + labbyt = labrec * lenbyt + hdr = [] + nvalues = int(labbyt / 4) + for i in range(nvalues): + hdr.append(0.0) + + if len(hdr) < 23: + return [] + + # NB these are Fortran indices + hdr[1] = 1.0 # nslice (=1 for an image) + hdr[2] = float(nrow) # number of rows per slice + hdr[5] = 1.0 # iform for 2D image + hdr[12] = float(nsam) # number of pixels per line + hdr[13] = float(labrec) # number of records in file header + hdr[22] = float(labbyt) # total number of bytes in header + hdr[23] = float(lenbyt) # record length in bytes + + # adjust for Fortran indexing + hdr = hdr[1:] + hdr.append(0.0) + # pack binary data into a string + hdrstr = [] + for v in hdr: + hdrstr.append(struct.pack("f", v)) + return hdrstr + + +def _save(im, fp, filename): + if im.mode[0] != "F": + im = im.convert("F") + + hdr = makeSpiderHeader(im) + if len(hdr) < 256: + raise OSError("Error creating Spider header") + + # write the SPIDER header + fp.writelines(hdr) + + rawmode = "F;32NF" # 32-bit native floating point + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) + + +def _save_spider(im, fp, filename): + # get the filename extension and register it with Image + ext = os.path.splitext(filename)[1] + Image.register_extension(SpiderImageFile.format, ext) + _save(im, fp, filename) + + +# -------------------------------------------------------------------- + + +Image.register_open(SpiderImageFile.format, SpiderImageFile) +Image.register_save(SpiderImageFile.format, _save_spider) + +if __name__ == "__main__": + + if len(sys.argv) < 2: + print("Syntax: python SpiderImagePlugin.py [infile] [outfile]") + sys.exit() + + filename = sys.argv[1] + if not isSpiderImage(filename): + print("input image must be in Spider format") + sys.exit() + + with Image.open(filename) as im: + print("image: " + str(im)) + print("format: " + str(im.format)) + print("size: " + str(im.size)) + print("mode: " + str(im.mode)) + print("max, min: ", end=" ") + print(im.getextrema()) + + if len(sys.argv) > 2: + outfile = sys.argv[2] + + # perform some image operation + im = im.transpose(Image.FLIP_LEFT_RIGHT) + print( + "saving a flipped version of %s as %s " + % (os.path.basename(filename), outfile) + ) + im.save(outfile, SpiderImageFile.format) diff --git a/venv/Lib/site-packages/PIL/SunImagePlugin.py b/venv/Lib/site-packages/PIL/SunImagePlugin.py new file mode 100644 index 0000000..d998842 --- /dev/null +++ b/venv/Lib/site-packages/PIL/SunImagePlugin.py @@ -0,0 +1,136 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Sun image file handling +# +# History: +# 1995-09-10 fl Created +# 1996-05-28 fl Fixed 32-bit alignment +# 1998-12-29 fl Import ImagePalette module +# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995-1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i32be as i32 + + +def _accept(prefix): + return len(prefix) >= 4 and i32(prefix) == 0x59A66A95 + + +## +# Image plugin for Sun raster files. + + +class SunImageFile(ImageFile.ImageFile): + + format = "SUN" + format_description = "Sun Raster File" + + def _open(self): + + # The Sun Raster file header is 32 bytes in length + # and has the following format: + + # typedef struct _SunRaster + # { + # DWORD MagicNumber; /* Magic (identification) number */ + # DWORD Width; /* Width of image in pixels */ + # DWORD Height; /* Height of image in pixels */ + # DWORD Depth; /* Number of bits per pixel */ + # DWORD Length; /* Size of image data in bytes */ + # DWORD Type; /* Type of raster file */ + # DWORD ColorMapType; /* Type of color map */ + # DWORD ColorMapLength; /* Size of the color map in bytes */ + # } SUNRASTER; + + # HEAD + s = self.fp.read(32) + if not _accept(s): + raise SyntaxError("not an SUN raster file") + + offset = 32 + + self._size = i32(s[4:8]), i32(s[8:12]) + + depth = i32(s[12:16]) + # data_length = i32(s[16:20]) # unreliable, ignore. + file_type = i32(s[20:24]) + palette_type = i32(s[24:28]) # 0: None, 1: RGB, 2: Raw/arbitrary + palette_length = i32(s[28:32]) + + if depth == 1: + self.mode, rawmode = "1", "1;I" + elif depth == 4: + self.mode, rawmode = "L", "L;4" + elif depth == 8: + self.mode = rawmode = "L" + elif depth == 24: + if file_type == 3: + self.mode, rawmode = "RGB", "RGB" + else: + self.mode, rawmode = "RGB", "BGR" + elif depth == 32: + if file_type == 3: + self.mode, rawmode = "RGB", "RGBX" + else: + self.mode, rawmode = "RGB", "BGRX" + else: + raise SyntaxError("Unsupported Mode/Bit Depth") + + if palette_length: + if palette_length > 1024: + raise SyntaxError("Unsupported Color Palette Length") + + if palette_type != 1: + raise SyntaxError("Unsupported Palette Type") + + offset = offset + palette_length + self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) + if self.mode == "L": + self.mode = "P" + rawmode = rawmode.replace("L", "P") + + # 16 bit boundaries on stride + stride = ((self.size[0] * depth + 15) // 16) * 2 + + # file type: Type is the version (or flavor) of the bitmap + # file. The following values are typically found in the Type + # field: + # 0000h Old + # 0001h Standard + # 0002h Byte-encoded + # 0003h RGB format + # 0004h TIFF format + # 0005h IFF format + # FFFFh Experimental + + # Old and standard are the same, except for the length tag. + # byte-encoded is run-length-encoded + # RGB looks similar to standard, but RGB byte order + # TIFF and IFF mean that they were converted from T/IFF + # Experimental means that it's something else. + # (https://www.fileformat.info/format/sunraster/egff.htm) + + if file_type in (0, 1, 3, 4, 5): + self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride))] + elif file_type == 2: + self.tile = [("sun_rle", (0, 0) + self.size, offset, rawmode)] + else: + raise SyntaxError("Unsupported Sun Raster file type") + + +# +# registry + + +Image.register_open(SunImageFile.format, SunImageFile, _accept) + +Image.register_extension(SunImageFile.format, ".ras") diff --git a/venv/Lib/site-packages/PIL/TarIO.py b/venv/Lib/site-packages/PIL/TarIO.py new file mode 100644 index 0000000..d108362 --- /dev/null +++ b/venv/Lib/site-packages/PIL/TarIO.py @@ -0,0 +1,65 @@ +# +# The Python Imaging Library. +# $Id$ +# +# read files from within a tar file +# +# History: +# 95-06-18 fl Created +# 96-05-28 fl Open files in binary mode +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-96. +# +# See the README file for information on usage and redistribution. +# + +import io + +from . import ContainerIO + + +class TarIO(ContainerIO.ContainerIO): + """A file object that provides read access to a given member of a TAR file.""" + + def __init__(self, tarfile, file): + """ + Create file object. + + :param tarfile: Name of TAR file. + :param file: Name of member file. + """ + self.fh = open(tarfile, "rb") + + while True: + + s = self.fh.read(512) + if len(s) != 512: + raise OSError("unexpected end of tar file") + + name = s[:100].decode("utf-8") + i = name.find("\0") + if i == 0: + raise OSError("cannot find subfile") + if i > 0: + name = name[:i] + + size = int(s[124:135], 8) + + if file == name: + break + + self.fh.seek((size + 511) & (~511), io.SEEK_CUR) + + # Open region + super().__init__(self.fh, self.fh.tell(), size) + + # Context manager support + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + self.fh.close() diff --git a/venv/Lib/site-packages/PIL/TgaImagePlugin.py b/venv/Lib/site-packages/PIL/TgaImagePlugin.py new file mode 100644 index 0000000..566f0ac --- /dev/null +++ b/venv/Lib/site-packages/PIL/TgaImagePlugin.py @@ -0,0 +1,246 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TGA file handling +# +# History: +# 95-09-01 fl created (reads 24-bit files only) +# 97-01-04 fl support more TGA versions, including compressed images +# 98-07-04 fl fixed orientation and alpha layer bugs +# 98-09-11 fl fixed orientation for runlength decoder +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# + + +import warnings + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, o8, o16le as o16 + +# +# -------------------------------------------------------------------- +# Read RGA file + + +MODES = { + # map imagetype/depth to rawmode + (1, 8): "P", + (3, 1): "1", + (3, 8): "L", + (3, 16): "LA", + (2, 16): "BGR;5", + (2, 24): "BGR", + (2, 32): "BGRA", +} + + +## +# Image plugin for Targa files. + + +class TgaImageFile(ImageFile.ImageFile): + + format = "TGA" + format_description = "Targa" + + def _open(self): + + # process header + s = self.fp.read(18) + + id_len = i8(s[0]) + + colormaptype = i8(s[1]) + imagetype = i8(s[2]) + + depth = i8(s[16]) + + flags = i8(s[17]) + + self._size = i16(s[12:]), i16(s[14:]) + + # validate header fields + if ( + colormaptype not in (0, 1) + or self.size[0] <= 0 + or self.size[1] <= 0 + or depth not in (1, 8, 16, 24, 32) + ): + raise SyntaxError("not a TGA file") + + # image mode + if imagetype in (3, 11): + self.mode = "L" + if depth == 1: + self.mode = "1" # ??? + elif depth == 16: + self.mode = "LA" + elif imagetype in (1, 9): + self.mode = "P" + elif imagetype in (2, 10): + self.mode = "RGB" + if depth == 32: + self.mode = "RGBA" + else: + raise SyntaxError("unknown TGA mode") + + # orientation + orientation = flags & 0x30 + if orientation == 0x20: + orientation = 1 + elif not orientation: + orientation = -1 + else: + raise SyntaxError("unknown TGA orientation") + + self.info["orientation"] = orientation + + if imagetype & 8: + self.info["compression"] = "tga_rle" + + if id_len: + self.info["id_section"] = self.fp.read(id_len) + + if colormaptype: + # read palette + start, size, mapdepth = i16(s[3:]), i16(s[5:]), i16(s[7:]) + if mapdepth == 16: + self.palette = ImagePalette.raw( + "BGR;16", b"\0" * 2 * start + self.fp.read(2 * size) + ) + elif mapdepth == 24: + self.palette = ImagePalette.raw( + "BGR", b"\0" * 3 * start + self.fp.read(3 * size) + ) + elif mapdepth == 32: + self.palette = ImagePalette.raw( + "BGRA", b"\0" * 4 * start + self.fp.read(4 * size) + ) + + # setup tile descriptor + try: + rawmode = MODES[(imagetype & 7, depth)] + if imagetype & 8: + # compressed + self.tile = [ + ( + "tga_rle", + (0, 0) + self.size, + self.fp.tell(), + (rawmode, orientation, depth), + ) + ] + else: + self.tile = [ + ( + "raw", + (0, 0) + self.size, + self.fp.tell(), + (rawmode, 0, orientation), + ) + ] + except KeyError: + pass # cannot decode + + +# +# -------------------------------------------------------------------- +# Write TGA file + + +SAVE = { + "1": ("1", 1, 0, 3), + "L": ("L", 8, 0, 3), + "LA": ("LA", 16, 0, 3), + "P": ("P", 8, 1, 1), + "RGB": ("BGR", 24, 0, 2), + "RGBA": ("BGRA", 32, 0, 2), +} + + +def _save(im, fp, filename): + + try: + rawmode, bits, colormaptype, imagetype = SAVE[im.mode] + except KeyError as e: + raise OSError("cannot write mode %s as TGA" % im.mode) from e + + if "rle" in im.encoderinfo: + rle = im.encoderinfo["rle"] + else: + compression = im.encoderinfo.get("compression", im.info.get("compression")) + rle = compression == "tga_rle" + if rle: + imagetype += 8 + + id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) + id_len = len(id_section) + if id_len > 255: + id_len = 255 + id_section = id_section[:255] + warnings.warn("id_section has been trimmed to 255 characters") + + if colormaptype: + colormapfirst, colormaplength, colormapentry = 0, 256, 24 + else: + colormapfirst, colormaplength, colormapentry = 0, 0, 0 + + if im.mode in ("LA", "RGBA"): + flags = 8 + else: + flags = 0 + + orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) + if orientation > 0: + flags = flags | 0x20 + + fp.write( + o8(id_len) + + o8(colormaptype) + + o8(imagetype) + + o16(colormapfirst) + + o16(colormaplength) + + o8(colormapentry) + + o16(0) + + o16(0) + + o16(im.size[0]) + + o16(im.size[1]) + + o8(bits) + + o8(flags) + ) + + if id_section: + fp.write(id_section) + + if colormaptype: + fp.write(im.im.getpalette("RGB", "BGR")) + + if rle: + ImageFile._save( + im, fp, [("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))] + ) + else: + ImageFile._save( + im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))] + ) + + # write targa version 2 footer + fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(TgaImageFile.format, TgaImageFile) +Image.register_save(TgaImageFile.format, _save) + +Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) + +Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/venv/Lib/site-packages/PIL/TiffImagePlugin.py b/venv/Lib/site-packages/PIL/TiffImagePlugin.py new file mode 100644 index 0000000..73e9a27 --- /dev/null +++ b/venv/Lib/site-packages/PIL/TiffImagePlugin.py @@ -0,0 +1,1891 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF file handling +# +# TIFF is a flexible, if somewhat aged, image file format originally +# defined by Aldus. Although TIFF supports a wide variety of pixel +# layouts and compression methods, the name doesn't really stand for +# "thousands of incompatible file formats," it just feels that way. +# +# To read TIFF data from a stream, the stream must be seekable. For +# progressive decoding, make sure to use TIFF files where the tag +# directory is placed first in the file. +# +# History: +# 1995-09-01 fl Created +# 1996-05-04 fl Handle JPEGTABLES tag +# 1996-05-18 fl Fixed COLORMAP support +# 1997-01-05 fl Fixed PREDICTOR support +# 1997-08-27 fl Added support for rational tags (from Perry Stoll) +# 1998-01-10 fl Fixed seek/tell (from Jan Blom) +# 1998-07-15 fl Use private names for internal variables +# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) +# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) +# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) +# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) +# 2001-12-18 fl Added workaround for broken Matrox library +# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) +# 2003-05-19 fl Check FILLORDER tag +# 2003-09-26 fl Added RGBa support +# 2004-02-24 fl Added DPI support; fixed rational write support +# 2005-02-07 fl Added workaround for broken Corel Draw 10 files +# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) +# +# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +import io +import itertools +import logging +import os +import struct +import warnings +from collections.abc import MutableMapping +from fractions import Fraction +from numbers import Number, Rational + +from . import Image, ImageFile, ImagePalette, TiffTags +from ._binary import i8, o8 +from .TiffTags import TYPES + +logger = logging.getLogger(__name__) + +# Set these to true to force use of libtiff for reading or writing. +READ_LIBTIFF = False +WRITE_LIBTIFF = False +IFD_LEGACY_API = True + +II = b"II" # little-endian (Intel style) +MM = b"MM" # big-endian (Motorola style) + +# +# -------------------------------------------------------------------- +# Read TIFF files + +# a few tag names, just to make the code below a bit more readable +IMAGEWIDTH = 256 +IMAGELENGTH = 257 +BITSPERSAMPLE = 258 +COMPRESSION = 259 +PHOTOMETRIC_INTERPRETATION = 262 +FILLORDER = 266 +IMAGEDESCRIPTION = 270 +STRIPOFFSETS = 273 +SAMPLESPERPIXEL = 277 +ROWSPERSTRIP = 278 +STRIPBYTECOUNTS = 279 +X_RESOLUTION = 282 +Y_RESOLUTION = 283 +PLANAR_CONFIGURATION = 284 +RESOLUTION_UNIT = 296 +TRANSFERFUNCTION = 301 +SOFTWARE = 305 +DATE_TIME = 306 +ARTIST = 315 +PREDICTOR = 317 +COLORMAP = 320 +TILEOFFSETS = 324 +EXTRASAMPLES = 338 +SAMPLEFORMAT = 339 +JPEGTABLES = 347 +REFERENCEBLACKWHITE = 532 +COPYRIGHT = 33432 +IPTC_NAA_CHUNK = 33723 # newsphoto properties +PHOTOSHOP_CHUNK = 34377 # photoshop properties +ICCPROFILE = 34675 +EXIFIFD = 34665 +XMP = 700 +JPEGQUALITY = 65537 # pseudo-tag by libtiff + +# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java +IMAGEJ_META_DATA_BYTE_COUNTS = 50838 +IMAGEJ_META_DATA = 50839 + +COMPRESSION_INFO = { + # Compression => pil compression name + 1: "raw", + 2: "tiff_ccitt", + 3: "group3", + 4: "group4", + 5: "tiff_lzw", + 6: "tiff_jpeg", # obsolete + 7: "jpeg", + 8: "tiff_adobe_deflate", + 32771: "tiff_raw_16", # 16-bit padding + 32773: "packbits", + 32809: "tiff_thunderscan", + 32946: "tiff_deflate", + 34676: "tiff_sgilog", + 34677: "tiff_sgilog24", + 34925: "lzma", + 50000: "zstd", + 50001: "webp", +} + +COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} + +OPEN_INFO = { + # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, + # ExtraSamples) => mode, rawmode + (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (II, 1, (1,), 1, (1,), ()): ("1", "1"), + (MM, 1, (1,), 1, (1,), ()): ("1", "1"), + (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (II, 1, (1,), 1, (8,), ()): ("L", "L"), + (MM, 1, (1,), 1, (8,), ()): ("L", "L"), + (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), + (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), + (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), + (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), + (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), + (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), + (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), + (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), + (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), + (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), + (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (II, 3, (1,), 1, (8,), ()): ("P", "P"), + (MM, 3, (1,), 1, (8,), ()): ("P", "P"), + (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"), + # JPEG compressed images handled by LibTiff and auto-converted to RGBX + # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel + (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), + (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), + (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), + (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), +} + +PREFIXES = [ + b"MM\x00\x2A", # Valid TIFF header with big-endian byte order + b"II\x2A\x00", # Valid TIFF header with little-endian byte order + b"MM\x2A\x00", # Invalid TIFF header, assume big-endian + b"II\x00\x2A", # Invalid TIFF header, assume little-endian +] + + +def _accept(prefix): + return prefix[:4] in PREFIXES + + +def _limit_rational(val, max_val): + inv = abs(val) > 1 + n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) + return n_d[::-1] if inv else n_d + + +def _limit_signed_rational(val, max_val, min_val): + frac = Fraction(val) + n_d = frac.numerator, frac.denominator + + if min(n_d) < min_val: + n_d = _limit_rational(val, abs(min_val)) + + if max(n_d) > max_val: + val = Fraction(*n_d) + n_d = _limit_rational(val, max_val) + + return n_d + + +## +# Wrapper for TIFF IFDs. + +_load_dispatch = {} +_write_dispatch = {} + + +class IFDRational(Rational): + """ Implements a rational class where 0/0 is a legal value to match + the in the wild use of exif rationals. + + e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used + """ + + """ If the denominator is 0, store this as a float('nan'), otherwise store + as a fractions.Fraction(). Delegate as appropriate + + """ + + __slots__ = ("_numerator", "_denominator", "_val") + + def __init__(self, value, denominator=1): + """ + :param value: either an integer numerator, a + float/rational/other number, or an IFDRational + :param denominator: Optional integer denominator + """ + if isinstance(value, IFDRational): + self._numerator = value.numerator + self._denominator = value.denominator + self._val = value._val + return + + if isinstance(value, Fraction): + self._numerator = value.numerator + self._denominator = value.denominator + else: + self._numerator = value + self._denominator = denominator + + if denominator == 0: + self._val = float("nan") + elif denominator == 1: + self._val = Fraction(value) + else: + self._val = Fraction(value, denominator) + + @property + def numerator(a): + return a._numerator + + @property + def denominator(a): + return a._denominator + + def limit_rational(self, max_denominator): + """ + + :param max_denominator: Integer, the maximum denominator value + :returns: Tuple of (numerator, denominator) + """ + + if self.denominator == 0: + return (self.numerator, self.denominator) + + f = self._val.limit_denominator(max_denominator) + return (f.numerator, f.denominator) + + def __repr__(self): + return str(float(self._val)) + + def __hash__(self): + return self._val.__hash__() + + def __eq__(self, other): + return self._val == other + + def _delegate(op): + def delegate(self, *args): + return getattr(self._val, op)(*args) + + return delegate + + """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul', + 'truediv', 'rtruediv', 'floordiv', 'rfloordiv', + 'mod','rmod', 'pow','rpow', 'pos', 'neg', + 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool', + 'ceil', 'floor', 'round'] + print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) + """ + + __add__ = _delegate("__add__") + __radd__ = _delegate("__radd__") + __sub__ = _delegate("__sub__") + __rsub__ = _delegate("__rsub__") + __mul__ = _delegate("__mul__") + __rmul__ = _delegate("__rmul__") + __truediv__ = _delegate("__truediv__") + __rtruediv__ = _delegate("__rtruediv__") + __floordiv__ = _delegate("__floordiv__") + __rfloordiv__ = _delegate("__rfloordiv__") + __mod__ = _delegate("__mod__") + __rmod__ = _delegate("__rmod__") + __pow__ = _delegate("__pow__") + __rpow__ = _delegate("__rpow__") + __pos__ = _delegate("__pos__") + __neg__ = _delegate("__neg__") + __abs__ = _delegate("__abs__") + __trunc__ = _delegate("__trunc__") + __lt__ = _delegate("__lt__") + __gt__ = _delegate("__gt__") + __le__ = _delegate("__le__") + __ge__ = _delegate("__ge__") + __bool__ = _delegate("__bool__") + __ceil__ = _delegate("__ceil__") + __floor__ = _delegate("__floor__") + __round__ = _delegate("__round__") + + +class ImageFileDirectory_v2(MutableMapping): + """This class represents a TIFF tag directory. To speed things up, we + don't decode tags unless they're asked for. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v2() + ifd[key] = 'Some Data' + ifd.tagtype[key] = TiffTags.ASCII + print(ifd[key]) + 'Some Data' + + Individual values are returned as the strings or numbers, sequences are + returned as tuples of the values. + + The tiff metadata type of each item is stored in a dictionary of + tag types in + `~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types + are read from a tiff file, guessed from the type added, or added + manually. + + Data Structures: + + * self.tagtype = {} + + * Key: numerical tiff tag number + * Value: integer corresponding to the data type from + ~PIL.TiffTags.TYPES` + + .. versionadded:: 3.0.0 + """ + + """ + Documentation: + + 'internal' data structures: + * self._tags_v2 = {} Key: numerical tiff tag number + Value: decoded data, as tuple for multiple values + * self._tagdata = {} Key: numerical tiff tag number + Value: undecoded byte string from file + * self._tags_v1 = {} Key: numerical tiff tag number + Value: decoded data in the v1 format + + Tags will be found in the private attributes self._tagdata, and in + self._tags_v2 once decoded. + + Self.legacy_api is a value for internal use, and shouldn't be + changed from outside code. In cooperation with the + ImageFileDirectory_v1 class, if legacy_api is true, then decoded + tags will be populated into both _tags_v1 and _tags_v2. _Tags_v2 + will be used if this IFD is used in the TIFF save routine. Tags + should be read from tags_v1 if legacy_api == true. + + """ + + def __init__(self, ifh=b"II\052\0\0\0\0\0", prefix=None): + """Initialize an ImageFileDirectory. + + To construct an ImageFileDirectory from a real file, pass the 8-byte + magic header to the constructor. To only set the endianness, pass it + as the 'prefix' keyword argument. + + :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets + endianness. + :param prefix: Override the endianness of the file. + """ + if ifh[:4] not in PREFIXES: + raise SyntaxError("not a TIFF file (header %r not valid)" % ifh) + self._prefix = prefix if prefix is not None else ifh[:2] + if self._prefix == MM: + self._endian = ">" + elif self._prefix == II: + self._endian = "<" + else: + raise SyntaxError("not a TIFF IFD") + self.reset() + (self.next,) = self._unpack("L", ifh[4:]) + self._legacy_api = False + + prefix = property(lambda self: self._prefix) + offset = property(lambda self: self._offset) + legacy_api = property(lambda self: self._legacy_api) + + @legacy_api.setter + def legacy_api(self, value): + raise Exception("Not allowing setting of legacy api") + + def reset(self): + self._tags_v1 = {} # will remain empty if legacy_api is false + self._tags_v2 = {} # main tag storage + self._tagdata = {} + self.tagtype = {} # added 2008-06-05 by Florian Hoech + self._next = None + self._offset = None + + def __str__(self): + return str(dict(self)) + + def named(self): + """ + :returns: dict of name|key: value + + Returns the complete tag dictionary, with named tags where possible. + """ + return {TiffTags.lookup(code).name: value for code, value in self.items()} + + def __len__(self): + return len(set(self._tagdata) | set(self._tags_v2)) + + def __getitem__(self, tag): + if tag not in self._tags_v2: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + self[tag] = handler(self, data, self.legacy_api) # check type + val = self._tags_v2[tag] + if self.legacy_api and not isinstance(val, (tuple, bytes)): + val = (val,) + return val + + def __contains__(self, tag): + return tag in self._tags_v2 or tag in self._tagdata + + def __setitem__(self, tag, value): + self._setitem(tag, value, self.legacy_api) + + def _setitem(self, tag, value, legacy_api): + basetypes = (Number, bytes, str) + + info = TiffTags.lookup(tag) + values = [value] if isinstance(value, basetypes) else value + + if tag not in self.tagtype: + if info.type: + self.tagtype[tag] = info.type + else: + self.tagtype[tag] = TiffTags.UNDEFINED + if all(isinstance(v, IFDRational) for v in values): + self.tagtype[tag] = ( + TiffTags.RATIONAL + if all(v >= 0 for v in values) + else TiffTags.SIGNED_RATIONAL + ) + elif all(isinstance(v, int) for v in values): + if all(0 <= v < 2 ** 16 for v in values): + self.tagtype[tag] = TiffTags.SHORT + elif all(-(2 ** 15) < v < 2 ** 15 for v in values): + self.tagtype[tag] = TiffTags.SIGNED_SHORT + else: + self.tagtype[tag] = ( + TiffTags.LONG + if all(v >= 0 for v in values) + else TiffTags.SIGNED_LONG + ) + elif all(isinstance(v, float) for v in values): + self.tagtype[tag] = TiffTags.DOUBLE + elif all(isinstance(v, str) for v in values): + self.tagtype[tag] = TiffTags.ASCII + elif all(isinstance(v, bytes) for v in values): + self.tagtype[tag] = TiffTags.BYTE + + if self.tagtype[tag] == TiffTags.UNDEFINED: + values = [ + value.encode("ascii", "replace") if isinstance(value, str) else value + ] + elif self.tagtype[tag] == TiffTags.RATIONAL: + values = [float(v) if isinstance(v, int) else v for v in values] + + values = tuple(info.cvt_enum(value) for value in values) + + dest = self._tags_v1 if legacy_api else self._tags_v2 + + # Three branches: + # Spec'd length == 1, Actual length 1, store as element + # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. + # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. + # Don't mess with the legacy api, since it's frozen. + if ( + (info.length == 1) + or self.tagtype[tag] == TiffTags.BYTE + or (info.length is None and len(values) == 1 and not legacy_api) + ): + # Don't mess with the legacy api, since it's frozen. + if legacy_api and self.tagtype[tag] in [ + TiffTags.RATIONAL, + TiffTags.SIGNED_RATIONAL, + ]: # rationals + values = (values,) + try: + (dest[tag],) = values + except ValueError: + # We've got a builtin tag with 1 expected entry + warnings.warn( + "Metadata Warning, tag %s had too many entries: %s, expected 1" + % (tag, len(values)) + ) + dest[tag] = values[0] + + else: + # Spec'd length > 1 or undefined + # Unspec'd, and length > 1 + dest[tag] = values + + def __delitem__(self, tag): + self._tags_v2.pop(tag, None) + self._tags_v1.pop(tag, None) + self._tagdata.pop(tag, None) + + def __iter__(self): + return iter(set(self._tagdata) | set(self._tags_v2)) + + def _unpack(self, fmt, data): + return struct.unpack(self._endian + fmt, data) + + def _pack(self, fmt, *values): + return struct.pack(self._endian + fmt, *values) + + def _register_loader(idx, size): + def decorator(func): + from .TiffTags import TYPES + + if func.__name__.startswith("load_"): + TYPES[idx] = func.__name__[5:].replace("_", " ") + _load_dispatch[idx] = size, func # noqa: F821 + return func + + return decorator + + def _register_writer(idx): + def decorator(func): + _write_dispatch[idx] = func # noqa: F821 + return func + + return decorator + + def _register_basic(idx_fmt_name): + from .TiffTags import TYPES + + idx, fmt, name = idx_fmt_name + TYPES[idx] = name + size = struct.calcsize("=" + fmt) + _load_dispatch[idx] = ( # noqa: F821 + size, + lambda self, data, legacy_api=True: ( + self._unpack("{}{}".format(len(data) // size, fmt), data) + ), + ) + _write_dispatch[idx] = lambda self, *values: ( # noqa: F821 + b"".join(self._pack(fmt, value) for value in values) + ) + + list( + map( + _register_basic, + [ + (TiffTags.SHORT, "H", "short"), + (TiffTags.LONG, "L", "long"), + (TiffTags.SIGNED_BYTE, "b", "signed byte"), + (TiffTags.SIGNED_SHORT, "h", "signed short"), + (TiffTags.SIGNED_LONG, "l", "signed long"), + (TiffTags.FLOAT, "f", "float"), + (TiffTags.DOUBLE, "d", "double"), + ], + ) + ) + + @_register_loader(1, 1) # Basic type, except for the legacy API. + def load_byte(self, data, legacy_api=True): + return data + + @_register_writer(1) # Basic type, except for the legacy API. + def write_byte(self, data): + return data + + @_register_loader(2, 1) + def load_string(self, data, legacy_api=True): + if data.endswith(b"\0"): + data = data[:-1] + return data.decode("latin-1", "replace") + + @_register_writer(2) + def write_string(self, value): + # remerge of https://github.com/python-pillow/Pillow/pull/1416 + return b"" + value.encode("ascii", "replace") + b"\0" + + @_register_loader(5, 8) + def load_rational(self, data, legacy_api=True): + vals = self._unpack("{}L".format(len(data) // 4), data) + + def combine(a, b): + return (a, b) if legacy_api else IFDRational(a, b) + + return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(5) + def write_rational(self, *values): + return b"".join( + self._pack("2L", *_limit_rational(frac, 2 ** 32 - 1)) for frac in values + ) + + @_register_loader(7, 1) + def load_undefined(self, data, legacy_api=True): + return data + + @_register_writer(7) + def write_undefined(self, value): + return value + + @_register_loader(10, 8) + def load_signed_rational(self, data, legacy_api=True): + vals = self._unpack("{}l".format(len(data) // 4), data) + + def combine(a, b): + return (a, b) if legacy_api else IFDRational(a, b) + + return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(10) + def write_signed_rational(self, *values): + return b"".join( + self._pack("2l", *_limit_signed_rational(frac, 2 ** 31 - 1, -(2 ** 31))) + for frac in values + ) + + def _ensure_read(self, fp, size): + ret = fp.read(size) + if len(ret) != size: + raise OSError( + "Corrupt EXIF data. " + + "Expecting to read %d bytes but only got %d. " % (size, len(ret)) + ) + return ret + + def load(self, fp): + + self.reset() + self._offset = fp.tell() + + try: + for i in range(self._unpack("H", self._ensure_read(fp, 2))[0]): + tag, typ, count, data = self._unpack("HHL4s", self._ensure_read(fp, 12)) + + tagname = TiffTags.lookup(tag).name + typname = TYPES.get(typ, "unknown") + msg = "tag: %s (%d) - type: %s (%d)" % (tagname, tag, typname, typ) + + try: + unit_size, handler = self._load_dispatch[typ] + except KeyError: + logger.debug(msg + " - unsupported type {}".format(typ)) + continue # ignore unsupported type + size = count * unit_size + if size > 4: + here = fp.tell() + (offset,) = self._unpack("L", data) + msg += " Tag Location: {} - Data Location: {}".format(here, offset) + fp.seek(offset) + data = ImageFile._safe_read(fp, size) + fp.seek(here) + else: + data = data[:size] + + if len(data) != size: + warnings.warn( + "Possibly corrupt EXIF data. " + "Expecting to read %d bytes but only got %d." + " Skipping tag %s" % (size, len(data), tag) + ) + logger.debug(msg) + continue + + if not data: + logger.debug(msg) + continue + + self._tagdata[tag] = data + self.tagtype[tag] = typ + + msg += " - value: " + ( + "" % size if size > 32 else str(data) + ) + logger.debug(msg) + + (self.next,) = self._unpack("L", self._ensure_read(fp, 4)) + except OSError as msg: + warnings.warn(str(msg)) + return + + def tobytes(self, offset=0): + # FIXME What about tagdata? + result = self._pack("H", len(self._tags_v2)) + + entries = [] + offset = offset + len(result) + len(self._tags_v2) * 12 + 4 + stripoffsets = None + + # pass 1: convert tags to binary format + # always write tags in ascending order + for tag, value in sorted(self._tags_v2.items()): + if tag == STRIPOFFSETS: + stripoffsets = len(entries) + typ = self.tagtype.get(tag) + logger.debug("Tag {}, Type: {}, Value: {}".format(tag, typ, value)) + values = value if isinstance(value, tuple) else (value,) + data = self._write_dispatch[typ](self, *values) + + tagname = TiffTags.lookup(tag).name + typname = TYPES.get(typ, "unknown") + msg = "save: %s (%d) - type: %s (%d)" % (tagname, tag, typname, typ) + msg += " - value: " + ( + "" % len(data) if len(data) >= 16 else str(values) + ) + logger.debug(msg) + + # count is sum of lengths for string and arbitrary data + if typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]: + count = len(data) + else: + count = len(values) + # figure out if data fits into the entry + if len(data) <= 4: + entries.append((tag, typ, count, data.ljust(4, b"\0"), b"")) + else: + entries.append((tag, typ, count, self._pack("L", offset), data)) + offset += (len(data) + 1) // 2 * 2 # pad to word + + # update strip offset data to point beyond auxiliary data + if stripoffsets is not None: + tag, typ, count, value, data = entries[stripoffsets] + if data: + raise NotImplementedError("multistrip support not yet implemented") + value = self._pack("L", self._unpack("L", value)[0] + offset) + entries[stripoffsets] = tag, typ, count, value, data + + # pass 2: write entries to file + for tag, typ, count, value, data in entries: + logger.debug( + "{} {} {} {} {}".format(tag, typ, count, repr(value), repr(data)) + ) + result += self._pack("HHL4s", tag, typ, count, value) + + # -- overwrite here for multi-page -- + result += b"\0\0\0\0" # end of entries + + # pass 3: write auxiliary data to file + for tag, typ, count, value, data in entries: + result += data + if len(data) & 1: + result += b"\0" + + return result + + def save(self, fp): + + if fp.tell() == 0: # skip TIFF header on subsequent pages + # tiff header -- PIL always starts the first IFD at offset 8 + fp.write(self._prefix + self._pack("HL", 42, 8)) + + offset = fp.tell() + result = self.tobytes(offset) + fp.write(result) + return offset + len(result) + + +ImageFileDirectory_v2._load_dispatch = _load_dispatch +ImageFileDirectory_v2._write_dispatch = _write_dispatch +for idx, name in TYPES.items(): + name = name.replace(" ", "_") + setattr(ImageFileDirectory_v2, "load_" + name, _load_dispatch[idx][1]) + setattr(ImageFileDirectory_v2, "write_" + name, _write_dispatch[idx]) +del _load_dispatch, _write_dispatch, idx, name + + +# Legacy ImageFileDirectory support. +class ImageFileDirectory_v1(ImageFileDirectory_v2): + """This class represents the **legacy** interface to a TIFF tag directory. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v1() + ifd[key] = 'Some Data' + ifd.tagtype[key] = TiffTags.ASCII + print(ifd[key]) + ('Some Data',) + + Also contains a dictionary of tag types as read from the tiff image file, + `~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. + + Values are returned as a tuple. + + .. deprecated:: 3.0.0 + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._legacy_api = True + + tags = property(lambda self: self._tags_v1) + tagdata = property(lambda self: self._tagdata) + + @classmethod + def from_v2(cls, original): + """ Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + + """ + + ifd = cls(prefix=original.prefix) + ifd._tagdata = original._tagdata + ifd.tagtype = original.tagtype + ifd.next = original.next # an indicator for multipage tiffs + return ifd + + def to_v2(self): + """ Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + + """ + + ifd = ImageFileDirectory_v2(prefix=self.prefix) + ifd._tagdata = dict(self._tagdata) + ifd.tagtype = dict(self.tagtype) + ifd._tags_v2 = dict(self._tags_v2) + return ifd + + def __contains__(self, tag): + return tag in self._tags_v1 or tag in self._tagdata + + def __len__(self): + return len(set(self._tagdata) | set(self._tags_v1)) + + def __iter__(self): + return iter(set(self._tagdata) | set(self._tags_v1)) + + def __setitem__(self, tag, value): + for legacy_api in (False, True): + self._setitem(tag, value, legacy_api) + + def __getitem__(self, tag): + if tag not in self._tags_v1: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + for legacy in (False, True): + self._setitem(tag, handler(self, data, legacy), legacy) + val = self._tags_v1[tag] + if not isinstance(val, (tuple, bytes)): + val = (val,) + return val + + +# undone -- switch this pointer when IFD_LEGACY_API == False +ImageFileDirectory = ImageFileDirectory_v1 + + +## +# Image plugin for TIFF files. + + +class TiffImageFile(ImageFile.ImageFile): + + format = "TIFF" + format_description = "Adobe TIFF" + _close_exclusive_fp_after_loading = False + + def _open(self): + """Open the first image in a TIFF file""" + + # Header + ifh = self.fp.read(8) + + # image file directory (tag dictionary) + self.tag_v2 = ImageFileDirectory_v2(ifh) + + # legacy tag/ifd entries will be filled in later + self.tag = self.ifd = None + + # setup frame pointers + self.__first = self.__next = self.tag_v2.next + self.__frame = -1 + self.__fp = self.fp + self._frame_pos = [] + self._n_frames = None + + logger.debug("*** TiffImageFile._open ***") + logger.debug("- __first: {}".format(self.__first)) + logger.debug("- ifh: {}".format(ifh)) + + # and load the first frame + self._seek(0) + + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + self._seek(len(self._frame_pos)) + while self._n_frames is None: + self._seek(self.tell() + 1) + self.seek(current) + return self._n_frames + + def seek(self, frame): + """Select a given frame as current image""" + if not self._seek_check(frame): + return + self._seek(frame) + # Create a new core image object on second and + # subsequent frames in the image. Image may be + # different size/mode. + Image._decompression_bomb_check(self.size) + self.im = Image.core.new(self.mode, self.size) + + def _seek(self, frame): + self.fp = self.__fp + while len(self._frame_pos) <= frame: + if not self.__next: + raise EOFError("no more images in TIFF file") + logger.debug( + "Seeking to frame %s, on frame %s, __next %s, location: %s" + % (frame, self.__frame, self.__next, self.fp.tell()) + ) + # reset buffered io handle in case fp + # was passed to libtiff, invalidating the buffer + self.fp.tell() + self.fp.seek(self.__next) + self._frame_pos.append(self.__next) + logger.debug("Loading tags, location: %s" % self.fp.tell()) + self.tag_v2.load(self.fp) + self.__next = self.tag_v2.next + if self.__next == 0: + self._n_frames = frame + 1 + if len(self._frame_pos) == 1: + self.is_animated = self.__next != 0 + self.__frame += 1 + self.fp.seek(self._frame_pos[frame]) + self.tag_v2.load(self.fp) + # fill the legacy tag/ifd entries + self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) + self.__frame = frame + self._setup() + + def tell(self): + """Return the current frame number""" + return self.__frame + + def load(self): + if self.tile and self.use_load_libtiff: + return self._load_libtiff() + return super().load() + + def load_end(self): + if self._tile_orientation: + method = { + 2: Image.FLIP_LEFT_RIGHT, + 3: Image.ROTATE_180, + 4: Image.FLIP_TOP_BOTTOM, + 5: Image.TRANSPOSE, + 6: Image.ROTATE_270, + 7: Image.TRANSVERSE, + 8: Image.ROTATE_90, + }.get(self._tile_orientation) + if method is not None: + self.im = self.im.transpose(method) + self._size = self.im.size + + # allow closing if we're on the first frame, there's no next + # This is the ImageFile.load path only, libtiff specific below. + if not self.is_animated: + self._close_exclusive_fp_after_loading = True + + def _load_libtiff(self): + """ Overload method triggered when we detect a compressed tiff + Calls out to libtiff """ + + Image.Image.load(self) + + self.load_prepare() + + if not len(self.tile) == 1: + raise OSError("Not exactly one tile") + + # (self._compression, (extents tuple), + # 0, (rawmode, self._compression, fp)) + extents = self.tile[0][1] + args = list(self.tile[0][3]) + + # To be nice on memory footprint, if there's a + # file descriptor, use that instead of reading + # into a string in python. + # libtiff closes the file descriptor, so pass in a dup. + try: + fp = hasattr(self.fp, "fileno") and os.dup(self.fp.fileno()) + # flush the file descriptor, prevents error on pypy 2.4+ + # should also eliminate the need for fp.tell + # in _seek + if hasattr(self.fp, "flush"): + self.fp.flush() + except OSError: + # io.BytesIO have a fileno, but returns an OSError if + # it doesn't use a file descriptor. + fp = False + + if fp: + args[2] = fp + + decoder = Image._getdecoder( + self.mode, "libtiff", tuple(args), self.decoderconfig + ) + try: + decoder.setimage(self.im, extents) + except ValueError as e: + raise OSError("Couldn't set the image") from e + + close_self_fp = self._exclusive_fp and not self.is_animated + if hasattr(self.fp, "getvalue"): + # We've got a stringio like thing passed in. Yay for all in memory. + # The decoder needs the entire file in one shot, so there's not + # a lot we can do here other than give it the entire file. + # unless we could do something like get the address of the + # underlying string for stringio. + # + # Rearranging for supporting byteio items, since they have a fileno + # that returns an OSError if there's no underlying fp. Easier to + # deal with here by reordering. + logger.debug("have getvalue. just sending in a string from getvalue") + n, err = decoder.decode(self.fp.getvalue()) + elif fp: + # we've got a actual file on disk, pass in the fp. + logger.debug("have fileno, calling fileno version of the decoder.") + if not close_self_fp: + self.fp.seek(0) + # 4 bytes, otherwise the trace might error out + n, err = decoder.decode(b"fpfp") + else: + # we have something else. + logger.debug("don't have fileno or getvalue. just reading") + self.fp.seek(0) + # UNDONE -- so much for that buffer size thing. + n, err = decoder.decode(self.fp.read()) + + self.tile = [] + self.readonly = 0 + + self.load_end() + + # libtiff closed the fp in a, we need to close self.fp, if possible + if close_self_fp: + self.fp.close() + self.fp = None # might be shared + + if err < 0: + raise OSError(err) + + return Image.Image.load(self) + + def _setup(self): + """Setup this image object based on current tags""" + + if 0xBC01 in self.tag_v2: + raise OSError("Windows Media Photo files not yet supported") + + # extract relevant tags + self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] + self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) + + # photometric is a required tag, but not everyone is reading + # the specification + photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) + + # old style jpeg compression images most certainly are YCbCr + if self._compression == "tiff_jpeg": + photo = 6 + + fillorder = self.tag_v2.get(FILLORDER, 1) + + logger.debug("*** Summary ***") + logger.debug("- compression: {}".format(self._compression)) + logger.debug("- photometric_interpretation: {}".format(photo)) + logger.debug("- planar_configuration: {}".format(self._planar_configuration)) + logger.debug("- fill_order: {}".format(fillorder)) + logger.debug("- YCbCr subsampling: {}".format(self.tag.get(530))) + + # size + xsize = int(self.tag_v2.get(IMAGEWIDTH)) + ysize = int(self.tag_v2.get(IMAGELENGTH)) + self._size = xsize, ysize + + logger.debug("- size: {}".format(self.size)) + + sampleFormat = self.tag_v2.get(SAMPLEFORMAT, (1,)) + if len(sampleFormat) > 1 and max(sampleFormat) == min(sampleFormat) == 1: + # SAMPLEFORMAT is properly per band, so an RGB image will + # be (1,1,1). But, we don't support per band pixel types, + # and anything more than one band is a uint8. So, just + # take the first element. Revisit this if adding support + # for more exotic images. + sampleFormat = (1,) + + bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) + extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) + if photo in (2, 6, 8): # RGB, YCbCr, LAB + bps_count = 3 + elif photo == 5: # CMYK + bps_count = 4 + else: + bps_count = 1 + bps_count += len(extra_tuple) + # Some files have only one value in bps_tuple, + # while should have more. Fix it + if bps_count > len(bps_tuple) and len(bps_tuple) == 1: + bps_tuple = bps_tuple * bps_count + + # mode: check photometric interpretation and bits per pixel + key = ( + self.tag_v2.prefix, + photo, + sampleFormat, + fillorder, + bps_tuple, + extra_tuple, + ) + logger.debug("format key: {}".format(key)) + try: + self.mode, rawmode = OPEN_INFO[key] + except KeyError as e: + logger.debug("- unsupported format") + raise SyntaxError("unknown pixel mode") from e + + logger.debug("- raw mode: {}".format(rawmode)) + logger.debug("- pil mode: {}".format(self.mode)) + + self.info["compression"] = self._compression + + xres = self.tag_v2.get(X_RESOLUTION, 1) + yres = self.tag_v2.get(Y_RESOLUTION, 1) + + if xres and yres: + resunit = self.tag_v2.get(RESOLUTION_UNIT) + if resunit == 2: # dots per inch + self.info["dpi"] = int(xres + 0.5), int(yres + 0.5) + elif resunit == 3: # dots per centimeter. convert to dpi + self.info["dpi"] = int(xres * 2.54 + 0.5), int(yres * 2.54 + 0.5) + elif resunit is None: # used to default to 1, but now 2) + self.info["dpi"] = int(xres + 0.5), int(yres + 0.5) + # For backward compatibility, + # we also preserve the old behavior + self.info["resolution"] = xres, yres + else: # No absolute unit of measurement + self.info["resolution"] = xres, yres + + # build tile descriptors + x = y = layer = 0 + self.tile = [] + self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw" + if self.use_load_libtiff: + # Decoder expects entire file as one tile. + # There's a buffer size limit in load (64k) + # so large g4 images will fail if we use that + # function. + # + # Setup the one tile for the whole image, then + # use the _load_libtiff function. + + # libtiff handles the fillmode for us, so 1;IR should + # actually be 1;I. Including the R double reverses the + # bits, so stripes of the image are reversed. See + # https://github.com/python-pillow/Pillow/issues/279 + if fillorder == 2: + # Replace fillorder with fillorder=1 + key = key[:3] + (1,) + key[4:] + logger.debug("format key: {}".format(key)) + # this should always work, since all the + # fillorder==2 modes have a corresponding + # fillorder=1 mode + self.mode, rawmode = OPEN_INFO[key] + # libtiff always returns the bytes in native order. + # we're expecting image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if rawmode == "I;16": + rawmode = "I;16N" + if ";16B" in rawmode: + rawmode = rawmode.replace(";16B", ";16N") + if ";16L" in rawmode: + rawmode = rawmode.replace(";16L", ";16N") + + # Offset in the tile tuple is 0, we go from 0,0 to + # w,h, and we only do this once -- eds + a = (rawmode, self._compression, False, self.tag_v2.offset) + self.tile.append(("libtiff", (0, 0, xsize, ysize), 0, a)) + + elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: + # striped image + if STRIPOFFSETS in self.tag_v2: + offsets = self.tag_v2[STRIPOFFSETS] + h = self.tag_v2.get(ROWSPERSTRIP, ysize) + w = self.size[0] + else: + # tiled image + offsets = self.tag_v2[TILEOFFSETS] + w = self.tag_v2.get(322) + h = self.tag_v2.get(323) + + for offset in offsets: + if x + w > xsize: + stride = w * sum(bps_tuple) / 8 # bytes per line + else: + stride = 0 + + tile_rawmode = rawmode + if self._planar_configuration == 2: + # each band on it's own layer + tile_rawmode = rawmode[layer] + # adjust stride width accordingly + stride /= bps_count + + a = (tile_rawmode, int(stride), 1) + self.tile.append( + ( + self._compression, + (x, y, min(x + w, xsize), min(y + h, ysize)), + offset, + a, + ) + ) + x = x + w + if x >= self.size[0]: + x, y = 0, y + h + if y >= self.size[1]: + x = y = 0 + layer += 1 + else: + logger.debug("- unsupported data organization") + raise SyntaxError("unknown data organization") + + # Fix up info. + if ICCPROFILE in self.tag_v2: + self.info["icc_profile"] = self.tag_v2[ICCPROFILE] + + # fixup palette descriptor + + if self.mode in ["P", "PA"]: + palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] + self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) + + self._tile_orientation = self.tag_v2.get(0x0112) + + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + + +# +# -------------------------------------------------------------------- +# Write TIFF files + +# little endian is default except for image modes with +# explicit big endian byte-order + +SAVE_INFO = { + # mode => rawmode, byteorder, photometrics, + # sampleformat, bitspersample, extra + "1": ("1", II, 1, 1, (1,), None), + "L": ("L", II, 1, 1, (8,), None), + "LA": ("LA", II, 1, 1, (8, 8), 2), + "P": ("P", II, 3, 1, (8,), None), + "PA": ("PA", II, 3, 1, (8, 8), 2), + "I": ("I;32S", II, 1, 2, (32,), None), + "I;16": ("I;16", II, 1, 1, (16,), None), + "I;16S": ("I;16S", II, 1, 2, (16,), None), + "F": ("F;32F", II, 1, 3, (32,), None), + "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), + "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), + "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), + "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), + "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), + "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), + "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), + "I;16B": ("I;16B", MM, 1, 1, (16,), None), + "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), + "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), +} + + +def _save(im, fp, filename): + + try: + rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] + except KeyError as e: + raise OSError("cannot write mode %s as TIFF" % im.mode) from e + + ifd = ImageFileDirectory_v2(prefix=prefix) + + compression = im.encoderinfo.get("compression", im.info.get("compression")) + if compression is None: + compression = "raw" + elif compression == "tiff_jpeg": + # OJPEG is obsolete, so use new-style JPEG compression instead + compression = "jpeg" + + libtiff = WRITE_LIBTIFF or compression != "raw" + + # required for color libtiff images + ifd[PLANAR_CONFIGURATION] = getattr(im, "_planar_configuration", 1) + + ifd[IMAGEWIDTH] = im.size[0] + ifd[IMAGELENGTH] = im.size[1] + + # write any arbitrary tags passed in as an ImageFileDirectory + info = im.encoderinfo.get("tiffinfo", {}) + logger.debug("Tiffinfo Keys: %s" % list(info)) + if isinstance(info, ImageFileDirectory_v1): + info = info.to_v2() + for key in info: + ifd[key] = info.get(key) + try: + ifd.tagtype[key] = info.tagtype[key] + except Exception: + pass # might not be an IFD. Might not have populated type + + # additions written by Greg Couch, gregc@cgl.ucsf.edu + # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com + if hasattr(im, "tag_v2"): + # preserve tags from original TIFF image file + for key in ( + RESOLUTION_UNIT, + X_RESOLUTION, + Y_RESOLUTION, + IPTC_NAA_CHUNK, + PHOTOSHOP_CHUNK, + XMP, + ): + if key in im.tag_v2: + ifd[key] = im.tag_v2[key] + ifd.tagtype[key] = im.tag_v2.tagtype[key] + + # preserve ICC profile (should also work when saving other formats + # which support profiles as TIFF) -- 2008-06-06 Florian Hoech + if "icc_profile" in im.info: + ifd[ICCPROFILE] = im.info["icc_profile"] + + for key, name in [ + (IMAGEDESCRIPTION, "description"), + (X_RESOLUTION, "resolution"), + (Y_RESOLUTION, "resolution"), + (X_RESOLUTION, "x_resolution"), + (Y_RESOLUTION, "y_resolution"), + (RESOLUTION_UNIT, "resolution_unit"), + (SOFTWARE, "software"), + (DATE_TIME, "date_time"), + (ARTIST, "artist"), + (COPYRIGHT, "copyright"), + ]: + if name in im.encoderinfo: + ifd[key] = im.encoderinfo[name] + + dpi = im.encoderinfo.get("dpi") + if dpi: + ifd[RESOLUTION_UNIT] = 2 + ifd[X_RESOLUTION] = int(dpi[0] + 0.5) + ifd[Y_RESOLUTION] = int(dpi[1] + 0.5) + + if bits != (1,): + ifd[BITSPERSAMPLE] = bits + if len(bits) != 1: + ifd[SAMPLESPERPIXEL] = len(bits) + if extra is not None: + ifd[EXTRASAMPLES] = extra + if format != 1: + ifd[SAMPLEFORMAT] = format + + ifd[PHOTOMETRIC_INTERPRETATION] = photo + + if im.mode in ["P", "PA"]: + lut = im.im.getpalette("RGB", "RGB;L") + ifd[COLORMAP] = tuple(i8(v) * 256 for v in lut) + # data orientation + stride = len(bits) * ((im.size[0] * bits[0] + 7) // 8) + ifd[ROWSPERSTRIP] = im.size[1] + strip_byte_counts = stride * im.size[1] + if strip_byte_counts >= 2 ** 16: + ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG + ifd[STRIPBYTECOUNTS] = strip_byte_counts + ifd[STRIPOFFSETS] = 0 # this is adjusted by IFD writer + # no compression by default: + ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) + + if libtiff: + if "quality" in im.encoderinfo: + quality = im.encoderinfo["quality"] + if not isinstance(quality, int) or quality < 0 or quality > 100: + raise ValueError("Invalid quality setting") + if compression != "jpeg": + raise ValueError( + "quality setting only supported for 'jpeg' compression" + ) + ifd[JPEGQUALITY] = quality + + logger.debug("Saving using libtiff encoder") + logger.debug("Items: %s" % sorted(ifd.items())) + _fp = 0 + if hasattr(fp, "fileno"): + try: + fp.seek(0) + _fp = os.dup(fp.fileno()) + except io.UnsupportedOperation: + pass + + # optional types for non core tags + types = {} + # SAMPLEFORMAT is determined by the image format and should not be copied + # from legacy_ifd. + # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library + # based on the data in the strip. + # The other tags expect arrays with a certain length (fixed or depending on + # BITSPERSAMPLE, etc), passing arrays with a different length will result in + # segfaults. Block these tags until we add extra validation. + blocklist = [ + REFERENCEBLACKWHITE, + SAMPLEFORMAT, + STRIPBYTECOUNTS, + STRIPOFFSETS, + TRANSFERFUNCTION, + ] + + atts = {} + # bits per sample is a single short in the tiff directory, not a list. + atts[BITSPERSAMPLE] = bits[0] + # Merge the ones that we have with (optional) more bits from + # the original file, e.g x,y resolution so that we can + # save(load('')) == original file. + legacy_ifd = {} + if hasattr(im, "tag"): + legacy_ifd = im.tag.to_v2() + for tag, value in itertools.chain( + ifd.items(), getattr(im, "tag_v2", {}).items(), legacy_ifd.items() + ): + # Libtiff can only process certain core items without adding + # them to the custom dictionary. + # Custom items are supported for int, float, unicode, string and byte + # values. Other types and tuples require a tagtype. + if tag not in TiffTags.LIBTIFF_CORE: + if not Image.core.libtiff_support_custom_tags: + continue + + if tag in ifd.tagtype: + types[tag] = ifd.tagtype[tag] + elif not (isinstance(value, (int, float, str, bytes))): + continue + else: + type = TiffTags.lookup(tag).type + if type: + types[tag] = type + if tag not in atts and tag not in blocklist: + if isinstance(value, str): + atts[tag] = value.encode("ascii", "replace") + b"\0" + elif isinstance(value, IFDRational): + atts[tag] = float(value) + else: + atts[tag] = value + + logger.debug("Converted items: %s" % sorted(atts.items())) + + # libtiff always expects the bytes in native order. + # we're storing image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if im.mode in ("I;16B", "I;16"): + rawmode = "I;16N" + + # Pass tags as sorted list so that the tags are set in a fixed order. + # This is required by libtiff for some tags. For example, the JPEGQUALITY + # pseudo tag requires that the COMPRESS tag was already set. + tags = list(atts.items()) + tags.sort() + a = (rawmode, compression, _fp, filename, tags, types) + e = Image._getencoder(im.mode, "libtiff", a, im.encoderconfig) + e.setimage(im.im, (0, 0) + im.size) + while True: + # undone, change to self.decodermaxblock: + l, s, d = e.encode(16 * 1024) + if not _fp: + fp.write(d) + if s: + break + if s < 0: + raise OSError("encoder error %d when writing image file" % s) + + else: + offset = ifd.save(fp) + + ImageFile._save( + im, fp, [("raw", (0, 0) + im.size, offset, (rawmode, stride, 1))] + ) + + # -- helper for multi-page save -- + if "_debug_multipage" in im.encoderinfo: + # just to access o32 and o16 (using correct byte order) + im._debug_multipage = ifd + + +class AppendingTiffWriter: + fieldSizes = [ + 0, # None + 1, # byte + 1, # ascii + 2, # short + 4, # long + 8, # rational + 1, # sbyte + 1, # undefined + 2, # sshort + 4, # slong + 8, # srational + 4, # float + 8, # double + ] + + # StripOffsets = 273 + # FreeOffsets = 288 + # TileOffsets = 324 + # JPEGQTables = 519 + # JPEGDCTables = 520 + # JPEGACTables = 521 + Tags = {273, 288, 324, 519, 520, 521} + + def __init__(self, fn, new=False): + if hasattr(fn, "read"): + self.f = fn + self.close_fp = False + else: + self.name = fn + self.close_fp = True + try: + self.f = open(fn, "w+b" if new else "r+b") + except OSError: + self.f = open(fn, "w+b") + self.beginning = self.f.tell() + self.setup() + + def setup(self): + # Reset everything. + self.f.seek(self.beginning, os.SEEK_SET) + + self.whereToWriteNewIFDOffset = None + self.offsetOfNewPage = 0 + + self.IIMM = IIMM = self.f.read(4) + if not IIMM: + # empty file - first page + self.isFirst = True + return + + self.isFirst = False + if IIMM == b"II\x2a\x00": + self.setEndian("<") + elif IIMM == b"MM\x00\x2a": + self.setEndian(">") + else: + raise RuntimeError("Invalid TIFF file header") + + self.skipIFDs() + self.goToEnd() + + def finalize(self): + if self.isFirst: + return + + # fix offsets + self.f.seek(self.offsetOfNewPage) + + IIMM = self.f.read(4) + if not IIMM: + # raise RuntimeError("nothing written into new page") + # Make it easy to finish a frame without committing to a new one. + return + + if IIMM != self.IIMM: + raise RuntimeError("IIMM of new page doesn't match IIMM of first page") + + IFDoffset = self.readLong() + IFDoffset += self.offsetOfNewPage + self.f.seek(self.whereToWriteNewIFDOffset) + self.writeLong(IFDoffset) + self.f.seek(IFDoffset) + self.fixIFD() + + def newFrame(self): + # Call this to finish a frame. + self.finalize() + self.setup() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.close_fp: + self.close() + return False + + def tell(self): + return self.f.tell() - self.offsetOfNewPage + + def seek(self, offset, whence=io.SEEK_SET): + if whence == os.SEEK_SET: + offset += self.offsetOfNewPage + + self.f.seek(offset, whence) + return self.tell() + + def goToEnd(self): + self.f.seek(0, os.SEEK_END) + pos = self.f.tell() + + # pad to 16 byte boundary + padBytes = 16 - pos % 16 + if 0 < padBytes < 16: + self.f.write(bytes(padBytes)) + self.offsetOfNewPage = self.f.tell() + + def setEndian(self, endian): + self.endian = endian + self.longFmt = self.endian + "L" + self.shortFmt = self.endian + "H" + self.tagFormat = self.endian + "HHL" + + def skipIFDs(self): + while True: + IFDoffset = self.readLong() + if IFDoffset == 0: + self.whereToWriteNewIFDOffset = self.f.tell() - 4 + break + + self.f.seek(IFDoffset) + numTags = self.readShort() + self.f.seek(numTags * 12, os.SEEK_CUR) + + def write(self, data): + return self.f.write(data) + + def readShort(self): + (value,) = struct.unpack(self.shortFmt, self.f.read(2)) + return value + + def readLong(self): + (value,) = struct.unpack(self.longFmt, self.f.read(4)) + return value + + def rewriteLastShortToLong(self, value): + self.f.seek(-2, os.SEEK_CUR) + bytesWritten = self.f.write(struct.pack(self.longFmt, value)) + if bytesWritten is not None and bytesWritten != 4: + raise RuntimeError("wrote only %u bytes but wanted 4" % bytesWritten) + + def rewriteLastShort(self, value): + self.f.seek(-2, os.SEEK_CUR) + bytesWritten = self.f.write(struct.pack(self.shortFmt, value)) + if bytesWritten is not None and bytesWritten != 2: + raise RuntimeError("wrote only %u bytes but wanted 2" % bytesWritten) + + def rewriteLastLong(self, value): + self.f.seek(-4, os.SEEK_CUR) + bytesWritten = self.f.write(struct.pack(self.longFmt, value)) + if bytesWritten is not None and bytesWritten != 4: + raise RuntimeError("wrote only %u bytes but wanted 4" % bytesWritten) + + def writeShort(self, value): + bytesWritten = self.f.write(struct.pack(self.shortFmt, value)) + if bytesWritten is not None and bytesWritten != 2: + raise RuntimeError("wrote only %u bytes but wanted 2" % bytesWritten) + + def writeLong(self, value): + bytesWritten = self.f.write(struct.pack(self.longFmt, value)) + if bytesWritten is not None and bytesWritten != 4: + raise RuntimeError("wrote only %u bytes but wanted 4" % bytesWritten) + + def close(self): + self.finalize() + self.f.close() + + def fixIFD(self): + numTags = self.readShort() + + for i in range(numTags): + tag, fieldType, count = struct.unpack(self.tagFormat, self.f.read(8)) + + fieldSize = self.fieldSizes[fieldType] + totalSize = fieldSize * count + isLocal = totalSize <= 4 + if not isLocal: + offset = self.readLong() + offset += self.offsetOfNewPage + self.rewriteLastLong(offset) + + if tag in self.Tags: + curPos = self.f.tell() + + if isLocal: + self.fixOffsets( + count, isShort=(fieldSize == 2), isLong=(fieldSize == 4) + ) + self.f.seek(curPos + 4) + else: + self.f.seek(offset) + self.fixOffsets( + count, isShort=(fieldSize == 2), isLong=(fieldSize == 4) + ) + self.f.seek(curPos) + + offset = curPos = None + + elif isLocal: + # skip the locally stored value that is not an offset + self.f.seek(4, os.SEEK_CUR) + + def fixOffsets(self, count, isShort=False, isLong=False): + if not isShort and not isLong: + raise RuntimeError("offset is neither short nor long") + + for i in range(count): + offset = self.readShort() if isShort else self.readLong() + offset += self.offsetOfNewPage + if isShort and offset >= 65536: + # offset is now too large - we must convert shorts to longs + if count != 1: + raise RuntimeError("not implemented") # XXX TODO + + # simple case - the offset is just one and therefore it is + # local (not referenced with another offset) + self.rewriteLastShortToLong(offset) + self.f.seek(-10, os.SEEK_CUR) + self.writeShort(TiffTags.LONG) # rewrite the type to LONG + self.f.seek(8, os.SEEK_CUR) + elif isShort: + self.rewriteLastShort(offset) + else: + self.rewriteLastLong(offset) + + +def _save_all(im, fp, filename): + encoderinfo = im.encoderinfo.copy() + encoderconfig = im.encoderconfig + append_images = list(encoderinfo.get("append_images", [])) + if not hasattr(im, "n_frames") and not append_images: + return _save(im, fp, filename) + + cur_idx = im.tell() + try: + with AppendingTiffWriter(fp) as tf: + for ims in [im] + append_images: + ims.encoderinfo = encoderinfo + ims.encoderconfig = encoderconfig + if not hasattr(ims, "n_frames"): + nfr = 1 + else: + nfr = ims.n_frames + + for idx in range(nfr): + ims.seek(idx) + ims.load() + _save(ims, tf, filename) + tf.newFrame() + finally: + im.seek(cur_idx) + + +# +# -------------------------------------------------------------------- +# Register + +Image.register_open(TiffImageFile.format, TiffImageFile, _accept) +Image.register_save(TiffImageFile.format, _save) +Image.register_save_all(TiffImageFile.format, _save_all) + +Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) + +Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/venv/Lib/site-packages/PIL/TiffTags.py b/venv/Lib/site-packages/PIL/TiffTags.py new file mode 100644 index 0000000..e1c1b70 --- /dev/null +++ b/venv/Lib/site-packages/PIL/TiffTags.py @@ -0,0 +1,498 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF tags +# +# This module provides clear-text names for various well-known +# TIFF tags. the TIFF codec works just fine without it. +# +# Copyright (c) Secret Labs AB 1999. +# +# See the README file for information on usage and redistribution. +# + +## +# This module provides constants and clear-text names for various +# well-known TIFF tags. +## + +from collections import namedtuple + + +class TagInfo(namedtuple("_TagInfo", "value name type length enum")): + __slots__ = [] + + def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None): + return super().__new__(cls, value, name, type, length, enum or {}) + + def cvt_enum(self, value): + # Using get will call hash(value), which can be expensive + # for some types (e.g. Fraction). Since self.enum is rarely + # used, it's usually better to test it first. + return self.enum.get(value, value) if self.enum else value + + +def lookup(tag): + """ + :param tag: Integer tag number + :returns: Taginfo namedtuple, From the TAGS_V2 info if possible, + otherwise just populating the value and name from TAGS. + If the tag is not recognized, "unknown" is returned for the name + + """ + + return TAGS_V2.get(tag, TagInfo(tag, TAGS.get(tag, "unknown"))) + + +## +# Map tag numbers to tag info. +# +# id: (Name, Type, Length, enum_values) +# +# The length here differs from the length in the tiff spec. For +# numbers, the tiff spec is for the number of fields returned. We +# agree here. For string-like types, the tiff spec uses the length of +# field in bytes. In Pillow, we are using the number of expected +# fields, in general 1 for string-like types. + + +BYTE = 1 +ASCII = 2 +SHORT = 3 +LONG = 4 +RATIONAL = 5 +SIGNED_BYTE = 6 +UNDEFINED = 7 +SIGNED_SHORT = 8 +SIGNED_LONG = 9 +SIGNED_RATIONAL = 10 +FLOAT = 11 +DOUBLE = 12 + +TAGS_V2 = { + 254: ("NewSubfileType", LONG, 1), + 255: ("SubfileType", SHORT, 1), + 256: ("ImageWidth", LONG, 1), + 257: ("ImageLength", LONG, 1), + 258: ("BitsPerSample", SHORT, 0), + 259: ( + "Compression", + SHORT, + 1, + { + "Uncompressed": 1, + "CCITT 1d": 2, + "Group 3 Fax": 3, + "Group 4 Fax": 4, + "LZW": 5, + "JPEG": 6, + "PackBits": 32773, + }, + ), + 262: ( + "PhotometricInterpretation", + SHORT, + 1, + { + "WhiteIsZero": 0, + "BlackIsZero": 1, + "RGB": 2, + "RGB Palette": 3, + "Transparency Mask": 4, + "CMYK": 5, + "YCbCr": 6, + "CieLAB": 8, + "CFA": 32803, # TIFF/EP, Adobe DNG + "LinearRaw": 32892, # Adobe DNG + }, + ), + 263: ("Threshholding", SHORT, 1), + 264: ("CellWidth", SHORT, 1), + 265: ("CellLength", SHORT, 1), + 266: ("FillOrder", SHORT, 1), + 269: ("DocumentName", ASCII, 1), + 270: ("ImageDescription", ASCII, 1), + 271: ("Make", ASCII, 1), + 272: ("Model", ASCII, 1), + 273: ("StripOffsets", LONG, 0), + 274: ("Orientation", SHORT, 1), + 277: ("SamplesPerPixel", SHORT, 1), + 278: ("RowsPerStrip", LONG, 1), + 279: ("StripByteCounts", LONG, 0), + 280: ("MinSampleValue", SHORT, 0), + 281: ("MaxSampleValue", SHORT, 0), + 282: ("XResolution", RATIONAL, 1), + 283: ("YResolution", RATIONAL, 1), + 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), + 285: ("PageName", ASCII, 1), + 286: ("XPosition", RATIONAL, 1), + 287: ("YPosition", RATIONAL, 1), + 288: ("FreeOffsets", LONG, 1), + 289: ("FreeByteCounts", LONG, 1), + 290: ("GrayResponseUnit", SHORT, 1), + 291: ("GrayResponseCurve", SHORT, 0), + 292: ("T4Options", LONG, 1), + 293: ("T6Options", LONG, 1), + 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), + 297: ("PageNumber", SHORT, 2), + 301: ("TransferFunction", SHORT, 0), + 305: ("Software", ASCII, 1), + 306: ("DateTime", ASCII, 1), + 315: ("Artist", ASCII, 1), + 316: ("HostComputer", ASCII, 1), + 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), + 318: ("WhitePoint", RATIONAL, 2), + 319: ("PrimaryChromaticities", RATIONAL, 6), + 320: ("ColorMap", SHORT, 0), + 321: ("HalftoneHints", SHORT, 2), + 322: ("TileWidth", LONG, 1), + 323: ("TileLength", LONG, 1), + 324: ("TileOffsets", LONG, 0), + 325: ("TileByteCounts", LONG, 0), + 332: ("InkSet", SHORT, 1), + 333: ("InkNames", ASCII, 1), + 334: ("NumberOfInks", SHORT, 1), + 336: ("DotRange", SHORT, 0), + 337: ("TargetPrinter", ASCII, 1), + 338: ("ExtraSamples", SHORT, 0), + 339: ("SampleFormat", SHORT, 0), + 340: ("SMinSampleValue", DOUBLE, 0), + 341: ("SMaxSampleValue", DOUBLE, 0), + 342: ("TransferRange", SHORT, 6), + 347: ("JPEGTables", UNDEFINED, 1), + # obsolete JPEG tags + 512: ("JPEGProc", SHORT, 1), + 513: ("JPEGInterchangeFormat", LONG, 1), + 514: ("JPEGInterchangeFormatLength", LONG, 1), + 515: ("JPEGRestartInterval", SHORT, 1), + 517: ("JPEGLosslessPredictors", SHORT, 0), + 518: ("JPEGPointTransforms", SHORT, 0), + 519: ("JPEGQTables", LONG, 0), + 520: ("JPEGDCTables", LONG, 0), + 521: ("JPEGACTables", LONG, 0), + 529: ("YCbCrCoefficients", RATIONAL, 3), + 530: ("YCbCrSubSampling", SHORT, 2), + 531: ("YCbCrPositioning", SHORT, 1), + 532: ("ReferenceBlackWhite", RATIONAL, 6), + 700: ("XMP", BYTE, 0), + 33432: ("Copyright", ASCII, 1), + 33723: ("IptcNaaInfo", UNDEFINED, 0), + 34377: ("PhotoshopInfo", BYTE, 0), + # FIXME add more tags here + 34665: ("ExifIFD", LONG, 1), + 34675: ("ICCProfile", UNDEFINED, 1), + 34853: ("GPSInfoIFD", LONG, 1), + # MPInfo + 45056: ("MPFVersion", UNDEFINED, 1), + 45057: ("NumberOfImages", LONG, 1), + 45058: ("MPEntry", UNDEFINED, 1), + 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check + 45060: ("TotalFrames", LONG, 1), + 45313: ("MPIndividualNum", LONG, 1), + 45569: ("PanOrientation", LONG, 1), + 45570: ("PanOverlap_H", RATIONAL, 1), + 45571: ("PanOverlap_V", RATIONAL, 1), + 45572: ("BaseViewpointNum", LONG, 1), + 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), + 45574: ("BaselineLength", RATIONAL, 1), + 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), + 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), + 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), + 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), + 45579: ("YawAngle", SIGNED_RATIONAL, 1), + 45580: ("PitchAngle", SIGNED_RATIONAL, 1), + 45581: ("RollAngle", SIGNED_RATIONAL, 1), + 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), + 50780: ("BestQualityScale", RATIONAL, 1), + 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one + 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006 +} + +# Legacy Tags structure +# these tags aren't included above, but were in the previous versions +TAGS = { + 347: "JPEGTables", + 700: "XMP", + # Additional Exif Info + 32932: "Wang Annotation", + 33434: "ExposureTime", + 33437: "FNumber", + 33445: "MD FileTag", + 33446: "MD ScalePixel", + 33447: "MD ColorTable", + 33448: "MD LabName", + 33449: "MD SampleInfo", + 33450: "MD PrepDate", + 33451: "MD PrepTime", + 33452: "MD FileUnits", + 33550: "ModelPixelScaleTag", + 33723: "IptcNaaInfo", + 33918: "INGR Packet Data Tag", + 33919: "INGR Flag Registers", + 33920: "IrasB Transformation Matrix", + 33922: "ModelTiepointTag", + 34264: "ModelTransformationTag", + 34377: "PhotoshopInfo", + 34735: "GeoKeyDirectoryTag", + 34736: "GeoDoubleParamsTag", + 34737: "GeoAsciiParamsTag", + 34850: "ExposureProgram", + 34852: "SpectralSensitivity", + 34855: "ISOSpeedRatings", + 34856: "OECF", + 34864: "SensitivityType", + 34865: "StandardOutputSensitivity", + 34866: "RecommendedExposureIndex", + 34867: "ISOSpeed", + 34868: "ISOSpeedLatitudeyyy", + 34869: "ISOSpeedLatitudezzz", + 34908: "HylaFAX FaxRecvParams", + 34909: "HylaFAX FaxSubAddress", + 34910: "HylaFAX FaxRecvTime", + 36864: "ExifVersion", + 36867: "DateTimeOriginal", + 36868: "DateTImeDigitized", + 37121: "ComponentsConfiguration", + 37122: "CompressedBitsPerPixel", + 37724: "ImageSourceData", + 37377: "ShutterSpeedValue", + 37378: "ApertureValue", + 37379: "BrightnessValue", + 37380: "ExposureBiasValue", + 37381: "MaxApertureValue", + 37382: "SubjectDistance", + 37383: "MeteringMode", + 37384: "LightSource", + 37385: "Flash", + 37386: "FocalLength", + 37396: "SubjectArea", + 37500: "MakerNote", + 37510: "UserComment", + 37520: "SubSec", + 37521: "SubSecTimeOriginal", + 37522: "SubsecTimeDigitized", + 40960: "FlashPixVersion", + 40961: "ColorSpace", + 40962: "PixelXDimension", + 40963: "PixelYDimension", + 40964: "RelatedSoundFile", + 40965: "InteroperabilityIFD", + 41483: "FlashEnergy", + 41484: "SpatialFrequencyResponse", + 41486: "FocalPlaneXResolution", + 41487: "FocalPlaneYResolution", + 41488: "FocalPlaneResolutionUnit", + 41492: "SubjectLocation", + 41493: "ExposureIndex", + 41495: "SensingMethod", + 41728: "FileSource", + 41729: "SceneType", + 41730: "CFAPattern", + 41985: "CustomRendered", + 41986: "ExposureMode", + 41987: "WhiteBalance", + 41988: "DigitalZoomRatio", + 41989: "FocalLengthIn35mmFilm", + 41990: "SceneCaptureType", + 41991: "GainControl", + 41992: "Contrast", + 41993: "Saturation", + 41994: "Sharpness", + 41995: "DeviceSettingDescription", + 41996: "SubjectDistanceRange", + 42016: "ImageUniqueID", + 42032: "CameraOwnerName", + 42033: "BodySerialNumber", + 42034: "LensSpecification", + 42035: "LensMake", + 42036: "LensModel", + 42037: "LensSerialNumber", + 42112: "GDAL_METADATA", + 42113: "GDAL_NODATA", + 42240: "Gamma", + 50215: "Oce Scanjob Description", + 50216: "Oce Application Selector", + 50217: "Oce Identification Number", + 50218: "Oce ImageLogic Characteristics", + # Adobe DNG + 50706: "DNGVersion", + 50707: "DNGBackwardVersion", + 50708: "UniqueCameraModel", + 50709: "LocalizedCameraModel", + 50710: "CFAPlaneColor", + 50711: "CFALayout", + 50712: "LinearizationTable", + 50713: "BlackLevelRepeatDim", + 50714: "BlackLevel", + 50715: "BlackLevelDeltaH", + 50716: "BlackLevelDeltaV", + 50717: "WhiteLevel", + 50718: "DefaultScale", + 50719: "DefaultCropOrigin", + 50720: "DefaultCropSize", + 50721: "ColorMatrix1", + 50722: "ColorMatrix2", + 50723: "CameraCalibration1", + 50724: "CameraCalibration2", + 50725: "ReductionMatrix1", + 50726: "ReductionMatrix2", + 50727: "AnalogBalance", + 50728: "AsShotNeutral", + 50729: "AsShotWhiteXY", + 50730: "BaselineExposure", + 50731: "BaselineNoise", + 50732: "BaselineSharpness", + 50733: "BayerGreenSplit", + 50734: "LinearResponseLimit", + 50735: "CameraSerialNumber", + 50736: "LensInfo", + 50737: "ChromaBlurRadius", + 50738: "AntiAliasStrength", + 50740: "DNGPrivateData", + 50778: "CalibrationIlluminant1", + 50779: "CalibrationIlluminant2", + 50784: "Alias Layer Metadata", +} + + +def _populate(): + for k, v in TAGS_V2.items(): + # Populate legacy structure. + TAGS[k] = v[0] + if len(v) == 4: + for sk, sv in v[3].items(): + TAGS[(k, sv)] = sk + + TAGS_V2[k] = TagInfo(k, *v) + + +_populate() +## +# Map type numbers to type names -- defined in ImageFileDirectory. + +TYPES = {} + +# was: +# TYPES = { +# 1: "byte", +# 2: "ascii", +# 3: "short", +# 4: "long", +# 5: "rational", +# 6: "signed byte", +# 7: "undefined", +# 8: "signed short", +# 9: "signed long", +# 10: "signed rational", +# 11: "float", +# 12: "double", +# } + +# +# These tags are handled by default in libtiff, without +# adding to the custom dictionary. From tif_dir.c, searching for +# case TIFFTAG in the _TIFFVSetField function: +# Line: item. +# 148: case TIFFTAG_SUBFILETYPE: +# 151: case TIFFTAG_IMAGEWIDTH: +# 154: case TIFFTAG_IMAGELENGTH: +# 157: case TIFFTAG_BITSPERSAMPLE: +# 181: case TIFFTAG_COMPRESSION: +# 202: case TIFFTAG_PHOTOMETRIC: +# 205: case TIFFTAG_THRESHHOLDING: +# 208: case TIFFTAG_FILLORDER: +# 214: case TIFFTAG_ORIENTATION: +# 221: case TIFFTAG_SAMPLESPERPIXEL: +# 228: case TIFFTAG_ROWSPERSTRIP: +# 238: case TIFFTAG_MINSAMPLEVALUE: +# 241: case TIFFTAG_MAXSAMPLEVALUE: +# 244: case TIFFTAG_SMINSAMPLEVALUE: +# 247: case TIFFTAG_SMAXSAMPLEVALUE: +# 250: case TIFFTAG_XRESOLUTION: +# 256: case TIFFTAG_YRESOLUTION: +# 262: case TIFFTAG_PLANARCONFIG: +# 268: case TIFFTAG_XPOSITION: +# 271: case TIFFTAG_YPOSITION: +# 274: case TIFFTAG_RESOLUTIONUNIT: +# 280: case TIFFTAG_PAGENUMBER: +# 284: case TIFFTAG_HALFTONEHINTS: +# 288: case TIFFTAG_COLORMAP: +# 294: case TIFFTAG_EXTRASAMPLES: +# 298: case TIFFTAG_MATTEING: +# 305: case TIFFTAG_TILEWIDTH: +# 316: case TIFFTAG_TILELENGTH: +# 327: case TIFFTAG_TILEDEPTH: +# 333: case TIFFTAG_DATATYPE: +# 344: case TIFFTAG_SAMPLEFORMAT: +# 361: case TIFFTAG_IMAGEDEPTH: +# 364: case TIFFTAG_SUBIFD: +# 376: case TIFFTAG_YCBCRPOSITIONING: +# 379: case TIFFTAG_YCBCRSUBSAMPLING: +# 383: case TIFFTAG_TRANSFERFUNCTION: +# 389: case TIFFTAG_REFERENCEBLACKWHITE: +# 393: case TIFFTAG_INKNAMES: + +# Following pseudo-tags are also handled by default in libtiff: +# TIFFTAG_JPEGQUALITY 65537 + +# some of these are not in our TAGS_V2 dict and were included from tiff.h + +# This list also exists in encode.c +LIBTIFF_CORE = { + 255, + 256, + 257, + 258, + 259, + 262, + 263, + 266, + 274, + 277, + 278, + 280, + 281, + 340, + 341, + 282, + 283, + 284, + 286, + 287, + 296, + 297, + 321, + 320, + 338, + 32995, + 322, + 323, + 32998, + 32996, + 339, + 32997, + 330, + 531, + 530, + 301, + 532, + 333, + # as above + 269, # this has been in our tests forever, and works + 65537, +} + +LIBTIFF_CORE.remove(301) # Array of short, crashes +LIBTIFF_CORE.remove(532) # Array of long, crashes + +LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes +LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff +LIBTIFF_CORE.remove(323) # Tiled images +LIBTIFF_CORE.remove(333) # Ink Names either + +# Note to advanced users: There may be combinations of these +# parameters and values that when added properly, will work and +# produce valid tiff images that may work in your application. +# It is safe to add and remove tags from this set from Pillow's point +# of view so long as you test against libtiff. diff --git a/venv/Lib/site-packages/PIL/WalImageFile.py b/venv/Lib/site-packages/PIL/WalImageFile.py new file mode 100644 index 0000000..b578d69 --- /dev/null +++ b/venv/Lib/site-packages/PIL/WalImageFile.py @@ -0,0 +1,126 @@ +# +# The Python Imaging Library. +# $Id$ +# +# WAL file handling +# +# History: +# 2003-04-23 fl created +# +# Copyright (c) 2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +""" +This reader is based on the specification available from: +https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml +and has been tested with a few sample files found using google. + +.. note:: + This format cannot be automatically recognized, so the reader + is not registered for use with :py:func:`PIL.Image.open()`. + To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. +""" + +import builtins + +from . import Image +from ._binary import i32le as i32 + + +def open(filename): + """ + Load texture from a Quake2 WAL texture file. + + By default, a Quake2 standard palette is attached to the texture. + To override the palette, use the :py:func:`PIL.Image.Image.putpalette()` method. + + :param filename: WAL file name, or an opened file handle. + :returns: An image instance. + """ + # FIXME: modify to return a WalImageFile instance instead of + # plain Image object ? + + def imopen(fp): + # read header fields + header = fp.read(32 + 24 + 32 + 12) + size = i32(header, 32), i32(header, 36) + offset = i32(header, 40) + + # load pixel data + fp.seek(offset) + + Image._decompression_bomb_check(size) + im = Image.frombytes("P", size, fp.read(size[0] * size[1])) + im.putpalette(quake2palette) + + im.format = "WAL" + im.format_description = "Quake2 Texture" + + # strings are null-terminated + im.info["name"] = header[:32].split(b"\0", 1)[0] + next_name = header[56 : 56 + 32].split(b"\0", 1)[0] + if next_name: + im.info["next_name"] = next_name + + return im + + if hasattr(filename, "read"): + return imopen(filename) + else: + with builtins.open(filename, "rb") as fp: + return imopen(fp) + + +quake2palette = ( + # default palette taken from piffo 0.93 by Hans Häggström + b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" + b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" + b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" + b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" + b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" + b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" + b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" + b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" + b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" + b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" + b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" + b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" + b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" + b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" + b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" + b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" + b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" + b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" + b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" + b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" + b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" + b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" + b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" + b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" + b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" + b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" + b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" + b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" + b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" + b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" + b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" + b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" + b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" + b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" + b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" + b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" + b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" + b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" + b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" + b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" + b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" + b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" + b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" + b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" + b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" + b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" + b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" + b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" +) diff --git a/venv/Lib/site-packages/PIL/WebPImagePlugin.py b/venv/Lib/site-packages/PIL/WebPImagePlugin.py new file mode 100644 index 0000000..2e9746f --- /dev/null +++ b/venv/Lib/site-packages/PIL/WebPImagePlugin.py @@ -0,0 +1,351 @@ +from io import BytesIO + +from . import Image, ImageFile + +try: + from . import _webp + + SUPPORTED = True +except ImportError: + SUPPORTED = False + + +_VALID_WEBP_MODES = {"RGBX": True, "RGBA": True, "RGB": True} + +_VALID_WEBP_LEGACY_MODES = {"RGB": True, "RGBA": True} + +_VP8_MODES_BY_IDENTIFIER = { + b"VP8 ": "RGB", + b"VP8X": "RGBA", + b"VP8L": "RGBA", # lossless +} + + +def _accept(prefix): + is_riff_file_format = prefix[:4] == b"RIFF" + is_webp_file = prefix[8:12] == b"WEBP" + is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER + + if is_riff_file_format and is_webp_file and is_valid_vp8_mode: + if not SUPPORTED: + return ( + "image file could not be identified because WEBP support not installed" + ) + return True + + +class WebPImageFile(ImageFile.ImageFile): + + format = "WEBP" + format_description = "WebP image" + __loaded = 0 + __logical_frame = 0 + + def _open(self): + if not _webp.HAVE_WEBPANIM: + # Legacy mode + data, width, height, self.mode, icc_profile, exif = _webp.WebPDecode( + self.fp.read() + ) + if icc_profile: + self.info["icc_profile"] = icc_profile + if exif: + self.info["exif"] = exif + self._size = width, height + self.fp = BytesIO(data) + self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] + self.n_frames = 1 + self.is_animated = False + return + + # Use the newer AnimDecoder API to parse the (possibly) animated file, + # and access muxed chunks like ICC/EXIF/XMP. + self._decoder = _webp.WebPAnimDecoder(self.fp.read()) + + # Get info from decoder + width, height, loop_count, bgcolor, frame_count, mode = self._decoder.get_info() + self._size = width, height + self.info["loop"] = loop_count + bg_a, bg_r, bg_g, bg_b = ( + (bgcolor >> 24) & 0xFF, + (bgcolor >> 16) & 0xFF, + (bgcolor >> 8) & 0xFF, + bgcolor & 0xFF, + ) + self.info["background"] = (bg_r, bg_g, bg_b, bg_a) + self.n_frames = frame_count + self.is_animated = self.n_frames > 1 + self.mode = "RGB" if mode == "RGBX" else mode + self.rawmode = mode + self.tile = [] + + # Attempt to read ICC / EXIF / XMP chunks from file + icc_profile = self._decoder.get_chunk("ICCP") + exif = self._decoder.get_chunk("EXIF") + xmp = self._decoder.get_chunk("XMP ") + if icc_profile: + self.info["icc_profile"] = icc_profile + if exif: + self.info["exif"] = exif + if xmp: + self.info["xmp"] = xmp + + # Initialize seek state + self._reset(reset=False) + + def _getexif(self): + if "exif" not in self.info: + return None + return dict(self.getexif()) + + def seek(self, frame): + if not self._seek_check(frame): + return + + # Set logical frame to requested position + self.__logical_frame = frame + + def _reset(self, reset=True): + if reset: + self._decoder.reset() + self.__physical_frame = 0 + self.__loaded = -1 + self.__timestamp = 0 + + def _get_next(self): + # Get next frame + ret = self._decoder.get_next() + self.__physical_frame += 1 + + # Check if an error occurred + if ret is None: + self._reset() # Reset just to be safe + self.seek(0) + raise EOFError("failed to decode next frame in WebP file") + + # Compute duration + data, timestamp = ret + duration = timestamp - self.__timestamp + self.__timestamp = timestamp + + # libwebp gives frame end, adjust to start of frame + timestamp -= duration + return data, timestamp, duration + + def _seek(self, frame): + if self.__physical_frame == frame: + return # Nothing to do + if frame < self.__physical_frame: + self._reset() # Rewind to beginning + while self.__physical_frame < frame: + self._get_next() # Advance to the requested frame + + def load(self): + if _webp.HAVE_WEBPANIM: + if self.__loaded != self.__logical_frame: + self._seek(self.__logical_frame) + + # We need to load the image data for this frame + data, timestamp, duration = self._get_next() + self.info["timestamp"] = timestamp + self.info["duration"] = duration + self.__loaded = self.__logical_frame + + # Set tile + if self.fp and self._exclusive_fp: + self.fp.close() + self.fp = BytesIO(data) + self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] + + return super().load() + + def tell(self): + if not _webp.HAVE_WEBPANIM: + return super().tell() + + return self.__logical_frame + + +def _save_all(im, fp, filename): + encoderinfo = im.encoderinfo.copy() + append_images = list(encoderinfo.get("append_images", [])) + + # If total frame count is 1, then save using the legacy API, which + # will preserve non-alpha modes + total = 0 + for ims in [im] + append_images: + total += getattr(ims, "n_frames", 1) + if total == 1: + _save(im, fp, filename) + return + + background = (0, 0, 0, 0) + if "background" in encoderinfo: + background = encoderinfo["background"] + elif "background" in im.info: + background = im.info["background"] + if isinstance(background, int): + # GifImagePlugin stores a global color table index in + # info["background"]. So it must be converted to an RGBA value + palette = im.getpalette() + if palette: + r, g, b = palette[background * 3 : (background + 1) * 3] + background = (r, g, b, 0) + + duration = im.encoderinfo.get("duration", 0) + loop = im.encoderinfo.get("loop", 0) + minimize_size = im.encoderinfo.get("minimize_size", False) + kmin = im.encoderinfo.get("kmin", None) + kmax = im.encoderinfo.get("kmax", None) + allow_mixed = im.encoderinfo.get("allow_mixed", False) + verbose = False + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + method = im.encoderinfo.get("method", 0) + icc_profile = im.encoderinfo.get("icc_profile", "") + exif = im.encoderinfo.get("exif", "") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + xmp = im.encoderinfo.get("xmp", "") + if allow_mixed: + lossless = False + + # Sensible keyframe defaults are from gif2webp.c script + if kmin is None: + kmin = 9 if lossless else 3 + if kmax is None: + kmax = 17 if lossless else 5 + + # Validate background color + if ( + not isinstance(background, (list, tuple)) + or len(background) != 4 + or not all(v >= 0 and v < 256 for v in background) + ): + raise OSError( + "Background color is not an RGBA tuple clamped to (0-255): %s" + % str(background) + ) + + # Convert to packed uint + bg_r, bg_g, bg_b, bg_a = background + background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) + + # Setup the WebP animation encoder + enc = _webp.WebPAnimEncoder( + im.size[0], + im.size[1], + background, + loop, + minimize_size, + kmin, + kmax, + allow_mixed, + verbose, + ) + + # Add each frame + frame_idx = 0 + timestamp = 0 + cur_idx = im.tell() + try: + for ims in [im] + append_images: + # Get # of frames in this image + nfr = getattr(ims, "n_frames", 1) + + for idx in range(nfr): + ims.seek(idx) + ims.load() + + # Make sure image mode is supported + frame = ims + rawmode = ims.mode + if ims.mode not in _VALID_WEBP_MODES: + alpha = ( + "A" in ims.mode + or "a" in ims.mode + or (ims.mode == "P" and "A" in ims.im.getpalettemode()) + ) + rawmode = "RGBA" if alpha else "RGB" + frame = ims.convert(rawmode) + + if rawmode == "RGB": + # For faster conversion, use RGBX + rawmode = "RGBX" + + # Append the frame to the animation encoder + enc.add( + frame.tobytes("raw", rawmode), + timestamp, + frame.size[0], + frame.size[1], + rawmode, + lossless, + quality, + method, + ) + + # Update timestamp and frame index + if isinstance(duration, (list, tuple)): + timestamp += duration[frame_idx] + else: + timestamp += duration + frame_idx += 1 + + finally: + im.seek(cur_idx) + + # Force encoder to flush frames + enc.add(None, timestamp, 0, 0, "", lossless, quality, 0) + + # Get the final output from the encoder + data = enc.assemble(icc_profile, exif, xmp) + if data is None: + raise OSError("cannot write file as WebP (encoder returned None)") + + fp.write(data) + + +def _save(im, fp, filename): + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + icc_profile = im.encoderinfo.get("icc_profile", "") + exif = im.encoderinfo.get("exif", "") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + xmp = im.encoderinfo.get("xmp", "") + method = im.encoderinfo.get("method", 0) + + if im.mode not in _VALID_WEBP_LEGACY_MODES: + alpha = ( + "A" in im.mode + or "a" in im.mode + or (im.mode == "P" and "A" in im.im.getpalettemode()) + ) + im = im.convert("RGBA" if alpha else "RGB") + + data = _webp.WebPEncode( + im.tobytes(), + im.size[0], + im.size[1], + lossless, + float(quality), + im.mode, + icc_profile, + method, + exif, + xmp, + ) + if data is None: + raise OSError("cannot write file as WebP (encoder returned None)") + + fp.write(data) + + +Image.register_open(WebPImageFile.format, WebPImageFile, _accept) +if SUPPORTED: + Image.register_save(WebPImageFile.format, _save) + if _webp.HAVE_WEBPANIM: + Image.register_save_all(WebPImageFile.format, _save_all) + Image.register_extension(WebPImageFile.format, ".webp") + Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/venv/Lib/site-packages/PIL/WmfImagePlugin.py b/venv/Lib/site-packages/PIL/WmfImagePlugin.py new file mode 100644 index 0000000..024222c --- /dev/null +++ b/venv/Lib/site-packages/PIL/WmfImagePlugin.py @@ -0,0 +1,175 @@ +# +# The Python Imaging Library +# $Id$ +# +# WMF stub codec +# +# history: +# 1996-12-14 fl Created +# 2004-02-22 fl Turned into a stub driver +# 2004-02-23 fl Added EMF support +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +# WMF/EMF reference documentation: +# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf +# http://wvware.sourceforge.net/caolan/index.html +# http://wvware.sourceforge.net/caolan/ora-wmf.html + +from . import Image, ImageFile +from ._binary import i16le as word, i32le as dword, si16le as short, si32le as _long + +_handler = None + + +def register_handler(handler): + """ + Install application-specific WMF image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +if hasattr(Image.core, "drawwmf"): + # install default handler (windows only) + + class WmfHandler: + def open(self, im): + im.mode = "RGB" + self.bbox = im.info["wmf_bbox"] + + def load(self, im): + im.fp.seek(0) # rewind + return Image.frombytes( + "RGB", + im.size, + Image.core.drawwmf(im.fp.read(), im.size, self.bbox), + "raw", + "BGR", + (im.size[0] * 3 + 3) & -4, + -1, + ) + + register_handler(WmfHandler()) + +# +# -------------------------------------------------------------------- +# Read WMF file + + +def _accept(prefix): + return ( + prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or prefix[:4] == b"\x01\x00\x00\x00" + ) + + +## +# Image plugin for Windows metafiles. + + +class WmfStubImageFile(ImageFile.StubImageFile): + + format = "WMF" + format_description = "Windows Metafile" + + def _open(self): + self._inch = None + + # check placable header + s = self.fp.read(80) + + if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": + + # placeable windows metafile + + # get units per inch + self._inch = word(s, 14) + + # get bounding box + x0 = short(s, 6) + y0 = short(s, 8) + x1 = short(s, 10) + y1 = short(s, 12) + + # normalize size to 72 dots per inch + self.info["dpi"] = 72 + size = ( + (x1 - x0) * self.info["dpi"] // self._inch, + (y1 - y0) * self.info["dpi"] // self._inch, + ) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + # sanity check (standard metafile header) + if s[22:26] != b"\x01\x00\t\x00": + raise SyntaxError("Unsupported WMF file format") + + elif dword(s) == 1 and s[40:44] == b" EMF": + # enhanced metafile + + # get bounding box + x0 = _long(s, 8) + y0 = _long(s, 12) + x1 = _long(s, 16) + y1 = _long(s, 20) + + # get frame (in 0.01 millimeter units) + frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) + + size = x1 - x0, y1 - y0 + + # calculate dots per inch from bbox and frame + xdpi = int(2540.0 * (x1 - y0) / (frame[2] - frame[0]) + 0.5) + ydpi = int(2540.0 * (y1 - y0) / (frame[3] - frame[1]) + 0.5) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + if xdpi == ydpi: + self.info["dpi"] = xdpi + else: + self.info["dpi"] = xdpi, ydpi + + else: + raise SyntaxError("Unsupported file format") + + self.mode = "RGB" + self._size = size + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + def load(self, dpi=None): + if dpi is not None and self._inch is not None: + self.info["dpi"] = int(dpi + 0.5) + x0, y0, x1, y1 = self.info["wmf_bbox"] + self._size = ( + (x1 - x0) * self.info["dpi"] // self._inch, + (y1 - y0) * self.info["dpi"] // self._inch, + ) + super().load() + + +def _save(im, fp, filename): + if _handler is None or not hasattr(_handler, "save"): + raise OSError("WMF save handler not installed") + _handler.save(im, fp, filename) + + +# +# -------------------------------------------------------------------- +# Registry stuff + + +Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) +Image.register_save(WmfStubImageFile.format, _save) + +Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/venv/Lib/site-packages/PIL/XVThumbImagePlugin.py b/venv/Lib/site-packages/PIL/XVThumbImagePlugin.py new file mode 100644 index 0000000..c0d8db0 --- /dev/null +++ b/venv/Lib/site-packages/PIL/XVThumbImagePlugin.py @@ -0,0 +1,78 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XV Thumbnail file handler by Charles E. "Gene" Cash +# (gcash@magicnet.net) +# +# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, +# available from ftp://ftp.cis.upenn.edu/pub/xv/ +# +# history: +# 98-08-15 cec created (b/w only) +# 98-12-09 cec added color palette +# 98-12-28 fl added to PIL (with only a few very minor modifications) +# +# To do: +# FIXME: make save work (this requires quantization support) +# + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, o8 + +_MAGIC = b"P7 332" + +# standard color palette for thumbnails (RGB332) +PALETTE = b"" +for r in range(8): + for g in range(8): + for b in range(4): + PALETTE = PALETTE + ( + o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3) + ) + + +def _accept(prefix): + return prefix[:6] == _MAGIC + + +## +# Image plugin for XV thumbnail images. + + +class XVThumbImageFile(ImageFile.ImageFile): + + format = "XVThumb" + format_description = "XV thumbnail image" + + def _open(self): + + # check magic + if not _accept(self.fp.read(6)): + raise SyntaxError("not an XV thumbnail file") + + # Skip to beginning of next line + self.fp.readline() + + # skip info comments + while True: + s = self.fp.readline() + if not s: + raise SyntaxError("Unexpected EOF reading XV thumbnail file") + if i8(s[0]) != 35: # ie. when not a comment: '#' + break + + # parse header line (already read) + s = s.strip().split() + + self.mode = "P" + self._size = int(s[0]), int(s[1]) + + self.palette = ImagePalette.raw("RGB", PALETTE) + + self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1))] + + +# -------------------------------------------------------------------- + +Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/venv/Lib/site-packages/PIL/XbmImagePlugin.py b/venv/Lib/site-packages/PIL/XbmImagePlugin.py new file mode 100644 index 0000000..ead9722 --- /dev/null +++ b/venv/Lib/site-packages/PIL/XbmImagePlugin.py @@ -0,0 +1,94 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XBM File handling +# +# History: +# 1995-09-08 fl Created +# 1996-11-01 fl Added save support +# 1997-07-07 fl Made header parser more tolerant +# 1997-07-22 fl Fixed yet another parser bug +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) +# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) +# 2004-02-24 fl Allow some whitespace before first #define +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import re + +from . import Image, ImageFile + +# XBM header +xbm_head = re.compile( + br"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" + b"(?P" + b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" + b")?" + b"[\\000-\\377]*_bits\\[\\]" +) + + +def _accept(prefix): + return prefix.lstrip()[:7] == b"#define" + + +## +# Image plugin for X11 bitmaps. + + +class XbmImageFile(ImageFile.ImageFile): + + format = "XBM" + format_description = "X11 Bitmap" + + def _open(self): + + m = xbm_head.match(self.fp.read(512)) + + if m: + + xsize = int(m.group("width")) + ysize = int(m.group("height")) + + if m.group("hotspot"): + self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot"))) + + self.mode = "1" + self._size = xsize, ysize + + self.tile = [("xbm", (0, 0) + self.size, m.end(), None)] + + +def _save(im, fp, filename): + + if im.mode != "1": + raise OSError("cannot write mode %s as XBM" % im.mode) + + fp.write(("#define im_width %d\n" % im.size[0]).encode("ascii")) + fp.write(("#define im_height %d\n" % im.size[1]).encode("ascii")) + + hotspot = im.encoderinfo.get("hotspot") + if hotspot: + fp.write(("#define im_x_hot %d\n" % hotspot[0]).encode("ascii")) + fp.write(("#define im_y_hot %d\n" % hotspot[1]).encode("ascii")) + + fp.write(b"static char im_bits[] = {\n") + + ImageFile._save(im, fp, [("xbm", (0, 0) + im.size, 0, None)]) + + fp.write(b"};\n") + + +Image.register_open(XbmImageFile.format, XbmImageFile, _accept) +Image.register_save(XbmImageFile.format, _save) + +Image.register_extension(XbmImageFile.format, ".xbm") + +Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/venv/Lib/site-packages/PIL/XpmImagePlugin.py b/venv/Lib/site-packages/PIL/XpmImagePlugin.py new file mode 100644 index 0000000..d8bd00a --- /dev/null +++ b/venv/Lib/site-packages/PIL/XpmImagePlugin.py @@ -0,0 +1,130 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XPM File handling +# +# History: +# 1996-12-29 fl Created +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# + + +import re + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, o8 + +# XPM header +xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') + + +def _accept(prefix): + return prefix[:9] == b"/* XPM */" + + +## +# Image plugin for X11 pixel maps. + + +class XpmImageFile(ImageFile.ImageFile): + + format = "XPM" + format_description = "X11 Pixel Map" + + def _open(self): + + if not _accept(self.fp.read(9)): + raise SyntaxError("not an XPM file") + + # skip forward to next string + while True: + s = self.fp.readline() + if not s: + raise SyntaxError("broken XPM file") + m = xpm_head.match(s) + if m: + break + + self._size = int(m.group(1)), int(m.group(2)) + + pal = int(m.group(3)) + bpp = int(m.group(4)) + + if pal > 256 or bpp != 1: + raise ValueError("cannot read this XPM file") + + # + # load palette description + + palette = [b"\0\0\0"] * 256 + + for i in range(pal): + + s = self.fp.readline() + if s[-2:] == b"\r\n": + s = s[:-2] + elif s[-1:] in b"\r\n": + s = s[:-1] + + c = i8(s[1]) + s = s[2:-2].split() + + for i in range(0, len(s), 2): + + if s[i] == b"c": + + # process colour key + rgb = s[i + 1] + if rgb == b"None": + self.info["transparency"] = c + elif rgb[0:1] == b"#": + # FIXME: handle colour names (see ImagePalette.py) + rgb = int(rgb[1:], 16) + palette[c] = ( + o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255) + ) + else: + # unknown colour + raise ValueError("cannot read this XPM file") + break + + else: + + # missing colour key + raise ValueError("cannot read this XPM file") + + self.mode = "P" + self.palette = ImagePalette.raw("RGB", b"".join(palette)) + + self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), ("P", 0, 1))] + + def load_read(self, bytes): + + # + # load all image data in one chunk + + xsize, ysize = self.size + + s = [None] * ysize + + for i in range(ysize): + s[i] = self.fp.readline()[1 : xsize + 1].ljust(xsize) + + return b"".join(s) + + +# +# Registry + + +Image.register_open(XpmImageFile.format, XpmImageFile, _accept) + +Image.register_extension(XpmImageFile.format, ".xpm") + +Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/venv/Lib/site-packages/PIL/__init__.py b/venv/Lib/site-packages/PIL/__init__.py new file mode 100644 index 0000000..d225ed1 --- /dev/null +++ b/venv/Lib/site-packages/PIL/__init__.py @@ -0,0 +1,139 @@ +"""Pillow (Fork of the Python Imaging Library) + +Pillow is the friendly PIL fork by Alex Clark and Contributors. + https://github.com/python-pillow/Pillow/ + +Pillow is forked from PIL 1.1.7. + +PIL is the Python Imaging Library by Fredrik Lundh and Contributors. +Copyright (c) 1999 by Secret Labs AB. + +Use PIL.__version__ for this Pillow version. + +;-) +""" + +import sys +import warnings + +from . import _version + +# VERSION was removed in Pillow 6.0.0. +__version__ = _version.__version__ + + +# PILLOW_VERSION is deprecated and will be removed in a future release. +# Use __version__ instead. +def _raise_version_warning(): + warnings.warn( + "PILLOW_VERSION is deprecated and will be removed in a future release. " + "Use __version__ instead.", + DeprecationWarning, + stacklevel=3, + ) + + +if sys.version_info >= (3, 7): + + def __getattr__(name): + if name == "PILLOW_VERSION": + _raise_version_warning() + return __version__ + raise AttributeError("module '{}' has no attribute '{}'".format(__name__, name)) + + +else: + + class _Deprecated_Version(str): + def __str__(self): + _raise_version_warning() + return super().__str__() + + def __getitem__(self, key): + _raise_version_warning() + return super().__getitem__(key) + + def __eq__(self, other): + _raise_version_warning() + return super().__eq__(other) + + def __ne__(self, other): + _raise_version_warning() + return super().__ne__(other) + + def __gt__(self, other): + _raise_version_warning() + return super().__gt__(other) + + def __lt__(self, other): + _raise_version_warning() + return super().__lt__(other) + + def __ge__(self, other): + _raise_version_warning() + return super().__gt__(other) + + def __le__(self, other): + _raise_version_warning() + return super().__lt__(other) + + PILLOW_VERSION = _Deprecated_Version(__version__) + +del _version + + +_plugins = [ + "BlpImagePlugin", + "BmpImagePlugin", + "BufrStubImagePlugin", + "CurImagePlugin", + "DcxImagePlugin", + "DdsImagePlugin", + "EpsImagePlugin", + "FitsStubImagePlugin", + "FliImagePlugin", + "FpxImagePlugin", + "FtexImagePlugin", + "GbrImagePlugin", + "GifImagePlugin", + "GribStubImagePlugin", + "Hdf5StubImagePlugin", + "IcnsImagePlugin", + "IcoImagePlugin", + "ImImagePlugin", + "ImtImagePlugin", + "IptcImagePlugin", + "JpegImagePlugin", + "Jpeg2KImagePlugin", + "McIdasImagePlugin", + "MicImagePlugin", + "MpegImagePlugin", + "MpoImagePlugin", + "MspImagePlugin", + "PalmImagePlugin", + "PcdImagePlugin", + "PcxImagePlugin", + "PdfImagePlugin", + "PixarImagePlugin", + "PngImagePlugin", + "PpmImagePlugin", + "PsdImagePlugin", + "SgiImagePlugin", + "SpiderImagePlugin", + "SunImagePlugin", + "TgaImagePlugin", + "TiffImagePlugin", + "WebPImagePlugin", + "WmfImagePlugin", + "XbmImagePlugin", + "XpmImagePlugin", + "XVThumbImagePlugin", +] + + +class UnidentifiedImageError(OSError): + """ + Raised in :py:meth:`PIL.Image.open` if an image cannot be opened and identified. + """ + + pass diff --git a/venv/Lib/site-packages/PIL/__main__.py b/venv/Lib/site-packages/PIL/__main__.py new file mode 100644 index 0000000..a05323f --- /dev/null +++ b/venv/Lib/site-packages/PIL/__main__.py @@ -0,0 +1,3 @@ +from .features import pilinfo + +pilinfo() diff --git a/venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a19b6fa57b555d57c239d63c64cf0c1b7a601ff GIT binary patch literal 2471 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 L#=vD(9@6qZ$~bAb literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ce6ebd8a8f12936b953da8fb8fbadd9ca7b988b GIT binary patch literal 7123 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50ed585678872eee45c2cf491ae40763a62ab43a GIT binary patch literal 2809 zcmai$&r{n*6vuZZSqNh&5E3$NIG-*m0Os5mqGpf+8LB^KE z?m8hJ(+l}S;E+QP{fBhzDd*gJ>U%3$F(hfk=xM#b_xnEYE%#?(Bg+8AATS zALGY{!uRm1Pr-1)X^*tX1HvtCza-o~wOW+ZCaF8Gp`C1nXva@Eb{lF0fu5vgaoV!; z(JhBNyz-K?D#GnfbtrfF)Jxj(xW}iVcA78p8D4{$Dxc+ZP&30n;q&mV@da4%N;b2R z#5#y#As;>&_Nxq@b=HY`f+c%h5o)Fn0?ksHJd3zcOp1WBAPj|4OeZX0X&^OAIxL8p zIF6K#;(arTnc`L_kx(7iU}L5<0~p@r&o&fLGlDGomBngHB-S$O3DP zY_RZl$(b{<&M5`;VE^{;Z!;Bcdjs~S#pK@Cs%2vX_8Ig|V}orL8#O=kz2F2zpQO`K zLN{1b7e|v~KT6^i7R7Aug%;|a5j_#_>jM}O4MDaJi1eWWlEUe>>Xppu9AtKysLaim z%iMgD%uzxd)*bxzI+=qq$_fmUE||ZFM9ThcZZz7zDj`+7`P0tk(+7XvX|Jd04}lKa zkCQOywRc57ZKqMXI*8LCJQRHO`GF9<)p-BTQTN+Kx3?cYZcliAEq#%Bz8}Sr_WjRb z31w*ZT$=w4mnJ)pJBD}~eDI5}aUgor;B0OEXtrCY(t|ov&J6?z$=pZW!fUzKH9DN11Op@F{pewgpcBD) zbolm+4}>n2GI{Ae4wOOHi%}=o~V~yEMlQwl(PQ35g(?%!er-Z-6!Su)~smq&46H7!HL@ zR>~83BbPvEu(vHKm(GIx+@o;U=Yh;GjuIt zql0VJErVA^h_D6KiCtCDiK-E`7|xM{c1L9kwp&)F1S8g#T3Fj@19_1$~tH7iAK%iAx;N`5d;A zxj~u&t3{&9DrRblm*HhCrpE_UJv@lXS8gr>+BrJBI+?G^-dm6*&@1&>ylms3FML0% z`aWdCK@ZC{-#;1zy`p8x_jwZfzO3OMX2E1ulw@9WbMt4vxw)Gs*DKhF9yOTBJmzMF^n^rAwgfQ|K8B*(&O2)~V@&T&F zzuz5vHGZw7(&NK#Uq1Q%=`VZZhh_OVGST>XF^SUgE18w!GAVavc^OTPrPw+BNy>C5 zpYEL;eO{RHi)YWr2Qzi!0K4V6ZG_QeB1>}zcG3(}psEdWg6gIrz7Ji02tty83KB3u z14pocUvcXS7f$2Z&SsBql2iuH!Rwdvtv5+7ic>v+DP5>*a+(kgu69ihQdN;7a!HqD zL2C`RSkeVEPQ@;$zH7LE@mDIGg>x1g*LW2ZTo5Glf?m+akWYje;8l*xNk)+o2CWc&CQ+_y+xLkV%}|xS&tAy zwE84w6$v|lba7_P7w*DaG!}m4iZ-shMXE;S$CxjycmQPq^mRrnBxJso7iJI*fV@Er zH2wn^Q4J6)tf5tHVrk7k7!`v_&8i-pN+kzzG0VlOgRAh?hD@PHErwf`#iiv&rm5vh zMxwrH+de$cO?37|sX|#-Mfp@(2dY_NN!sSC^HSDxK_h&dm@Fz`_WnJ~bux!~4{->% zfi#Cr0A(6muZUwUjiuVs%+kbCVX3sVur&I=rWHPL2vC$VzYD7V7zAN0r$c?}JDm1u zhjQxC&%ow@^qoHK(c5g^yIEtqb$}6+o*#yJl*ur(tuV|AF-uYJgyG37O0Qg3jhQ!G}_Z3%W{96K$lbkEA}uWxZ=mo*9{IO!WF&SZg(p X{)6?2zwUvTMrfP9@A-c3lWq1Npdmw| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02849a8d21ece699d160bef4aa52ccf74e67f6ee GIT binary patch literal 1791 zcmZ`(OK%)S5bmCynVo&cu}A_a2qPh)m9UkB98eUYICgA|63fCsoYA7zc)E8z-r1RP zPj6VS)*RTJ_!a8|2af!mK5*gWzrcyAUO!?4GwQ19XMOcmbw6u1YXrXER^RX_AmlIX zTznoFPob6jAOsOKB?B5#infzF0~Wg0W~n#uLmzB6tO!r|Z%G(z5>XMsTOtDKPgz)% zbXJqq!@8`>;FM7U{RZ|$_0)l#wO!J#pHXnsrpDVEL_LW{^2NgxjmAzqvV$8*Dw97B z{(KzcTKrHu(AJ=p?}N}}LZ(#EzL($D6m9MF9XQ|FK67Ed%?wLrW*8i9yqBw+TWjFK zFO=*iqu+@_LjL|??Q!S(QmV4E`}McaUvK{WptD*O>yeH+FY-7_JKxDc(J7K*d6*SZ z+?QhcrvoX|<*fJM=)=paBh-Pg`_>y40ZyPC$LyfPcLBE|wL$ zF}76#`%q)5Y?_{c0aTF*B&lp6RTHEV+MxrQfo3xx^w68o4+zq!eMpA2EU|RE9fWm` zVet4s#(i}gj#Rf$+(2;$#UcuHst|hHQFy`TEAg6KMQN8mgP{_una~1t@3};?eoft{(5K`z$(%hHhZhg4mh8=|67acKR2eT$^HQ4Ds@5vm zA8KjK?tie?xLu8f_7WqQ^W{SJTkzMM@ttdYU9H}3*G#~92Bpclsc}BY#V|#?!THfJ zO3!EfZmyt6&Ei~hABw5cUdY=4`0G?Vx zaYetiu&h-R#64(b3q;_!kZ{)tZUsTW?A+L05%Fjno*|;Jbm126Ct0M96@#9=gJJ99 zS)V_U^Gd^H*-LDX37bmxk`fW(HBz6#Y`AziCP!LkC4}~07)|hG&e2y`L>4ICvWDZb KAXvD+;QRwPY?E^U literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d0e092312bb76109ed075bf5583f3af099fd953 GIT binary patch literal 4442 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a190d43c2c1251dfcdf54c8ebff6751346a0d0a GIT binary patch literal 7483 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 E2d9-h)Bpeg literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/FitsStubImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/FitsStubImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf2aa3b3748d02adb90d2d253a65149e6a503c42 GIT binary patch literal 1611 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3689dc55b06bd1a3da1c725d3ab9c5501b9aa36 GIT binary patch literal 2302 zcmZuyOK%)S5bo}I?Cf~gcASvJ;h{wW#ELk?C<+pZP+sIAMXQhm8Acn8#@l0i;@#PC z&)8nCdLpFc4rdO?K5#(d$PeJmjcXsn$$xxbCOI)@y6TNvlTAX<-2EnH2~NbMyp*yssbf`{z6Xt&Yw&(Mu7YJP`3`=AtB zNWRI`1&rczhHtjd3ce5h0YBiJZMiE<-mtYp7(bS|6__>q~Je zlPGPsmai_YCPgccx3=T77c25DVT`j*+cM5BZC5sQfiqmbx*9_%)-vPnME&hJH+<(; zrs|mf=h5viy5Hon%DYeQKmO{wdoPx|H?!r0pCoRr|;d)#k=Yuf(1Z#3SjPdcAH%v|!OmBZ0Yo=KJ z8TTWr$|uZAVY8B>iPDl*X^%3^fZ~nP(T-|qr)!sPSu4G=UU1E|C+$Us-dbem*-KG! zE%4=3IzhT~gm+PhO{x}p@5q|=^~{<$Kt&;U9J%wV+_}{)8fA0zM}eAtNp<*pIjfnTU1ZfwUcY&h z6aLKUhHeU0&X=bk&EWW-&i?^Rlp{0K7Z~gBKlM%Q8Xqx ziWPKgcDX@y|89s&egNm+16|DLd8Sl#oH>5Kn#PpP)RRu z0nshcz#z&x6$2>B`yp}AAxVZAzO0&%+P-lo3yn31M#foraOdfLPuWCxIA^&@KmJ@3P_fNif%X!$C%5f<5_Nbj)(OZ8f;feY6HY%g

7V-bagu}R}(euV)nvtP5v z>|2bWkGXOENwgDJJXm35Y+uS&2Z8mdbC1NNZ^Z6u#nfPOVoQJQU#p%E*|M=pWH`COGqmwbN)2DDRToGSR?nzeP z@Px3Vs*p4wy^ofY03-@qc#dazpDI$cYl=Xv$k(dqs$aCaK%aE;YSI6lYrN|dH@{rK NvMO1Cy|69M`xh~;{K)_S literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a1d948a12511cbafa5bade2c458dd959400e59e GIT binary patch literal 3625 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 UqQ+~M09=lWgJ1nI`$J9q7o6Hj=>Px# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ef6d2cfdd39d60f19a1f3fdc0bc0cb13b1e2dca GIT binary patch literal 3458 zcmai1&2QVt6(=d`!?c_YHruQhXo`W+Y@>xOe512#f?j*-slPX*Wu;KNGBlcb^X7g0-p7m|udP`cK7ZXm zcm7$`w13dz>Qltz5x#MPforzLb#4T@t>d>47{h{H&^2!IVqgx7c5zs;OIVleGS}@2 zH|>=t8ZYz8&l<0Y(rM{k!M6Acw|>^_RZ)Cj71rsRu*B*mq+or6)_j#$`^KdKImSz^ zw&qsLnr7{@=Y9}G7c7WeE+p$klGS^O$J~(9WXyVgAYyj!u+#d!X8lpfXeiiI;RSB! z4Fr35swj^FMX7s(Z!N0>x)+6s2$PsaJ(djoScze-6l@@*IC;aQ2!tC8&ioJzf{n%} zf$uRM4P8*~HJdv%>u?+dED=8@nH0f5W#AHFEE*PLgCrTnjqPnu3ODi3g%=HnQ5e@F z+279OW#YCcFmijhzO!vv?U0L+zz}+Zy>=zrYp@pY3wGRN&4C-mY>RcEatu=s;W|5v zWbMP6lY zWsX_{Hnh!QljP>wxa9;xRNWKAyyNNrqUQ?!BbF$yFx5ydB z#`pIcL$~jHoAc$lkc8be;lk(1;CeX_et(c$uZR9<=#CsO8ixzi+!95#W)`rgO4v}k zHdr_wQtF@-HYl1Kgy@FSv!U?W$dq7#Fi}Nte|QyARYag>$)-*&ny^7q=}4{v?Af+T zLE2b6xoGB+lR0Z13sgS$dp#f-CM<_3FKS__nC1MntdR3cuUkt3g9t3@W?!+lDi|4Y zQ_U|ZXbj*HblC5<7FmL$ zmAOG#kPI?EP=~oImUR>*qQUlYX=M1v2xKJD>fm?aCrKc-S|Rsc+%IihPeF~5JQhiG zlDhQ)SFv_f)6?=}0;_%eK?k8`q{TMrPFK_q-3hUY4Ju-fj$C~VOdjDI{}zMLaF=Vg zf&03^4cp`eZsK+>@**$cx5Uf1gDdIUApoDtwM`N_xzowBXz~8J*M7a%XdO3e9$7^n zT;Ey=-zL8CI;e^E9`A>#c51wb&P$!{dPOTNp_w_YNPJVxF%{=W)UGkpX9h1}w>UL; z`OJt1N$DqjDQ97poh?tzOMRK%u0AVfI;YS%D@_YY<;;+O=M|DquNUmDe6Hc0Qtp|3 z_~BULCb(9?^)Fss*k7CPSCcBgF)iHI-swMOp08bM(0*fDdPfort^wyyjwZ&#_6Ld@ zCjO-GaL@lx!744FMaTkXwu#xkT{!W=njs0|>me;j_o7yiD|0HHn0(m|(V6_E_hsI? z8tksDeUg^qgf6bMG!E&KPmSIvHSuQQX;D>jY7QeV(i{7@mnC(YmXwi9%~*)DboKD~ z#k2j6L$w7G3g0#pBw>0h-*|P@Jbw24MeF6u)}uX7 z)FowCvkseGWN9f|rA5`|?A3*ilA2Uef79fzA?)9;n~m-(NRGQN|L~&qrzd~j?e338 z2jJ*FjqqaWcEoVh9r>fJ%wfT|AW{TdVSo3B(+5$~ecpcBou~fuVBGh^`sfYdi10Q$ zfDTnen*JI7ZtLqt$*daddR4z|RE>&W(%1D0s8z$#C%5Kus9fqwf=52nhkhxTszxaO zDj)PCyuM^Wd^ zfSjbPRF2-nWC~Zg{ukp5w16{u@Eb>xItKb%@!9^9b`z5lo`OC9$Ny57t~e^M-9!i+ z$bFZ;!+c`W{|0ItBd^Pj!z0geh@6vFKhF{S@o+wH7niPFM yPJ~neQ^?r2=CteQ?1FI$8Wo+&!wleWA3$FG83rJtSB;wnu+h!Jr*|vnP5nPrqx>@f literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f555d387f938986fa5a279d46cfd421a8710d633 GIT binary patch literal 1862 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 G{pw$=&6|q= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37dadd5c82e986b76ed9ba608c8b1ba9c012bfce GIT binary patch literal 16464 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38756bb4b487fbf8c2b172b8279955773da1638b GIT binary patch literal 3304 zcmbVO&2JmW6`!45E?4}LWGT^CkZ#j7F#}t*ilPk+SF#<;iUC`3&9rF=8N`Y+q}C#L zsoAA03%fm(>OH;oBp+I!e?bmK|BC`ew}%Gki8lki6uGp&Hxwz!NLrw~m^W`{-pssx z^M3EWyXA6$;rZR2!^TpXv47CV_{o8}jTW7N2v%pp5WHh_d7XF7y4khrRySAA8BCbM z>e$_UJr6!tcZ4nSC#*gt95IEyAPS<0z9>qfjJ_l)Vj6u}PRW8S%91R%bM?v=6EkA= zgo)V!uTSIaikQRKoSYt*^%*f=W7Ri~zbMq=eyioip&KhNh&o;@-DY1MN;i`2t_GU|na@PjtKgmnGD-Fooo@iq6k^078> zcVD>oC9Q0R?jsp^?oaxD5K9%V7HU$uv<)qAg&)Pr-|feK7`Uxax!q9Fc3`_64X#!T zLzs|Nt<3C%?Tq*Q%#8dXv!VkP4-J|!G9G@|{^Oti^4Gs7fBSKhlRO^kO|*~Dq9-7U zk+6M3y_2w*?K3qmj2aU>G3HsqR#=S%*GOWKrG_wdk8v%zE=-a>UGv?I>6w7Zuu0448$##`zcGnl8BQvuXMt@+ch(%xh{G*#YKaHe{c4{9#+5E-U zFV}YN^m_Na*xPv+HoeZyr?T7I>G{3u{h;SH_ocZ0d{4^G^`O0W@azX+yz}_M!<{X^ z+uKr}@NtFr{f=Diy~ym2A4pGq3#UX^NI%2DYw-%Fo;U@cWtWU)V?Y~g8BAitaM}TA z45P$+zz4<(o1>rR&bIY5`!g@v5umAJEsb#^P6T^^M$RwnUFc#q#bMTn~eCb@3R~tk6L7YlU|EC7CQEyKw+3d^IFQs>e=L79sRohh?O_cXE0s|_{#f2bqmSe=^})R`l7&?XNV`8HZaZX;RU z5UdW%)J>72=yqb%Ekat=&Po@(bbH8v-pP;AU*^%Yoewe7W+`?_fy8GlF_+kmomy!w zwbOj+q*I?8NB40HaL{|~bK~iUX(1^jaEnDCIV~Q2kmQmgFy2Z`!GFZQX_tfb&ln^v zV7`=;VvZFj$rQ9U2RtnY%gIz?(`-^&VM%e!(OhiCmaq~>7)vb46NOY6kwo(gY#x!F z9Ccu%m5D6ZvY-=L@Rww#C$c#$3p$Yne@S*`B5P||(1|SgOR}>GKg}hTWO{)mGib95 z?4@C_gAYDqB7bTp{G}nB7RN13Z7T|@ikxf`(uV)0A@ZRi-S$7xSlxQEb@xs+pE>Qb z*puauR@zd>0Y!J2nF#us?e%&x5SjHX^n>aZL~hw>WqAZE<;$p^KT9|n_m47ubOUV- zt(#e@y?aB`wJd*@p)$kIjHAqWUe85{k1{hMuuoWG6>tlk-`!Ky7K}x5J{#*@TJkJv=rxY9%`l~ ztjAngf0gMgtt1uUK<_`tj;Lt8t<$N*0j3MUaw#ddY>k1(hyhl@8U>xvr?-cc7$YLO zL>W87@nR6ht~aV%&J77mM}(Da_`^-NN!X!>E|0FZh8EFfw^2+yEv1Oo6tsTB4{&+f zGf*YuTAk2~Q6uox8|o^AFSrbO%U6Y49TZB8P=Cm3F>{ci z1Qi!qvGyW}y`xQ~LX{Pw*i&)z+>iIN9MyC^wL*tbPQXB~S-zM@7k?#~}#3xGcXu)<3e7!VXn7@46_%p)8ueWR7Pt2y;O?4)iGSp&)P zjfM!DjfUE!A#L$5)0NMuBUc#G*GrEOQZI(XyOr#~QsAtMcA| E048+FuK)l5 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1c56ceeaeb5098ba9f8e72d0643349ee50bb61b GIT binary patch literal 1371 zcmZ`(&2QX96n`_e*Un~>rYO+T3bdk#Y6V%f5<)17qJFYe3Q^Pm6)RWPbZ3${@!H<; zY}2e94s5t_;l_bOa^S$fG~&i-&)jn2J#Utl2u6C(Z{Gagd-FcV4;B{cfa|yWFQao8 z;7{7jmV?4Qq~arF5+qBY3zADGVSV1^3_2iP>79V|#=PrDwhgV?1hKF=VaQv|^6c{- zDQ1hKa1W{Y5SfB5lhEaop)v2e(vj{7bUo?G8h&fiM~8vE(uw=|mPnK_>Wes0qua!r zdm@#I(#@SrH#<+h+PYmd^C^f_ePPM^Qt<~e$s|7k1JW6@M=)k3 zM66_|{ETvSf8_6CUI&i8V;or*RmT$L!cew2SCE#`@LF%lQi3C|%h=1T!QpkaP_y zd2uS2u+K`q27}dSAg`P*(EhB-K?0U-X|qQyphX41)}j^@zm9AdN_f6>%nXza1H&@> z%m*$Su?e-j#dP)ImbdR%7XJ=<4%O$+99|ta62;Nd3nBl7(1aLWeN(McqmMMzR?|Hv#Qs8p)}r;aNOzU>FXqq&S_zrNsj~Ci zN2w979&4Rx%eAr|4rp)BI*CfHXNGyAtkV~{b>h@mugH_w*!s638LG;r>WFpsvp8*e z)-6=BWBE?50}O0gVcE;7M^i>G+6J>~-NaqdLyAYBAKR6s2tKn{gb1o>&=7zk7&N)O!%SkOz#S!@5o zr4w7&_E4wqAs>3^EAiTsUZJPXP_}BPCBWg39FjBNe4J;!UWY*Yl2AQ;Rzo`f1ijzv_BEimh2?BaH6*8 zhz;23NV?dN?USx-OaIcL1m-0M1DL61-rgf0>V`^?ADb`(rKE6`)>}O zg({S6FsyxBXA~&ug-z)U#Wi*<%1`G|NMM! z@?$MkJsH1x^WvxdUms4MR@L`h^U3Qn;o0P^%&SS2R=cM~#gmy7yC2_4ne7(G58t0W zD)r>>;Pqr*rAK3ZdSoFu%ubKfVpyGT1$29KpzocAc(KpAa6nBz=DM+1f>Ch z1pA%s0N68D-q*O|?vM*AS~CXFd7~wmk);cwMu9LbF(zg6LKQAT#9pQ3G(EH7t^}sQ z_%TlsS?LfaE0?I+1U-SiZs_V0==E11B#EdX5fe0Wpu2(z2bgn%W8ju=?%Vz6GTrCuBh{$uCqhtHbq|^n%t8G(2)af1`G_)xau}uOYD~T#$Z476F`N z4O52=TeKTuEeJT$8Z9x-`PQh^AzzVb3eFh%a=al>jbbj|g*bVKOHFmeY5`w5PRthXvSQlXU0*22XRy(k^2mLC~|N9KO zJc9HEaa{0R#g3Z9~-wWE?bd&u9io1g> literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..284a186e734e9388266f38aa800e8d1ae15ca00f GIT binary patch literal 1611 zcmZuxPj4JG6t_LIGqam)*epU7InWVsU?s9rC2}AF)Y3Lhq-u#sIWS#mQxALrPQ2$$R!PCqdwza?_WSpA;a z*8|q%K9E+x1QE0#Gn&vDOBf}BaZh-{e?t;qv_t@N>j@E|h~5wpNp=#Pdr2tTq60gT zq!(=&o^)g=TbCXsuwHZP=o0RN)jF=knpmGQ)ChJ&2Hm$591oan9nAPt+P0ha@ z+`)k}(nBB}0c!|{NZ~YFq@5VXL8%QdikR1Rk!RfGRk^KendOr_i}xSx?Zi3W9v|~k z6jBX4?$mD06`x%zcjNu#Zd|=Mk(n7fo6&&UD7`uda(E^FNmKxl{PXib8V!$4qy{2z<`lZVIgjn$ODBdQ4fU1HS;(2A(Z(P z3+;{G;t5y3-=QSk&Q`~z07(V4l9T+*Etf0=QyZo{%Vcft;yLG)sx^=^pw&SAeIWfQ zFi8?BNWuh7JRn~%;UQ=Qzz60)1Q1DRH?bwFe6iVykE&HVn2HbN(s>3#Lr%yAy(B+V z!<-D)U($1`KQ`dxoc>Ckw$*?ZkmWTb4TKLoY{*3f=UBtkVZ$!k4RIC(0%?s@8}44b zH>ym`O9V$4GTFO)F&nh8p zE7kb|r=kKgzp7<9@X(@|*r1wBv@|xrJ*nO;c`HTh&%m|r10$@%dNg9|UO)pDQJ*gE z{HJz9cV<<)TdxI+XfRg_KvuYd=?+ZqI94Bk?n|JnKL4*940#0Yi_)~@GnuBglctdI zyg+$9O<&G=akUdnDmCNA_Lp-iq|Q`ccNcRmD6yU)0mI34;EDX5-Ff_Db_$3J}g+FqIfQIl_a&Z^y z8KZdp5yU0HAz%I|QVjg1H9UOHjZrrI?#Q)V#o&10B`lw*4G?XF*unH~q~+cb-~q1x z8f-MCNob!&RN;GBc*EnJg+DwNlR?)Kg^x*LcFw1J;tp|1_ttB1)o>Ri-PIR?z)>H; w*&90ao4mg=k!MDh8d{)lgt)4_jlNno^BZh|#$Tkzd@tIF{Qg$d?$HhQFTenG+W-In literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83ddee4ba114822d4be6cc306b9e7d639877d5f8 GIT binary patch literal 9285 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 a-OGj&Y2C{7{YqQx@V)PA8P-)qE&jh#2MiMc literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/Image.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/Image.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c36c270167e06bbcebf6cf27ed8e2ebc32fae51 GIT binary patch literal 92790 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μ((?0CSBHN%!wsJ`~gvLRoFPe2m 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb623168f11db95f706994d3077e3d70844c0451 GIT binary patch literal 32131 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 HURwGei^@;N literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a76d73a5807fd773d7fc4edf4bd2ccbdab44c989 GIT binary patch literal 14249 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 D58cT9 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d1624ec57c40de1101cbeaa7389cf9d5af15865 GIT binary patch literal 32931 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 H`0)P$nivEv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3e5b51f9a204b399e1afdd1da23592b760c0edd GIT binary patch literal 2440 zcmZ8jTW=f36`t7(xm;dEU2I8C>Mq;_Fww|}k{~IHqKIW#vI0X^tz4W119iDGq*mHn zW`~tT>=r@e0)6yTpUHJW=@C`~hIWd`aYKTv@)$%RkN`B?UAYb&a_e5Gg{Tk+SHv9 zm|;zuI6_HDL=K~^l7PJqEgS7+{g9NkL!x8Z5bG!DoV2H%l9tBI=$n;OH7Zv+(*;&5 z8>P#j#InH}>x8*0AghEmKPRj;t3ym8{#`ndW3z%NeXD9$oob=#>Zt9qxkk!P*#f zf!jQ>?&ayoZx^B9JPm_fjs>3>8|TV~qxkqEWj@{AQl<#bd~<8}slXGvG*SKc<;$0s zATKBH9Yk@Qoq1o4LA)PL>MTqLAYj0VWUR!`dNa;>j*z%0x zI>_ZlS(i6|#9V&RF;}Z**_?uhIZ?3{ozEZH4R$kLPi|E$sG&7|2kl5+Y*pKT0Q(x) z->uqUZ%=#T| z{50l2Q!piiuu#M|f%WD*L{;Y?9cefm#N$zv`sViD7JQXDTS@-L@Z{sykU_XymvFb| zMTM6H;gdrzfP}x9GlQ3<@kQ^Kq6ImKHY!AbSU`n&3H-W=B~;6xfD2?GRlSf$ND7+W z#0pw(pt^}_6_mgHR`5Bgsahe$IFzb6hx`$89DGlCm@%$wprlAD8}j1k%8iOBg;;3_ z7R`e|PnoK3AtmlT5g%Zr4UE)!wJ&%D#63N<9S!t0;E-D0&*WZ`$2{Sw$=$KmY&$ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3f6a57ee964e457b5c75c50e7272e0a2059952d GIT binary patch literal 8143 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..983fcc6fae1901d20b07ac4d4bfc5f7fbe88e64c GIT binary patch literal 1270 zcmZWo&2AGh5VpPE&8D>FM<@uyPdEmtkt!h$P@y(0gh(Nj7E}=}vbM1sw&Z7PZ%c_b zT-qn#3E;qi8%LhSS5CYFCuW>9RKk{LJmc|Q@l*sQ`b zw}D6!lRA-9vQr}232Rg7Nq$P&Op^4?IF`*2n^nN9{>Q|-*l;&C$|>9~`2G-YL~v z8g!Qr_U{j~XtU9b8vVGdFz0Ie(S|}KgCrB;8U!#Q5JCetN7vBiUtOwamK};#Fp%SN zRe%PPoa|#iAYbaz0ETM!_zA%PwjcylRES$37)+PYQR%;6&ZJcd@QH)CuY|C3LO{_D zd$^w$;@~juO;5n39Cn1zMewE(R_B6Z?KDQ#_}Z(m3_dHQoP~kY%~C=uJaZ}igiS`w z4+LJ1_Su+Hl8`YwuI6;#`@+AH4f3`ev9T9*)*YCz{QCSx=#mKdk{4kqU58^By_r#Rh>L=cFosKr)A1d}5W$2j|91^80!oyCA8Q z%atrSJw5&S`g=bbAI!|uH2i*b{nPfpU(&SS(ntQQqH_&TxQj+;f_Yj?6S^=w*4JBl z-)I?36Qx#3n4*mNim)(S6*V!{tF}xrg)a?X7G|rMH8EQLP!rQ)=BXxTp6IO#zGlT4 ze4W9UCD>i9KKBf#Y0YO0ZCy{yjlSJ;l9{%Px9j)%fgJ3*nyzWj%2@Htpr%4ii5iO< zlNzkhI(Uj7t-OXO{2m%dYcZj?m@iA96Ru9?uOU9(2(QBMGn}51mIt$L}~H z=Jp*P?K+{ezMjJ&U~B73jYcB_oPy_#)fWa5xKmia1%zV9A5 z9_C^2lWWyJiuP$ctXiS0-PS++FI5Y|XFd9lC z)Zv|>l#UPCDx5yGy`giNgX5iDtj(}Xmpg*HUG4`wz&^?QcBIxowT8YZ4!cwEa)KFa zAa0F6whwvE$Aa!ArkYOAj+|nMSafsP?~`DZ;udF)Nnf&kn(YsvgSH3AA>VO$5BlrZ z3qZF4=(a0mK#u2I>NV{N`w@#Vvyj1scbIOD z=2w*gau^{!Fte4>Jm_0lY48=$myWHfF|`KcpqtF`^jJfg=y;6wu8iTSy$aq+aR%lU z4=2x1XO7RUms{mdAbm%|vALeIxV3Tj-InFZAcUc=6}@*`B}ep}(cDM=z8^gH3)6hg z-mDvml}j=)AeW?i>!9N(-%u|lrO@%Zau&i!D#4)b+kK}stAMogUBA}kS1|v4>&E)_ zNAMis_TBGp-TJ!^KU>|tJ{a7zBYS%@=-A%&J*Pj|9=L<$p$|v3?}+8cyN=^6`@Pji zduu_o{r!#2Z52P1>un4U6RX{JeK%^iui=D{qtTefEWOOisx9G-N7tFoYKFz;^wC$w zD%!|*cPP5hkKUwiO2y{UiJ^6SP_*x0ic||Kz?yZYD6Z@BES9LgA~9{wVJw-pg(x`i z03)F~f{k9AIDT?XhXN%1=uMhVXoL+ksRsW9`uh_t(mvNdXI)(&NI$hA7U@seP3Y+p zvH(M&S8hrIA?dtlb7%_4G(wQSjVDBQ0OB5=KVo07n0=vL19AJM1?>kw;1O&Cgz5@V zQ&EM`tv6N@=Ay&;NdZ?tj&+^weN1UZpkwM4el$plTrc4*YT2Hqee0Q>`SM7 zjJc4K3sQ{|8(sY0P%4;3Jfufy0_~2W2f6fLL}Sc`q|$RDqU{rG$z?u2abh-II5iS8 zB{)jlOXx&e4513PuZMFH9FWkD_0P4ga$iraSSN9xka*0|(==&lBV6={5t0RaUxnw) z^0@5_Zu4|j`2jVOMk2(p-8@|IEZSvD5v1%6T!=~$5a}qyO#-2$Wt?t2qr5UXtz|@v z(z5gDK+9&KWiX;byHZAGiX|@)05+(zq>^Di=BK=fNlI9Ag<78AW&1S!uTm!iKFjfw z+3O)Z52Yu!D3m3oy}2)Q^J_rt}ba$GuwfgkJH z3Ufh=j1xUJyZQ-(xh~z;L|MW3SyYO#>!@_Iuc0 zQTu;i>?dr-`>$sEt>ZHC|LTd3H!1=3MpAtO=)#C9vH65u0QTw}tHAF!_qDhLjh!0( zYbM~ARCdP>-A)mANO9dL%#$|y?0A9im6Vn!Z<(;$32P<{uCkS|)w(6g z(I#bkFmQY!>-2GE>(0IF_crb{+qbXZ+uC>_ze%Grw>P%7?rddaNkuvX59xYhxPDZx zDot(8C^qGBg(9xXxLecdc$(v;(b&L;Tp+;APZgQ`<=C*2xg1O`i#^PTi)geGh019* z3vYP|J&T=ZucvSQBF5+S(bpz5{soy9E|f~qB468tGldFkC-AC0?T8(G28T-O9UbYB zer%8t9K!$v6dUSf#71~6GDS({VrHI;LG8*XFqzmuuY#TlrK7%ef*1%xF#)4WFmhN> zMlu~JV_b^MC&qVh_M>z6wS&KosxkHegLNo(1?x;vThOo%)uGyt!WNhicE|{EmW~_| znd5@i)d90|MSJv1z!^kS(X@gijw;biT!Hhhh*>f`7zHZJXg0RUEY4}Mg}ibW|IYrH zjNCd{iRt_$oUb2MLI0T;bo_$J^Dr)CsBx7t&%HT1>lf_N`TN?V|AZ-F1jaN!@@@qE zf$KR)-n~LGQQg61+gugaffw`+DYq_43(oI-aFefpKxHh4*1*@J##`zFOg-I$)$7WD z4k?UfbpYq1H^zf)g-e>;3rTafr@;qIXy*$3Pq zPYZN%)cE3awwRjB6xK-!s?QnE%mxPaU{v~eW%XfGQr06$6Xmzi)Xz#zeU)VD(n-o8 z(u2;fT%%FSa1yg8gW*8_1r7Wa4OAU}*r$TjNh+O`OUe-C8#HU|xPEGMrmDcww4yeV z&Am;KRA%v))T2O{MP$g^w?1^RLf zs6L?DAukgQrC*9|iskiEs%ex(s)etrAe89-i4a#edZ=hDHjigCm$BsK;)TdH@hEaz z=upZEf-E^7A&pekEZc*J-8bah7(t@&BNiFQr5K}lOu9^;u?YOktoN6 z$?o7%1Yez9%KH&*=|TnT5dSB$RdpC$r4U#Y7ujegm#{kL zRBcMbHHf^0qf)Av-`-6c;QzaL z{!~enQ~r}JrdBsYm2=>?Q|kUWNzld1f8a^Wf06_neKohPQ}7CDkR+&9Q_{GJ4(f4K z<4^RTpMz_pBo)yjy>3C(r2nn9r9IG4HEDas6Be0}+BKomWlU5S7@_(d?y@v`a}$n< zd|~0K(mxycye~aY`B$RLo#traz6_xHAUh2r&7gSM%mwY<<}SMF=FITmShy zrOVJ-gb}Jy!7G;XDvPCW+_mv{l1YA0+B)XOE6qC5AMe1?s=%o07MqbTt z6E_}GbJ{EuE5wOJ^zSekQemPgpF2H4a=xS>nXa+uQR+aEI87na`?1kmci}|IO9E>4 zXCR+D2lNLXWF%oQlpTk%0d-%L-4-h3UqG!Ark6(lg#*${BYkux*VAmSZZs+XlN(qg zzemmAP_s#mO7keBq^^q8UeYa`w5i#lW_+URDMxi16aR=OP4gJiJjC-P>7rWxs#6l{N}8o!C67*=b?(2J=^6fr%jHUxEZe>7^)82@#-yxuHnc43cXzecQUb+Y*<-D#=2Q>a z;;?&I-6N4gj}us%91I)S_?&};IDm6EaxxGENOH&_ha7^SPYdJ+Q7*~J2#g?`@4f2o z;ZUR`z_*a-W_MNftEyM8-p}`n7stkG8h-xl!oAh@JDT>-^pgKrcsP$M`WM`UCiITh zRDboRE(~FIj4iWi>YA`b=@YGKiL$8RZ%Npqioa#?HBl2IpXkksm>1*X2%c=uyjvBz zm}r~gB{7MTnphAoizz&fP+eOWuZW{~8^zlg-j0cByp4;~;l5oVU=y_7SCcc8dFN@d3SMhgBydmDi-&e$psN?TZaYp=(n8O#x#3|80 z$+XaKYW26CV5ZvA6CL-uo|dj|x$9nw-sq=`H>$)u^Y6!v=sNc9WOOIUQjQk<+V@>Po`GKYsaY>huyR!{q>EQYT`KD`g2W= zgUD}gTw1*SVdTl^_RaT}uYB*_A1>U!(CuD!WB2y8u;q4cuXtPC+g-nVsuy(K)}|*; z-QV!M&Z%I1Vf*fxFur}`>b2Xc zK|dz0f`M<~rC{J|5DA0Csc-07Vmz`EEzutveK43AA&CT5q{e+;3Ok{!mt+}*sTsvG z)#OWfZrbZ!+~P_zE%8HYZG~VB)iMjz?FfBXUgZ`uc#dq`c;v>YE|2257&CQDoMK`Zvdz=2Y0^*V0sMUKlfP#cHq(%o{xHuj3=_(8W9 zD=Kr2^tQr#XgfRG>cwHZJv-}kJ=wyR$(l2b4(V1eiXAtA!Exm#J$L;buY;atxW#mf zj^?--D7)QA^+=nO2}L0a+?Y#;=s0U0wmt^3)`1#!X6EaP3Jo~#ohjt)?r-=p_;UKK zx9W`=*DQ8jnk8@LMQ{Z(Wu*{@PFIF4FNzv_+o}03I`4(|oh>)mE#{5(sKfNz2h44V zgujku@l;=H81}jhdteYV#<}NqdKh3Y@|>kG@K{v^p)+WQanl+vN-yroV9~h{r~#{D zNk&+nz-{S?!2QYReEa(#VcFdYWa4c0x@aA|dAx9hQTOUvF)>;(d* z5^|85r1;8iw~HdyUiEQFmMkqRcBExBC;1f=$}i#8EOp#nm|A@!HT<1a51J;LrbZ`B zjSW97MG!bIErVN;_muJ+bsS7$t0Jlk{Z4mhYGe)O81&Eg%&mX7WXnPOP|u^*U^uB6}Kn9k6WvP8~u=y zCL_Q~`UF&WZr!5s7?vq9g|TVNvjQ%O1=R+Hb|xw1Pr};Nqq_ktHnj~Jds>O4oV5}~ zdokRe?4u|>grkHfgP&jw&|g)4N@jse$XHZx*|@4ZXJeE4cu2~=0rggapP&o#xJJq& zvH7i>y;b=Q3ZB*0FQC?VE>LSfVk)J?n%2JX zC;P?~SSWOz`&{+4hgrfdAjLA=uu|1cz!2OWAkHQ`d&_H=pS=*PeIEonAAo^Zefb4rHZM0(= z5iALsaN~w^wGG?0~ui= zAJo0Gwu=eERI1VLl0%%$L5=JKHB6@)Mm`aR5k`+>!!i@kok!dU23Aa($1&qI)*Jc6 z*b|9ryixDL`_Uy z#-X3`pqLwrkQ7?a%tQJ9{G0fv225?%2Fz*N`6N?QdLk{YL&F5AwFZYU)%|9bJ+)QLtXV4_7xp}# z-XDb8xeWdU!;9X>O*=jg-{%dZVNy5>F9_Zfe$5H^LF4+QSu@5FsLtZ|bO|Nd^E}#8 z*}OT$?WXXx{3fW?4dqp8pMAS{Xc7EFKcl$Fe`24h0l$=dCR{o~q7p2o&UO>QE8fcp zX3IbT&Y&Lt4tW(nH4p;*IyPZ_w7Y1Zn2${aLDbHYze4B)O1SW~qBTV!luhBO0L@KP z{*j`^{n%~tortD}FS$ixPs4g4w6+tAzCdt|U#3!p$5c%ao+j0{@fdzv5O9Cl=+*b! zvIcL3XM+BI&Hd3ksO{^I=89mj=nwCE`WsRGB_l#t{UsIHQOo@Zjwb7^W%l)Lf|3_;PNPqVwX9`+v%bWs-a)nKCE7D<)pXWLlj0dNWaI9bRpDCkVrp2 zCZbl{yd}f#kbMhJ~|i$X#e6Blp|8531bQ-(@yIG4S)+v^}?jhKf;2kK$5ySwPdv0S_Z zsIGC9*w(ms_0os9?lhd6o<|W@d+`qTbj$0;r@%$BYmRS1IvXZ{Ej4Ft=#6|>y8hH2F8ps)b-EwzQDD)sL zb%CgO^-&cQTl7U*R?;Y^sA*O45{uom{jF8ra{%3$7ro%y`XfRLj=ZUulSk#`tU!5)Ry z*aFVM08!?Blb5KFBqd~w36YQ9hA$7L0R}bb`@KNb{ZMYgQ-=0HJB8E`d<&3<$I)mw zk>`;cytwGl9;ankyz|4sCRbaXwAY>I0zgmcI5j`D71t%kSVe26_?sE7}OwnMw+1 znM&!pgezLYjcgUHEYc|iG2f(j16T!toq(5tP0SG5fR#4Mx@FH6J+~nl_=;d>Sj3wE zfU*81_iqO4PiPcbDC`)*c0{%~6qMwlM9XQrtr)JZ(*I--2z#TDL9y&Y(Lj2@A_=62 z)47nDvpuNb93rRqKHMW`o{iB0lr90AEreFNsmoNZQUiyBeA#%1bh8?!T4pw-Y+_X@ z07jZ-yA!(c&_}rz`7I3-puOMDG%2x*7#So|t&ST-Pj7)cPPld#9)OyIa(hWMAG}KX zI$J1?s}Kvq6&jFHz3=!Dt`Y7)NehcYY4zwfkBqD#U1HD@~K+1D)2Fegy zCWx3dc_tv6@xi*QUTRj0Pt-Eff;6oUuH1aDS;^*8H`SWkIg`|?59_Y9tZEl%&B+jJ zBl0@#g^?m1NQUYXuIN8-!z#lihx(c#^CS#{pYQ~Qg(n0eeRJnm1Z~BDtB@$|n>kTESQlbR0t_3|Y0x z_Fo{Ea|XGbQ9x-XLue!JC%NQa+3s-yXCS*y0p9OV;s7D(_>{qMf-pD*pV)I1^pZux zOmonP9AhDqFnG@qI7wNh(-(3S&j69{_M1+l)C_ejs5qiOlFmUI$7H=4Ne|N1J)3>JPOe3XDhjL95fF zm?#^s3$J=N^7Hi0!4fZzLGlzZfE7`gKylE4#Fpg$Ca#Day>$pA(yPc~OCaulY-~df z4HO+R#ztelX{@#fWs>apZ)#^L&4Nr;_uTb-Ka{lxCkrN>?a;A<=v-saP-$#(|2SX4 zkVSn=`KRR5sa(wK^hD@{q;mxFP2AEd@AWY3MC9L!9?nVFA<}m)Omk`?tW=l=WvT1c z%%>$T$~huI*_~8hYnE6HQwyGNS2n0-k#75Txt&kp+cYl+EwmAW9w^;%6v>=XeabjN zsTa7f1VK#e@_T4g=zDU43Vko|Qn;!(1=25JC&Dec%ON-*=o0NG>~kuCtBR5`<*j1_ zM+vmM76H|511SoeLb;3d2ml4-pC18A;Ikwg>L*olY#;n13)2Mwxhi%CZynA_KF_C6 z;rEbe=bqz5MJ@|+A&Lh;eH5`TIyWd$s-kxVozA#fXvwd2Y>Uf9hzmbxhGC@_Ne`0T z)+_9M4wSe&k5VN*3~rI$t=9(rXll{04)jU~CjVWcu}=h$N+dAi2P6P&+^ZAF!Ab|1qtD<-ffaY*s*_C?I45PvR@0%a7_uxHv+P_6sHCT^*BL6 zl(__d6C2POtW(w-l~ge*hO?%~wv4EeDM|!DDc*41D9$I)g|rR+){Y^l>yKeZ48J8~ zqViJ{JHdAU2MfXSzI*@(MUe|o`9n~syjGbVCNhAAo`pZ{3;E!1vwKfQh&8?Q9q%5t z&L#JOyA}q|cjg#>BGBxqfR1XEpFbGc|8vj^E};kXEQ{FPT*0~O6apzZFo1&Z9D-6& zb{?GbG7ec;6|PgR4&nL=zE|oBQM(I2xrNU=`6&sYZ0c;od}DrrQU?c6qkKemm;^eG z=)qHDB(ILFlL?8gfbnRbqE$3u1TEbKaW&D%jpWfGtEX!xRZfV|b)E z>;k9~M@sUq**{_oj9VSZAtHx45P;XnAv_w@;P6Tg*l9{4MssH2S+iE{o`qE^ zb^v3KTaAJ#hp*^h`iG3HU<%2?zNI~Q>OAv9sKN6`^qwEC!W!eqy zEvz#q%Cfir8svMFA4)J&U2mFe;SR#TH}R%C3&sG{VIfs;1yz(3gAS7K(DNuiuPQgF zS?wS-uu59Fd8ByE0Mk*Wm~;4)_@?mD<_JG4xoB4Tg&5hi`4LQDTx`E%Vz&J_B(H?d zX=<<8a71mmq_%NXx5_7x>zcME%n8$mYYK;zP79f~K5CxSPa0FEyp3;)NB~qg5@3gg zoE(BBV*M_HR01L%Y%_=7>G*pAcFGk}t{MT&3~e?jrD8$UiX4twwL$9Hp}Lu>P#t^CLbM5Ml)s^cvRxe&(S-Ji}U02@SK7Y+3+J8-a;jp|SR}Y;jdFM1!!RK`A#sisJ+rxk4~lg&@dE!wIhqYT z07lSpI21GD1F(~QxI+XsB*wHlAvKOb9pMA;aysi`K4|fbuc`^p1l~GuG9<0Am0vIr z_FrJG1axtfhrPuS9VeYRKvP%?M`Z^FU}Z)BpNIn#2Wk~MFE^=67taMBQ2V0ttGs~? z%YulG%x!gEwJVTjfP!zJQs&h)On8<0PVo*Jbw>h+fsUP|M?M+ z+@F2mZoqs_-wnD`9l_e2diyysA?fZXj1dr{)Uk)BP{$E-Pj=!-MbP8nDfEMs+ zAyC6VvFgq>_R|!`cR|OX!7W})C@h26^8v>3+D9!(l zAV8splN$)#Dfjd(=*>qXj}eC69TnDD{6!8*do)J5DD0(wP)pWEN+-)6ZBVWyaISp! z>O0PL=_4ae#}$zOcGu|;I^~?Oh)9%X?G^H_@NNdG$@<}}LkmtD9XRXkHk|8F&how= z!MiLdP%fqzIT>Q4Xee6z;IA6;2Sc{Tgy z_vTrhrjuS;J z2$YBd`fN(z@cAMDeDq7_tjU)uL;fsa?$o)#Zsk(l+ItY|4AtmdQ`eWWHrcBr7qos{ zF5{0}q1(%JW8Tt#QSrYe@ewR_n48WiH7nWC4$gxsXOPlLP5a{2Ygd=9Tv+DZ14EAt zNwIgwj*q-UG+ny2=tk;`cMT7J4=>n@;(wU3&mtq;>v-n~5{_nZLoUl0E!!iuZBNv$ e)mA1?)sBq6GCp4Wa_yzb5A7O$$8a5~z4U(}hh^sg literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a1bf1d03c65710f328a382748d3d20b8c2290af GIT binary patch literal 5513 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4860a65ef957f025f9752ce94aaa3ae53d81bbff GIT binary patch literal 6642 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e686fd18c343bd528b5865e67c9f0443a1c7073d GIT binary patch literal 3712 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 YGJT(ZMHjaH6Im!;UR=7mbZu$*KkOHlssI20 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab7d3d18d5b734630cbdfd161bd10b066832cafb GIT binary patch literal 8070 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 PQ7JmoDL2v@Dun+7w5Zfw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..051edc4a8df7957d89753614b189951d3dd301f7 GIT binary patch literal 5874 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 KUPoZGX8s@a3YP)^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e110b73841da9c33262d4faadeac8d7074d0aa20 GIT binary patch literal 16903 zcma)jYjj-Kb>4l=%$>pDNe}=*iW*TQ#nFQ%z=tTAkqDBYNQnd?l9H$?o$&zY4tR;d z40z^(0wyzdBFOQhcEY%^SKFv5@S|R7R@>#(UtV4P(WYsezFaqT6X(WF9NTF$b>b#* znkGsc_51c63**!Y`3J(3|U9=+E^FK2{o7*pb_Tcw8mkF>-^-RY`<9RZ4Xs98zi3jc{1?s9uC4s!#QM z!$n&Ss2vgxs+|%JsbL96)Gluj`J-yLr1z*tB;2bWl`x|oQ~MQDbUc9aYEFadkpHt4^xt)bmoOSAEzUL9eIOk4X9j^`eBQ z)r8bNqs~hDoSO7@qTG4)l7tu3MG0S4uSj@FU6yc4U6F8Fy(-~Vbxp$S>NN>pS8qso zL%k_sPW=rDZ>o<-_@gQ>;YU?L!WlIyp;DeIsyTH_`RcZsS0%Ne%BrFk)g9HPv^RvY zRo{Ivw@U?T3F|%jlA-RZx85<-TVC>Za@Ef5R?BJyIeS!1{TRYWR9!U??o}Vd|HtwF zb;EPmC40D)0AZkubCGS|&jQ<)=1!wT#*huFF$gEBBE zYpTg6va!%cH=$Kr3?1zilxAaLDqk%Wy*v>Zu~YR*#W225(DR-S&GJ7q^bVAI|BbWH z-+Zm=>FUjE7p_je`O?S6ZcZ#No+|`}o0lrHh0@LI-ooO|MSt;`rSf87cHUFZymia- zO3#$%#_rrcRtauSU%Yhl97yuUb(E~*@jVGf#lC&Kom*?Sj$GU+`i z^TQ_Hu$5Iem3`V6G8#_Z#$v?k&M7Wcd@WH2rf993rhzifyrti(ld{Afb) zDzR!gtl=v6l+lO<$$CsBS1rM$P8lovgA_`2?J`!)MqFy7S1k#m+LJlrk4OY7K2*q^Dsi+0!l=NXZdtf0vXDP%e$Nvbj$8 z%<{KUb`&|5{<4(aEoJva7`40MvfZ_A^@wk*TaDyBa~b98ZrxR}VMEI9m9qb6Pma6R>|VS{*Sr{}c9gPvBc^hP^TKlOCfPouk@Qjbbs zWt8pS*jZeT%x<2XZWU8$j%d}C{IrsJcjS*K88I-Az3ZU8?s~G09mgor_m2j9Jc>Q; zz1=sT!rFW(+UIHRv~>gPcIQhd@g=O?K8(oLeH}aUc!ZG?gR>_4vLENFPtH}3tU?cJ z4@GAPwLxK8rznk6)FU+xoHEMiTl**{VPn4PptO&(f%(dOr2G?d3(U3tb)#;L;M5OC zXZ+A9L-n!*PL!iZTBj?{_{xvhjkSSwqtRRMRoPueqYvSe2>Vw?f*tjK^%Td75M$nL zGzMC0GKdwi^*@WoT<>oTL~By-Q%}ptzFHqp&pe0n!A`^u4|6}-v0}6yxEpBg5LRF) z7!F2)T}212I(jH-Reeb2gi=x4ilpwylqRvL#U`ew52$7@;{LZjFpMUNi%^)C&tE*> zj3JeCZWsMx6RT?E(v0Tsg1q^aax;P4rb|H9MU!@hwp#SVq!e2!`#~7hP+qy}2P^*X zpo=OSom}>dM(B75{BLg{&rjdDYUJEvsZhPO=r1?ZC|D)9c=l|5`s$VQ7cWg3{vU9d zJ*Ts_T=lAz(o%r&=X%fi z)x}a_#Z#|gsMQ;}t~Vc^`=jd4z>3g4iD1icdE16?Rrixs^f{a&6vZ-myuB6zLE zO0kI7$v=ek^G5+RenyjT)ZEpt?ES>|UUg2-A%VYdy_mI{7ZA~h0J5W+bJyJjoT@xS znp+jxg~i1%0Z{U*K^RBGE344)%f(6%!ONGtGTvXm=7o;J!>SLkN(La;3r?W5yLleJTzVM~_6ABn!h(D# zBQS_qXyXPvi%9hzfDs!sd#tpTGW)C%YY@;f)8>fTW5zAlOyR%B++(IKK>pHw2p!-? zP0Msq%SGKZ@)0xp%#<~Nya96%b(tPOdwZnKKBVF(xyKr?N9+;SmVXOg@gNLymfRmh7Tcp(T*L=eKnY-M4= z!~WW5uUyV1A9@7!)97EePCv=mQvg}#zTMS7!mOiV`R zr4p@DN#K*p1}E|vh1WZuDvt}s0_I(XTwpSSNdfauRF`0S&|;d{s71Uy-Sct%4P^_j z)TMf46S@?+8gLNcU8WhXb+3a;p?}0VPSwXz;Qd8<)x>*X>Qi&z)t2`WbI$n4NCO<( zS}%C6{%EEVA982#4MPpA_0^qqa9w3cf{nOvPhD!qDPsxNxax@qh4h=`7c8+$YhE7K*lX*q-NnYsA4938hW;i-n`U&i& zJP|_w^ll_;yJrjKawW*zDwI{p%N$V8%=kfu6j@jG2ug(JrO>|m(iuI>gmd=to3GR! zd7zS1$oLc?s#(YXCD3XA-w^zJg0BLEU5mOh2TD-&?|K~xJYqs#_o4Y8;D>^sl6e#^ zLI`P+gf@j>4Iu{N^-zKw%aa~OG}pl-s``1h7LVoySJ58%4Nzy*pab?=AypLrc6IHgZu7SXkWW>{wv6>aukM(J7(?! z!2OM{@LK%9m^sPs+LZr@41+guU3lcbhE{7x?43SvBA z`ZH0eta(G94nT(Frs2Fr_Yv}kqhh0mNE+`1F31z_Do!Hr?>hOMBucoa4H7cQt#Yp$ z_MQDaV|Vtq&RQ}$Yt0D^uJ*`GL1peN70Q8MEAR!(1ce!#vPfi$PT>_449zpqxs*Ll zJ#>%tYbY$+8f|l|pmkv-Om}vXjcvDSp?UX#4LbMg_4m+Tm2Z%d% zI&NCK=V#HymS&=1WTCEldHN-CDVPkogemFux!Rug^tSexIW%!Ln~Pyt#*Wkm@0(;t z=2&gl{Zr*&q7wGGiLtvMI8AKY31gEpH1i{Y2&5R{eA1A|1=)zMmJ>+rX%LPxj9 zYL9Ixc;8xdlssPBwWVaWwK1F@mc_Yx?fQ{g66`4Wn;>&!s)ZZd#Eos>#y4@}8@QvJ zxT71mW1F~R8@S_}xZ@kR6Pvgb8@OjTanBM50&}s}b4>DuVz@*-ZHjP~Sk&wAK)@akop^PB^g@JMYZ z^fo0_7Sd7m=ExOgj!5R%_L*anIlg`7xMUvPKJ%z#9@{?im}DN`KJ&O_p4dL~gk(Ou zede>0d2;*Alal$|_L=jMcLyI$sUigk3J;(Xq0{IA=$^G z?Bfr~KF(_digTpa)h0Qu%LVLMCpNlXz>arfqYDP?(N1i1#ehB5iH$B9u*W;G(KQ41 zL?<@7Xuv+(iIuCy@t*9&o|H=o>~o#i=ZK8~i+xFNPHs#{hv3Jy;AMV-AK!wP84CXB z7W~nvFmX1L4YDu#|AL&=za$WD>t8YU%LMK75s)?W z|1-hY2>uJfuM+%Mg0B<&H-cXy_;rGB5c~!~Nbs8k-z50&1iwY_+XU2Qh_*qr3;uVQ z{4T-o68sN>-y?XBph@sQ3BE`0`vlZ7h{W&zFUJ0m;ExFYnBWHle?suT3I3Ge{}B8c z!JiYnPw*E6|CiwZ5&R{cvR=!tS=pTGaPAw39E@`Uo?JE?&Em z89Vaa*vV{r@>Cs>pOnd;#$dtW8Ea6@Lt-%l=%rW9>Ye}tBA=-226WJro$^rG=VKzl z#C@g{0$qVgfho!DYDqcY4Z7J@!>U`5^(_5%-E8#~UpI#h^acGc^UIX7I0E1s=A9dL zE9iyH_Lo6#9USOQyJ0sRNL$bn&L{O(>ajXBgR9UrqTK}A{X^95gOmlRT%^CQl8rbm zWx(_ggRg}?J6*Jj&K&yB4@_^&x7`~#-+N|t0PS^)q&LD@a~#xzL-ISab$nQxUarlZ z8!g_qZ%WQdt(O8-AtNhKA?61>LLWp*Cmg>>29w*PscNdlDO7#5mNG7I)f-?lkVH3C)Lb+lCDVR&wZFsPD-^YvX_dAQZY| zsu=85@jCC~en_(@&$76mfTL{RR?vVT4LEARVv|@NQgP^2dKyV+Rg&{D{n=^b&S&2+ zAjz_(Bjp_hT~mY^G3rUs3YaJBNwg@XV0nPtyHWaq66kB#C_0dzH^$T1!p4|7aH0u| z*OQ{_aX`o7Et+If?<2XG5iEnQj4`nr79ANUV(2G@ew=!$$a4y5n`a@S7%w3P>cKk| z#@;+Tb5`pTQI2SOM1La|ho}lSOvn{3wTRVaAadPu*gOpZtmx0l)fXZV+6#VJPqVqM zhz4wu22+Km7n+sOEaYMkElOUlyP|zqj0>emCqsIXvu7#~yp=Jf3&r3IJZ`kB8c>Zm zAOa4wwhj~^gShH0F8D!QaTjS4hkfQj>o7`Cx4Xx@|JqA??I(_xf@*uY_Wu--0ME<1 zanowx+6UH}O#%RQpLN?=<8i`Mpq~$@nZ@y}Q{@qd`5Yz6ZU7Y|iGA(KAhp&7i?#XF zL)7iArKvEi+qb)MM7#MAylPxEZonL*jFler(ZjMP%|kS@_QJ?|FER>6rXU!|jN9F} z`%oJ{#QOO-$$_NntmUf=A9_;Y>|p2yuxc|mOf1Y- znSgD+8pdX!XMmO-vhA%f4r@X+sD>`f3FS^zmu4WC%|Z_mre<$>v-5duU`c-%i=}zD zLx;pVba>-o{$B{=OJ&G`^I_u3HL)jbz7cXfG>=hB3muw8{S!#$?7Y8lKbw>i8X_}; z?aioWP|$GFB6yNHpXL^CL>^D-QpwBb!*o6m*}c@tiPQ20Bhf$<<~yEbT}4NFiJ(sKSpv>fa|9h5 zBa1wibLbe;X)tjSng4`*FE5ly0+xDmw+q9lOiiVfJk)78fG2t9(7~Awf1)F zIMM7FcICl1FD>SkKO1DNoLkki64x2j?--Db7%R32ayBUmr*GAv?rH`Zl}f(`E?UAq&^;oK`d%QDpM_ zuoNr8#FAV$%+{SZap(8748a)C4bYp2@{sjd!xIB01e62@ahs}EQNUhOv9hJ&4QJ)) zAhrfYEXu@CI#G|^c1cg_v9)AGSzv~b(X|7;Jsp|g^)Hx4BVih~o*)hP5IieyTck%Y zLL@$xxM4(;XC;lN7SCG4ZPnyBG1+#_Zy8{>K-)K?M7PlG`fRS&<{rixS(LnJ;6X7u4^>2oW=&VQ~g^~15CBb z?Ko|y!586FAhmWPHPlWGBQ^4FT+IKw&}Nq~?eD5lxB={f`+T~65Z#Jmtm8@@m8Ir-F?aD)1*woy$3^Trk;=(M{5k!IA1vx3Zatawh*D;L^oO86d?j1UY?mM5CdzY=#%jCTRtcPwY3;+V zvJ&+JrjB&cC)x2W0+X9$5!lgo*@pgk6bTcrmFLTqx5~B0wmU|&;Gl6i0NL!$$bj}7 z>sfv!Oq`)Kaq&vz96@bDZfCSZU@*>Y9Mk;WahTgYZ$5O&-g2NniE{dj1cwP|Ak%LU zj01#Skyl>6s4ENl^TgOSA8vp%l}ahJ@t#J8?*8cgKEndt)vn?6by}tGhV5hOGIT? za$T)R0k?nuYqv6JXAL8&%K*`O27rZh{r{UqS$BEu`3Idu!!G?lC-$f!D56v+V5+o01j+f5d z5IsbceL4~*_^ONjS5GmvkAT)W{c`}#J&cJ2L94LltE*ojAT?<+*?fdR{1TpE2I+x* zj5t1-&0Pc(#G6@yrwEb+Y_v%(Lchz{qXdTt_+U5rRBLwLB&*V7=gkZO`)EExaE#yt z0hxy;$J~^Dx&2KZxaLuUX9-Rb>?Gg>n+FJ}3Tg5rHct|e6K+y~X+BP{pWq0=7y)lW zlLxr@0>O&_vMyOW8;|5HS;%bw@?`*gu3=6(vS3e=wubi;+O zatkP!Sfn2IpoalC1`&G1JGge}assvSO6q62UB1w=L~Z9hOZEdxw9WKP=+On(!FbPfO` zi^;$?$EAN8_*XXv1d&Ea)N4S8Ne{FErY$^{>6$-RE6nA6zS5Ase~bCHuOd;mh0xyu zR&z|@;CAzxVm}mC47f23;HSTf_yaQ&CX?f(Ory+IOVhU&JB{Ust}@cFh}Q}f$7Cgu z3!N)inpRqTD4{Lw#6bT_H*B1Ob!rscDN!C`;5=8NG-%@SjK0FU27-$xt6G)Ox9x}!R;wO0Zj6OMVp)bF8kTgybU z!JcI${w_{DL~PEI?6wUyb{y=O1vd6Hm@x+o@E~-wlm<+C0o9#08|-|{*UVewgYib5D{)uiNwDP5Dk*v$eNiPEh&5dNlI40m5yY`4 zzXX3BtaT&B+Yg4X(&ZttT0w>tQ5+k zW>Sqb(z1TLFn{6= z2kHaF2LmY4PYQ{qcW3`p2loe$@j3BdT#g;_$P_U5(S%48GgRdb&Pb zq!-%|c5tLVbkC}OzrGVb%CGYzxBR6C)e}hJ%b#7wAaB4hYY!TYk@6Xw$wTw8dv^5@ zVz7*$CieOvrAa}gmCiQk!F+qPK7zFwh6Xn)>xi?d`r!TSG?2Tt8`c+7J*lWR8^)T# zi%qncBkQ<#qPTi$sM40u^>aHMT*P zgskVBc@MJ4N0C_@-q66cs$}5M8-V83V#l7xzqH5r`19jJG^6+tdGZ+_dwwhuOpcz7 zmT0N!Wu9RBPh{{hN;$KkKy8^C{Ay;?sMKCLKKmqx@+M!xL~z}Vc~|3-Lh*rAz(-(zZ-ZFg0I|fig0=wenjn*An@pM?GlfiMZWzK;Kvw}q0R%FLk&RGs zIxXT-M}5Tu5VE2zp_DJF7HRuP%h)6 zCLCS+&K|NuS^ItS@#yj7X#-CbgV(zsXmXfPMtu_jRIHFaLmQmMeJ`Y(>A%f0&Havp z>#rTX?^KI680^Sj#VFNAJI?HV9(nB(#YdkLeSpg&cZUlPQwPa#bSJZB^EArJaB-11 z3o$J5nu@Q`eeBfV-@KR6t@|U^pnjmXe+qs-IP{sILMvx^WgEA_s{TnRBJ;>v>E9us2%z%-VD8AbX$pt>I|Sb% z;37aV_{WS3^VWC&I)9!sqO4#*`l8dO1sg@5P5Esv7&*#!v|NnhH-LRhqf8%Sdtkk& zJ^DlTP+wxdmkIU(i2Fj#df|d_$RB*Wng+7-s|3PhsbJYv~BVdCn<8<($~n~YTZ6mj%t*i4sK<|hD}-#7?w zr>XkXKOo>qj;scM!r12t$hyf#48kEkMHJVH#)#SZ$mm3wPZY!YXQgmZ5&LAWyVX^P z9SSC>!m@mTk#jFk+&FXT%Gp<7OD1{G?h+m|GKa3RNlhTzNx3ol>fn2f{XT&(>2%)! z)z*Io48FU7UZNnYo$KSOUU_};>V-)dZ!b+w<#wRI{FyhePhQJkoXSVG@!SZJ=O(UC z+@AvjjC_(<71<*C&|-q!a)b1r6J!9w#LQArT$XvxI<5+|HRADG{Sxqo7(n{qI}Cqd ze%K%%CO{ug)0iAO!3nm{9D92k4ax}9 ziXXIkVx#gA1`)~GM1JxlS=ZBWXi?wEPmB90C;#n z85?#WAApK!&5jIf;NK~I$k%&#l4v4};Ym8xX(AJ1Y{LvTyVVQ^O-3xQmKGNEJLp4y zg5cu>pC;gm#l5EN(Qz&sOm1Co7$bOw^3pn`Xt`Mi{0(?zsdUlt){dZZQbAWiQ!_JOrU1IS zsaC!M?}C!|bOz4;Z~4$%qJTI$;8IXU3LdSHnSsyqrWZ>#C3YXtE#-PP`injd*044} zt%mQg76T!xVM^52k%f@@k56D>*SqG$+RNh*t4{>li?o$j`vctyd!7nFR5q%bLeuQ$wVA zRB~M}qo--1H`Rz}Qt2e07Rg69;^i;?=6Zn{MS?kkFA#i=fI39|7X;rX_&ox7%id#* z7f{ZrOg-1Fy*a#io)$kCA;%p!p7-32b`j9N$o0G0QD(u1hGX-lNK76<_f%woe1Wf0 z^{W8Uhf^&GnlNIf<8I8o>vp+E+}&Gpu~!=(T5aGXnz9vck1N9uT{y%wb|EvH2 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41fec8391629b8288bad352bd5b623758e31af16 GIT binary patch literal 5479 zcmeHL-EtGj6_#Z$#$&vgzg-rA=`{vyuRXS8AX};|fd#S)MN&>6RawO;xvg$V1EU!+ zGqMmDd4fE`UgRc~%4_5?xXqPcVXyLi-7}gIPIikbF7_hs@|pg+&pF-w^*Lvz^!37m zQ^Mch?;ke*Q7x7JO_2RPLFXR+<2Q4qk}5SyYD$&Ww3<;LsS|2eom6u`j+$4e&=%Ck zz%xLn$7l|k`P>}lPZZ{eXHz@&*-jcS89Mgt+*6BK;|#o`noHp58qhMl5PhDaW%!&ocAR6oghsoxfr}M*Tmd6x*qu_>fo|YFRt&z1 zQ?CG()lJM^GE6UG7VU z?F?05XDxH??3`t?Vwj~Jqm7MR=BNTL=wTCMSHLbC{jG!3?bL!dvoS^$^z%7-yi%AW zzMR_G^?ni;xY$we)21f0$xCi+8O^XowRAp17U!r2F04g9mSJ+lW^smU<~DLfTtx5P zA9FEqG5G7rQptI;`{*0-Y9M_t8HrdYi5GNY zp&ecfC$G zM~6BZH7AF9^0n797H~IqRdkcNvYl-PvZt2|hGCFe<645mdm|Gs z3`9bvQU|6V|Fna6a1hI0-zW3w-C7TYiFds`dQFRTC9mh=PW9@t*OMJ>cIv+9ca}Hu zL-4l9=JJ~3Jj>T}HuJxU3E{;lHL{g>EiJ;f&_OFy+@x71W;}S@L=OSTVMJ0a5ILbg zAQw(Mj6|y&g*_>}0HBvr)Ww}~&L2$9xXx;%+iqQSlcXQlx3+ZP4!xINAAu#^FzRd( zZ9On9n+0-krrj`(JqBrESRgkB+D7sAhNub|C{e?)WFlH&gq`+7j38=m)zLQasMTxK za@gBOn0yxw1VgN&kzz=ZqIWPNZ4wQ=q|0e%|4CnW9`h1*{XxeIT-Y_UyIu8qYx|-- z2ta5U!1?3AnzzCpV~qL9u+6;oWb{%;yaet?3%`gUy*zG1g9~?QqI~J*NF#xhqFx6mWl0Rh-8{ln|frk&Ci`9o-+=_IfL1XL% zS|pJSV&3o?*^G2AJk-wmAP95|=aSKAeIf$dhzaA&1d>>#Umq7Z5`7sZJRwIiT0qv? zu~Yu{&?p|TiExX&*Vm4ZVNV;*kH;8mw9==FHYf3NNQN5kg?Bb;(xtd_+~K(HDzDvUa0bqf7-EwsnN?Rj$F&_u1WPLn z5{bw#$KYk!BFbQv!uMkAjX8sKB8cH<9Navbi~4KM_^0hZi_N>n0^JQeR?Ww%7;|0M zsk!2jY#|BFiwgUc$5$+@fdn$#y3UT>^c%19Ms`FPDVuRNgn8h?=2z|8gPGua2QQH7 z;_g@Cjzn~hg98W0o6Z&sbEzrE>8mNFAszhRbt84tq>E;Hud78cSxKIz+cD*H9NMV) zu8dk;?@-(7sSmbl+tu3kPVLKT?e^_kJ6p^G6k65{o~MO(TqI)`skfCLF?(+Am@?ux zM`iphbab9#k>WFon-nz)m*OtPLyEH$pHkeQxJ_}N;wr@j3PEv);xffWiZ3X>hFB{% z<_kr)ajF=QNApyxP%KfLqBu>lKyiuU8pRgHb&7iwI}~Rqwkgh0d_wUn3jCLjPEgEH z;P0e!u?^?~}c!VN3dZ&vmcA*Z2CHgP<>4FSXjl$DsB%gHH9;i(6r` zxBK|%9^YTP_T$g(kKUgAWiM0%U*G)}>%=vjb7rPoUYshnvlD1>>SFo-8byBo11XvJ ATL1t6 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b4104beca8f6b8d686e3e6efc9642b74da281ae GIT binary patch literal 1342 zcmZ8h&2HO95Z*shv@F@G?Z6cf1Zsg6<-q~m8acE@5!?Bx0LKXG_7Fk>GLKs+bXm92L~wiG|*7d&tjyL6Rv+ER`Z zSGbd&5Z`OS7ddVypwEmmoJJF6R;+lIq-u-?94I-=Lzra`ptd3W!TJ!w83R}Rxbe`4 za6QD|#HWUq8m>Yt{QK(g>(Ni8(&gyn`yZaZdj8w)Xul|)L{&68%EwVU`cX}bQIQlo zv#f~5XG-pz|Dsg7lTCJCpYG+==;iQe^kO`eQE8)mna(Cj_ON(sT46LEtD^cC4l5ak zK=lgX7}cAB{9~BqeE>xQDoMa34Y*{1kX#B#o+BN&k89R%9fQdT+!u$#C;KP!-qJ9L zw2B7t?KHK(D_+*7=|50va!M|#q*ru7D^}ABss|NEDd`#4UsOV}3;H{)X-z^$@(Hcn zs&(l}QPV51Y!d-K!j%Q9nRFo8?itfR%a$Muz7W~oHR}QUMy@QlYy}eMKHN)b< z2q>SlEn;}8GP8Q}HmjmvpK6`!U=xcQN>z?^QdGGP!G{rPQdY(-D?J;7T()SierKx@ z(_AX!gk>^UMj!^Ff;RD6uu^HPu}us;*AGy(z_b0p&EvRKRe=5zsXn|Kjc*G4<%P;V z1GW4dfbb68q8@YUebCyp!vuAg$dKJ&Jvw0Xdv}`nq4jbM?d^qO7EM(cnsyjM0J9YJ zP8hzPMd`K0U8dG-Eam%rBzdMWl3Ov_H;#d7tiu3iiIfLn31&Ip)A;HP(fB9PSXG;S oYYe(tO(45U+W@tXR_pTv*feU^b$%XQ?(DSASx0MRf`b81aJ!uO40%=SEKFD*janMyUea> zVi_KQ{txG&5B*D{zV#{n2~{O}&NvAPVx>7gbLMvD`@T88U9VRNe1EJz=WF2ojh*Aq z0p}L9dn}Fao=k(pV0nSZe3t`n_(aO|_dTi0u7IR2ioH`*Y{J{!h77 zd4K!<*2dF&FR%62v+Pb#1pNnT7{vV@Im!B2lwF-BSrCq;xcb|!l=0PMcw?tzgdt4os$te0L!h%B)MXf!X8)DO-f!+N@k715%e{k(^u><;ttW5^a*)N z683})feY^L{Qx^yi_!tPLw>pOg3TGog&;p_3w&!8IaqO$VipJ<1L|5iyab8%s zuONV#*PC5V(xMe4EkLV<68XLrCC`I660OY#8z!QVABBQD{O|4Cw=;Wfz0*|)+XogW zX)8kIwq#PMNapRPa$%-l-i#&E(%sZ-kZB79sY{#N8%m{0SGV_*BG_AYT(dscr8vq9 z5h?8kStb*q&-2s#at_-#0~Ji9wqlw1Wu9=;&HZYW^B{qJ3MovYez~*R+gb1SHny}E zLU@>}eQoDbj@uUg#sf{IwzHtvH4kEGP!`(ZDIEVbxcL`gh{I@;uFy-43-$_Kv0dsh zkGix*YpenOta&=mHM2ZK4Dqv}ov1B=4lqLI^nm6KWMsbq9D=S^$qP`H(H#Tb-3Q%4 z*#O;HMt9bU?yQ&AvF>1{y>L)9z_eSGM&6=4C&=|2BNf9q>&@!GQ9ccKTL!Im)vs~{ zf`_{@94o9Py3$RAJmSOK*t~0)QRiUDuOJ$Ep=2;o4G1W_k*=TADI{5ajsqWqY1``J zv9CSUR|15o&oG9C=N-;!6}mq{Gu4dH3biSt4MdtXSdGojpFtHfK6%2ZO>E`~quc-r zlsE0Q=`szvOylg4+Ad@qKgBZ*J@maZaP-U>SWV3tx51fR-@l0GAYo%m8GpeJAQ2$$ z0u&4ji2H^@pB@#4WvKuv$dl#sgZymu5$t7<)J_;fY0{1L0-nyV(?S~9;R*)A_j0dr zGaH{lA8$|tLjbcHVAh}&Hv8lZUhii2+7<0_jy!O#E1XYKF^$o$asF%?#786UAXV^! zbaVO3h0H@0Wkr-G{^g_X#gq|E%yTxHGyfy11*^g@p}iYR5N=+8RXOJ6u@%?znj0(Zf2KU_W&i*H literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed54b1cf189cdd6aeb7a86228e3ad39311bf58f7 GIT binary patch literal 1910 zcmZuxOHUj}5bo}IF#CXzMTtpdMH|VNRRj@|rC5V z1j@g}Nz7_AlXEf{itClSU8&Jb*7sPaam8V@BaHVVjfcwAZ1;UKQXOtY@}!U5*(WgC zKr0?YC>Cn?^x(mu7z&pROpdetoyPi>*(iX1Lm5hww087rB-p;r|amWp4v0C z;!}tzpRx!%KyoXEWH>CkSJ-47$B030-2J31Obv4XcrZ{J7~DdQ1{(CTznE^I`}fVW zZ+kx%N*BGoA6{?&vh({|Z!^!I$7S4mIqt`!-cKscdwG(t9A|mlKU8w%w_lYStz^Ts zql3revbX!Iu?~t8Sz7Dy}HYi?hR}(Q;0mKa~JN}3kY7iZ#LPe{F_dh_FD|PrK_6j14 z@g@)O`&{rv-nxgC6lYk83aTlK^+ya&pUkk*2syRRO7h#eaHSyXEk5L%#mDdAv)F7t z5+pavLwbfN4kE0{Z|}ahT*^L8+kAgzDjYXh>m(=3eAJ#{onOK3#Ie z3s{JGs*|aJcf1S3E$CRs?z4OHo*&lFHRxVvZyk=@O&`j-ZYQ8j&*D@?k*P;fI+n*H z8aJcp=r|r#J9?f>+NfINOEe`K?wF)<)ReQDLbHrkP(mZ1Uf=}vz_;stEX_WO;|5ys z5aRZ^!BfNW%n0e=S@EO`+@6`A)hNAPq5EogduLX6bkVHt=*Ft<&iPx=S5==BhmLNS zc*V~7A6&Yi)U|uwWu=3D0Ky~BK1F`_s*QV+zfrA|#cW)*pjF`sWSyslU+ggvcalxlDUQ{F#b)7PX7k5~*Mear8TxFZM&QiuiT`cfG;IUb{ zhkDiObz$=p=xTaN^#cgw55_u;OVg_QNUEZ*le|pEnQoJo4bH8wVWJQ{MYHJ<2$#D; z)7r#cP4nTzgH*#w{UniU{56fcorYnWxYm@jW-i)KvRI#0r9n}*=fioehDlK>ZQa#W t-{I114Ud+}3V2rBQB0Fm{hyO2cv@xT`p3AXAio!R(_eVhT3Qe-@gI9cf5!j- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32d570273f02d20cae67ad3fb8fd7eec1fb21c6b GIT binary patch literal 3408 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5296998de85e12d5e857beee026cbf1814bd0b84 GIT binary patch literal 5781 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c4a8287342d45d266f746ac9bd1a0f518f043c3 GIT binary patch literal 1341 zcmZux&2HO95T02sMOs!2BQe~x1p+rQ(C8o|L5iX%3?sjFQv`-#rA;F+AZYDMp+%AO zl1?mv>Y;M)?HkyK6vzwoVfN5VPdew8OFK)+jvaJ~`F3_^c6RpLS>C^NsS4EI+j;E3W-TUo6YBN^$*GQ-CEv73J8O)zyCm5v zfrJ(cpe5L{1Z#0&34R1ETiBvPeMLAF%GLARK_v5Beiue^*f6;AGKfVa)k-H(D^H~g zx=Gx~@&Q@WsqadM+_E)o?QGs}n@vq~XYzph>~8{rf*nC_GRKE7#sYji{HwrYb^;?- zuxxc33ObRne`BA5sPvfndVe{$3N}XJ^tk#V=fWN1uPEkBq=FsWCtxCttifVod3?l2 z_NX#)oURY5k(C*1VRJAZ&mm?%gWv_{U_lSnpQ1{*9CHNP(<$sR5?03e z2~h8tzJNU}_&V92ftWvb&G@7|g#ez7hSjktSzfA6a#_qHED@y=c4S~_@NU5~;nZzuh9<1>?)NwWgOo9Eqp zKa9iN_t(}Vvro1`%ITsB5eXAo1j?NBoq-z@K{#C84a9|NxWEM!_mqnzQc5mrBg~<| zF;1D7@_^b3Qgi=(5YDzJM++u&a2T4VV6p^fS^7vnHkT?bJx2 zS}W_X!>H15i#WPMv)WO?>wY3+9hJG!k8`VbWj-V14w*~dfDM<=@BP7LtL~W7#6e&B zzOMQ{MLvj(Ui1C^gCLq&9N!m7+xOLVv*i~CZd}~lRQ2@AEYeJ-S@}0W&Ny>FS7vsr hZfVEg4dXx!O8U#$b0;_pqTTgrCL4<;lHsLh{RhK7G3x*T literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2232b833108c6b36e8f63a305044288988b5acb GIT binary patch literal 7006 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 Y|Kr|8kCqvILxpQ%*yQb~dwX4c1RgIN;Q#;t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fafe9b1e9d52cb5d4b473733dab3c0509deec7b GIT binary patch literal 5198 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 C>@1Z4 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf2a50e3b8c835853bb64862dd296c5596c290dc GIT binary patch literal 3668 zcmaJ^&2JmW72nwpa=9WYT9zftk}O)W6EluKo1#STX-aX%9sm_~cVjkU)FrC5NJi{uMn3bLgcfUwbHu9-97UNGpwjbQe1x@B6)Z zZ)SF-RPqcwf4Kg*{(R9e{;no39~*;r@g;|7s6k2F@JBuIiJqIjNlj|Ct&Z*69mjV% zIX~CQ`}vORyTqV2bv`xx0xi-!bw4G($LzrbEii9r5(DER#)a{?L<{sKyo~XLf>W|( z)JiX)-?;sPpshL5+2{lanN+%qDGa20US0PSop<8BfAEs@EHq z5`#zeIee@5l4&%;NR5=FCMDE-YD235t=8?kH6q<4c+BcSyN$6^SCg70&9EcQW>>mR zXpe#p`=h~2kn``4R=>CX6X;F0x8A#RZH2BmRd9`}=UVo(vsl%2pEEs{;7)-%G_$KDlN2D~fw&!$D#vyhcEde}I`kC4PLRtCD{P?fg3D{`zlj781K0SdL+vy2JWCk>!r!$)7 z_wc2h%~B&f2|pI-wJ1z#aPq^Z(?^?q*Z!GVP_FxCB134$j~B2^a&(SYk9vC=k_kpdiU zVJWb$Y3!elB%S>RN#6zSIZgYwBih%$fwl-Q-$>_1J}SFVRZCeFRr6LlnNGuo#lgj) zq2qjh9PiqYq)Ta4!O}U5XVa7EDf;G9PgT+0rL>~>up?a7To*=M={(lPRM3%J`qooI zFFrLXYExWEmuP<4NOSXuHD=YXW-U8CrsUB}dPlwd|7e@$jFFwuwrigB488IcyMH=O zJyZ?ySyduhQ|I|rmFMDGO6b)m<};iBBPD}xDHv+tZCwLu|Gsux=7MgQMRfhp;um(X zZ<8i3VuzG=C#LMs+P|V;Ke);;=>c+-7VQuy9h(eN0Y2CTG;^#La%KD4~r&$1d@g<~=**3=gs&B7;@Zd);1*`Gl z@kS6uv8bwpud1R}J(oy}2m8|6W&N6|L!}$vet+}EO@Cs&4R^-|SchTPpS;tHZn3B( zcE^Uh>g3xAMRGXbi;`Zq8*_n}s4(C>MXajl&m}dPzyF~QH&@4XtsrxWK(IT~zI)I` zV7GcZLJgdIAr-rR?mZT^c7@F0LI4qdWd#a08DEV%-8f>A@QWk$xEKVT#P?R?cFeb6 z3X>L8tK(fqy=MCPO&&M4nBcD|&6Z!dgBf*K%Mgc#N-bX>ZH`Zu|vCOX=2$pPoDDxuTQA3>;(u&x=w3F}<8PV+t3bkBah%L z$z$INI|)Cj*b7IyfM1GwogKzM#C=vp*V8#whiQplP_~bTrN%fHN7G8!seg@6lF;`Q z`E4ytiFtWh_FWJw6f#NGq|9}7fgmwPh2%9AFQT6Iv!65l38iSOHO{UC>S+-p=L(HSMOs35#athdG+cjO{ zl8T)pInaBgNGgDjUJrc^Tpp=dIZ%~>Q||(}Y|Lgz*#V_l1l@=hBhv$qf)ur66a8rZ z5{}+1J1*!vtEhD@gL@jE>X*%;<3YNzM_Hz<9=ACKg-2w{Qczf97IUhfwx-N!_*ev` zjsbrI?jPEhkQj%PSoL<;2-Hz@8GssDuTAprgMeR9&1E#w&}lzPaaCJ-+t9_U{{}{B zU*fEVjALB?HTcKAHdQ|n{?ri&Ma&}gf8>9~)xkFNKP#sGY`9uB>Ar&_px0(Un8i&0 VIVsOwbD`wA-p`F677@du`CmhM?r8u3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0f719485185caaab464993b7e0a68709a41c8ef GIT binary patch literal 26154 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 J9L?PJe*g+OZsh;~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2cbfda63bb2c2d41b66f1ee99f4e2010d746383 GIT binary patch literal 1158 zcmY*YTWb?R6rP#AWRoUsjF(cV7z7_8v``QqM5GsMEtC*ig}MZmH8Y8uZg#h`8=Hny z#MHkbjVP%2i{{lA^B2Si&)KwT9XQ{dGjnFnWxiQ26mkT{*R{7!XcF=Zjf-J`vI-LK z18~BrPde159cD9%HuJTPZX2L$Tt6kYxkb3a%~Qfn!P;!7*%?94ERktvMMjt-jS{eP zX!Fbn@38hrB|D~YeT6AwyW_Tm%BIsZ&leS{3~%M3FB<5917{6n10*g24AQ(lvIWTI zfWd8Ab*$qi!u#KZd?#>=8A;LfdJ+mGDg4>rcvOEG3mMnI8vw)fX| z`=xX$OE*r0EPL3xX`8S`SZms*PoNA)o19TjNA!dyY(R%JUQ8g^kba;8dcLcT=sbaa zeL%U+4Q%RgVwqf@SWPw{j*)s~xOK(D;@Jz26E zRod>>y3(Y31gl^ZIS1eoAVaE2@CU*v){K-ch0D{IQ8RnTLE`o{r3|IgfN{!jVy`ch z-U&G%>b9OBBQ>yu-&8b~H}U={qof5UoC_ln+y^x-0T3-uEox~+c2_Gii<)}>#{aLm zoF1scGh2=mxE!0tK%}{pSM3pA9!$sVXUX*xYAQvFqm2}d? zFei!s`yNP)OBU0q&eFBMz8v*rwKAiK#O6t44bbVgdEUHscXn^@fxE-q;Q)dQ5CCx?2@)g>QXoa)O@agu2mn5`fwWv~&)w}k zb`LXi1a7@Y$%Ooj<-oGyC^DVe^DD8VB#O(iofKWM<+!X;oH$PGvTNcbidE$pj_o*+ zoybgL=KKDho!#3z=;3lI2X0SyPj^p0{{G+HJk{TyGw}DLC*LSN`@@FuB_`T`Lx`Nf zFL>893}q;D(J1PtSu`bW6)kz%MO&Uu(UE7Wm{OLq7t>3bVrI!Lx=Yz&b}3iPE%g=q zOat$n#r#r#v43fxIJh)a+_p4a99|kJjxKF4j+usMw#L1Qb+fp`vs#lXwQkPuEbdb2 z;(aQkT$NQh)u-~RUk#{1HKewwVKt&g)pj-Z_F!?h)EP(Z`@QUZp}0p)czZ^T;$CGG zA5d0tpW0E}kN5$^A5@cS=f{lVLG^;#rSAKfS)6*#P`lOrA2Zbbx2@tKqzY;eQhU6I zZrjC&k>0BwK>7i^eFUj}YClr@y+e3=SRGIgqP0hne^5;!e+oUw;>}~~ka|cxtR7K^ z)uZY${5zr^S5K&;>YLOt_2kn9CeSYr&0H5eBlYCo>A{d>itL^RnMvq zpv*U^6Y3uE_pxo%17 z8A%gZIO&f_Ly?0vPBzjPPU?pI zQ5Iu>Dtt6t7Lb>N$g=oaCegav9e29&IrerL?!P$hk2Ag<0os}9inE=&w$A5ke}|5b zb;YG_oG)>{Y_}7~nSVFkl|PAikU{X__YN8F9ol#I1meYs=N;M^)}LQpVFIV#YH| zDdtYM|i#%R}<54VdXfSp3AWDy!j zC=)KBwdOP(%$NDC)(&n6mP%o3SYf*9 z+&0(jFw?|_2$n;4K8rA?oUo5MV}@)KY?P)wV`H$X#^G~bSeYx73pMX%p~4wET)6Co zD}F5~%z0(y`Gsn2rtUA5!)m>Dcv|BM?(4?nb-%vg)e69$g&APy!a=ED*dI(y<^4xc zB(j(5%QABUGz*b~#ZZwGdW(yZ4GbNnt3jz!RX!&r+J52U$up&^mtUSfee&wrGo|w{ zoqX=>m8kE^YAr0^lI_M8mi?)ee^{DFRemFg(u-bgHk|YKBD-gm{Kt{^27Uoin_)Rv zq9Jp@%43VQ1_y-o5_L^Bk?CN!Z${Zt$pa?vOQr8b zg?L9aws(IcDUp1LfXUx;tdd92G+M?wzTE~)6I*ey9snry_#I%hp!d@NO79kd^1Im# z+cP$Sq%M$rn4{z7lo4`m6(E%RLPG8kaAJCI*zv+*x68tAJ%0cFXymWs*Z%&t?vcwF zDzaTrgikJi@^QTjurUQn3H$AjTl(Ya^767*Q&Wzf`uCx-f1JV74E80#e#9bYc_o

bW0py_hs=%O&DRw!IR7|e5)B#krw|E^ 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7973f70fb5a39baade235b613f6efc5b90df4aaf GIT binary patch literal 4970 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 AAOHXW literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..147fff0c58fe770c04e2b404921b2e2ae51b61cd GIT binary patch literal 6569 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4536d78525b5fe77df7f9376812a67143152983d GIT binary patch literal 1922 zcmY*ZPj4GV6rY*>0GxPl);4BW^X9$ZyqWiB-n^|wqekHS@!nVd z?+b+diNfTwfVm4JYXjkg(}?t`NBhiUeZw;-Vk|QImS+QRaPxwAl^wz@ZeI{?3wFZJ z4bKtuvMQXDns7wr3U+}!hcd5RG1%uEkydp?!9>eY)^0yI7OJYJ&%#Kkx@Hf8NaVR_ zQDuc6-FhlIsE;4c48}H$Yz0V83UW?4?ODlEPBqVZ3~U(tBNNuc?@xYu(qhVpM63)r z49>JuDZ1gypNYg|{PX4Z$L&X%kXifa^TP*EcD~+h-%Hc`K_0aCl1>n{ABuk3PQ!F# z5T`+>C-}yTXF^09@$u&KliNw&KG@xB9}VKt^=NP$#y8VbRq=yPN2EErnW58!$~w>v zvXc+-yD+kKAcA<56OVD~8Jv0MILQ{bARt@SCpIuso^kYOe>e}2dl+Q7kS?OrL{;H9 z8-`BQ-;lO~oRCXM)D=CWIVO_WsC)>mM$~N$v)*3&rBfvQD~CClYI8K2 zqeUcGts^W(soyA5baQBI-r0pWME8cq-ksZW2~`Xr_^u9jwj}OpF+F+4*3RLCH(~Md zRDgxY!?j0oHb~P%=7PIlBwT#373S`JcqY$60uOfR&MIstQ6k-OH*ohve4IZUuFPso z)*hawVrYTAJ9~;AjKCo>nn!{UtYyhHm~=#P895z3Haum>;03s-*O7RYY!Lf0694yP z=AB{w+#Kw+8j5vOWl9ln{j$~E(P^9qFCR#mNQv21mY;<~q0BynDzPES8`?-(b~sg$ zB8`F$XrP{F=5Tnc3X+Jrie}1Ay4_6V%Ho(JRYl`I8u#ksBTDJoM1npCNrH2O7iiP7 zvs{K?8(UpT=1RYkRK)KBn;ifl%{q0c!%X%LTVM+me&$fbCIdKDr#1LtW)8D~a~KYX zE`gR!>&Dt*jjjW}!iLS+UUkz)WBbs;9N&+FzVLlj^L_Ad0MYoW?)%RNK{Q^myNT=v zxoVcP&qdaeVVZ|YEZ+xLXF}0IVLY+{#D$UJ%|aa1WEvZqH=*qJTXjVwmV(5()fWN% z`Dqvj@>F6S=-bklsJD3yDUL&ItJ-z>A*guGDJEX#BF@mE|I#}3MLD08k$s8}Dnon` LlH)kd?gIN4B01QK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd6859d37687ac70baaaa555df0f951bd167f4d2 GIT binary patch literal 1533 zcmZuxPj4GV6rY)0+iS;mML|?W9JU1^xl$}u;!s6^5=@j^YK?CQC3@GwkdV#xO2r8l~YL_Ia3QyGGS-T=G z2|QqH*vdf&t|w2o{6U;ZKRX=C$oS?sG=8qKvsg&&D;Wwuj3TMEZ!$mhkK!|#`Xf0y zl*-QraC5M=S32lMtH5dy7ZioyS^ovXkb(+2Wd-5%{P%(k>5K_>O)nhd6wVZaK5BEi)UA*1teUQ?_9X11|Aw>4LykF zlwDK{R=DuiZ!by7?G;tgx<^ENlbHIjaSbgwZGTV9+LX+ih$vC5Yf@CN9SY5Ya^0Cs z8vb(ipejbbUA1oG*0_;}DjfMHR9Mvwe>WUKZ3l14^e*zhuw`ZOvU`iPOdZCA5i6UVvqOg~9_7 z-vBZu|J>Yk+Sbi-nOZhDwl4PGItd(WFZQ>U%9O1N8D&CR7u{JWPK|Z7lqZ(Onf3O! zx4-4RS9`Xi$GKG2<2+7d!?|^hOp;Cw!O6hZmc>CgiL_K(H-#!$8UrAnNErS)=TQ=B z&H10?^>@9E{wpn&?(aX{+x}ta=g0l6JpU#%VgGp+g-QQFj`DsU=j-D%52F())_**f zGFeZL9-j_B&rJX2v*-PC+PnEr>K^2LAGY>EkXn;5)}&49vAeWEz4F&&cbP{S``DSZ z7w@f7iLk1;@QJ$zTjO88ATTC$S3Ll|LlrWV`a(Q}BW5L2BNgWxaMaLH@G-fwVp!U4 zDbS942exj4D9DUl1FKk2L7gg5l4;ptC7pFcb)?@Vg)Yc*?82AmX32S*)xva3i5VfJ z%&J{d4#|wZP0AF8qCN%j|7n({O)#&>))omaLapOiV7p-~8k~xn$EuolW-gW literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12dd5bc8b742da875045300067f1993c1d1bb767 GIT binary patch literal 3725 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..038284b795cde10e1fa043279e59066eec789c3e GIT binary patch literal 46210 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 K5Veb>L;nrPQ)|iq literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e394bceb8e20b561bb2f34082ab670bcb9ee6d1 GIT binary patch literal 2546 zcmZ`)&2QV-5$B_1Q6|HXAX!lq_3`vA%KESsJBn59s>!z7E)WFSb&A~z2DG$DS=>mX zmZai3kbBAY+&`cwU>|zuKd^`XDZKWSb8kI$9_3B21^NIEALq@y`S{HYpYc3P!TS5t zHY<>lge+;My zVPc;F6P2S)9kTZ8rWV76IJ2j9N@;(6zbrFm(0+_k-G7~ghw9=Mo%ga2PY zeI7a9inK{8f3Ezsxrp>hQhvGvle?otJ1a16S{?R1U`xGt4=_;%3il!vvT+{u7WR~| z$%?_V56@@t_yZuM6n>y?P(W>=1m4kJW{bAeJ9I_`=#~av{Eq$$dqV@4CfqNnuc&V* zYY&PdVfIK-kbFLOO$%W8W3cgdh(lZvpuH%(4<{r9Hqv-@jV*g-ZWcl7qpTkQ&ZcMK zwYji^z$Qgz27x)9Lwa<}w0hWiIW(2Z%8FY+(S}Tt)B^*dZn;&6Pz$Be@uOHl$(Y5Af3!b_nvAfMl+w z_W~clNZf;QM!@(dkS%o!fZQQ~18o7AcXadySZ4IiZXbU~-^4(U-p1|_qJr3Md`sW& z_N=`vKz2)QX)B=-%4n2A-J!eKO?(@_O#}>)w36HSBx&sf-3Kd_MgN)Bs9V-zE#_{g z8UK#6xFH3n4=nzFPjB|Nd)|-Ry)BV?2vTt<2I0kf3nF-r38@g$01~2?9w|MKjG%E0 zO8xD_`?`3wtCoL9l^MoKX5T*{dfyPe{S_Qf2-A2F#!26WF{tD)?%Vcjk5utkn^@4H z%e80wK8&2ng}c0%K&4DykN3&YxwwWoF=jvF9P;0j8PmImJxuHdKq&3raGgK(oHc2y zaL->aoFI%ltC?#gLVC6i6Z2^BfeSDb!h}1U`F1d-ou&5>-1!IP>G1l`tIr1KzxQp= zKR^53SHJngZ~t_3{&c1u+F-%Y0-HfalLa?I_TyaEw$PdaE;GbxonBmF{9-fRcDkml2S;J z5XU2ih2*!2#b%*k__7E`IbEbEe#7R40LOB~0uEXyz;-#Ikeo%%tm z)@)W9M!8-u)@p@HC08nC3x!NJo7S|Hs*;RCIysI#%u2%SL)c*6C<;G#WKWBRm=@qoFi96-FoAsK<=j=#wV;WeuGcQ9p-{GpLtBT?w@X z)Z|c|L1lz;2&o8(2z`Q(rj14&kcuW2FfW{y>0NtqV0t1Uq?bI2kdI9k?MSDE$>GwqHVgaHG<-$v O7N?W+1N0!4?EDv=XGmZG literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59233aeeb60b9b3bb37c174c87a49e4f9ed7d9aa GIT binary patch literal 6979 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..764b5be819c61af2f8f6e77daec6bf272800279b GIT binary patch literal 3423 zcmZuz&2JmW6`z^iC6^Q_Q6JWqU57~>pe$-3YKt5UHRaBltjclB%qV_*MNRL_s%bSjusFkb&WvXUkOQN68p#P++Y&^P);eoU4mpHwh}?P9 z3AR*TGTno)tr~Xjgv%ec6}q4N7+oP54bjthtw}5Cqn_G5w8RC-SO6lbjk3nHF)m&C+mP0PtdKM+_@y39&2YamhR(xfJl9B`s;AM@+zS zg}jVYPgHK2jj@D!YR1yDKqSw&&oaJ)Jr-bhUr2`4)>>{oTfLjR5WwHu>>f0%-0pOx z%Iz>}b#vR$L~bXl-O5GSG1eM^F>IUL-B?9G1eVwUj2HOP#JN06G~bqcXot?=N2P$m+Je$Z^HIK4w_ zOdJaR1K>@xv(E$xM#+Z&=W&gg7KrCjTszW{1;lqjmcL*vE?rrARq~2oFq?TUCLLS-QBMVK9=-GT5|{mu6>3UPHUmA92l|^m8Zud|$NeUhzZ|BRNT$mgE9x z&;wc(wtJf*j2>}Dk+|6j8+J4WNcOD%X| zWY@@r9j=odP21`^KyL4MwalGl8)9lIO8MCOVUz|3_qFco+>xVszuk?tax08dJxNTC zZwjCTI?5g?-xxDxFXu@v4nD}mA=<$*`el9HtZ3olRi1qSlX>>Ds%H&WiiVattqR+!QEa%A?)J)D(-AU=f<9G;Y@;W+G(a%e(sj44i>i1})3ij4hObI``)Tpe`?iMY2 z34r8cyCuC%DL=weDlVK-12iE8lAC&Kfo<45q-M|VIcEg}^KU5_m#CBuJ_=Bu9XkW) zXu{lHJCB+VAcl$HMnT^uoJ?*4L6bEQ8GA8Y^e%947&Dk94~T7*040KcMDsi^`F^t< zB#G~joNDYuYyW_jP~I>;ML#@vO&nc$!!KkoGJHwD2VVVs0u=dqVU#!d)TsBRN}4*1 z>D8y{eW1x3M$Ei=B1BWQ+oyt%>)^&UVlqO}b@&Ukgl1e}b6dFgTuT$ZNe-fqdU}YH zB@)Whl-%SdQz-|=`yyFPVQ#81DLb|@I5ZRVOg?=u*-7wH9bKo_C}F4X&U(~M>*47A zs$|19QAY2~BuG=87e84y*{7f3$c8m~Nl?n>E~PYG`ETY7?LQznDay#oF4xb29ob9! zofe?#v>FRJGfx>!n&m}*GmHX#s3|D*&j^sVdW8UOqdy{0ByfiSC4+g1>UF~2Awad! zT;5*w(miV|X(aHfXAfISZ2bvVT%eKQ-t-xZI!INNz^%yz9Zlwu-*Wf%=mqo<)trQC aWR1@Y+j7elYkaa?bjwrE-LV=U7yk#?llhkb literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c1dadcb5907f0f44a33c5c871a281d3e5c36174 GIT binary patch literal 1437 zcmZWpOK%)S5bo}I?08>Z8!L7q4l5D~R^W&b1XhHiIJRSqjI(kaJG2&!#@oH?v1ew- zJ#DhK91b}A3l81`2d?}Eennq7?U@@FsOpV_fgbhORn?EG`nq}^*J@<~?dRq1!kTxgixevO-OTy*B@IX!p?}Dz9Z#%p^ z+{G-hi(5qIT!r6H;Pk3;=y+@8$p?|hV zL|If`6JA>B>rpFXgX*tH*NTa?qQ+9X~ zC(=}{*p3pZwQMoN;w8fdON9>`+MhS?-~Z$fkjNNG8M_F7ApmD&>;QD}WNbL1VFh~8 z064eY{m5<-O^z5u!M4VDYKs~_{CatPV+EyL$zDACg(%$eCtrEcd0t3Wbe?^=z4p!e z_xC!>dA=IysIxifMoDK!rgrXM%D^FzyORxWKw6 zJjlj3jq84pOkR3pIh%d4+te6C7R5<3M$+FBg)Wc>OVqC*XrStlUV@tuy`aT{24@%a z2WqYE2$&sybS1x{=d^eLD;!**y>lwun@}RcJ95;WHaWhtN6zV`KO&c<5qU+0e@?)KaLhMpYf*J)HDZl)n`TyB3Cx g%5oKaG0E&9-f3|IV2(DJ>$tRTKSm$AK`?v!Z#1D?CIA2c literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1472127db47be31e041ad8fd349f8165c7ec2d7 GIT binary patch literal 2022 zcmZuyTW=dh6rP#Ac)hXR5=xU6RIQ4NaI1twMXG?(E2UH_p`w7wdehZ*XKZicy>xcd zCdTEVDH0ET;3wD*Jn%R88S~0hC4K=6nRA^vbG|vg(QLW|zTdAu34f~- z@)t4(p9PC+Fv{mZIN@|ae8L$w1~g?pOAX(kM3Aw`%?b4_ZgKks@$K7$*SPb7a7P$h z#=ha#c%8eTaReLJMQzI!HDOQCmyH)R?@XBH8p!d58Q0WY136CblXmkJoP%t!WuU~aM;Lu~r9=bH$nK-Y?BCoE@J9i$2o9Dybu%Ewn-v#Ck=l?qF zz2UHT)S-Q~6RfSRtppb@U4rnBlBx_k!Dfs%fgjEWjGHjZ6F^2}OeVT!zpztKvuy_V zXKcKxp#hTF5!zJQgR+uIfvZBo#qItK;8CgzbZ@ZJOS08s zPu0RGjzv*@fM;Pq2$cxJ7?%eh%CEsF-vc6uPdV`!r@q0NZ*qg1fG0p4WM!+y!5#<# z-*|B2>!JH#ecii}RB2QkUXlrs5YqaRUc#axV>%*RY;15kf!{MaqVm_u9MQ4G*@W)X zXKcn9nlrQpz%C!oH1`%y;UWP|7B4KUBMh414hdaCuy804VC+QP>v|S5_KT zabK}+p-hPaBgrad^<=&Sk|gWq%1m=ElogiAP$*MVLuA}HE4ah92_iA*Dw_J%E-HO% z4<`+bDS>7IhYj;WWEWvsE&?HJk(sPTTg;_rnN3|bT%51Xsy5$%k~v|RMX3lw<%S^~ zWoLlvMi@Tci3T%`-OVK=q86uf$VC|gP^%=*7jTcNHg-m^6L0V)?zBX>IYkUMP93*}b{ad! zHsmqLWcY3zWm#T%Pi0aG4=e1QE4`@n@JXDQJ$WxlrybEd$6bvbWkqG2B*S;+ET-_& zCioO(3**m+&@B%2Z%B0?Luq*$9Lg%HlGuy;k;GlGZFM%i&%K{qc^uU9_${$M&pvb8 zb-4^HRr}`tEh%#e?*WsM7*5$Diypc&z$ z&p!tkjg>Z-+=5Y_1VR9_Eq0ooW({i6WxC8d;J;LP4m%~D$oe(h@=T0Qb7^)3rbNNMJ=>p>tJm>6K9k4dNaGB zj3~XXn5H331@hnJcH9D{e zjL1GCZvGAtj>tVDA}9GK-{WpUvO!T6HcPS~^ZOj;ut6DRk>6)V8ZlA2oOFvpEPUx8hejk(lzTu~c#W;a3m7`0mb+3-udOblXe3`n^um3+msxVPR_7@5*56z89S&3J;lqZW3j| zUJ0aXlMY~qeY!{Ei3Il9qd(K`jL}>Bq)$^C&x4+$KCuUx6ny(EW$OGg**^c6B-xY! zd@NkyhzBU`(RG%RM(#+HK~0|@Nm(OVDHqO`75|!A!rJ2MMUode+(qPDR5+ugZ$GEq zcauU2d*3F{>FPv3b2=_j5X4+^af>OPLasysb)OX4F5%S{hoDB1qOGfrzre z*~3|b5}vmES5gq=q?|&$!rtSz$?6N(m8Ka0)5sQkPSrF@!Wt*Alao54Vzeu17GfI_ zXBJ8LJ!s3qGO<;S^-nlCkx^N&K*nR#K^`nPEtF~!m7@3 zewHB@+tZNwqkL`u@tBA)$o83}IyfuF#l&DVg*({C8#pH>#d(Nq4A#NB9^WV8!n)O> zV4DyG5Oi@#IRJ{@NZ3iHywFs~IzXv6vZgv)^0h)CIu8uNayzh)VD4-M=~`2%1N6;|y_B+VEXTIz(-Ehfqfqzc-zwp|X6E?)Bv@-@wRV{e@Q#C55b)lQ=kdTrTg=zOCA7rhf8Uu-nCcf8=pk^v+D zm~?eGHiV3u%8wGi6RM9fm}_rFWMacBRV5&op~nb$hgsBO&Ml+uS#yBYUe3qg^eV8m zie^e`qOi~uR+51nd^c-;=&4-;(IFtS%}zT4psBaf3;!Ooq+3$5<;RIs=7!ZG7~JZK tPIeO+#t`!-5jXo`T?BMA!x z;KR{2UAGUFr+Mmsh#&fppOHV1AAr|9`7iXTyGOFZ$(lqnnj8m*y~Sep+r7QzVtsbD ztl{|2+9UUeil+TUi^*6*;u>D*k2rzmXrO};>W(h&hGReh%&^cm9aGns`Jm_&p$Mht znp0x>gDIHWFYZ4AbZ$$7GR!>JV1`W}6r3_Ev*Lm7%zSM^1!kcNb8rUcVF4E5 zHFzD)!W(c7-h{W{JiHC>z`Jk(Y`6&T!TazV_y9hHOK=%#@LTvD{2rE|4$JTntiZ?c z2e<;Cz#rjL_^i9+RM75KSVg<5Y!>ZS!Dwl<&%Lj8O=|{W7(cczZ^nGzjytyKF}pbw zy*RQPeXkotU3)udbB_;eiKNTpbZ2P}ecXg3?%c8A_?5AC&(J+U`J4_96U_C_2D z9<&D{=4ribYN^iB8&zZ2dy>@D^t)s0k zQw&UFyY9M=7*B&Za$Ry7BY_CUff+wR>CcyH<(HT<+U`pXvR2bGYx15??8zu1v4L0m z8csrcfQcmxz_j{zLC1u{Z8CSC{uS+R-@51Cy>YwMxV1|z14}sbJ%Lf7Fh9o7*==TX z){h?{FNkc*nnnUv2$kWp6D>u6x4U+m3xN+`Gg2 z$zBp9OM@suI}DZ{_ZSP8qVCGW2UlXThhFZvZV&~+b?eD6JL_^UNZBNA?ikQ{3YUeG zrklE97&@Opx@K?_Z!f2C@+ssr=>Go*e~61`c!2i}z96&%d?@smM$!JRAk1gl3*$il zr!He&*v+bH%%5KD$1n()ed%w1zhw8k)Q)1?6QkT7ace~hB%8^_IIFHrWNvUC^Q?p^ z)As~sgBy8$=DHYnlc>W;aw^Tg*4IxC#GS6(j4Pk zts@K7bIU168jBUurlhG%Sx!;XQ(z%olJqo`k)D$D3{;S|B#q?>>1j!0nL@h!t!8S@ z4Cd&3w&+gMgMoW@bU>7CFc24kOwZsn3IBoio$-Q_T;Ht~M$s##gM{&H%5_t6ox+o{ zu!Hw$*Y!g$OmNs9*;5wvWJI|iZNDj z{wgRsHJ>S<-Z~x>DLW;ei1K5y`capdnSK zL=*lZnhS{J`bp4`s#Bohj%u&09-NLVr{lpXD`iwTf#Ehy7jepF(KRYPJ`2N1`JsQlNn*=V zME~H+c*zQ9=@m2o-#OzEnc;cy1ZAOYG)n;cR(cic%C1cg%A{8T-6_b= zl0tU&%Ltu_M9>M?$XnSvJ$2;w!)@vbWrw?(3|IS1^j5#2zFZ=%#|ewRv4akF#dbg^ z&Gx-0iUl>t^laQOAL<`{lO3E6LlaE`}xzJ`-}eoCH_S&P}^Y@OoJ1r zHpi(|%L?f*dFX(s8Lf u*B{EBTQ-T-7o)=VCo&*gKhv;u%cvAeMQgfjl&8;Jv<$;E^k3&!GXDo+?blTR literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35d918e6c68d113d8b94f07adda37af66c057cdb GIT binary patch literal 215 zcmZ?b<>g`kf~AgS@tQ#TF^B^LOhASM5EqL9i4=wu#vF!R#wbQchE&F821bSyreFq5 z=9i2>NlnIE>;;)QnR#jXews|TIMPxROG=AUi;F-;tYj!+0a9S%SAersOlWaxQE^PL zN04izd!1p7V?lvSVo73*PkwS@PE1H@Zb3{zW`S;LUO{4Vc4~@lc}8k#j&5GMVPTd@ oeo0J#r%z0Ld~RZ9UVOY>LFFwDo80`A(wtN~kVA?=7VzULJm4n zY6An|R^ zdHP|hxDtks9OV=@1J@}RUy4dt483ro?u&ql_xnPWC;YvscL%e9Dn8%XEZQagag*V3 z&G6<2$TM=0aoL9JZ?02pwCkNHDDCbt+vR6myL|B-ucCv=(yq`c2){J0& z1hHWthq9}Up+K0xsSR|appcDIcFNC8Ff=RX$(O8!V=eHHgjA8`Skn{Qm^D5%XO%n^ z<*i6b&)>6DU^%{3^&@Z37l4sdVo%7)tX8lPI?}0F?n2{fH}I9?`SfC4AHI&)$V&W$ zV8IG@cO#(?t~`h~eyY>2oEVGi^&oOdyyXpHjZZHkzd->CH@+#dM6Bo>rN; zk}-c|=0-EdYnB$w7~*9y#!GLDylkBqOV=ISYcrG%Zb>}(Wsb|fe=yfl)Jx)7%v?X2 zi}w~PG`fCLf34TgGeZ|=Do1%PsmLO9AY49g$$-kxHr{EJXX*vbtKayWdWy|XOg;6# zrqwSs;eAQGj;SANNqrOEm&Dtc`eBr}@RN0)ZUVY%Y1@Xt#YUdO9#wUf4uweKxaL37}dQOVmlCQCt#cx0y*~ NlG(;cWRtkZ-w$9U@#p{m literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..794bb9dee68004c8edf3dc47c4d13eac769a95d5 GIT binary patch literal 491 zcmXv}!EO^V5Vf66v)v|9h4_HI<`7V&o)AK$kU~UMRqaBlwUXtmC#`qAyRO$MEQenD zEgblzy>j9gI5BDISbnx=p6AUw8jT`?@pE=7Dn`if?c*szyu8KTa0Ep-QB*NQImNSQ zSlQzNCC~?|f_vsp+aUz`PCnq_1-bbW5ZEmux1?mduoC5a`H+W~So=z<9n2t8v2!x% z|2T|~b*190F0D48;<8p71F_Lnp{uLd*Kv}W_+^|Fm|HpNG&Ip4oQj-GXcr2PG!KqH zx2^GbHNO#>3pX+VQ?Gkj=weaC)tAi1Fj}+rO18;TLhcsPh1S zFW$XMKR4i-^!(%5{PM%yK{~Vcz4S6&)|oVE0;Nr@w$n{zWmbTie!B)R)9UKrCO@ow ndb(JqPktYqf_q`xE`0r{`ey5?*+&RyNQW#67#-3vd&d3&D-(`; literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/_util.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59f65f4620681a3f17a1179767ea008558aee54f GIT binary patch literal 1106 zcmZuwTTc@~6rP#gZI`wX#akfy1NH$DqVd5H1A;*lBt-PV&Bn>nnZlOs?lLn)YZ@N} z|A#*K;9r_opZW_-eDa(r1&d5_E<2a=edn^zW@j4&){pfQ{+kl=3qK~y17{6HzXv6V zpgD=hmc~@lE`vSxl`RnA9R;x`J+%rue(v{zIG{uXqIO2&S`mu+*b||cft~sm5e?Bi zBcgfA;!w~%617HvL3TzAbi_soJ*uHkt-qU^!#0p}3vB?h0ith!GGs^$HOzP&@039( zx)b@fk?E|^CN0|12Kxgewe_@73ZFtu+WAQoX8z~Z#*^f&mP#jkFJ3=?xAl1?S+Al6HL$fzBV7!w zF&9Er3-lCyA2uBQIdCTQJ8VMUQ<%7_qY6PqRL!7|F~_Qj9)`vI&tawzuzU{THaLiI zO3Qfz9sA}D$#<+b7RiOMtkl-8fU^xUEi!dIoNZ=$GgGo{N;SB139FDo8{}eP)@va8 zJ}60IDoD%(6%0D>2~YT7eGveMnw=A}BbAbZgDzFuRSce?MR7S`-a|Sh9ARp4^#&#re8~C0+6b5;%u-P!UtN;EwfV zZmz;MIX{plHAZp%;2-40|Bx@P?L+~xEz+Lk+%`Dxm7<@c-{SnZpXTEeg`HG)QC-e~ z^V~4pgo6bH#MugI=qcQZX4EVgnEZjZtrHmXtSq1~oig^T!NbS4j(yLwefL|qad7=~ dkFUeA;p&*)Q!JDF{Q!*3dp>QkMlB3N|1TT(-u(ao literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/PIL/__pycache__/_version.cpython-37.pyc b/venv/Lib/site-packages/PIL/__pycache__/_version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fff65f29ce77e1788ee84813aed2fe3e91a44346 GIT binary patch literal 188 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 WT~A6Q`b1nxXyf{*oH", c, o)[0] + + +def i32be(c, o=0): + return unpack_from(">I", c, o)[0] + + +# Output, le = little endian, be = big endian +def o16le(i): + return pack("H", i) + + +def o32be(i): + return pack(">I", i) diff --git a/venv/Lib/site-packages/PIL/_imaging.cp37-win_amd64.pyd b/venv/Lib/site-packages/PIL/_imaging.cp37-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..c9802f017ba9ac76b79152c632eb35f3134cec0f GIT binary patch literal 2604032 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ΝY}J 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

8>FRT}CTq=TyqEr!O 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 z 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