From 93422b027441b7187603282ae7f8bf2f01b88141 Mon Sep 17 00:00:00 2001 From: j Date: Thu, 26 Feb 2015 14:29:47 +0530 Subject: [PATCH] use system PIL and simplejson on Linux --- .../simplejson-3.6.4.egg-info/PKG-INFO | 54 - .../simplejson-3.6.4.egg-info/SOURCES.txt | 48 - .../dependency_links.txt | 1 - .../installed-files.txt | 74 - .../simplejson-3.6.4.egg-info/top_level.txt | 1 - .../site-packages/simplejson/__init__.py | 564 ---- .../simplejson/_speedups.cpython-34m.so | Bin 113240 -> 0 bytes .../site-packages/simplejson/compat.py | 46 - .../site-packages/simplejson/decoder.py | 400 --- .../site-packages/simplejson/encoder.py | 648 ----- .../site-packages/simplejson/ordered_dict.py | 119 - .../site-packages/simplejson/scanner.py | 133 - .../simplejson/tests/__init__.py | 88 - .../simplejson/tests/test_bigint_as_string.py | 67 - .../tests/test_bitsize_int_as_string.py | 73 - .../simplejson/tests/test_check_circular.py | 30 - .../simplejson/tests/test_decimal.py | 71 - .../simplejson/tests/test_decode.py | 99 - .../simplejson/tests/test_default.py | 9 - .../simplejson/tests/test_dump.py | 130 - .../tests/test_encode_basestring_ascii.py | 47 - .../simplejson/tests/test_encode_for_html.py | 30 - .../simplejson/tests/test_errors.py | 51 - .../simplejson/tests/test_fail.py | 176 -- .../simplejson/tests/test_float.py | 35 - .../simplejson/tests/test_for_json.py | 97 - .../simplejson/tests/test_indent.py | 86 - .../simplejson/tests/test_item_sort_key.py | 20 - .../simplejson/tests/test_namedtuple.py | 122 - .../simplejson/tests/test_pass1.py | 71 - .../simplejson/tests/test_pass2.py | 14 - .../simplejson/tests/test_pass3.py | 20 - .../simplejson/tests/test_recursion.py | 67 - .../simplejson/tests/test_scanstring.py | 194 -- .../simplejson/tests/test_separators.py | 42 - .../simplejson/tests/test_speedups.py | 39 - .../simplejson/tests/test_tool.py | 97 - .../simplejson/tests/test_tuple.py | 51 - .../simplejson/tests/test_unicode.py | 153 - .../site-packages/simplejson/tool.py | 42 - .../site-packages/PIL/BdfFontFile.py | 132 - .../site-packages/PIL/BmpImagePlugin.py | 260 -- .../site-packages/PIL/BufrStubImagePlugin.py | 68 - .../site-packages/PIL/ContainerIO.py | 116 - .../site-packages/PIL/CurImagePlugin.py | 86 - .../site-packages/PIL/DcxImagePlugin.py | 77 - .../site-packages/PIL/EpsImagePlugin.py | 446 --- .../python3.4/site-packages/PIL/ExifTags.py | 193 -- .../site-packages/PIL/FitsStubImagePlugin.py | 73 - .../site-packages/PIL/FliImagePlugin.py | 141 - .../python3.4/site-packages/PIL/FontFile.py | 146 - .../site-packages/PIL/FpxImagePlugin.py | 224 -- .../site-packages/PIL/GbrImagePlugin.py | 69 - .../site-packages/PIL/GdImageFile.py | 90 - .../site-packages/PIL/GifImagePlugin.py | 506 ---- .../site-packages/PIL/GimpGradientFile.py | 124 - .../site-packages/PIL/GimpPaletteFile.py | 62 - .../site-packages/PIL/GribStubImagePlugin.py | 68 - .../site-packages/PIL/Hdf5StubImagePlugin.py | 70 - .../site-packages/PIL/IcnsImagePlugin.py | 301 -- .../site-packages/PIL/IcoImagePlugin.py | 233 -- .../site-packages/PIL/ImImagePlugin.py | 342 --- .../lib/python3.4/site-packages/PIL/Image.py | 2419 ---------------- .../python3.4/site-packages/PIL/ImageChops.py | 283 -- .../python3.4/site-packages/PIL/ImageCms.py | 952 ------- .../python3.4/site-packages/PIL/ImageColor.py | 276 -- .../python3.4/site-packages/PIL/ImageDraw.py | 379 --- .../python3.4/site-packages/PIL/ImageDraw2.py | 106 - .../site-packages/PIL/ImageEnhance.py | 87 - .../python3.4/site-packages/PIL/ImageFile.py | 506 ---- .../site-packages/PIL/ImageFileIO.py | 40 - .../site-packages/PIL/ImageFilter.py | 269 -- .../python3.4/site-packages/PIL/ImageFont.py | 406 --- .../python3.4/site-packages/PIL/ImageGrab.py | 49 - .../python3.4/site-packages/PIL/ImageMath.py | 227 -- .../python3.4/site-packages/PIL/ImageMode.py | 50 - .../python3.4/site-packages/PIL/ImageMorph.py | 244 -- .../python3.4/site-packages/PIL/ImageOps.py | 436 --- .../site-packages/PIL/ImagePalette.py | 209 -- .../python3.4/site-packages/PIL/ImagePath.py | 66 - .../python3.4/site-packages/PIL/ImageQt.py | 89 - .../site-packages/PIL/ImageSequence.py | 41 - .../python3.4/site-packages/PIL/ImageShow.py | 171 -- .../python3.4/site-packages/PIL/ImageStat.py | 147 - .../python3.4/site-packages/PIL/ImageTk.py | 296 -- .../site-packages/PIL/ImageTransform.py | 95 - .../python3.4/site-packages/PIL/ImageWin.py | 251 -- .../site-packages/PIL/ImtImagePlugin.py | 93 - .../site-packages/PIL/IptcImagePlugin.py | 287 -- .../site-packages/PIL/Jpeg2KImagePlugin.py | 277 -- .../site-packages/PIL/JpegImagePlugin.py | 625 ----- .../site-packages/PIL/JpegPresets.py | 241 -- .../site-packages/PIL/McIdasImagePlugin.py | 70 - .../site-packages/PIL/MicImagePlugin.py | 95 - .../site-packages/PIL/MpegImagePlugin.py | 83 - .../site-packages/PIL/MspImagePlugin.py | 101 - .../site-packages/PIL/OleFileIO-README.md | 351 --- .../python3.4/site-packages/PIL/OleFileIO.py | 2077 -------------- .../lib/python3.4/site-packages/PIL/PSDraw.py | 236 -- .../site-packages/PIL/PaletteFile.py | 55 - .../site-packages/PIL/PalmImagePlugin.py | 225 -- .../site-packages/PIL/PcdImagePlugin.py | 78 - .../site-packages/PIL/PcfFontFile.py | 250 -- .../site-packages/PIL/PcxImagePlugin.py | 185 -- .../site-packages/PIL/PdfImagePlugin.py | 238 -- .../site-packages/PIL/PixarImagePlugin.py | 68 - .../site-packages/PIL/PngImagePlugin.py | 667 ----- .../site-packages/PIL/PpmImagePlugin.py | 168 -- .../site-packages/PIL/PsdImagePlugin.py | 295 -- .../python3.4/site-packages/PIL/PyAccess.py | 297 -- .../site-packages/PIL/SgiImagePlugin.py | 89 - .../site-packages/PIL/SpiderImagePlugin.py | 312 --- .../site-packages/PIL/SunImagePlugin.py | 82 - .../lib/python3.4/site-packages/PIL/TarIO.py | 56 - .../site-packages/PIL/TgaImagePlugin.py | 197 -- .../site-packages/PIL/TiffImagePlugin.py | 1177 -------- .../python3.4/site-packages/PIL/TiffTags.py | 213 -- .../site-packages/PIL/WalImageFile.py | 132 - .../site-packages/PIL/WebPImagePlugin.py | 79 - .../site-packages/PIL/WmfImagePlugin.py | 165 -- .../site-packages/PIL/XVThumbImagePlugin.py | 74 - .../site-packages/PIL/XbmImagePlugin.py | 94 - .../site-packages/PIL/XpmImagePlugin.py | 130 - .../python3.4/site-packages/PIL/__init__.py | 57 - .../python3.4/site-packages/PIL/_binary.py | 65 - .../site-packages/PIL/_imaging.cpython-34m.so | Bin 1217392 -> 0 bytes .../PIL/_imagingcms.cpython-34m.so | Bin 49648 -> 0 bytes .../PIL/_imagingft.cpython-34m.so | Bin 59848 -> 0 bytes .../PIL/_imagingmath.cpython-34m.so | Bin 48504 -> 0 bytes .../PIL/_imagingmorph.cpython-34m.so | Bin 31424 -> 0 bytes .../lib/python3.4/site-packages/PIL/_util.py | 22 - .../site-packages/PIL/_webp.cpython-34m.so | Bin 31544 -> 0 bytes .../Pillow-2.5.3.egg-info/PKG-INFO | 2491 ----------------- .../Pillow-2.5.3.egg-info/SOURCES.txt | 593 ---- .../dependency_links.txt | 1 - .../Pillow-2.5.3.egg-info/installed-files.txt | 188 -- .../Pillow-2.5.3.egg-info/top_level.txt | 1 - .../Pillow-2.5.3.egg-info/zip-safe | 1 - .../simplejson-3.6.4.egg-info/PKG-INFO | 54 - .../simplejson-3.6.4.egg-info/SOURCES.txt | 48 - .../dependency_links.txt | 1 - .../installed-files.txt | 74 - .../simplejson-3.6.4.egg-info/top_level.txt | 1 - .../site-packages/simplejson/__init__.py | 564 ---- .../simplejson/_speedups.cpython-34m.so | Bin 160008 -> 0 bytes .../site-packages/simplejson/compat.py | 46 - .../site-packages/simplejson/decoder.py | 400 --- .../site-packages/simplejson/encoder.py | 648 ----- .../site-packages/simplejson/ordered_dict.py | 119 - .../site-packages/simplejson/scanner.py | 133 - .../simplejson/tests/__init__.py | 88 - .../simplejson/tests/test_bigint_as_string.py | 67 - .../tests/test_bitsize_int_as_string.py | 73 - .../simplejson/tests/test_check_circular.py | 30 - .../simplejson/tests/test_decimal.py | 71 - .../simplejson/tests/test_decode.py | 99 - .../simplejson/tests/test_default.py | 9 - .../simplejson/tests/test_dump.py | 130 - .../tests/test_encode_basestring_ascii.py | 47 - .../simplejson/tests/test_encode_for_html.py | 30 - .../simplejson/tests/test_errors.py | 51 - .../simplejson/tests/test_fail.py | 176 -- .../simplejson/tests/test_float.py | 35 - .../simplejson/tests/test_for_json.py | 97 - .../simplejson/tests/test_indent.py | 86 - .../simplejson/tests/test_item_sort_key.py | 20 - .../simplejson/tests/test_namedtuple.py | 122 - .../simplejson/tests/test_pass1.py | 71 - .../simplejson/tests/test_pass2.py | 14 - .../simplejson/tests/test_pass3.py | 20 - .../simplejson/tests/test_recursion.py | 67 - .../simplejson/tests/test_scanstring.py | 194 -- .../simplejson/tests/test_separators.py | 42 - .../simplejson/tests/test_speedups.py | 39 - .../simplejson/tests/test_tool.py | 97 - .../simplejson/tests/test_tuple.py | 51 - .../simplejson/tests/test_unicode.py | 153 - .../site-packages/simplejson/tool.py | 42 - Linux_x86_64/update.sh | 2 +- 179 files changed, 1 insertion(+), 33421 deletions(-) delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/PKG-INFO delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/SOURCES.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/dependency_links.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/installed-files.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/top_level.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/__init__.py delete mode 100755 Linux_i686/lib/python3.4/site-packages/simplejson/_speedups.cpython-34m.so delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/compat.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/decoder.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/encoder.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/ordered_dict.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/scanner.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_bigint_as_string.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_bitsize_int_as_string.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_check_circular.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_decimal.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_decode.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_default.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_dump.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_encode_basestring_ascii.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_encode_for_html.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_errors.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_fail.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_float.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_for_json.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_indent.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_item_sort_key.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_namedtuple.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass1.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass2.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass3.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_recursion.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_scanstring.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_separators.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_speedups.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_tool.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_tuple.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_unicode.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/simplejson/tool.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/BdfFontFile.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/BmpImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/BufrStubImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ContainerIO.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/CurImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/DcxImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/EpsImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ExifTags.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/FitsStubImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/FliImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/FontFile.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/FpxImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/GbrImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/GdImageFile.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/GifImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/GimpGradientFile.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/GimpPaletteFile.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/GribStubImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/Hdf5StubImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/IcnsImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/IcoImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/Image.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageChops.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageCms.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageColor.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageDraw.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageDraw2.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageEnhance.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFile.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFileIO.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFilter.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFont.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageGrab.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMath.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMode.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMorph.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageOps.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImagePalette.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImagePath.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageQt.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageSequence.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageShow.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageStat.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageTk.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageTransform.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImageWin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/ImtImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/IptcImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/Jpeg2KImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/JpegImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/JpegPresets.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/McIdasImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/MicImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/MpegImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/MspImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/OleFileIO-README.md delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/OleFileIO.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PSDraw.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PaletteFile.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PalmImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PcdImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PcfFontFile.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PcxImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PdfImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PixarImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PngImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PpmImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PsdImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/PyAccess.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/SgiImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/SpiderImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/SunImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/TarIO.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/TgaImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/TiffImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/TiffTags.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/WalImageFile.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/WebPImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/WmfImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/XVThumbImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/XbmImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/XpmImagePlugin.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/__init__.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/_binary.py delete mode 100755 Linux_x86_64/lib/python3.4/site-packages/PIL/_imaging.cpython-34m.so delete mode 100755 Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingcms.cpython-34m.so delete mode 100755 Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingft.cpython-34m.so delete mode 100755 Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingmath.cpython-34m.so delete mode 100755 Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingmorph.cpython-34m.so delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/PIL/_util.py delete mode 100755 Linux_x86_64/lib/python3.4/site-packages/PIL/_webp.cpython-34m.so delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/PKG-INFO delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/SOURCES.txt delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/dependency_links.txt delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/installed-files.txt delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/top_level.txt delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/zip-safe delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/PKG-INFO delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/SOURCES.txt delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/dependency_links.txt delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/installed-files.txt delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/top_level.txt delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/__init__.py delete mode 100755 Linux_x86_64/lib/python3.4/site-packages/simplejson/_speedups.cpython-34m.so delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/compat.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/decoder.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/encoder.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/ordered_dict.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/scanner.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/__init__.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_bigint_as_string.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_bitsize_int_as_string.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_check_circular.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_decimal.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_decode.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_default.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_dump.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_encode_basestring_ascii.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_encode_for_html.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_errors.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_fail.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_float.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_for_json.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_indent.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_item_sort_key.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_namedtuple.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass1.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass2.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass3.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_recursion.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_scanstring.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_separators.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_speedups.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_tool.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_tuple.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_unicode.py delete mode 100644 Linux_x86_64/lib/python3.4/site-packages/simplejson/tool.py diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/PKG-INFO b/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/PKG-INFO deleted file mode 100644 index c823c75..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/PKG-INFO +++ /dev/null @@ -1,54 +0,0 @@ -Metadata-Version: 1.1 -Name: simplejson -Version: 3.6.4 -Summary: Simple, fast, extensible JSON encoder/decoder for Python -Home-page: http://github.com/simplejson/simplejson -Author: Bob Ippolito -Author-email: bob@redivi.com -License: MIT License -Description: simplejson is a simple, fast, complete, correct and extensible - JSON encoder and decoder for Python 2.5+ - and Python 3.3+. It is pure Python code with no dependencies, - but includes an optional C extension for a serious speed boost. - - The latest documentation for simplejson can be read online here: - http://simplejson.readthedocs.org/ - - simplejson is the externally maintained development version of the - json library included with Python 2.6 and Python 3.0, but maintains - backwards compatibility with Python 2.5. - - The encoder can be specialized to provide serialization in any kind of - situation, without any special support by the objects to be serialized - (somewhat like pickle). This is best done with the ``default`` kwarg - to dumps. - - The decoder can handle incoming JSON strings of any specified encoding - (UTF-8 by default). It can also be specialized to post-process JSON - objects with the ``object_hook`` or ``object_pairs_hook`` kwargs. This - is particularly useful for implementing protocols such as JSON-RPC - that have a richer type system than JSON itself. - - For those of you that have legacy systems to maintain, there is a - very old fork of simplejson in the `python2.2`_ branch that supports - Python 2.2. This is based off of a very old version of simplejson, - is not maintained, and should only be used as a last resort. - - .. _python2.2: https://github.com/simplejson/simplejson/tree/python2.2 - -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: License :: OSI Approved :: Academic Free License (AFL) -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.5 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/SOURCES.txt b/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/SOURCES.txt deleted file mode 100644 index 76f095a..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/SOURCES.txt +++ /dev/null @@ -1,48 +0,0 @@ -CHANGES.txt -LICENSE.txt -MANIFEST.in -README.rst -conf.py -index.rst -setup.cfg -setup.py -scripts/make_docs.py -simplejson/__init__.py -simplejson/_speedups.c -simplejson/compat.py -simplejson/decoder.py -simplejson/encoder.py -simplejson/ordered_dict.py -simplejson/scanner.py -simplejson/tool.py -simplejson.egg-info/PKG-INFO -simplejson.egg-info/SOURCES.txt -simplejson.egg-info/dependency_links.txt -simplejson.egg-info/top_level.txt -simplejson/tests/__init__.py -simplejson/tests/test_bigint_as_string.py -simplejson/tests/test_bitsize_int_as_string.py -simplejson/tests/test_check_circular.py -simplejson/tests/test_decimal.py -simplejson/tests/test_decode.py -simplejson/tests/test_default.py -simplejson/tests/test_dump.py -simplejson/tests/test_encode_basestring_ascii.py -simplejson/tests/test_encode_for_html.py -simplejson/tests/test_errors.py -simplejson/tests/test_fail.py -simplejson/tests/test_float.py -simplejson/tests/test_for_json.py -simplejson/tests/test_indent.py -simplejson/tests/test_item_sort_key.py -simplejson/tests/test_namedtuple.py -simplejson/tests/test_pass1.py -simplejson/tests/test_pass2.py -simplejson/tests/test_pass3.py -simplejson/tests/test_recursion.py -simplejson/tests/test_scanstring.py -simplejson/tests/test_separators.py -simplejson/tests/test_speedups.py -simplejson/tests/test_tool.py -simplejson/tests/test_tuple.py -simplejson/tests/test_unicode.py \ No newline at end of file diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/dependency_links.txt b/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/installed-files.txt b/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/installed-files.txt deleted file mode 100644 index 7348207..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/installed-files.txt +++ /dev/null @@ -1,74 +0,0 @@ -../simplejson/scanner.py -../simplejson/compat.py -../simplejson/__init__.py -../simplejson/encoder.py -../simplejson/decoder.py -../simplejson/tool.py -../simplejson/ordered_dict.py -../simplejson/tests/test_namedtuple.py -../simplejson/tests/test_recursion.py -../simplejson/tests/test_encode_for_html.py -../simplejson/tests/test_for_json.py -../simplejson/tests/test_bigint_as_string.py -../simplejson/tests/test_item_sort_key.py -../simplejson/tests/__init__.py -../simplejson/tests/test_scanstring.py -../simplejson/tests/test_speedups.py -../simplejson/tests/test_pass3.py -../simplejson/tests/test_tool.py -../simplejson/tests/test_tuple.py -../simplejson/tests/test_errors.py -../simplejson/tests/test_unicode.py -../simplejson/tests/test_fail.py -../simplejson/tests/test_separators.py -../simplejson/tests/test_encode_basestring_ascii.py -../simplejson/tests/test_check_circular.py -../simplejson/tests/test_decimal.py -../simplejson/tests/test_pass2.py -../simplejson/tests/test_decode.py -../simplejson/tests/test_indent.py -../simplejson/tests/test_bitsize_int_as_string.py -../simplejson/tests/test_pass1.py -../simplejson/tests/test_dump.py -../simplejson/tests/test_float.py -../simplejson/tests/test_default.py -../simplejson/__pycache__/scanner.cpython-34.pyc -../simplejson/__pycache__/compat.cpython-34.pyc -../simplejson/__pycache__/__init__.cpython-34.pyc -../simplejson/__pycache__/encoder.cpython-34.pyc -../simplejson/__pycache__/decoder.cpython-34.pyc -../simplejson/__pycache__/tool.cpython-34.pyc -../simplejson/__pycache__/ordered_dict.cpython-34.pyc -../simplejson/tests/__pycache__/test_namedtuple.cpython-34.pyc -../simplejson/tests/__pycache__/test_recursion.cpython-34.pyc -../simplejson/tests/__pycache__/test_encode_for_html.cpython-34.pyc -../simplejson/tests/__pycache__/test_for_json.cpython-34.pyc -../simplejson/tests/__pycache__/test_bigint_as_string.cpython-34.pyc -../simplejson/tests/__pycache__/test_item_sort_key.cpython-34.pyc -../simplejson/tests/__pycache__/__init__.cpython-34.pyc -../simplejson/tests/__pycache__/test_scanstring.cpython-34.pyc -../simplejson/tests/__pycache__/test_speedups.cpython-34.pyc -../simplejson/tests/__pycache__/test_pass3.cpython-34.pyc -../simplejson/tests/__pycache__/test_tool.cpython-34.pyc -../simplejson/tests/__pycache__/test_tuple.cpython-34.pyc -../simplejson/tests/__pycache__/test_errors.cpython-34.pyc -../simplejson/tests/__pycache__/test_unicode.cpython-34.pyc -../simplejson/tests/__pycache__/test_fail.cpython-34.pyc -../simplejson/tests/__pycache__/test_separators.cpython-34.pyc -../simplejson/tests/__pycache__/test_encode_basestring_ascii.cpython-34.pyc -../simplejson/tests/__pycache__/test_check_circular.cpython-34.pyc -../simplejson/tests/__pycache__/test_decimal.cpython-34.pyc -../simplejson/tests/__pycache__/test_pass2.cpython-34.pyc -../simplejson/tests/__pycache__/test_decode.cpython-34.pyc -../simplejson/tests/__pycache__/test_indent.cpython-34.pyc -../simplejson/tests/__pycache__/test_bitsize_int_as_string.cpython-34.pyc -../simplejson/tests/__pycache__/test_pass1.cpython-34.pyc -../simplejson/tests/__pycache__/test_dump.cpython-34.pyc -../simplejson/tests/__pycache__/test_float.cpython-34.pyc -../simplejson/tests/__pycache__/test_default.cpython-34.pyc -../simplejson/_speedups.cpython-34m.so -./ -dependency_links.txt -PKG-INFO -SOURCES.txt -top_level.txt diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/top_level.txt b/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/top_level.txt deleted file mode 100644 index 322630e..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -simplejson diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/__init__.py b/Linux_i686/lib/python3.4/site-packages/simplejson/__init__.py deleted file mode 100644 index cbb5b34..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/__init__.py +++ /dev/null @@ -1,564 +0,0 @@ -r"""JSON (JavaScript Object Notation) is a subset of -JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data -interchange format. - -:mod:`simplejson` exposes an API familiar to users of the standard library -:mod:`marshal` and :mod:`pickle` modules. It is the externally maintained -version of the :mod:`json` library contained in Python 2.6, but maintains -compatibility with Python 2.4 and Python 2.5 and (currently) has -significant performance advantages, even without using the optional C -extension for speedups. - -Encoding basic Python object hierarchies:: - - >>> import simplejson as json - >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) - '["foo", {"bar": ["baz", null, 1.0, 2]}]' - >>> print(json.dumps("\"foo\bar")) - "\"foo\bar" - >>> print(json.dumps(u'\u1234')) - "\u1234" - >>> print(json.dumps('\\')) - "\\" - >>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)) - {"a": 0, "b": 0, "c": 0} - >>> from simplejson.compat import StringIO - >>> io = StringIO() - >>> json.dump(['streaming API'], io) - >>> io.getvalue() - '["streaming API"]' - -Compact encoding:: - - >>> import simplejson as json - >>> obj = [1,2,3,{'4': 5, '6': 7}] - >>> json.dumps(obj, separators=(',',':'), sort_keys=True) - '[1,2,3,{"4":5,"6":7}]' - -Pretty printing:: - - >>> import simplejson as json - >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=' ')) - { - "4": 5, - "6": 7 - } - -Decoding JSON:: - - >>> import simplejson as json - >>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}] - >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj - True - >>> json.loads('"\\"foo\\bar"') == u'"foo\x08ar' - True - >>> from simplejson.compat import StringIO - >>> io = StringIO('["streaming API"]') - >>> json.load(io)[0] == 'streaming API' - True - -Specializing JSON object decoding:: - - >>> import simplejson as json - >>> def as_complex(dct): - ... if '__complex__' in dct: - ... return complex(dct['real'], dct['imag']) - ... return dct - ... - >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}', - ... object_hook=as_complex) - (1+2j) - >>> from decimal import Decimal - >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1') - True - -Specializing JSON object encoding:: - - >>> import simplejson as json - >>> def encode_complex(obj): - ... if isinstance(obj, complex): - ... return [obj.real, obj.imag] - ... raise TypeError(repr(o) + " is not JSON serializable") - ... - >>> json.dumps(2 + 1j, default=encode_complex) - '[2.0, 1.0]' - >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j) - '[2.0, 1.0]' - >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j)) - '[2.0, 1.0]' - - -Using simplejson.tool from the shell to validate and pretty-print:: - - $ echo '{"json":"obj"}' | python -m simplejson.tool - { - "json": "obj" - } - $ echo '{ 1.2:3.4}' | python -m simplejson.tool - Expecting property name: line 1 column 3 (char 2) -""" -from __future__ import absolute_import -__version__ = '3.6.4' -__all__ = [ - 'dump', 'dumps', 'load', 'loads', - 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder', - 'OrderedDict', 'simple_first', -] - -__author__ = 'Bob Ippolito ' - -from decimal import Decimal - -from .scanner import JSONDecodeError -from .decoder import JSONDecoder -from .encoder import JSONEncoder, JSONEncoderForHTML -def _import_OrderedDict(): - import collections - try: - return collections.OrderedDict - except AttributeError: - from . import ordered_dict - return ordered_dict.OrderedDict -OrderedDict = _import_OrderedDict() - -def _import_c_make_encoder(): - try: - from ._speedups import make_encoder - return make_encoder - except ImportError: - return None - -_default_encoder = JSONEncoder( - skipkeys=False, - ensure_ascii=True, - check_circular=True, - allow_nan=True, - indent=None, - separators=None, - encoding='utf-8', - default=None, - use_decimal=True, - namedtuple_as_object=True, - tuple_as_array=True, - bigint_as_string=False, - item_sort_key=None, - for_json=False, - ignore_nan=False, - int_as_string_bitcount=None, -) - -def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, - allow_nan=True, cls=None, indent=None, separators=None, - encoding='utf-8', default=None, use_decimal=True, - namedtuple_as_object=True, tuple_as_array=True, - bigint_as_string=False, sort_keys=False, item_sort_key=None, - for_json=False, ignore_nan=False, int_as_string_bitcount=None, **kw): - """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a - ``.write()``-supporting file-like object). - - If *skipkeys* is true then ``dict`` keys that are not basic types - (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) - will be skipped instead of raising a ``TypeError``. - - If *ensure_ascii* is false, then the some chunks written to ``fp`` - may be ``unicode`` instances, subject to normal Python ``str`` to - ``unicode`` coercion rules. Unless ``fp.write()`` explicitly - understands ``unicode`` (as in ``codecs.getwriter()``) this is likely - to cause an error. - - If *check_circular* is false, then the circular reference check - for container types will be skipped and a circular reference will - result in an ``OverflowError`` (or worse). - - If *allow_nan* is false, then it will be a ``ValueError`` to - serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) - in strict compliance of the original JSON specification, instead of using - the JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). See - *ignore_nan* for ECMA-262 compliant behavior. - - If *indent* is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, *separators* should be an - ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')`` - if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most - compact JSON representation, you should specify ``(',', ':')`` to eliminate - whitespace. - - *encoding* is the character encoding for str instances, default is UTF-8. - - *default(obj)* is a function that should return a serializable version - of obj or raise ``TypeError``. The default simply raises ``TypeError``. - - If *use_decimal* is true (default: ``True``) then decimal.Decimal - will be natively serialized to JSON with full precision. - - If *namedtuple_as_object* is true (default: ``True``), - :class:`tuple` subclasses with ``_asdict()`` methods will be encoded - as JSON objects. - - If *tuple_as_array* is true (default: ``True``), - :class:`tuple` (and subclasses) will be encoded as JSON arrays. - - If *bigint_as_string* is true (default: ``False``), ints 2**53 and higher - or lower than -2**53 will be encoded as strings. This is to avoid the - rounding that happens in Javascript otherwise. Note that this is still a - lossy operation that will not round-trip correctly and should be used - sparingly. - - If *int_as_string_bitcount* is a positive number (n), then int of size - greater than or equal to 2**n or lower than or equal to -2**n will be - encoded as strings. - - If specified, *item_sort_key* is a callable used to sort the items in - each dictionary. This is useful if you want to sort items other than - in alphabetical order by key. This option takes precedence over - *sort_keys*. - - If *sort_keys* is true (default: ``False``), the output of dictionaries - will be sorted by item. - - If *for_json* is true (default: ``False``), objects with a ``for_json()`` - method will use the return value of that method for encoding as JSON - instead of the object. - - If *ignore_nan* is true (default: ``False``), then out of range - :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as - ``null`` in compliance with the ECMA-262 specification. If true, this will - override *allow_nan*. - - To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the - ``.default()`` method to serialize additional types), specify it with - the ``cls`` kwarg. NOTE: You should use *default* or *for_json* instead - of subclassing whenever possible. - - """ - # cached encoder - if (not skipkeys and ensure_ascii and - check_circular and allow_nan and - cls is None and indent is None and separators is None and - encoding == 'utf-8' and default is None and use_decimal - and namedtuple_as_object and tuple_as_array - and not bigint_as_string and not sort_keys - and not item_sort_key and not for_json - and not ignore_nan and int_as_string_bitcount is None - and not kw - ): - iterable = _default_encoder.iterencode(obj) - else: - if cls is None: - cls = JSONEncoder - iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, - check_circular=check_circular, allow_nan=allow_nan, indent=indent, - separators=separators, encoding=encoding, - default=default, use_decimal=use_decimal, - namedtuple_as_object=namedtuple_as_object, - tuple_as_array=tuple_as_array, - bigint_as_string=bigint_as_string, - sort_keys=sort_keys, - item_sort_key=item_sort_key, - for_json=for_json, - ignore_nan=ignore_nan, - int_as_string_bitcount=int_as_string_bitcount, - **kw).iterencode(obj) - # could accelerate with writelines in some versions of Python, at - # a debuggability cost - for chunk in iterable: - fp.write(chunk) - - -def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, - allow_nan=True, cls=None, indent=None, separators=None, - encoding='utf-8', default=None, use_decimal=True, - namedtuple_as_object=True, tuple_as_array=True, - bigint_as_string=False, sort_keys=False, item_sort_key=None, - for_json=False, ignore_nan=False, int_as_string_bitcount=None, **kw): - """Serialize ``obj`` to a JSON formatted ``str``. - - If ``skipkeys`` is false then ``dict`` keys that are not basic types - (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) - will be skipped instead of raising a ``TypeError``. - - If ``ensure_ascii`` is false, then the return value will be a - ``unicode`` instance subject to normal Python ``str`` to ``unicode`` - coercion rules instead of being escaped to an ASCII ``str``. - - If ``check_circular`` is false, then the circular reference check - for container types will be skipped and a circular reference will - result in an ``OverflowError`` (or worse). - - If ``allow_nan`` is false, then it will be a ``ValueError`` to - serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in - strict compliance of the JSON specification, instead of using the - JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). - - If ``indent`` is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, ``separators`` should be an - ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')`` - if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most - compact JSON representation, you should specify ``(',', ':')`` to eliminate - whitespace. - - ``encoding`` is the character encoding for str instances, default is UTF-8. - - ``default(obj)`` is a function that should return a serializable version - of obj or raise TypeError. The default simply raises TypeError. - - If *use_decimal* is true (default: ``True``) then decimal.Decimal - will be natively serialized to JSON with full precision. - - If *namedtuple_as_object* is true (default: ``True``), - :class:`tuple` subclasses with ``_asdict()`` methods will be encoded - as JSON objects. - - If *tuple_as_array* is true (default: ``True``), - :class:`tuple` (and subclasses) will be encoded as JSON arrays. - - If *bigint_as_string* is true (not the default), ints 2**53 and higher - or lower than -2**53 will be encoded as strings. This is to avoid the - rounding that happens in Javascript otherwise. - - If *int_as_string_bitcount* is a positive number (n), then int of size - greater than or equal to 2**n or lower than or equal to -2**n will be - encoded as strings. - - If specified, *item_sort_key* is a callable used to sort the items in - each dictionary. This is useful if you want to sort items other than - in alphabetical order by key. This option takes precendence over - *sort_keys*. - - If *sort_keys* is true (default: ``False``), the output of dictionaries - will be sorted by item. - - If *for_json* is true (default: ``False``), objects with a ``for_json()`` - method will use the return value of that method for encoding as JSON - instead of the object. - - If *ignore_nan* is true (default: ``False``), then out of range - :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as - ``null`` in compliance with the ECMA-262 specification. If true, this will - override *allow_nan*. - - To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the - ``.default()`` method to serialize additional types), specify it with - the ``cls`` kwarg. NOTE: You should use *default* instead of subclassing - whenever possible. - - """ - # cached encoder - if ( - not skipkeys and ensure_ascii and - check_circular and allow_nan and - cls is None and indent is None and separators is None and - encoding == 'utf-8' and default is None and use_decimal - and namedtuple_as_object and tuple_as_array - and not bigint_as_string and not sort_keys - and not item_sort_key and not for_json - and not ignore_nan and int_as_string_bitcount is None - and not kw - ): - return _default_encoder.encode(obj) - if cls is None: - cls = JSONEncoder - return cls( - skipkeys=skipkeys, ensure_ascii=ensure_ascii, - check_circular=check_circular, allow_nan=allow_nan, indent=indent, - separators=separators, encoding=encoding, default=default, - use_decimal=use_decimal, - namedtuple_as_object=namedtuple_as_object, - tuple_as_array=tuple_as_array, - bigint_as_string=bigint_as_string, - sort_keys=sort_keys, - item_sort_key=item_sort_key, - for_json=for_json, - ignore_nan=ignore_nan, - int_as_string_bitcount=int_as_string_bitcount, - **kw).encode(obj) - - -_default_decoder = JSONDecoder(encoding=None, object_hook=None, - object_pairs_hook=None) - - -def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, object_pairs_hook=None, - use_decimal=False, namedtuple_as_object=True, tuple_as_array=True, - **kw): - """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing - a JSON document) to a Python object. - - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - If *use_decimal* is true (default: ``False``) then it implies - parse_float=decimal.Decimal for parity with ``dump``. - - To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` - kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead - of subclassing whenever possible. - - """ - return loads(fp.read(), - encoding=encoding, cls=cls, object_hook=object_hook, - parse_float=parse_float, parse_int=parse_int, - parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, - use_decimal=use_decimal, **kw) - - -def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, object_pairs_hook=None, - use_decimal=False, **kw): - """Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON - document) to a Python object. - - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - If *use_decimal* is true (default: ``False``) then it implies - parse_float=decimal.Decimal for parity with ``dump``. - - To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` - kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead - of subclassing whenever possible. - - """ - if (cls is None and encoding is None and object_hook is None and - parse_int is None and parse_float is None and - parse_constant is None and object_pairs_hook is None - and not use_decimal and not kw): - return _default_decoder.decode(s) - if cls is None: - cls = JSONDecoder - if object_hook is not None: - kw['object_hook'] = object_hook - if object_pairs_hook is not None: - kw['object_pairs_hook'] = object_pairs_hook - if parse_float is not None: - kw['parse_float'] = parse_float - if parse_int is not None: - kw['parse_int'] = parse_int - if parse_constant is not None: - kw['parse_constant'] = parse_constant - if use_decimal: - if parse_float is not None: - raise TypeError("use_decimal=True implies parse_float=Decimal") - kw['parse_float'] = Decimal - return cls(encoding=encoding, **kw).decode(s) - - -def _toggle_speedups(enabled): - from . import decoder as dec - from . import encoder as enc - from . import scanner as scan - c_make_encoder = _import_c_make_encoder() - if enabled: - dec.scanstring = dec.c_scanstring or dec.py_scanstring - enc.c_make_encoder = c_make_encoder - enc.encode_basestring_ascii = (enc.c_encode_basestring_ascii or - enc.py_encode_basestring_ascii) - scan.make_scanner = scan.c_make_scanner or scan.py_make_scanner - else: - dec.scanstring = dec.py_scanstring - enc.c_make_encoder = None - enc.encode_basestring_ascii = enc.py_encode_basestring_ascii - scan.make_scanner = scan.py_make_scanner - dec.make_scanner = scan.make_scanner - global _default_decoder - _default_decoder = JSONDecoder( - encoding=None, - object_hook=None, - object_pairs_hook=None, - ) - global _default_encoder - _default_encoder = JSONEncoder( - skipkeys=False, - ensure_ascii=True, - check_circular=True, - allow_nan=True, - indent=None, - separators=None, - encoding='utf-8', - default=None, - ) - -def simple_first(kv): - """Helper function to pass to item_sort_key to sort simple - elements to the top, then container elements. - """ - return (isinstance(kv[1], (list, dict, tuple)), kv[0]) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/_speedups.cpython-34m.so b/Linux_i686/lib/python3.4/site-packages/simplejson/_speedups.cpython-34m.so deleted file mode 100755 index e6d3852910d6da7457aa17e41ac81b5ab4a990fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113240 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

dyDhxB6H^t84GrFm^(kCCBLrmpUJ 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 diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/compat.py b/Linux_i686/lib/python3.4/site-packages/simplejson/compat.py deleted file mode 100644 index a0af4a1..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/compat.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Python 3 compatibility shims -""" -import sys -if sys.version_info[0] < 3: - PY3 = False - def b(s): - return s - def u(s): - return unicode(s, 'unicode_escape') - import cStringIO as StringIO - StringIO = BytesIO = StringIO.StringIO - text_type = unicode - binary_type = str - string_types = (basestring,) - integer_types = (int, long) - unichr = unichr - reload_module = reload - def fromhex(s): - return s.decode('hex') - -else: - PY3 = True - if sys.version_info[:2] >= (3, 4): - from importlib import reload as reload_module - else: - from imp import reload as reload_module - import codecs - def b(s): - return codecs.latin_1_encode(s)[0] - def u(s): - return s - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - text_type = str - binary_type = bytes - string_types = (str,) - integer_types = (int,) - - def unichr(s): - return u(chr(s)) - - def fromhex(s): - return bytes.fromhex(s) - -long_type = integer_types[-1] diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/decoder.py b/Linux_i686/lib/python3.4/site-packages/simplejson/decoder.py deleted file mode 100644 index 545e658..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/decoder.py +++ /dev/null @@ -1,400 +0,0 @@ -"""Implementation of JSONDecoder -""" -from __future__ import absolute_import -import re -import sys -import struct -from .compat import fromhex, b, u, text_type, binary_type, PY3, unichr -from .scanner import make_scanner, JSONDecodeError - -def _import_c_scanstring(): - try: - from ._speedups import scanstring - return scanstring - except ImportError: - return None -c_scanstring = _import_c_scanstring() - -# NOTE (3.1.0): JSONDecodeError may still be imported from this module for -# compatibility, but it was never in the __all__ -__all__ = ['JSONDecoder'] - -FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL - -def _floatconstants(): - _BYTES = fromhex('7FF80000000000007FF0000000000000') - # The struct module in Python 2.4 would get frexp() out of range here - # when an endian is specified in the format string. Fixed in Python 2.5+ - if sys.byteorder != 'big': - _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1] - nan, inf = struct.unpack('dd', _BYTES) - return nan, inf, -inf - -NaN, PosInf, NegInf = _floatconstants() - -_CONSTANTS = { - '-Infinity': NegInf, - 'Infinity': PosInf, - 'NaN': NaN, -} - -STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS) -BACKSLASH = { - '"': u('"'), '\\': u('\u005c'), '/': u('/'), - 'b': u('\b'), 'f': u('\f'), 'n': u('\n'), 'r': u('\r'), 't': u('\t'), -} - -DEFAULT_ENCODING = "utf-8" - -def py_scanstring(s, end, encoding=None, strict=True, - _b=BACKSLASH, _m=STRINGCHUNK.match, _join=u('').join, - _PY3=PY3, _maxunicode=sys.maxunicode): - """Scan the string s for a JSON string. End is the index of the - character in s after the quote that started the JSON string. - Unescapes all valid JSON string escape sequences and raises ValueError - on attempt to decode an invalid string. If strict is False then literal - control characters are allowed in the string. - - Returns a tuple of the decoded string and the index of the character in s - after the end quote.""" - if encoding is None: - encoding = DEFAULT_ENCODING - chunks = [] - _append = chunks.append - begin = end - 1 - while 1: - chunk = _m(s, end) - if chunk is None: - raise JSONDecodeError( - "Unterminated string starting at", s, begin) - end = chunk.end() - content, terminator = chunk.groups() - # Content is contains zero or more unescaped string characters - if content: - if not _PY3 and not isinstance(content, text_type): - content = text_type(content, encoding) - _append(content) - # Terminator is the end of string, a literal control character, - # or a backslash denoting that an escape sequence follows - if terminator == '"': - break - elif terminator != '\\': - if strict: - msg = "Invalid control character %r at" - raise JSONDecodeError(msg, s, end) - else: - _append(terminator) - continue - try: - esc = s[end] - except IndexError: - raise JSONDecodeError( - "Unterminated string starting at", s, begin) - # If not a unicode escape sequence, must be in the lookup table - if esc != 'u': - try: - char = _b[esc] - except KeyError: - msg = "Invalid \\X escape sequence %r" - raise JSONDecodeError(msg, s, end) - end += 1 - else: - # Unicode escape sequence - msg = "Invalid \\uXXXX escape sequence" - esc = s[end + 1:end + 5] - escX = esc[1:2] - if len(esc) != 4 or escX == 'x' or escX == 'X': - raise JSONDecodeError(msg, s, end - 1) - try: - uni = int(esc, 16) - except ValueError: - raise JSONDecodeError(msg, s, end - 1) - end += 5 - # Check for surrogate pair on UCS-4 systems - # Note that this will join high/low surrogate pairs - # but will also pass unpaired surrogates through - if (_maxunicode > 65535 and - uni & 0xfc00 == 0xd800 and - s[end:end + 2] == '\\u'): - esc2 = s[end + 2:end + 6] - escX = esc2[1:2] - if len(esc2) == 4 and not (escX == 'x' or escX == 'X'): - try: - uni2 = int(esc2, 16) - except ValueError: - raise JSONDecodeError(msg, s, end) - if uni2 & 0xfc00 == 0xdc00: - uni = 0x10000 + (((uni - 0xd800) << 10) | - (uni2 - 0xdc00)) - end += 6 - char = unichr(uni) - # Append the unescaped character - _append(char) - return _join(chunks), end - - -# Use speedup if available -scanstring = c_scanstring or py_scanstring - -WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS) -WHITESPACE_STR = ' \t\n\r' - -def JSONObject(state, encoding, strict, scan_once, object_hook, - object_pairs_hook, memo=None, - _w=WHITESPACE.match, _ws=WHITESPACE_STR): - (s, end) = state - # Backwards compatibility - if memo is None: - memo = {} - memo_get = memo.setdefault - pairs = [] - # Use a slice to prevent IndexError from being raised, the following - # check will raise a more specific ValueError if the string is empty - nextchar = s[end:end + 1] - # Normally we expect nextchar == '"' - if nextchar != '"': - if nextchar in _ws: - end = _w(s, end).end() - nextchar = s[end:end + 1] - # Trivial empty object - if nextchar == '}': - if object_pairs_hook is not None: - result = object_pairs_hook(pairs) - return result, end + 1 - pairs = {} - if object_hook is not None: - pairs = object_hook(pairs) - return pairs, end + 1 - elif nextchar != '"': - raise JSONDecodeError( - "Expecting property name enclosed in double quotes", - s, end) - end += 1 - while True: - key, end = scanstring(s, end, encoding, strict) - key = memo_get(key, key) - - # To skip some function call overhead we optimize the fast paths where - # the JSON key separator is ": " or just ":". - if s[end:end + 1] != ':': - end = _w(s, end).end() - if s[end:end + 1] != ':': - raise JSONDecodeError("Expecting ':' delimiter", s, end) - - end += 1 - - try: - if s[end] in _ws: - end += 1 - if s[end] in _ws: - end = _w(s, end + 1).end() - except IndexError: - pass - - value, end = scan_once(s, end) - pairs.append((key, value)) - - try: - nextchar = s[end] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end] - except IndexError: - nextchar = '' - end += 1 - - if nextchar == '}': - break - elif nextchar != ',': - raise JSONDecodeError("Expecting ',' delimiter or '}'", s, end - 1) - - try: - nextchar = s[end] - if nextchar in _ws: - end += 1 - nextchar = s[end] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end] - except IndexError: - nextchar = '' - - end += 1 - if nextchar != '"': - raise JSONDecodeError( - "Expecting property name enclosed in double quotes", - s, end - 1) - - if object_pairs_hook is not None: - result = object_pairs_hook(pairs) - return result, end - pairs = dict(pairs) - if object_hook is not None: - pairs = object_hook(pairs) - return pairs, end - -def JSONArray(state, scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR): - (s, end) = state - values = [] - nextchar = s[end:end + 1] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end:end + 1] - # Look-ahead for trivial empty array - if nextchar == ']': - return values, end + 1 - elif nextchar == '': - raise JSONDecodeError("Expecting value or ']'", s, end) - _append = values.append - while True: - value, end = scan_once(s, end) - _append(value) - nextchar = s[end:end + 1] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end:end + 1] - end += 1 - if nextchar == ']': - break - elif nextchar != ',': - raise JSONDecodeError("Expecting ',' delimiter or ']'", s, end - 1) - - try: - if s[end] in _ws: - end += 1 - if s[end] in _ws: - end = _w(s, end + 1).end() - except IndexError: - pass - - return values, end - -class JSONDecoder(object): - """Simple JSON decoder - - Performs the following translations in decoding by default: - - +---------------+-------------------+ - | JSON | Python | - +===============+===================+ - | object | dict | - +---------------+-------------------+ - | array | list | - +---------------+-------------------+ - | string | str, unicode | - +---------------+-------------------+ - | number (int) | int, long | - +---------------+-------------------+ - | number (real) | float | - +---------------+-------------------+ - | true | True | - +---------------+-------------------+ - | false | False | - +---------------+-------------------+ - | null | None | - +---------------+-------------------+ - - It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as - their corresponding ``float`` values, which is outside the JSON spec. - - """ - - def __init__(self, encoding=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, strict=True, - object_pairs_hook=None): - """ - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - *strict* controls the parser's behavior when it encounters an - invalid control character in a string. The default setting of - ``True`` means that unescaped control characters are parse errors, if - ``False`` then control characters will be allowed in strings. - - """ - if encoding is None: - encoding = DEFAULT_ENCODING - self.encoding = encoding - self.object_hook = object_hook - self.object_pairs_hook = object_pairs_hook - self.parse_float = parse_float or float - self.parse_int = parse_int or int - self.parse_constant = parse_constant or _CONSTANTS.__getitem__ - self.strict = strict - self.parse_object = JSONObject - self.parse_array = JSONArray - self.parse_string = scanstring - self.memo = {} - self.scan_once = make_scanner(self) - - def decode(self, s, _w=WHITESPACE.match, _PY3=PY3): - """Return the Python representation of ``s`` (a ``str`` or ``unicode`` - instance containing a JSON document) - - """ - if _PY3 and isinstance(s, binary_type): - s = s.decode(self.encoding) - obj, end = self.raw_decode(s) - end = _w(s, end).end() - if end != len(s): - raise JSONDecodeError("Extra data", s, end, len(s)) - return obj - - def raw_decode(self, s, idx=0, _w=WHITESPACE.match, _PY3=PY3): - """Decode a JSON document from ``s`` (a ``str`` or ``unicode`` - beginning with a JSON document) and return a 2-tuple of the Python - representation and the index in ``s`` where the document ended. - Optionally, ``idx`` can be used to specify an offset in ``s`` where - the JSON document begins. - - This can be used to decode a JSON document from a string that may - have extraneous data at the end. - - """ - if idx < 0: - # Ensure that raw_decode bails on negative indexes, the regex - # would otherwise mask this behavior. #98 - raise JSONDecodeError('Expecting value', s, idx) - if _PY3 and not isinstance(s, text_type): - raise TypeError("Input string must be text, not bytes") - # strip UTF-8 bom - if len(s) > idx: - ord0 = ord(s[idx]) - if ord0 == 0xfeff: - idx += 1 - elif ord0 == 0xef and s[idx:idx + 3] == '\xef\xbb\xbf': - idx += 3 - return self.scan_once(s, idx=_w(s, idx).end()) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/encoder.py b/Linux_i686/lib/python3.4/site-packages/simplejson/encoder.py deleted file mode 100644 index db18244..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/encoder.py +++ /dev/null @@ -1,648 +0,0 @@ -"""Implementation of JSONEncoder -""" -from __future__ import absolute_import -import re -from operator import itemgetter -from decimal import Decimal -from .compat import u, unichr, binary_type, string_types, integer_types, PY3 -def _import_speedups(): - try: - from . import _speedups - return _speedups.encode_basestring_ascii, _speedups.make_encoder - except ImportError: - return None, None -c_encode_basestring_ascii, c_make_encoder = _import_speedups() - -from simplejson.decoder import PosInf - -#ESCAPE = re.compile(ur'[\x00-\x1f\\"\b\f\n\r\t\u2028\u2029]') -# This is required because u() will mangle the string and ur'' isn't valid -# python3 syntax -ESCAPE = re.compile(u'[\\x00-\\x1f\\\\"\\b\\f\\n\\r\\t\u2028\u2029]') -ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') -HAS_UTF8 = re.compile(r'[\x80-\xff]') -ESCAPE_DCT = { - '\\': '\\\\', - '"': '\\"', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', -} -for i in range(0x20): - #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) - ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,)) -for i in [0x2028, 0x2029]: - ESCAPE_DCT.setdefault(unichr(i), '\\u%04x' % (i,)) - -FLOAT_REPR = repr - -def encode_basestring(s, _PY3=PY3, _q=u('"')): - """Return a JSON representation of a Python string - - """ - if _PY3: - if isinstance(s, binary_type): - s = s.decode('utf-8') - else: - if isinstance(s, str) and HAS_UTF8.search(s) is not None: - s = s.decode('utf-8') - def replace(match): - return ESCAPE_DCT[match.group(0)] - return _q + ESCAPE.sub(replace, s) + _q - - -def py_encode_basestring_ascii(s, _PY3=PY3): - """Return an ASCII-only JSON representation of a Python string - - """ - if _PY3: - if isinstance(s, binary_type): - s = s.decode('utf-8') - else: - if isinstance(s, str) and HAS_UTF8.search(s) is not None: - s = s.decode('utf-8') - def replace(match): - s = match.group(0) - try: - return ESCAPE_DCT[s] - except KeyError: - n = ord(s) - if n < 0x10000: - #return '\\u{0:04x}'.format(n) - return '\\u%04x' % (n,) - else: - # surrogate pair - n -= 0x10000 - s1 = 0xd800 | ((n >> 10) & 0x3ff) - s2 = 0xdc00 | (n & 0x3ff) - #return '\\u{0:04x}\\u{1:04x}'.format(s1, s2) - return '\\u%04x\\u%04x' % (s1, s2) - return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"' - - -encode_basestring_ascii = ( - c_encode_basestring_ascii or py_encode_basestring_ascii) - -class JSONEncoder(object): - """Extensible JSON encoder for Python data structures. - - Supports the following objects and types by default: - - +-------------------+---------------+ - | Python | JSON | - +===================+===============+ - | dict, namedtuple | object | - +-------------------+---------------+ - | list, tuple | array | - +-------------------+---------------+ - | str, unicode | string | - +-------------------+---------------+ - | int, long, float | number | - +-------------------+---------------+ - | True | true | - +-------------------+---------------+ - | False | false | - +-------------------+---------------+ - | None | null | - +-------------------+---------------+ - - To extend this to recognize other objects, subclass and implement a - ``.default()`` method with another method that returns a serializable - object for ``o`` if possible, otherwise it should call the superclass - implementation (to raise ``TypeError``). - - """ - item_separator = ', ' - key_separator = ': ' - - def __init__(self, skipkeys=False, ensure_ascii=True, - check_circular=True, allow_nan=True, sort_keys=False, - indent=None, separators=None, encoding='utf-8', default=None, - use_decimal=True, namedtuple_as_object=True, - tuple_as_array=True, bigint_as_string=False, - item_sort_key=None, for_json=False, ignore_nan=False, - int_as_string_bitcount=None): - """Constructor for JSONEncoder, with sensible defaults. - - If skipkeys is false, then it is a TypeError to attempt - encoding of keys that are not str, int, long, float or None. If - skipkeys is True, such items are simply skipped. - - If ensure_ascii is true, the output is guaranteed to be str - objects with all incoming unicode characters escaped. If - ensure_ascii is false, the output will be unicode object. - - If check_circular is true, then lists, dicts, and custom encoded - objects will be checked for circular references during encoding to - prevent an infinite recursion (which would cause an OverflowError). - Otherwise, no such check takes place. - - If allow_nan is true, then NaN, Infinity, and -Infinity will be - encoded as such. This behavior is not JSON specification compliant, - but is consistent with most JavaScript based encoders and decoders. - Otherwise, it will be a ValueError to encode such floats. - - If sort_keys is true, then the output of dictionaries will be - sorted by key; this is useful for regression tests to ensure - that JSON serializations can be compared on a day-to-day basis. - - If indent is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, separators should be an (item_separator, key_separator) - tuple. The default is (', ', ': ') if *indent* is ``None`` and - (',', ': ') otherwise. To get the most compact JSON representation, - you should specify (',', ':') to eliminate whitespace. - - If specified, default is a function that gets called for objects - that can't otherwise be serialized. It should return a JSON encodable - version of the object or raise a ``TypeError``. - - If encoding is not None, then all input strings will be - transformed into unicode using that encoding prior to JSON-encoding. - The default is UTF-8. - - If use_decimal is true (not the default), ``decimal.Decimal`` will - be supported directly by the encoder. For the inverse, decode JSON - with ``parse_float=decimal.Decimal``. - - If namedtuple_as_object is true (the default), objects with - ``_asdict()`` methods will be encoded as JSON objects. - - If tuple_as_array is true (the default), tuple (and subclasses) will - be encoded as JSON arrays. - - If bigint_as_string is true (not the default), ints 2**53 and higher - or lower than -2**53 will be encoded as strings. This is to avoid the - rounding that happens in Javascript otherwise. - - If int_as_string_bitcount is a positive number (n), then int of size - greater than or equal to 2**n or lower than or equal to -2**n will be - encoded as strings. - - If specified, item_sort_key is a callable used to sort the items in - each dictionary. This is useful if you want to sort items other than - in alphabetical order by key. - - If for_json is true (not the default), objects with a ``for_json()`` - method will use the return value of that method for encoding as JSON - instead of the object. - - If *ignore_nan* is true (default: ``False``), then out of range - :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized - as ``null`` in compliance with the ECMA-262 specification. If true, - this will override *allow_nan*. - - """ - - self.skipkeys = skipkeys - self.ensure_ascii = ensure_ascii - self.check_circular = check_circular - self.allow_nan = allow_nan - self.sort_keys = sort_keys - self.use_decimal = use_decimal - self.namedtuple_as_object = namedtuple_as_object - self.tuple_as_array = tuple_as_array - self.bigint_as_string = bigint_as_string - self.item_sort_key = item_sort_key - self.for_json = for_json - self.ignore_nan = ignore_nan - self.int_as_string_bitcount = int_as_string_bitcount - if indent is not None and not isinstance(indent, string_types): - indent = indent * ' ' - self.indent = indent - if separators is not None: - self.item_separator, self.key_separator = separators - elif indent is not None: - self.item_separator = ',' - if default is not None: - self.default = default - self.encoding = encoding - - def default(self, o): - """Implement this method in a subclass such that it returns - a serializable object for ``o``, or calls the base implementation - (to raise a ``TypeError``). - - For example, to support arbitrary iterators, you could - implement default like this:: - - def default(self, o): - try: - iterable = iter(o) - except TypeError: - pass - else: - return list(iterable) - return JSONEncoder.default(self, o) - - """ - raise TypeError(repr(o) + " is not JSON serializable") - - def encode(self, o): - """Return a JSON string representation of a Python data structure. - - >>> from simplejson import JSONEncoder - >>> JSONEncoder().encode({"foo": ["bar", "baz"]}) - '{"foo": ["bar", "baz"]}' - - """ - # This is for extremely simple cases and benchmarks. - if isinstance(o, binary_type): - _encoding = self.encoding - if (_encoding is not None and not (_encoding == 'utf-8')): - o = o.decode(_encoding) - if isinstance(o, string_types): - if self.ensure_ascii: - return encode_basestring_ascii(o) - else: - return encode_basestring(o) - # This doesn't pass the iterator directly to ''.join() because the - # exceptions aren't as detailed. The list call should be roughly - # equivalent to the PySequence_Fast that ''.join() would do. - chunks = self.iterencode(o, _one_shot=True) - if not isinstance(chunks, (list, tuple)): - chunks = list(chunks) - if self.ensure_ascii: - return ''.join(chunks) - else: - return u''.join(chunks) - - def iterencode(self, o, _one_shot=False): - """Encode the given object and yield each string - representation as available. - - For example:: - - for chunk in JSONEncoder().iterencode(bigobject): - mysocket.write(chunk) - - """ - if self.check_circular: - markers = {} - else: - markers = None - if self.ensure_ascii: - _encoder = encode_basestring_ascii - else: - _encoder = encode_basestring - if self.encoding != 'utf-8': - def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding): - if isinstance(o, binary_type): - o = o.decode(_encoding) - return _orig_encoder(o) - - def floatstr(o, allow_nan=self.allow_nan, ignore_nan=self.ignore_nan, - _repr=FLOAT_REPR, _inf=PosInf, _neginf=-PosInf): - # Check for specials. Note that this type of test is processor - # and/or platform-specific, so do tests which don't depend on - # the internals. - - if o != o: - text = 'NaN' - elif o == _inf: - text = 'Infinity' - elif o == _neginf: - text = '-Infinity' - else: - return _repr(o) - - if ignore_nan: - text = 'null' - elif not allow_nan: - raise ValueError( - "Out of range float values are not JSON compliant: " + - repr(o)) - - return text - - key_memo = {} - int_as_string_bitcount = ( - 53 if self.bigint_as_string else self.int_as_string_bitcount) - if (_one_shot and c_make_encoder is not None - and self.indent is None): - _iterencode = c_make_encoder( - markers, self.default, _encoder, self.indent, - self.key_separator, self.item_separator, self.sort_keys, - self.skipkeys, self.allow_nan, key_memo, self.use_decimal, - self.namedtuple_as_object, self.tuple_as_array, - int_as_string_bitcount, - self.item_sort_key, self.encoding, self.for_json, - self.ignore_nan, Decimal) - else: - _iterencode = _make_iterencode( - markers, self.default, _encoder, self.indent, floatstr, - self.key_separator, self.item_separator, self.sort_keys, - self.skipkeys, _one_shot, self.use_decimal, - self.namedtuple_as_object, self.tuple_as_array, - int_as_string_bitcount, - self.item_sort_key, self.encoding, self.for_json, - Decimal=Decimal) - try: - return _iterencode(o, 0) - finally: - key_memo.clear() - - -class JSONEncoderForHTML(JSONEncoder): - """An encoder that produces JSON safe to embed in HTML. - - To embed JSON content in, say, a script tag on a web page, the - characters &, < and > should be escaped. They cannot be escaped - with the usual entities (e.g. &) because they are not expanded - within ' - self.assertEqual( - r'"\u003c/script\u003e\u003cscript\u003e' - r'alert(\"gotcha\")\u003c/script\u003e"', - self.encoder.encode(bad_string)) - self.assertEqual( - bad_string, self.decoder.decode( - self.encoder.encode(bad_string))) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_errors.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_errors.py deleted file mode 100644 index 8dede38..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_errors.py +++ /dev/null @@ -1,51 +0,0 @@ -import sys, pickle -from unittest import TestCase - -import simplejson as json -from simplejson.compat import u, b - -class TestErrors(TestCase): - def test_string_keys_error(self): - data = [{'a': 'A', 'b': (2, 4), 'c': 3.0, ('d',): 'D tuple'}] - self.assertRaises(TypeError, json.dumps, data) - - def test_decode_error(self): - err = None - try: - json.loads('{}\na\nb') - except json.JSONDecodeError: - err = sys.exc_info()[1] - else: - self.fail('Expected JSONDecodeError') - self.assertEqual(err.lineno, 2) - self.assertEqual(err.colno, 1) - self.assertEqual(err.endlineno, 3) - self.assertEqual(err.endcolno, 2) - - def test_scan_error(self): - err = None - for t in (u, b): - try: - json.loads(t('{"asdf": "')) - except json.JSONDecodeError: - err = sys.exc_info()[1] - else: - self.fail('Expected JSONDecodeError') - self.assertEqual(err.lineno, 1) - self.assertEqual(err.colno, 10) - - def test_error_is_pickable(self): - err = None - try: - json.loads('{}\na\nb') - except json.JSONDecodeError: - err = sys.exc_info()[1] - else: - self.fail('Expected JSONDecodeError') - s = pickle.dumps(err) - e = pickle.loads(s) - - self.assertEqual(err.msg, e.msg) - self.assertEqual(err.doc, e.doc) - self.assertEqual(err.pos, e.pos) - self.assertEqual(err.end, e.end) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_fail.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_fail.py deleted file mode 100644 index 788f3a5..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_fail.py +++ /dev/null @@ -1,176 +0,0 @@ -import sys -from unittest import TestCase - -import simplejson as json - -# 2007-10-05 -JSONDOCS = [ - # http://json.org/JSON_checker/test/fail1.json - '"A JSON payload should be an object or array, not a string."', - # http://json.org/JSON_checker/test/fail2.json - '["Unclosed array"', - # http://json.org/JSON_checker/test/fail3.json - '{unquoted_key: "keys must be quoted"}', - # http://json.org/JSON_checker/test/fail4.json - '["extra comma",]', - # http://json.org/JSON_checker/test/fail5.json - '["double extra comma",,]', - # http://json.org/JSON_checker/test/fail6.json - '[ , "<-- missing value"]', - # http://json.org/JSON_checker/test/fail7.json - '["Comma after the close"],', - # http://json.org/JSON_checker/test/fail8.json - '["Extra close"]]', - # http://json.org/JSON_checker/test/fail9.json - '{"Extra comma": true,}', - # http://json.org/JSON_checker/test/fail10.json - '{"Extra value after close": true} "misplaced quoted value"', - # http://json.org/JSON_checker/test/fail11.json - '{"Illegal expression": 1 + 2}', - # http://json.org/JSON_checker/test/fail12.json - '{"Illegal invocation": alert()}', - # http://json.org/JSON_checker/test/fail13.json - '{"Numbers cannot have leading zeroes": 013}', - # http://json.org/JSON_checker/test/fail14.json - '{"Numbers cannot be hex": 0x14}', - # http://json.org/JSON_checker/test/fail15.json - '["Illegal backslash escape: \\x15"]', - # http://json.org/JSON_checker/test/fail16.json - '[\\naked]', - # http://json.org/JSON_checker/test/fail17.json - '["Illegal backslash escape: \\017"]', - # http://json.org/JSON_checker/test/fail18.json - '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', - # http://json.org/JSON_checker/test/fail19.json - '{"Missing colon" null}', - # http://json.org/JSON_checker/test/fail20.json - '{"Double colon":: null}', - # http://json.org/JSON_checker/test/fail21.json - '{"Comma instead of colon", null}', - # http://json.org/JSON_checker/test/fail22.json - '["Colon instead of comma": false]', - # http://json.org/JSON_checker/test/fail23.json - '["Bad value", truth]', - # http://json.org/JSON_checker/test/fail24.json - "['single quote']", - # http://json.org/JSON_checker/test/fail25.json - '["\ttab\tcharacter\tin\tstring\t"]', - # http://json.org/JSON_checker/test/fail26.json - '["tab\\ character\\ in\\ string\\ "]', - # http://json.org/JSON_checker/test/fail27.json - '["line\nbreak"]', - # http://json.org/JSON_checker/test/fail28.json - '["line\\\nbreak"]', - # http://json.org/JSON_checker/test/fail29.json - '[0e]', - # http://json.org/JSON_checker/test/fail30.json - '[0e+]', - # http://json.org/JSON_checker/test/fail31.json - '[0e+-1]', - # http://json.org/JSON_checker/test/fail32.json - '{"Comma instead if closing brace": true,', - # http://json.org/JSON_checker/test/fail33.json - '["mismatch"}', - # http://code.google.com/p/simplejson/issues/detail?id=3 - u'["A\u001FZ control characters in string"]', - # misc based on coverage - '{', - '{]', - '{"foo": "bar"]', - '{"foo": "bar"', - 'nul', - 'nulx', - '-', - '-x', - '-e', - '-e0', - '-Infinite', - '-Inf', - 'Infinit', - 'Infinite', - 'NaM', - 'NuN', - 'falsy', - 'fal', - 'trug', - 'tru', - '1e', - '1ex', - '1e-', - '1e-x', -] - -SKIPS = { - 1: "why not have a string payload?", - 18: "spec doesn't specify any nesting limitations", -} - -class TestFail(TestCase): - def test_failures(self): - for idx, doc in enumerate(JSONDOCS): - idx = idx + 1 - if idx in SKIPS: - json.loads(doc) - continue - try: - json.loads(doc) - except json.JSONDecodeError: - pass - else: - self.fail("Expected failure for fail%d.json: %r" % (idx, doc)) - - def test_array_decoder_issue46(self): - # http://code.google.com/p/simplejson/issues/detail?id=46 - for doc in [u'[,]', '[,]']: - try: - json.loads(doc) - except json.JSONDecodeError: - e = sys.exc_info()[1] - self.assertEqual(e.pos, 1) - self.assertEqual(e.lineno, 1) - self.assertEqual(e.colno, 2) - except Exception: - e = sys.exc_info()[1] - self.fail("Unexpected exception raised %r %s" % (e, e)) - else: - self.fail("Unexpected success parsing '[,]'") - - def test_truncated_input(self): - test_cases = [ - ('', 'Expecting value', 0), - ('[', "Expecting value or ']'", 1), - ('[42', "Expecting ',' delimiter", 3), - ('[42,', 'Expecting value', 4), - ('["', 'Unterminated string starting at', 1), - ('["spam', 'Unterminated string starting at', 1), - ('["spam"', "Expecting ',' delimiter", 7), - ('["spam",', 'Expecting value', 8), - ('{', 'Expecting property name enclosed in double quotes', 1), - ('{"', 'Unterminated string starting at', 1), - ('{"spam', 'Unterminated string starting at', 1), - ('{"spam"', "Expecting ':' delimiter", 7), - ('{"spam":', 'Expecting value', 8), - ('{"spam":42', "Expecting ',' delimiter", 10), - ('{"spam":42,', 'Expecting property name enclosed in double quotes', - 11), - ('"', 'Unterminated string starting at', 0), - ('"spam', 'Unterminated string starting at', 0), - ('[,', "Expecting value", 1), - ] - for data, msg, idx in test_cases: - try: - json.loads(data) - except json.JSONDecodeError: - e = sys.exc_info()[1] - self.assertEqual( - e.msg[:len(msg)], - msg, - "%r doesn't start with %r for %r" % (e.msg, msg, data)) - self.assertEqual( - e.pos, idx, - "pos %r != %r for %r" % (e.pos, idx, data)) - except Exception: - e = sys.exc_info()[1] - self.fail("Unexpected exception raised %r %s" % (e, e)) - else: - self.fail("Unexpected success parsing '%r'" % (data,)) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_float.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_float.py deleted file mode 100644 index e382ec2..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_float.py +++ /dev/null @@ -1,35 +0,0 @@ -import math -from unittest import TestCase -from simplejson.compat import long_type, text_type -import simplejson as json -from simplejson.decoder import NaN, PosInf, NegInf - -class TestFloat(TestCase): - def test_degenerates_allow(self): - for inf in (PosInf, NegInf): - self.assertEqual(json.loads(json.dumps(inf)), inf) - # Python 2.5 doesn't have math.isnan - nan = json.loads(json.dumps(NaN)) - self.assertTrue((0 + nan) != nan) - - def test_degenerates_ignore(self): - for f in (PosInf, NegInf, NaN): - self.assertEqual(json.loads(json.dumps(f, ignore_nan=True)), None) - - def test_degenerates_deny(self): - for f in (PosInf, NegInf, NaN): - self.assertRaises(ValueError, json.dumps, f, allow_nan=False) - - def test_floats(self): - for num in [1617161771.7650001, math.pi, math.pi**100, - math.pi**-100, 3.1]: - self.assertEqual(float(json.dumps(num)), num) - self.assertEqual(json.loads(json.dumps(num)), num) - self.assertEqual(json.loads(text_type(json.dumps(num))), num) - - def test_ints(self): - for num in [1, long_type(1), 1<<32, 1<<64]: - self.assertEqual(json.dumps(num), str(num)) - self.assertEqual(int(json.dumps(num)), num) - self.assertEqual(json.loads(json.dumps(num)), num) - self.assertEqual(json.loads(text_type(json.dumps(num))), num) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_for_json.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_for_json.py deleted file mode 100644 index b791b88..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_for_json.py +++ /dev/null @@ -1,97 +0,0 @@ -import unittest -import simplejson as json - - -class ForJson(object): - def for_json(self): - return {'for_json': 1} - - -class NestedForJson(object): - def for_json(self): - return {'nested': ForJson()} - - -class ForJsonList(object): - def for_json(self): - return ['list'] - - -class DictForJson(dict): - def for_json(self): - return {'alpha': 1} - - -class ListForJson(list): - def for_json(self): - return ['list'] - - -class TestForJson(unittest.TestCase): - def assertRoundTrip(self, obj, other, for_json=True): - if for_json is None: - # None will use the default - s = json.dumps(obj) - else: - s = json.dumps(obj, for_json=for_json) - self.assertEqual( - json.loads(s), - other) - - def test_for_json_encodes_stand_alone_object(self): - self.assertRoundTrip( - ForJson(), - ForJson().for_json()) - - def test_for_json_encodes_object_nested_in_dict(self): - self.assertRoundTrip( - {'hooray': ForJson()}, - {'hooray': ForJson().for_json()}) - - def test_for_json_encodes_object_nested_in_list_within_dict(self): - self.assertRoundTrip( - {'list': [0, ForJson(), 2, 3]}, - {'list': [0, ForJson().for_json(), 2, 3]}) - - def test_for_json_encodes_object_nested_within_object(self): - self.assertRoundTrip( - NestedForJson(), - {'nested': {'for_json': 1}}) - - def test_for_json_encodes_list(self): - self.assertRoundTrip( - ForJsonList(), - ForJsonList().for_json()) - - def test_for_json_encodes_list_within_object(self): - self.assertRoundTrip( - {'nested': ForJsonList()}, - {'nested': ForJsonList().for_json()}) - - def test_for_json_encodes_dict_subclass(self): - self.assertRoundTrip( - DictForJson(a=1), - DictForJson(a=1).for_json()) - - def test_for_json_encodes_list_subclass(self): - self.assertRoundTrip( - ListForJson(['l']), - ListForJson(['l']).for_json()) - - def test_for_json_ignored_if_not_true_with_dict_subclass(self): - for for_json in (None, False): - self.assertRoundTrip( - DictForJson(a=1), - {'a': 1}, - for_json=for_json) - - def test_for_json_ignored_if_not_true_with_list_subclass(self): - for for_json in (None, False): - self.assertRoundTrip( - ListForJson(['l']), - ['l'], - for_json=for_json) - - def test_raises_typeerror_if_for_json_not_true_with_object(self): - self.assertRaises(TypeError, json.dumps, ForJson()) - self.assertRaises(TypeError, json.dumps, ForJson(), for_json=False) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_indent.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_indent.py deleted file mode 100644 index cea25a5..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_indent.py +++ /dev/null @@ -1,86 +0,0 @@ -from unittest import TestCase -import textwrap - -import simplejson as json -from simplejson.compat import StringIO - -class TestIndent(TestCase): - def test_indent(self): - h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh', - 'i-vhbjkhnth', - {'nifty': 87}, {'field': 'yes', 'morefield': False} ] - - expect = textwrap.dedent("""\ - [ - \t[ - \t\t"blorpie" - \t], - \t[ - \t\t"whoops" - \t], - \t[], - \t"d-shtaeou", - \t"d-nthiouh", - \t"i-vhbjkhnth", - \t{ - \t\t"nifty": 87 - \t}, - \t{ - \t\t"field": "yes", - \t\t"morefield": false - \t} - ]""") - - - d1 = json.dumps(h) - d2 = json.dumps(h, indent='\t', sort_keys=True, separators=(',', ': ')) - d3 = json.dumps(h, indent=' ', sort_keys=True, separators=(',', ': ')) - d4 = json.dumps(h, indent=2, sort_keys=True, separators=(',', ': ')) - - h1 = json.loads(d1) - h2 = json.loads(d2) - h3 = json.loads(d3) - h4 = json.loads(d4) - - self.assertEqual(h1, h) - self.assertEqual(h2, h) - self.assertEqual(h3, h) - self.assertEqual(h4, h) - self.assertEqual(d3, expect.replace('\t', ' ')) - self.assertEqual(d4, expect.replace('\t', ' ')) - # NOTE: Python 2.4 textwrap.dedent converts tabs to spaces, - # so the following is expected to fail. Python 2.4 is not a - # supported platform in simplejson 2.1.0+. - self.assertEqual(d2, expect) - - def test_indent0(self): - h = {3: 1} - def check(indent, expected): - d1 = json.dumps(h, indent=indent) - self.assertEqual(d1, expected) - - sio = StringIO() - json.dump(h, sio, indent=indent) - self.assertEqual(sio.getvalue(), expected) - - # indent=0 should emit newlines - check(0, '{\n"3": 1\n}') - # indent=None is more compact - check(None, '{"3": 1}') - - def test_separators(self): - lst = [1,2,3,4] - expect = '[\n1,\n2,\n3,\n4\n]' - expect_spaces = '[\n1, \n2, \n3, \n4\n]' - # Ensure that separators still works - self.assertEqual( - expect_spaces, - json.dumps(lst, indent=0, separators=(', ', ': '))) - # Force the new defaults - self.assertEqual( - expect, - json.dumps(lst, indent=0, separators=(',', ': '))) - # Added in 2.1.4 - self.assertEqual( - expect, - json.dumps(lst, indent=0)) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_item_sort_key.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_item_sort_key.py deleted file mode 100644 index b05bfc8..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_item_sort_key.py +++ /dev/null @@ -1,20 +0,0 @@ -from unittest import TestCase - -import simplejson as json -from operator import itemgetter - -class TestItemSortKey(TestCase): - def test_simple_first(self): - a = {'a': 1, 'c': 5, 'jack': 'jill', 'pick': 'axe', 'array': [1, 5, 6, 9], 'tuple': (83, 12, 3), 'crate': 'dog', 'zeak': 'oh'} - self.assertEqual( - '{"a": 1, "c": 5, "crate": "dog", "jack": "jill", "pick": "axe", "zeak": "oh", "array": [1, 5, 6, 9], "tuple": [83, 12, 3]}', - json.dumps(a, item_sort_key=json.simple_first)) - - def test_case(self): - a = {'a': 1, 'c': 5, 'Jack': 'jill', 'pick': 'axe', 'Array': [1, 5, 6, 9], 'tuple': (83, 12, 3), 'crate': 'dog', 'zeak': 'oh'} - self.assertEqual( - '{"Array": [1, 5, 6, 9], "Jack": "jill", "a": 1, "c": 5, "crate": "dog", "pick": "axe", "tuple": [83, 12, 3], "zeak": "oh"}', - json.dumps(a, item_sort_key=itemgetter(0))) - self.assertEqual( - '{"a": 1, "Array": [1, 5, 6, 9], "c": 5, "crate": "dog", "Jack": "jill", "pick": "axe", "tuple": [83, 12, 3], "zeak": "oh"}', - json.dumps(a, item_sort_key=lambda kv: kv[0].lower())) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_namedtuple.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_namedtuple.py deleted file mode 100644 index 4387894..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_namedtuple.py +++ /dev/null @@ -1,122 +0,0 @@ -from __future__ import absolute_import -import unittest -import simplejson as json -from simplejson.compat import StringIO - -try: - from collections import namedtuple -except ImportError: - class Value(tuple): - def __new__(cls, *args): - return tuple.__new__(cls, args) - - def _asdict(self): - return {'value': self[0]} - class Point(tuple): - def __new__(cls, *args): - return tuple.__new__(cls, args) - - def _asdict(self): - return {'x': self[0], 'y': self[1]} -else: - Value = namedtuple('Value', ['value']) - Point = namedtuple('Point', ['x', 'y']) - -class DuckValue(object): - def __init__(self, *args): - self.value = Value(*args) - - def _asdict(self): - return self.value._asdict() - -class DuckPoint(object): - def __init__(self, *args): - self.point = Point(*args) - - def _asdict(self): - return self.point._asdict() - -class DeadDuck(object): - _asdict = None - -class DeadDict(dict): - _asdict = None - -CONSTRUCTORS = [ - lambda v: v, - lambda v: [v], - lambda v: [{'key': v}], -] - -class TestNamedTuple(unittest.TestCase): - def test_namedtuple_dumps(self): - for v in [Value(1), Point(1, 2), DuckValue(1), DuckPoint(1, 2)]: - d = v._asdict() - self.assertEqual(d, json.loads(json.dumps(v))) - self.assertEqual( - d, - json.loads(json.dumps(v, namedtuple_as_object=True))) - self.assertEqual(d, json.loads(json.dumps(v, tuple_as_array=False))) - self.assertEqual( - d, - json.loads(json.dumps(v, namedtuple_as_object=True, - tuple_as_array=False))) - - def test_namedtuple_dumps_false(self): - for v in [Value(1), Point(1, 2)]: - l = list(v) - self.assertEqual( - l, - json.loads(json.dumps(v, namedtuple_as_object=False))) - self.assertRaises(TypeError, json.dumps, v, - tuple_as_array=False, namedtuple_as_object=False) - - def test_namedtuple_dump(self): - for v in [Value(1), Point(1, 2), DuckValue(1), DuckPoint(1, 2)]: - d = v._asdict() - sio = StringIO() - json.dump(v, sio) - self.assertEqual(d, json.loads(sio.getvalue())) - sio = StringIO() - json.dump(v, sio, namedtuple_as_object=True) - self.assertEqual( - d, - json.loads(sio.getvalue())) - sio = StringIO() - json.dump(v, sio, tuple_as_array=False) - self.assertEqual(d, json.loads(sio.getvalue())) - sio = StringIO() - json.dump(v, sio, namedtuple_as_object=True, - tuple_as_array=False) - self.assertEqual( - d, - json.loads(sio.getvalue())) - - def test_namedtuple_dump_false(self): - for v in [Value(1), Point(1, 2)]: - l = list(v) - sio = StringIO() - json.dump(v, sio, namedtuple_as_object=False) - self.assertEqual( - l, - json.loads(sio.getvalue())) - self.assertRaises(TypeError, json.dump, v, StringIO(), - tuple_as_array=False, namedtuple_as_object=False) - - def test_asdict_not_callable_dump(self): - for f in CONSTRUCTORS: - self.assertRaises(TypeError, - json.dump, f(DeadDuck()), StringIO(), namedtuple_as_object=True) - sio = StringIO() - json.dump(f(DeadDict()), sio, namedtuple_as_object=True) - self.assertEqual( - json.dumps(f({})), - sio.getvalue()) - - def test_asdict_not_callable_dumps(self): - for f in CONSTRUCTORS: - self.assertRaises(TypeError, - json.dumps, f(DeadDuck()), namedtuple_as_object=True) - self.assertEqual( - json.dumps(f({})), - json.dumps(f(DeadDict()), namedtuple_as_object=True)) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass1.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass1.py deleted file mode 100644 index f0b5b10..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass1.py +++ /dev/null @@ -1,71 +0,0 @@ -from unittest import TestCase - -import simplejson as json - -# from http://json.org/JSON_checker/test/pass1.json -JSON = r''' -[ - "JSON Test Pattern pass1", - {"object with 1 member":["array with 1 element"]}, - {}, - [], - -42, - true, - false, - null, - { - "integer": 1234567890, - "real": -9876.543210, - "e": 0.123456789e-12, - "E": 1.234567890E+34, - "": 23456789012E66, - "zero": 0, - "one": 1, - "space": " ", - "quote": "\"", - "backslash": "\\", - "controls": "\b\f\n\r\t", - "slash": "/ & \/", - "alpha": "abcdefghijklmnopqrstuvwyz", - "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", - "digit": "0123456789", - "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", - "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", - "true": true, - "false": false, - "null": null, - "array":[ ], - "object":{ }, - "address": "50 St. James Street", - "url": "http://www.JSON.org/", - "comment": "// /* */": " ", - " s p a c e d " :[1,2 , 3 - -, - -4 , 5 , 6 ,7 ],"compact": [1,2,3,4,5,6,7], - "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", - "quotes": "" \u0022 %22 0x22 034 "", - "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" -: "A key can be any string" - }, - 0.5 ,98.6 -, -99.44 -, - -1066, -1e1, -0.1e1, -1e-1, -1e00,2e+00,2e-00 -,"rosebud"] -''' - -class TestPass1(TestCase): - def test_parse(self): - # test in/out equivalence and parsing - res = json.loads(JSON) - out = json.dumps(res) - self.assertEqual(res, json.loads(out)) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass2.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass2.py deleted file mode 100644 index 5d812b3..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass2.py +++ /dev/null @@ -1,14 +0,0 @@ -from unittest import TestCase -import simplejson as json - -# from http://json.org/JSON_checker/test/pass2.json -JSON = r''' -[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] -''' - -class TestPass2(TestCase): - def test_parse(self): - # test in/out equivalence and parsing - res = json.loads(JSON) - out = json.dumps(res) - self.assertEqual(res, json.loads(out)) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass3.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass3.py deleted file mode 100644 index 821d60b..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_pass3.py +++ /dev/null @@ -1,20 +0,0 @@ -from unittest import TestCase - -import simplejson as json - -# from http://json.org/JSON_checker/test/pass3.json -JSON = r''' -{ - "JSON Test Pattern pass3": { - "The outermost value": "must be an object or array.", - "In this test": "It is an object." - } -} -''' - -class TestPass3(TestCase): - def test_parse(self): - # test in/out equivalence and parsing - res = json.loads(JSON) - out = json.dumps(res) - self.assertEqual(res, json.loads(out)) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_recursion.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_recursion.py deleted file mode 100644 index 662eb66..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_recursion.py +++ /dev/null @@ -1,67 +0,0 @@ -from unittest import TestCase - -import simplejson as json - -class JSONTestObject: - pass - - -class RecursiveJSONEncoder(json.JSONEncoder): - recurse = False - def default(self, o): - if o is JSONTestObject: - if self.recurse: - return [JSONTestObject] - else: - return 'JSONTestObject' - return json.JSONEncoder.default(o) - - -class TestRecursion(TestCase): - def test_listrecursion(self): - x = [] - x.append(x) - try: - json.dumps(x) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on list recursion") - x = [] - y = [x] - x.append(y) - try: - json.dumps(x) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on alternating list recursion") - y = [] - x = [y, y] - # ensure that the marker is cleared - json.dumps(x) - - def test_dictrecursion(self): - x = {} - x["test"] = x - try: - json.dumps(x) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on dict recursion") - x = {} - y = {"a": x, "b": x} - # ensure that the marker is cleared - json.dumps(y) - - def test_defaultrecursion(self): - enc = RecursiveJSONEncoder() - self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"') - enc.recurse = True - try: - enc.encode(JSONTestObject) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on default recursion") diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_scanstring.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_scanstring.py deleted file mode 100644 index 3d98f0d..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_scanstring.py +++ /dev/null @@ -1,194 +0,0 @@ -import sys -from unittest import TestCase - -import simplejson as json -import simplejson.decoder -from simplejson.compat import b, PY3 - -class TestScanString(TestCase): - # The bytes type is intentionally not used in most of these tests - # under Python 3 because the decoder immediately coerces to str before - # calling scanstring. In Python 2 we are testing the code paths - # for both unicode and str. - # - # The reason this is done is because Python 3 would require - # entirely different code paths for parsing bytes and str. - # - def test_py_scanstring(self): - self._test_scanstring(simplejson.decoder.py_scanstring) - - def test_c_scanstring(self): - if not simplejson.decoder.c_scanstring: - return - self._test_scanstring(simplejson.decoder.c_scanstring) - - def _test_scanstring(self, scanstring): - if sys.maxunicode == 65535: - self.assertEqual( - scanstring(u'"z\U0001d120x"', 1, None, True), - (u'z\U0001d120x', 6)) - else: - self.assertEqual( - scanstring(u'"z\U0001d120x"', 1, None, True), - (u'z\U0001d120x', 5)) - - self.assertEqual( - scanstring('"\\u007b"', 1, None, True), - (u'{', 8)) - - self.assertEqual( - scanstring('"A JSON payload should be an object or array, not a string."', 1, None, True), - (u'A JSON payload should be an object or array, not a string.', 60)) - - self.assertEqual( - scanstring('["Unclosed array"', 2, None, True), - (u'Unclosed array', 17)) - - self.assertEqual( - scanstring('["extra comma",]', 2, None, True), - (u'extra comma', 14)) - - self.assertEqual( - scanstring('["double extra comma",,]', 2, None, True), - (u'double extra comma', 21)) - - self.assertEqual( - scanstring('["Comma after the close"],', 2, None, True), - (u'Comma after the close', 24)) - - self.assertEqual( - scanstring('["Extra close"]]', 2, None, True), - (u'Extra close', 14)) - - self.assertEqual( - scanstring('{"Extra comma": true,}', 2, None, True), - (u'Extra comma', 14)) - - self.assertEqual( - scanstring('{"Extra value after close": true} "misplaced quoted value"', 2, None, True), - (u'Extra value after close', 26)) - - self.assertEqual( - scanstring('{"Illegal expression": 1 + 2}', 2, None, True), - (u'Illegal expression', 21)) - - self.assertEqual( - scanstring('{"Illegal invocation": alert()}', 2, None, True), - (u'Illegal invocation', 21)) - - self.assertEqual( - scanstring('{"Numbers cannot have leading zeroes": 013}', 2, None, True), - (u'Numbers cannot have leading zeroes', 37)) - - self.assertEqual( - scanstring('{"Numbers cannot be hex": 0x14}', 2, None, True), - (u'Numbers cannot be hex', 24)) - - self.assertEqual( - scanstring('[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', 21, None, True), - (u'Too deep', 30)) - - self.assertEqual( - scanstring('{"Missing colon" null}', 2, None, True), - (u'Missing colon', 16)) - - self.assertEqual( - scanstring('{"Double colon":: null}', 2, None, True), - (u'Double colon', 15)) - - self.assertEqual( - scanstring('{"Comma instead of colon", null}', 2, None, True), - (u'Comma instead of colon', 25)) - - self.assertEqual( - scanstring('["Colon instead of comma": false]', 2, None, True), - (u'Colon instead of comma', 25)) - - self.assertEqual( - scanstring('["Bad value", truth]', 2, None, True), - (u'Bad value', 12)) - - for c in map(chr, range(0x00, 0x1f)): - self.assertEqual( - scanstring(c + '"', 0, None, False), - (c, 2)) - self.assertRaises( - ValueError, - scanstring, c + '"', 0, None, True) - - self.assertRaises(ValueError, scanstring, '', 0, None, True) - self.assertRaises(ValueError, scanstring, 'a', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u0', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u01', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u012', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u0123', 0, None, True) - if sys.maxunicode > 65535: - self.assertRaises(ValueError, - scanstring, '\\ud834\\u"', 0, None, True) - self.assertRaises(ValueError, - scanstring, '\\ud834\\x0123"', 0, None, True) - - def test_issue3623(self): - self.assertRaises(ValueError, json.decoder.scanstring, "xxx", 1, - "xxx") - self.assertRaises(UnicodeDecodeError, - json.encoder.encode_basestring_ascii, b("xx\xff")) - - def test_overflow(self): - # Python 2.5 does not have maxsize, Python 3 does not have maxint - maxsize = getattr(sys, 'maxsize', getattr(sys, 'maxint', None)) - assert maxsize is not None - self.assertRaises(OverflowError, json.decoder.scanstring, "xxx", - maxsize + 1) - - def test_surrogates(self): - scanstring = json.decoder.scanstring - - def assertScan(given, expect, test_utf8=True): - givens = [given] - if not PY3 and test_utf8: - givens.append(given.encode('utf8')) - for given in givens: - (res, count) = scanstring(given, 1, None, True) - self.assertEqual(len(given), count) - self.assertEqual(res, expect) - - assertScan( - u'"z\\ud834\\u0079x"', - u'z\ud834yx') - assertScan( - u'"z\\ud834\\udd20x"', - u'z\U0001d120x') - assertScan( - u'"z\\ud834\\ud834\\udd20x"', - u'z\ud834\U0001d120x') - assertScan( - u'"z\\ud834x"', - u'z\ud834x') - assertScan( - u'"z\\udd20x"', - u'z\udd20x') - assertScan( - u'"z\ud834x"', - u'z\ud834x') - # It may look strange to join strings together, but Python is drunk. - # https://gist.github.com/etrepum/5538443 - assertScan( - u'"z\\ud834\udd20x12345"', - u''.join([u'z\ud834', u'\udd20x12345'])) - assertScan( - u'"z\ud834\\udd20x"', - u''.join([u'z\ud834', u'\udd20x'])) - # these have different behavior given UTF8 input, because the surrogate - # pair may be joined (in maxunicode > 65535 builds) - assertScan( - u''.join([u'"z\ud834', u'\udd20x"']), - u''.join([u'z\ud834', u'\udd20x']), - test_utf8=False) - - self.assertRaises(ValueError, - scanstring, u'"z\\ud83x"', 1, None, True) - self.assertRaises(ValueError, - scanstring, u'"z\\ud834\\udd2x"', 1, None, True) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_separators.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_separators.py deleted file mode 100644 index 91b4d4f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_separators.py +++ /dev/null @@ -1,42 +0,0 @@ -import textwrap -from unittest import TestCase - -import simplejson as json - - -class TestSeparators(TestCase): - def test_separators(self): - h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh', 'i-vhbjkhnth', - {'nifty': 87}, {'field': 'yes', 'morefield': False} ] - - expect = textwrap.dedent("""\ - [ - [ - "blorpie" - ] , - [ - "whoops" - ] , - [] , - "d-shtaeou" , - "d-nthiouh" , - "i-vhbjkhnth" , - { - "nifty" : 87 - } , - { - "field" : "yes" , - "morefield" : false - } - ]""") - - - d1 = json.dumps(h) - d2 = json.dumps(h, indent=' ', sort_keys=True, separators=(' ,', ' : ')) - - h1 = json.loads(d1) - h2 = json.loads(d2) - - self.assertEqual(h1, h) - self.assertEqual(h2, h) - self.assertEqual(d2, expect) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_speedups.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_speedups.py deleted file mode 100644 index 0a2b63b..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_speedups.py +++ /dev/null @@ -1,39 +0,0 @@ -import sys -import unittest -from unittest import TestCase - -from simplejson import encoder, scanner - - -def has_speedups(): - return encoder.c_make_encoder is not None - - -def skip_if_speedups_missing(func): - def wrapper(*args, **kwargs): - if not has_speedups(): - if hasattr(unittest, 'SkipTest'): - raise unittest.SkipTest("C Extension not available") - else: - sys.stdout.write("C Extension not available") - return - return func(*args, **kwargs) - - return wrapper - - -class TestDecode(TestCase): - @skip_if_speedups_missing - def test_make_scanner(self): - self.assertRaises(AttributeError, scanner.c_make_scanner, 1) - - @skip_if_speedups_missing - def test_make_encoder(self): - self.assertRaises( - TypeError, - encoder.c_make_encoder, - None, - ("\xCD\x7D\x3D\x4E\x12\x4C\xF9\x79\xD7" - "\x52\xBA\x82\xF2\x27\x4A\x7D\xA0\xCA\x75"), - None - ) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_tool.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_tool.py deleted file mode 100644 index ac2a14c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_tool.py +++ /dev/null @@ -1,97 +0,0 @@ -from __future__ import with_statement -import os -import sys -import textwrap -import unittest -import subprocess -import tempfile -try: - # Python 3.x - from test.support import strip_python_stderr -except ImportError: - # Python 2.6+ - try: - from test.test_support import strip_python_stderr - except ImportError: - # Python 2.5 - import re - def strip_python_stderr(stderr): - return re.sub( - r"\[\d+ refs\]\r?\n?$".encode(), - "".encode(), - stderr).strip() - -class TestTool(unittest.TestCase): - data = """ - - [["blorpie"],[ "whoops" ] , [ - ],\t"d-shtaeou",\r"d-nthiouh", - "i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field" - :"yes"} ] - """ - - expect = textwrap.dedent("""\ - [ - [ - "blorpie" - ], - [ - "whoops" - ], - [], - "d-shtaeou", - "d-nthiouh", - "i-vhbjkhnth", - { - "nifty": 87 - }, - { - "field": "yes", - "morefield": false - } - ] - """) - - def runTool(self, args=None, data=None): - argv = [sys.executable, '-m', 'simplejson.tool'] - if args: - argv.extend(args) - proc = subprocess.Popen(argv, - stdin=subprocess.PIPE, - stderr=subprocess.PIPE, - stdout=subprocess.PIPE) - out, err = proc.communicate(data) - self.assertEqual(strip_python_stderr(err), ''.encode()) - self.assertEqual(proc.returncode, 0) - return out - - def test_stdin_stdout(self): - self.assertEqual( - self.runTool(data=self.data.encode()), - self.expect.encode()) - - def test_infile_stdout(self): - with tempfile.NamedTemporaryFile() as infile: - infile.write(self.data.encode()) - infile.flush() - self.assertEqual( - self.runTool(args=[infile.name]), - self.expect.encode()) - - def test_infile_outfile(self): - with tempfile.NamedTemporaryFile() as infile: - infile.write(self.data.encode()) - infile.flush() - # outfile will get overwritten by tool, so the delete - # may not work on some platforms. Do it manually. - outfile = tempfile.NamedTemporaryFile() - try: - self.assertEqual( - self.runTool(args=[infile.name, outfile.name]), - ''.encode()) - with open(outfile.name, 'rb') as f: - self.assertEqual(f.read(), self.expect.encode()) - finally: - outfile.close() - if os.path.exists(outfile.name): - os.unlink(outfile.name) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_tuple.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_tuple.py deleted file mode 100644 index a6a9910..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_tuple.py +++ /dev/null @@ -1,51 +0,0 @@ -import unittest - -from simplejson.compat import StringIO -import simplejson as json - -class TestTuples(unittest.TestCase): - def test_tuple_array_dumps(self): - t = (1, 2, 3) - expect = json.dumps(list(t)) - # Default is True - self.assertEqual(expect, json.dumps(t)) - self.assertEqual(expect, json.dumps(t, tuple_as_array=True)) - self.assertRaises(TypeError, json.dumps, t, tuple_as_array=False) - # Ensure that the "default" does not get called - self.assertEqual(expect, json.dumps(t, default=repr)) - self.assertEqual(expect, json.dumps(t, tuple_as_array=True, - default=repr)) - # Ensure that the "default" gets called - self.assertEqual( - json.dumps(repr(t)), - json.dumps(t, tuple_as_array=False, default=repr)) - - def test_tuple_array_dump(self): - t = (1, 2, 3) - expect = json.dumps(list(t)) - # Default is True - sio = StringIO() - json.dump(t, sio) - self.assertEqual(expect, sio.getvalue()) - sio = StringIO() - json.dump(t, sio, tuple_as_array=True) - self.assertEqual(expect, sio.getvalue()) - self.assertRaises(TypeError, json.dump, t, StringIO(), - tuple_as_array=False) - # Ensure that the "default" does not get called - sio = StringIO() - json.dump(t, sio, default=repr) - self.assertEqual(expect, sio.getvalue()) - sio = StringIO() - json.dump(t, sio, tuple_as_array=True, default=repr) - self.assertEqual(expect, sio.getvalue()) - # Ensure that the "default" gets called - sio = StringIO() - json.dump(t, sio, tuple_as_array=False, default=repr) - self.assertEqual( - json.dumps(repr(t)), - sio.getvalue()) - -class TestNamedTuple(unittest.TestCase): - def test_namedtuple_dump(self): - pass diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_unicode.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_unicode.py deleted file mode 100644 index 3b37f65..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tests/test_unicode.py +++ /dev/null @@ -1,153 +0,0 @@ -import sys -import codecs -from unittest import TestCase - -import simplejson as json -from simplejson.compat import unichr, text_type, b, u, BytesIO - -class TestUnicode(TestCase): - def test_encoding1(self): - encoder = json.JSONEncoder(encoding='utf-8') - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - s = u.encode('utf-8') - ju = encoder.encode(u) - js = encoder.encode(s) - self.assertEqual(ju, js) - - def test_encoding2(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - s = u.encode('utf-8') - ju = json.dumps(u, encoding='utf-8') - js = json.dumps(s, encoding='utf-8') - self.assertEqual(ju, js) - - def test_encoding3(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps(u) - self.assertEqual(j, '"\\u03b1\\u03a9"') - - def test_encoding4(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps([u]) - self.assertEqual(j, '["\\u03b1\\u03a9"]') - - def test_encoding5(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps(u, ensure_ascii=False) - self.assertEqual(j, u'"' + u + u'"') - - def test_encoding6(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps([u], ensure_ascii=False) - self.assertEqual(j, u'["' + u + u'"]') - - def test_big_unicode_encode(self): - u = u'\U0001d120' - self.assertEqual(json.dumps(u), '"\\ud834\\udd20"') - self.assertEqual(json.dumps(u, ensure_ascii=False), u'"\U0001d120"') - - def test_big_unicode_decode(self): - u = u'z\U0001d120x' - self.assertEqual(json.loads('"' + u + '"'), u) - self.assertEqual(json.loads('"z\\ud834\\udd20x"'), u) - - def test_unicode_decode(self): - for i in range(0, 0xd7ff): - u = unichr(i) - #s = '"\\u{0:04x}"'.format(i) - s = '"\\u%04x"' % (i,) - self.assertEqual(json.loads(s), u) - - def test_object_pairs_hook_with_unicode(self): - s = u'{"xkd":1, "kcw":2, "art":3, "hxm":4, "qrt":5, "pad":6, "hoy":7}' - p = [(u"xkd", 1), (u"kcw", 2), (u"art", 3), (u"hxm", 4), - (u"qrt", 5), (u"pad", 6), (u"hoy", 7)] - self.assertEqual(json.loads(s), eval(s)) - self.assertEqual(json.loads(s, object_pairs_hook=lambda x: x), p) - od = json.loads(s, object_pairs_hook=json.OrderedDict) - self.assertEqual(od, json.OrderedDict(p)) - self.assertEqual(type(od), json.OrderedDict) - # the object_pairs_hook takes priority over the object_hook - self.assertEqual(json.loads(s, - object_pairs_hook=json.OrderedDict, - object_hook=lambda x: None), - json.OrderedDict(p)) - - - def test_default_encoding(self): - self.assertEqual(json.loads(u'{"a": "\xe9"}'.encode('utf-8')), - {'a': u'\xe9'}) - - def test_unicode_preservation(self): - self.assertEqual(type(json.loads(u'""')), text_type) - self.assertEqual(type(json.loads(u'"a"')), text_type) - self.assertEqual(type(json.loads(u'["a"]')[0]), text_type) - - def test_ensure_ascii_false_returns_unicode(self): - # http://code.google.com/p/simplejson/issues/detail?id=48 - self.assertEqual(type(json.dumps([], ensure_ascii=False)), text_type) - self.assertEqual(type(json.dumps(0, ensure_ascii=False)), text_type) - self.assertEqual(type(json.dumps({}, ensure_ascii=False)), text_type) - self.assertEqual(type(json.dumps("", ensure_ascii=False)), text_type) - - def test_ensure_ascii_false_bytestring_encoding(self): - # http://code.google.com/p/simplejson/issues/detail?id=48 - doc1 = {u'quux': b('Arr\xc3\xaat sur images')} - doc2 = {u'quux': u('Arr\xeat sur images')} - doc_ascii = '{"quux": "Arr\\u00eat sur images"}' - doc_unicode = u'{"quux": "Arr\xeat sur images"}' - self.assertEqual(json.dumps(doc1), doc_ascii) - self.assertEqual(json.dumps(doc2), doc_ascii) - self.assertEqual(json.dumps(doc1, ensure_ascii=False), doc_unicode) - self.assertEqual(json.dumps(doc2, ensure_ascii=False), doc_unicode) - - def test_ensure_ascii_linebreak_encoding(self): - # http://timelessrepo.com/json-isnt-a-javascript-subset - s1 = u'\u2029\u2028' - s2 = s1.encode('utf8') - expect = '"\\u2029\\u2028"' - self.assertEqual(json.dumps(s1), expect) - self.assertEqual(json.dumps(s2), expect) - self.assertEqual(json.dumps(s1, ensure_ascii=False), expect) - self.assertEqual(json.dumps(s2, ensure_ascii=False), expect) - - def test_invalid_escape_sequences(self): - # incomplete escape sequence - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u12') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u123') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1234') - # invalid escape sequence - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u123x"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u12x4"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1x34"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ux234"') - if sys.maxunicode > 65535: - # invalid escape sequence for low surrogate - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u0"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u00"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u000"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u000x"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u00x0"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u0x00"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\ux000"') - - def test_ensure_ascii_still_works(self): - # in the ascii range, ensure that everything is the same - for c in map(unichr, range(0, 127)): - self.assertEqual( - json.dumps(c, ensure_ascii=False), - json.dumps(c)) - snowman = u'\N{SNOWMAN}' - self.assertEqual( - json.dumps(c, ensure_ascii=False), - '"' + c + '"') - - def test_strip_bom(self): - content = u"\u3053\u3093\u306b\u3061\u308f" - json_doc = codecs.BOM_UTF8 + b(json.dumps(content)) - self.assertEqual(json.load(BytesIO(json_doc)), content) - for doc in json_doc, json_doc.decode('utf8'): - self.assertEqual(json.loads(doc), content) diff --git a/Linux_i686/lib/python3.4/site-packages/simplejson/tool.py b/Linux_i686/lib/python3.4/site-packages/simplejson/tool.py deleted file mode 100644 index 062e8e2..0000000 --- a/Linux_i686/lib/python3.4/site-packages/simplejson/tool.py +++ /dev/null @@ -1,42 +0,0 @@ -r"""Command-line tool to validate and pretty-print JSON - -Usage:: - - $ echo '{"json":"obj"}' | python -m simplejson.tool - { - "json": "obj" - } - $ echo '{ 1.2:3.4}' | python -m simplejson.tool - Expecting property name: line 1 column 2 (char 2) - -""" -from __future__ import with_statement -import sys -import simplejson as json - -def main(): - if len(sys.argv) == 1: - infile = sys.stdin - outfile = sys.stdout - elif len(sys.argv) == 2: - infile = open(sys.argv[1], 'r') - outfile = sys.stdout - elif len(sys.argv) == 3: - infile = open(sys.argv[1], 'r') - outfile = open(sys.argv[2], 'w') - else: - raise SystemExit(sys.argv[0] + " [infile [outfile]]") - with infile: - try: - obj = json.load(infile, - object_pairs_hook=json.OrderedDict, - use_decimal=True) - except ValueError: - raise SystemExit(sys.exc_info()[1]) - with outfile: - json.dump(obj, outfile, sort_keys=True, indent=' ', use_decimal=True) - outfile.write('\n') - - -if __name__ == '__main__': - main() diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/BdfFontFile.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/BdfFontFile.py deleted file mode 100644 index 3a41848..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/BdfFontFile.py +++ /dev/null @@ -1,132 +0,0 @@ -# -# 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. -# - -from PIL import Image -from PIL import FontFile - - -# -------------------------------------------------------------------- -# parse X Bitmap Distribution Format (BDF) -# -------------------------------------------------------------------- - -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(s) for s in props["BBX"].split()] - [dx, dy] = [int(s) for s 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 - -## -# Font file plugin for the X11 BDF format. - -class BdfFontFile(FontFile.FontFile): - - def __init__(self, fp): - - FontFile.FontFile.__init__(self) - - 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')) - - font = props["FONT"].split("-") - - font[4] = bdf_slant[font[4].upper()] - font[11] = bdf_spacing[font[11].upper()] - - ascent = int(props["FONT_ASCENT"]) - descent = int(props["FONT_DESCENT"]) - - fontname = ";".join(font[1:]) - - # print "#", fontname - # for i in comments: - # print "#", i - - font = [] - 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/Linux_x86_64/lib/python3.4/site-packages/PIL/BmpImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/BmpImagePlugin.py deleted file mode 100644 index fae6bd3..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/BmpImagePlugin.py +++ /dev/null @@ -1,260 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# BMP file handler -# -# Windows (and OS/2) native bitmap storage format. -# -# history: -# 1995-09-01 fl Created -# 1996-04-30 fl Added save -# 1997-08-27 fl Fixed save of 1-bit images -# 1998-03-06 fl Load P images as L where possible -# 1998-07-03 fl Load P images as 1 where possible -# 1998-12-29 fl Handle small palettes -# 2002-12-30 fl Fixed load of 1-bit palette images -# 2003-04-21 fl Fixed load of 1-bit monochrome images -# 2003-04-23 fl Added limited support for BI_BITFIELDS compression -# -# 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. -# - - -__version__ = "0.7" - - -from PIL import Image, ImageFile, ImagePalette, _binary -import math - -i8 = _binary.i8 -i16 = _binary.i16le -i32 = _binary.i32le -o8 = _binary.o8 -o16 = _binary.o16le -o32 = _binary.o32le - -# -# -------------------------------------------------------------------- -# Read BMP file - -BIT2MODE = { - # bits => 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" - -## -# Image plugin for the Windows BMP format. - -class BmpImageFile(ImageFile.ImageFile): - - format = "BMP" - format_description = "Windows Bitmap" - - def _bitmap(self, header = 0, offset = 0): - - if header: - self.fp.seek(header) - - read = self.fp.read - - # CORE/INFO - s = read(4) - s = s + ImageFile._safe_read(self.fp, i32(s)-4) - - if len(s) == 12: - - # OS/2 1.0 CORE - bits = i16(s[10:]) - self.size = i16(s[4:]), i16(s[6:]) - compression = 0 - lutsize = 3 - colors = 0 - direction = -1 - - elif len(s) in [40, 64, 108, 124]: - - # WIN 3.1 or OS/2 2.0 INFO - bits = i16(s[14:]) - self.size = i32(s[4:]), i32(s[8:]) - compression = i32(s[16:]) - pxperm = (i32(s[24:]), i32(s[28:])) # Pixels per meter - lutsize = 4 - colors = i32(s[32:]) - direction = -1 - if i8(s[11]) == 0xff: - # upside-down storage - self.size = self.size[0], 2**32 - self.size[1] - direction = 0 - - self.info["dpi"] = tuple(map(lambda x: math.ceil(x / 39.3701), pxperm)) - - else: - raise IOError("Unsupported BMP header type (%d)" % len(s)) - - if (self.size[0]*self.size[1]) > 2**31: - # Prevent DOS for > 2gb images - raise IOError("Unsupported BMP Size: (%dx%d)" % self.size) - - if not colors: - colors = 1 << bits - - # MODE - try: - self.mode, rawmode = BIT2MODE[bits] - except KeyError: - raise IOError("Unsupported BMP pixel depth (%d)" % bits) - - if compression == 3: - # BI_BITFIELDS compression - mask = i32(read(4)), i32(read(4)), i32(read(4)) - if bits == 32 and mask == (0xff0000, 0x00ff00, 0x0000ff): - rawmode = "BGRX" - elif bits == 16 and mask == (0x00f800, 0x0007e0, 0x00001f): - rawmode = "BGR;16" - elif bits == 16 and mask == (0x007c00, 0x0003e0, 0x00001f): - rawmode = "BGR;15" - else: - # print bits, map(hex, mask) - raise IOError("Unsupported BMP bitfields layout") - elif compression != 0: - raise IOError("Unsupported BMP compression (%d)" % compression) - - # LUT - if self.mode == "P": - palette = [] - greyscale = 1 - if colors == 2: - indices = (0, 255) - elif colors > 2**16 or colors <=0: #We're reading a i32. - raise IOError("Unsupported BMP Palette size (%d)" % colors) - else: - indices = list(range(colors)) - for i in indices: - rgb = read(lutsize)[:3] - if rgb != o8(i)*3: - greyscale = 0 - palette.append(rgb) - if greyscale: - if colors == 2: - self.mode = rawmode = "1" - else: - self.mode = rawmode = "L" - else: - self.mode = "P" - self.palette = ImagePalette.raw( - "BGR", b"".join(palette) - ) - - if not offset: - offset = self.fp.tell() - - self.tile = [("raw", - (0, 0) + self.size, - offset, - (rawmode, ((self.size[0]*bits+31)>>3)&(~3), direction))] - - self.info["compression"] = compression - - def _open(self): - - # HEAD - s = self.fp.read(14) - if s[:2] != b"BM": - raise SyntaxError("Not a BMP file") - offset = i32(s[10:]) - - self._bitmap(offset=offset) - - -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), -} - -def _save(im, fp, filename, check=0): - - try: - rawmode, bits, colors = SAVE[im.mode] - except KeyError: - raise IOError("cannot write mode %s as BMP" % im.mode) - - if check: - return check - - info = im.encoderinfo - - dpi = info.get("dpi", (96, 96)) - - # 1 meter == 39.3701 inches - ppm = tuple(map(lambda x: int(x * 39.3701), dpi)) - - stride = ((im.size[0]*bits+7)//8+3)&(~3) - header = 40 # or 64 for OS/2 version 2 - offset = 14 + header + colors * 4 - image = stride * im.size[1] - - # bitmap header - fp.write(b"BM" + # file type (magic) - o32(offset+image) + # 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]) + 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") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/BufrStubImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/BufrStubImagePlugin.py deleted file mode 100644 index a55ae56..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/BufrStubImagePlugin.py +++ /dev/null @@ -1,68 +0,0 @@ -# -# 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 PIL import Image, ImageFile - -_handler = None - -## -# Install application-specific BUFR image handler. -# -# @param handler Handler object. - -def register_handler(handler): - 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(8)): - 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 IOError("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/Linux_x86_64/lib/python3.4/site-packages/PIL/ContainerIO.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ContainerIO.py deleted file mode 100644 index f4a15b8..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ContainerIO.py +++ /dev/null @@ -1,116 +0,0 @@ -# -# 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. -# - -## -# A file object that provides read access to a part of an existing -# file (for example a TAR file). - -class ContainerIO: - - ## - # Create file object. - # - # @param file Existing file. - # @param offset Start of region, in bytes. - # @param length Size of region, in bytes. - - def __init__(self, file, offset, length): - self.fh = file - self.pos = 0 - self.offset = offset - self.length = length - self.fh.seek(offset) - - ## - # Always false. - - def isatty(self): - return 0 - - ## - # 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. - - def seek(self, offset, mode = 0): - 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) - - ## - # Get current file pointer. - # - # @return Offset from start of region, in bytes. - - def tell(self): - return self.pos - - ## - # Read data. - # - # @def read(bytes=0) - # @param bytes Number of bytes to read. If omitted or zero, - # read until end of region. - # @return An 8-bit string. - - def read(self, n = 0): - if n: - n = min(n, self.length - self.pos) - else: - n = self.length - self.pos - if not n: # EOF - return "" - self.pos = self.pos + n - return self.fh.read(n) - - ## - # Read a line of text. - # - # @return An 8-bit string. - - def readline(self): - s = "" - while True: - c = self.read(1) - if not c: - break - s = s + c - if c == "\n": - break - return s - - ## - # Read multiple lines of text. - # - # @return A list of 8-bit strings. - - def readlines(self): - l = [] - while True: - s = self.readline() - if not s: - break - l.append(s) - return l diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/CurImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/CurImagePlugin.py deleted file mode 100644 index 4cf2882..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/CurImagePlugin.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# 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. -# - - -__version__ = "0.1" - -from PIL import Image, BmpImagePlugin, _binary - - -# -# -------------------------------------------------------------------- - -i8 = _binary.i8 -i16 = _binary.i16le -i32 = _binary.i32le - - -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 an 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 - #print "width", i8(s[0]) - #print "height", i8(s[1]) - #print "colors", i8(s[2]) - #print "reserved", i8(s[3]) - #print "hotspot x", i16(s[4:]) - #print "hotspot y", i16(s[6:]) - #print "bytes", i32(s[8:]) - #print "offset", i32(s[12:]) - - # 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("CUR", CurImageFile, _accept) - -Image.register_extension("CUR", ".cur") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/DcxImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/DcxImagePlugin.py deleted file mode 100644 index 631875e..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/DcxImagePlugin.py +++ /dev/null @@ -1,77 +0,0 @@ -# -# 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. -# - -__version__ = "0.2" - -from PIL import Image, _binary - -from PIL.PcxImagePlugin import PcxImageFile - -MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? - -i32 = _binary.i32le - -def _accept(prefix): - return i32(prefix) == MAGIC - -## -# Image plugin for the Intel DCX format. - -class DcxImageFile(PcxImageFile): - - format = "DCX" - format_description = "Intel DCX" - - def _open(self): - - # Header - s = self.fp.read(4) - if i32(s) != MAGIC: - 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.seek(0) - - def seek(self, frame): - if frame >= len(self._offset): - raise EOFError("attempt to seek outside DCX directory") - self.frame = frame - self.fp = self.__fp - self.fp.seek(self._offset[frame]) - PcxImageFile._open(self) - - def tell(self): - return self.frame - - -Image.register_open("DCX", DcxImageFile, _accept) - -Image.register_extension("DCX", ".dcx") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/EpsImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/EpsImagePlugin.py deleted file mode 100644 index 9f963f7..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/EpsImagePlugin.py +++ /dev/null @@ -1,446 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EPS file handling -# -# History: -# 1995-09-01 fl Created (0.1) -# 1996-05-18 fl Don't choke on "atend" fields, Ghostscript interface (0.2) -# 1996-08-22 fl Don't choke on floating point BoundingBox values -# 1996-08-23 fl Handle files from Macintosh (0.3) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2003-09-07 fl Check gs.close status (from Federico Di Gregorio) (0.5) -# 2014-05-07 e Handling of EPS with binary preview and fixed resolution resizing -# -# 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. -# - -__version__ = "0.5" - -import re -import io -from PIL import Image, ImageFile, _binary - -# -# -------------------------------------------------------------------- - -i32 = _binary.i32le -o32 = _binary.o32le - -split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$") -field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$") - -gs_windows_binary = None -import sys -if sys.platform.startswith('win'): - import shutil - if hasattr(shutil, 'which'): - which = shutil.which - else: - # Python < 3.3 - import distutils.spawn - which = distutils.spawn.find_executable - for binary in ('gswin32c', 'gswin64c', 'gs'): - if which(binary) is not None: - gs_windows_binary = binary - break - else: - gs_windows_binary = False - -def has_ghostscript(): - if gs_windows_binary: - return True - if not sys.platform.startswith('win'): - import subprocess - try: - gs = subprocess.Popen(['gs','--version'], stdout=subprocess.PIPE) - gs.stdout.read() - return True - except OSError: - # no ghostscript - pass - return False - - -def Ghostscript(tile, size, fp, scale=1): - """Render an image using Ghostscript""" - - # Unpack decoder tile - decoder, tile, offset, data = tile[0] - length, bbox = data - - #Hack to support hi-res rendering - scale = int(scale) or 1 - orig_size = size - orig_bbox = bbox - size = (size[0] * scale, size[1] * scale) - # resolution is dependend on bbox and size - res = ( float((72.0 * size[0]) / (bbox[2]-bbox[0])), float((72.0 * size[1]) / (bbox[3]-bbox[1])) ) - #print("Ghostscript", scale, size, orig_size, bbox, orig_bbox, res) - - import tempfile, os, subprocess - - out_fd, outfile = tempfile.mkstemp() - os.close(out_fd) - in_fd, infile = tempfile.mkstemp() - os.close(in_fd) - - # ignore length and offset! - # ghostscript can read it - # copy whole file to read in ghostscript - with open(infile, 'wb') as f: - # fetch length of fp - fp.seek(0, 2) - fsize = fp.tell() - # ensure start position - # go back - fp.seek(0) - lengthfile = fsize - while lengthfile > 0: - s = fp.read(min(lengthfile, 100*1024)) - if not s: - break - length -= 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) - "-dNOPAUSE -dSAFER", # don't pause between pages, safe mode - "-sDEVICE=ppmraw", # ppm driver - "-sOutputFile=%s" % outfile, # output file - "-c", "%d %d translate" % (-bbox[0], -bbox[1]), - # adjust for image origin - "-f", infile, # input file - ] - - if gs_windows_binary is not None: - if not gs_windows_binary: - raise WindowsError('Unable to locate Ghostscript on paths') - command[0] = gs_windows_binary - - # push data through ghostscript - try: - gs = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE) - gs.stdin.close() - status = gs.wait() - if status: - raise IOError("gs failed (status %d)" % status) - im = Image.core.open_ppm(outfile) - finally: - try: - os.unlink(outfile) - os.unlink(infile) - except: pass - - return im - - -class PSFile: - """Wrapper that treats either CR or LF as end of line.""" - def __init__(self, fp): - self.fp = fp - self.char = None - def __getattr__(self, id): - v = getattr(self.fp, id) - setattr(self, id, v) - return v - def seek(self, offset, whence=0): - self.char = None - self.fp.seek(offset, whence) - def read(self, count): - return self.fp.read(count).decode('latin-1') - def readbinary(self, count): - return self.fp.read(count) - def tell(self): - pos = self.fp.tell() - if self.char: - pos -= 1 - return pos - def readline(self): - s = b"" - if self.char: - c = self.char - self.char = None - else: - c = self.fp.read(1) - while c not in b"\r\n": - s = s + c - c = self.fp.read(1) - if c == b"\r": - self.char = self.fp.read(1) - if self.char == b"\n": - self.char = None - return s.decode('latin-1') + "\n" - - -def _accept(prefix): - return prefix[:4] == b"%!PS" or 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" - - def _open(self): - - fp = PSFile(self.fp) - - # FIX for: Some EPS file not handled correctly / issue #302 - # EPS can contain binary data - # or start directly with latin coding - # read header in both ways to handle both - # file types - # more info see http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf - - # for HEAD without binary preview - s = fp.read(4) - # for HEAD with binary preview - fp.seek(0) - sb = fp.readbinary(160) - - if s[:4] == "%!PS": - fp.seek(0, 2) - length = fp.tell() - offset = 0 - elif i32(sb[0:4]) == 0xC6D3D0C5: - offset = i32(sb[4:8]) - length = i32(sb[8:12]) - else: - raise SyntaxError("not an EPS file") - - # go to offset - start of "%!PS" - fp.seek(offset) - - box = None - - self.mode = "RGB" - self.size = 1, 1 # FIXME: huh? - - # - # Load EPS header - - s = fp.readline() - - while s: - - if len(s) > 255: - raise SyntaxError("not an EPS file") - - if s[-2:] == '\r\n': - s = s[:-2] - elif s[-1:] == '\n': - s = s[:-1] - - try: - m = split.match(s) - except re.error as v: - raise SyntaxError("not an EPS file") - - 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(s)) for s in v.split()] - self.size = box[2] - box[0], box[3] - box[1] - self.tile = [("eps", (0,0) + self.size, offset, - (length, box))] - except: - 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:1] == '%': - # handle non-DSC Postscript comments that some - # tools mistakenly put in the Comments section - pass - else: - raise IOError("bad EPS header") - - s = fp.readline() - - if s[:1] != "%": - break - - - # - # Scan for an "ImageData" descriptor - - while s[0] == "%": - - if len(s) > 255: - raise SyntaxError("not an EPS file") - - if s[-2:] == '\r\n': - s = s[:-2] - elif s[-1:] == '\n': - s = s[:-1] - - if s[:11] == "%ImageData:": - - [x, y, bi, mo, z3, z4, en, id] =\ - s[11:].split(None, 7) - - x = int(x); y = int(y) - - bi = int(bi) - mo = int(mo) - - en = int(en) - - if en == 1: - decoder = "eps_binary" - elif en == 2: - decoder = "eps_hex" - else: - break - if bi != 8: - break - if mo == 1: - self.mode = "L" - elif mo == 2: - self.mode = "LAB" - elif mo == 3: - self.mode = "RGB" - else: - break - - if id[:1] == id[-1:] == '"': - id = id[1:-1] - - # Scan forward to the actual image data - while True: - s = fp.readline() - if not s: - break - if s[:len(id)] == id: - self.size = x, y - self.tile2 = [(decoder, - (0, 0, x, y), - fp.tell(), - 0)] - return - - s = fp.readline() - if not s: - break - - if not box: - raise IOError("cannot determine EPS bounding box") - - 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") - - class NoCloseStream: - def __init__(self, fp): - self.fp = fp - def __getattr__(self, name): - return getattr(self.fp, name) - def close(self): - pass - - base_fp = fp - fp = NoCloseStream(fp) - if sys.version_info[0] > 2: - fp = io.TextIOWrapper(fp, encoding='latin-1') - - 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") - fp.flush() - - ImageFile._save(im, base_fp, [("eps", (0,0)+im.size, 0, None)]) - - fp.write("\n%%%%EndBinary\n") - fp.write("grestore end\n") - fp.flush() - -# -# -------------------------------------------------------------------- - -Image.register_open(EpsImageFile.format, EpsImageFile, _accept) - -Image.register_save(EpsImageFile.format, _save) - -Image.register_extension(EpsImageFile.format, ".ps") -Image.register_extension(EpsImageFile.format, ".eps") - -Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ExifTags.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ExifTags.py deleted file mode 100644 index 25cd080..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ExifTags.py +++ /dev/null @@ -1,193 +0,0 @@ -# -# 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. -## - -## -# Maps EXIF tags to tag names. - -TAGS = { - - # possibly incomplete - 0x00fe: "NewSubfileType", - 0x00ff: "SubfileType", - 0x0100: "ImageWidth", - 0x0101: "ImageLength", - 0x0102: "BitsPerSample", - 0x0103: "Compression", - 0x0106: "PhotometricInterpretation", - 0x0107: "Threshholding", - 0x0108: "CellWidth", - 0x0109: "CellLenght", - 0x010a: "FillOrder", - 0x010d: "DocumentName", - 0x011d: "PageName", - 0x010e: "ImageDescription", - 0x010f: "Make", - 0x0110: "Model", - 0x0111: "StripOffsets", - 0x0112: "Orientation", - 0x0115: "SamplesPerPixel", - 0x0116: "RowsPerStrip", - 0x0117: "StripByteConunts", - 0x0118: "MinSampleValue", - 0x0119: "MaxSampleValue", - 0x011a: "XResolution", - 0x011b: "YResolution", - 0x011c: "PlanarConfiguration", - 0x0120: "FreeOffsets", - 0x0121: "FreeByteCounts", - 0x0122: "GrayResponseUnit", - 0x0123: "GrayResponseCurve", - 0x0128: "ResolutionUnit", - 0x012d: "TransferFunction", - 0x0131: "Software", - 0x0132: "DateTime", - 0x013b: "Artist", - 0x013c: "HostComputer", - 0x013e: "WhitePoint", - 0x013f: "PrimaryChromaticities", - 0x0140: "ColorMap", - 0x0152: "ExtraSamples", - 0x0201: "JpegIFOffset", - 0x0202: "JpegIFByteCount", - 0x0211: "YCbCrCoefficients", - 0x0212: "YCbCrSubSampling", - 0x0213: "YCbCrPositioning", - 0x0214: "ReferenceBlackWhite", - 0x1000: "RelatedImageFileFormat", - 0x1001: "RelatedImageLength", # FIXME / Dictionary contains duplicate keys - 0x1001: "RelatedImageWidth", # FIXME \ Dictionary contains duplicate keys - 0x828d: "CFARepeatPatternDim", - 0x828e: "CFAPattern", - 0x828f: "BatteryLevel", - 0x8298: "Copyright", - 0x829a: "ExposureTime", - 0x829d: "FNumber", - 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", - 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", - -} - -## -# Maps EXIF GPS 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", -} diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/FitsStubImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/FitsStubImagePlugin.py deleted file mode 100644 index 0b851ae..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/FitsStubImagePlugin.py +++ /dev/null @@ -1,73 +0,0 @@ -# -# 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 PIL import Image, ImageFile - -_handler = None - -## -# Install application-specific FITS image handler. -# -# @param handler Handler object. - -def register_handler(handler): - 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 IOError("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_extension(FITSStubImageFile.format, ".fit") -Image.register_extension(FITSStubImageFile.format, ".fits") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/FliImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/FliImagePlugin.py deleted file mode 100644 index c9a2905..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/FliImagePlugin.py +++ /dev/null @@ -1,141 +0,0 @@ -# -# 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. -# - - -__version__ = "0.2" - -from PIL import Image, ImageFile, ImagePalette, _binary - -i8 = _binary.i8 -i16 = _binary.i16le -i32 = _binary.i32le -o8 = _binary.o8 - -# -# decoder - -def _accept(prefix): - return 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" - - def _open(self): - - # HEAD - s = self.fp.read(128) - magic = i16(s[4:6]) - if not (magic in [0xAF11, 0xAF12] and - i16(s[14:16]) in [0, 3] and # flags - s[20:22] == b"\x00\x00"): # reserved - raise SyntaxError("not an FLI/FLC file") - - # image characteristics - self.mode = "P" - self.size = i16(s[8:10]), i16(s[10:12]) - - # animation speed - duration = i32(s[16:20]) - 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.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 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 = self.__offset + framesize - - def tell(self): - - return self.frame - -# -# registry - -Image.register_open("FLI", FliImageFile, _accept) - -Image.register_extension("FLI", ".fli") -Image.register_extension("FLI", ".flc") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/FontFile.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/FontFile.py deleted file mode 100644 index 7c5704c..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/FontFile.py +++ /dev/null @@ -1,146 +0,0 @@ -# -# 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 PIL import Image, _binary - -import marshal - -try: - import zlib -except ImportError: - zlib = None - -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)) - -## -# Base class for raster font file handlers. - -class FontFile: - - 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, yy = src[2] - src[0], 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) - # print chr(i), dst, s - self.metrics[i] = d, dst, s - - - def save1(self, filename): - "Save font in version 1 format" - - self.compile() - - # font data - self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") - - # font metrics - fp = open(os.path.splitext(filename)[0] + ".pil", "wb") - 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]) - fp.close() - - - def save2(self, filename): - "Save font in version 2 format" - - # THIS IS WORK IN PROGRESS - - self.compile() - - data = marshal.dumps((self.metrics, self.info)) - - if zlib: - data = b"z" + zlib.compress(data, 9) - else: - data = b"u" + data - - fp = open(os.path.splitext(filename)[0] + ".pil", "wb") - - fp.write(b"PILfont2\n" + self.name + "\n" + "DATA\n") - - fp.write(data) - - self.bitmap.save(fp, "PNG") - - fp.close() - - - save = save1 # for now diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/FpxImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/FpxImagePlugin.py deleted file mode 100644 index 64c7b15..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/FpxImagePlugin.py +++ /dev/null @@ -1,224 +0,0 @@ -# -# 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. -# - - -__version__ = "0.1" - - -from PIL import Image, ImageFile -from PIL.OleFileIO import * - - -# 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] == 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 = OleFileIO(self.fp) - except IOError: - raise SyntaxError("not an FPX file; invalid OLE file") - - 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 = [] - for i in range(i32(s, 4)): - # 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] - - # print len(self.jpeg), "tables loaded" - - 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 - p = 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) - - # print size, self.mode, self.rawmode - - if size != self.size: - raise IOError("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 IOError("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"]) - - ImageFile.ImageFile.load(self) - -# -# -------------------------------------------------------------------- - -Image.register_open("FPX", FpxImageFile, _accept) - -Image.register_extension("FPX", ".fpx") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/GbrImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/GbrImagePlugin.py deleted file mode 100644 index e2a5d0c..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/GbrImagePlugin.py +++ /dev/null @@ -1,69 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# load a GIMP brush file -# -# History: -# 96-03-14 fl Created -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# -# See the README file for information on usage and redistribution. -# - -from PIL import Image, ImageFile, _binary - -i32 = _binary.i32be - -def _accept(prefix): - return i32(prefix) >= 20 and i32(prefix[4:8]) == 1 - -## -# 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 or version != 1: - raise SyntaxError("not a GIMP brush") - - width = i32(self.fp.read(4)) - height = i32(self.fp.read(4)) - bytes = i32(self.fp.read(4)) - if width <= 0 or height <= 0 or bytes != 1: - raise SyntaxError("not a GIMP brush") - - comment = self.fp.read(header_size - 20)[:-1] - - self.mode = "L" - self.size = width, height - - self.info["comment"] = comment - - # Since the brush is so small, we read the data immediately - self.data = self.fp.read(width * height) - - def load(self): - - if not self.data: - return - - # create an image out of the brush data block - self.im = Image.core.new(self.mode, self.size) - self.im.frombytes(self.data) - self.data = b"" - -# -# registry - -Image.register_open("GBR", GbrImageFile, _accept) - -Image.register_extension("GBR", ".gbr") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/GdImageFile.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/GdImageFile.py deleted file mode 100644 index f1dbc7c..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/GdImageFile.py +++ /dev/null @@ -1,90 +0,0 @@ -# -# 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 Image.open(). To open a -# gd file, use the GdImageFile.open() function instead. - -# THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This -# implementation is provided for convenience and demonstrational -# purposes only. - - -__version__ = "0.1" - -from PIL import ImageFile, ImagePalette, _binary -from PIL._util import isPath - -try: - import builtins -except ImportError: - import __builtin__ - builtins = __builtin__ - -i16 = _binary.i16be - -## -# Image plugin for the GD uncompressed format. Note that this format -# is not supported by the standard Image.open function. To use -# this plugin, you have to import the GdImageFile module and -# use the GdImageFile.open function. - -class GdImageFile(ImageFile.ImageFile): - - format = "GD" - format_description = "GD uncompressed images" - - def _open(self): - - # Header - s = self.fp.read(775) - - self.mode = "L" # FIXME: "P" - self.size = i16(s[0:2]), i16(s[2:4]) - - # transparency index - tindex = i16(s[5:7]) - if tindex < 256: - self.info["transparent"] = tindex - - self.palette = ImagePalette.raw("RGB", s[7:]) - - self.tile = [("raw", (0,0)+self.size, 775, ("L", 0, -1))] - -## -# 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". -# @return An image instance. -# @exception IOError If the image could not be read. - -def open(fp, mode = "r"): - - if mode != "r": - raise ValueError("bad mode") - - if isPath(fp): - filename = fp - fp = builtins.open(fp, "rb") - else: - filename = "" - - try: - return GdImageFile(fp, filename) - except SyntaxError: - raise IOError("cannot identify this image file") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/GifImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/GifImagePlugin.py deleted file mode 100644 index ec83019..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/GifImagePlugin.py +++ /dev/null @@ -1,506 +0,0 @@ -# -# 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. -# - - -__version__ = "0.9" - - -from PIL import Image, ImageFile, ImagePalette, _binary - - -# -------------------------------------------------------------------- -# Helpers - -i8 = _binary.i8 -i16 = _binary.i16le -o8 = _binary.o8 -o16 = _binary.o16le - - -# -------------------------------------------------------------------- -# 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" - 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 s[:6] not in [b"GIF87a", b"GIF89a"]: - 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<= 3 and i8(block[0]) == 1: - self.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:]) - flags = i8(s[8]) - - interlace = (flags & 64) != 0 - - if flags & 128: - bits = (flags & 7) + 1 - self.palette =\ - ImagePalette.raw("RGB", self.fp.read(3< %s" % (file, filename) - quant_cmd = ["ppmquant", "256", file] - togif_cmd = ["ppmtogif"] - stderr = tempfile.TemporaryFile() - quant_proc = Popen(quant_cmd, stdout=PIPE, stderr=stderr) - stderr = tempfile.TemporaryFile() - togif_proc = Popen(togif_cmd, stdin=quant_proc.stdout, stdout=f, stderr=stderr) - - # Allow ppmquant to receive SIGPIPE if ppmtogif exits - quant_proc.stdout.close() - - retcode = quant_proc.wait() - if retcode: - raise CalledProcessError(retcode, quant_cmd) - - retcode = togif_proc.wait() - if retcode: - raise CalledProcessError(retcode, togif_cmd) - - try: - os.unlink(file) - except: - pass - - -# -------------------------------------------------------------------- -# GIF utilities - -def getheader(im, palette=None, info=None): - """Return a list of strings representing a GIF header""" - - optimize = info and info.get("optimize", 0) - - # Header Block - # http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp - header = [ - b"GIF87a" + # signature + version - o16(im.size[0]) + # canvas width - o16(im.size[1]) # canvas height - ] - - if im.mode == "P": - if palette and isinstance(palette, bytes): - sourcePalette = palette[:768] - else: - sourcePalette = im.im.getpalette("RGB")[:768] - else: # L-mode - if palette and isinstance(palette, bytes): - sourcePalette = palette[:768] - else: - sourcePalette = bytearray([i//3 for i in range(768)]) - - usedPaletteColors = paletteBytes = None - - if optimize: - usedPaletteColors = [] - - # check which colors are used - i = 0 - for count in im.histogram(): - if count: - usedPaletteColors.append(i) - i += 1 - - # create the new palette if not every color is used - if len(usedPaletteColors) < 256: - paletteBytes = b"" - newPositions = {} - - i = 0 - # pick only the used colors from the palette - for oldPosition in usedPaletteColors: - paletteBytes += sourcePalette[oldPosition*3:oldPosition*3+3] - newPositions[oldPosition] = i - i += 1 - - # replace the palette color id of all pixel with the new id - imageBytes = bytearray(im.tobytes()) - for i in range(len(imageBytes)): - imageBytes[i] = newPositions[imageBytes[i]] - im.frombytes(bytes(imageBytes)) - newPaletteBytes = paletteBytes + (768 - len(paletteBytes)) * b'\x00' - im.putpalette(newPaletteBytes) - im.palette = ImagePalette.ImagePalette("RGB", palette = paletteBytes, size = len(paletteBytes)) - - if not paletteBytes: - paletteBytes = sourcePalette - - # Logical Screen Descriptor - # calculate the palette size for the header - import math - colorTableSize = int(math.ceil(math.log(len(paletteBytes)//3, 2)))-1 - if colorTableSize < 0: colorTableSize = 0 - # size of global color table + global color table flag - header.append(o8(colorTableSize + 128)) - # background + reserved/aspect - header.append(o8(0) + o8(0)) - # end of Logical Screen Descriptor - - # add the missing amount of bytes - # the palette has to be 2< 0: - paletteBytes += o8(0) * 3 * actualTargetSizeDiff - - # Header + Logical Screen Descriptor + Global Color Table - header.append(paletteBytes) - return header, usedPaletteColors - - -def getdata(im, offset = (0, 0), **params): - """Return a list of strings representing this image. - The first string is a local image header, the rest contains - encoded image data.""" - - class collector: - data = [] - def write(self, data): - self.data.append(data) - - im.load() # make sure raster data is available - - fp = collector() - - try: - im.encoderinfo = params - - # local image header - fp.write(b"," + - o16(offset[0]) + # offset - o16(offset[1]) + - o16(im.size[0]) + # size - o16(im.size[1]) + - o8(0) + # flags - o8(8)) # bits - - ImageFile._save(im, fp, [("gif", (0,0)+im.size, 0, RAWMODE[im.mode])]) - - fp.write(b"\0") # end of image data - - finally: - del im.encoderinfo - - return fp.data - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(GifImageFile.format, GifImageFile, _accept) -Image.register_save(GifImageFile.format, _save) -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/Linux_x86_64/lib/python3.4/site-packages/PIL/GimpGradientFile.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/GimpGradientFile.py deleted file mode 100644 index 7c88add..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/GimpGradientFile.py +++ /dev/null @@ -1,124 +0,0 @@ -# -# 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. -# - -from math import pi, log, sin, sqrt -from PIL._binary import o8 - -# -------------------------------------------------------------------- -# 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.) -# - -EPSILON = 1e-10 - -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 ] - -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 / float(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" - -## -# File handler for GIMP's gradient format. - -class GimpGradientFile(GradientFile): - - def __init__(self, fp): - - if fp.readline()[:13] != b"GIMP Gradient": - raise SyntaxError("not a GIMP gradient file") - - count = int(fp.readline()) - - 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 IOError("cannot handle HSV colour space") - - gradient.append((x0, x1, xm, rgb0, rgb1, segment)) - - self.gradient = gradient diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/GimpPaletteFile.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/GimpPaletteFile.py deleted file mode 100644 index 6f71ec6..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/GimpPaletteFile.py +++ /dev/null @@ -1,62 +0,0 @@ -# -# 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 PIL._binary import o8 - -## -# File handler for GIMP's palette format. - -class GimpPaletteFile: - - 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") - - i = 0 - - while i <= 255: - - s = fp.readline() - - if not s: - break - # skip fields and comment lines - if re.match(b"\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") - - if 0 <= i <= 255: - self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) - - i += 1 - - self.palette = b"".join(self.palette) - - - def getpalette(self): - - return self.palette, self.rawmode diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/GribStubImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/GribStubImagePlugin.py deleted file mode 100644 index d76585c..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/GribStubImagePlugin.py +++ /dev/null @@ -1,68 +0,0 @@ -# -# 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 PIL import Image, ImageFile - -_handler = None - -## -# Install application-specific GRIB image handler. -# -# @param handler Handler object. - -def register_handler(handler): - global _handler - _handler = handler - -# -------------------------------------------------------------------- -# Image adapter - -def _accept(prefix): - return prefix[0:4] == b"GRIB" and prefix[7] == b'\x01' - -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 IOError("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/Linux_x86_64/lib/python3.4/site-packages/PIL/Hdf5StubImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/Hdf5StubImagePlugin.py deleted file mode 100644 index eb888d8..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/Hdf5StubImagePlugin.py +++ /dev/null @@ -1,70 +0,0 @@ -# -# 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 PIL import Image, ImageFile - -_handler = None - -## -# Install application-specific HDF5 image handler. -# -# @param handler Handler object. - -def register_handler(handler): - 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 IOError("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_extension(HDF5StubImageFile.format, ".h5") -Image.register_extension(HDF5StubImageFile.format, ".hdf") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/IcnsImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/IcnsImagePlugin.py deleted file mode 100644 index ca7a149..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/IcnsImagePlugin.py +++ /dev/null @@ -1,301 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Mac OS X 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. -# - -from PIL import Image, ImageFile, PngImagePlugin, _binary -import struct, io - -enable_jpeg2k = hasattr(Image.core, 'jp2klib_version') -if enable_jpeg2k: - from PIL import Jpeg2KImagePlugin - -i8 = _binary.i8 - -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, length) = start_length - 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, 1) - 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 read-only 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.best_size = self.icns.bestsize() - self.size = (self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2]) - self.info['sizes'] = self.icns.itersizes() - # Just use this to see if it's loaded or not yet. - self.tile = ('',) - - 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 not self.tile: - 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.fp = None - self.icns = None - self.tile = () - self.load_end() - -Image.register_open("ICNS", IcnsImageFile, lambda x: x[:4] == b'icns') -Image.register_extension("ICNS", '.icns') - -if __name__ == '__main__': - import os, sys - imf = IcnsImageFile(open(sys.argv[1], 'rb')) - for size in imf.info['sizes']: - imf.size = size - imf.load() - im = imf.im - im.save('out-%s-%s-%s.png' % size) - im = Image.open(open(sys.argv[1], "rb")) - im.save("out.png") - if sys.platform == 'windows': - os.startfile("out.png") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/IcoImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/IcoImagePlugin.py deleted file mode 100644 index 268e93d..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/IcoImagePlugin.py +++ /dev/null @@ -1,233 +0,0 @@ -# -# 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/p/casadebender/wiki/Win32IconImagePlugin -# -# Icon format references: -# * http://en.wikipedia.org/wiki/ICO_(file_format) -# * http://msdn.microsoft.com/en-us/library/ms997538.aspx - - -__version__ = "0.1" - -from PIL import Image, ImageFile, BmpImagePlugin, PngImagePlugin, _binary -from math import log, ceil - -# -# -------------------------------------------------------------------- - -i8 = _binary.i8 -i16 = _binary.i16le -i32 = _binary.i32le - -_MAGIC = b"\0\0\1\0" - -def _accept(prefix): - return prefix[:4] == _MAGIC - - -class IcoFile: - def __init__(self, buf): - """ - Parse image from file-like object containing ico file data - """ - - # check magic - s = buf.read(6) - if not _accept(s): - raise SyntaxError("not an ICO file") - - self.buf = buf - self.entry = [] - - # Number of items in file - self.nb_items = i16(s[4:]) - - # Get headers for each item - for i in range(self.nb_items): - s = buf.read(16) - - icon_header = { - 'width': i8(s[0]), - 'height': i8(s[1]), - 'nb_color': i8(s[2]), # Number of colors in image (0 if >=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 set((h['width'], h['height']) for h in self.entry) - - def getimage(self, size, bpp=False): - """ - Get an image from the icon - """ - for (i, h) in enumerate(self.entry): - if size == h['dim'] and (bpp == False or bpp == h['color_depth']): - return self.frame(i) - return self.frame(0) - - 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) - - # 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 in BmpImagePlugin.BIT2MODE.keys(): - if mode == BmpImagePlugin.BIT2MODE[k][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) - maskData = self.buf.read(total_bytes) - - # convert raw data to image - mask = Image.frombuffer( - '1', # 1 bpp - im.size, # (w, h) - maskData, # 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. - - This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis . - https://code.google.com/p/casadebender/wiki/Win32IconImagePlugin - """ - 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() - - def load(self): - 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 - self.size = im.size - - - def load_seek(self): - # Flage the ImageFile.Parser so that it just does all the decode at the end. - pass -# -# -------------------------------------------------------------------- - -Image.register_open("ICO", IcoImageFile, _accept) -Image.register_extension("ICO", ".ico") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImImagePlugin.py deleted file mode 100644 index a5eeef7..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImImagePlugin.py +++ /dev/null @@ -1,342 +0,0 @@ -# -# 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. -# - - -__version__ = "0.7" - -import re -from PIL import Image, ImageFile, ImagePalette -from PIL._binary import i8, o8 - - -# -------------------------------------------------------------------- -# 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"), - "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" - - def _open(self): - - # Quick rejection: if there's not an LF among the first - # 100 bytes, this is (probably) not a text header. - - if not b"\n" 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 v: - raise SyntaxError("not an IM file") - - 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 == "L" or self.mode == "LA": - if greyscale: - if not linear: - self.lut = [i8(c) for c in palette[:256]] - else: - if self.mode == "L": - self.mode = self.rawmode = "P" - elif self.mode == "LA": - self.mode = self.rawmode = "PA" - 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))] - - def seek(self, frame): - - if frame < 0 or frame >= self.info[FRAMES]: - raise EOFError("seek outside sequence") - - if self.frame == 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 - -# -# -------------------------------------------------------------------- -# 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, check=0): - - try: - type, rawmode = SAVE[im.mode] - except KeyError: - raise ValueError("Cannot save %s images as IM" % im.mode) - - try: - frames = im.encoderinfo["frames"] - except KeyError: - frames = 1 - - if check: - return check - - fp.write(("Image type: %s image\r\n" % type).encode('ascii')) - if filename: - fp.write(("Name: %s\r\n" % filename).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 == "P": - fp.write(b"Lut: 1\r\n") - fp.write(b"\000" * (511-fp.tell()) + b"\032") - if im.mode == "P": - 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("IM", ImImageFile) -Image.register_save("IM", _save) - -Image.register_extension("IM", ".im") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/Image.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/Image.py deleted file mode 100644 index 787e602..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/Image.py +++ /dev/null @@ -1,2419 +0,0 @@ -# -# 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. -# - -from __future__ import print_function - -from PIL import VERSION, PILLOW_VERSION, _plugins - -import warnings - - -class DecompressionBombWarning(RuntimeWarning): - pass - -class _imaging_not_installed: - # module placeholder - def __getattr__(self, id): - raise ImportError("The _imaging C module is not installed") - - -# Limit to around a quarter gigabyte for a 24 bit (3 bpp) image -MAX_IMAGE_PIXELS = int(1024 * 1024 * 1024 / 4 / 3) - -try: - # give Tk a chance to set up the environment, in case we're - # using an _imaging module linked against libtcl/libtk (use - # __import__ to hide this from naive packagers; we don't really - # depend on Tk unless ImageTk is used, and that module already - # imports Tkinter) - __import__("FixTk") -except ImportError: - pass - -try: - # If the _imaging C module is not present, you can still use - # the "open" function to identify files, but you cannot load - # them. Note that other modules should not refer to _imaging - # directly; import Image and use the Image.core variable instead. - from PIL import _imaging as core - if PILLOW_VERSION != getattr(core, 'PILLOW_VERSION', None): - raise ImportError("The _imaging extension was built for another " - " version of Pillow or PIL") - -except ImportError as v: - core = _imaging_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) - elif "Symbol not found: _PyUnicodeUCS2_FromString" in str(v): - warnings.warn( - "The _imaging extension was built for Python with UCS2 support; " - "recompile PIL or build Python --without-wide-unicode. ", - RuntimeWarning - ) - elif "Symbol not found: _PyUnicodeUCS4_FromString" in str(v): - warnings.warn( - "The _imaging extension was built for Python with UCS4 support; " - "recompile PIL or build Python --with-wide-unicode. ", - RuntimeWarning - ) - # Fail here anyway. Don't let people run with a mostly broken Pillow. - raise - -try: - import builtins -except ImportError: - import __builtin__ - builtins = __builtin__ - -from PIL import ImageMode -from PIL._binary import i8 -from PIL._util import isPath -from PIL._util import isStringType -from PIL._util import deferred_error - -import os -import sys - -# type stuff -import collections -import numbers - -# works everywhere, win for pypy, not cpython -USE_CFFI_ACCESS = hasattr(sys, 'pypy_version_info') -try: - import cffi - HAS_CFFI = True -except: - HAS_CFFI = False - - -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") - -# -# Debug level - -DEBUG = 0 - -# -# Constants (also defined in _imagingmodule.c!) - -NONE = 0 - -# transpose -FLIP_LEFT_RIGHT = 0 -FLIP_TOP_BOTTOM = 1 -ROTATE_90 = 2 -ROTATE_180 = 3 -ROTATE_270 = 4 - -# transforms -AFFINE = 0 -EXTENT = 1 -PERSPECTIVE = 2 -QUAD = 3 -MESH = 4 - -# resampling filters -NONE = 0 -NEAREST = 0 -ANTIALIAS = 1 # 3-lobed lanczos -LINEAR = BILINEAR = 2 -CUBIC = BICUBIC = 3 - -# dithers -NONE = 0 -NEAREST = 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 - -# 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 = {} -EXTENSION = {} - -# -------------------------------------------------------------------- -# 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": ("RGB", "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")), - - # 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), # broken - "L": ('|u1', None), - "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 - # 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 PIL import BmpImagePlugin - except ImportError: - pass - try: - from PIL import GifImagePlugin - except ImportError: - pass - try: - from PIL import JpegImagePlugin - except ImportError: - pass - try: - from PIL import PpmImagePlugin - except ImportError: - pass - try: - from PIL import PngImagePlugin - except ImportError: - pass -# try: -# import 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: - if DEBUG: - print ("Importing %s" % plugin) - __import__("PIL.%s" % plugin, globals(), locals(), []) - except ImportError: - if DEBUG: - print("Image: failed to import", end=' ') - print(plugin, ":", sys.exc_info()[1]) - - 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: - # get decoder - decoder = getattr(core, decoder_name + "_decoder") - # print(decoder, mode, args + extra) - return decoder(mode, *args + extra) - except AttributeError: - raise IOError("decoder %s not available" % decoder_name) - - -def _getencoder(mode, encoder_name, args, extra=()): - - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - # get encoder - encoder = getattr(core, encoder_name + "_encoder") - # print(encoder, mode, args + extra) - return encoder(mode, *args + extra) - except AttributeError: - raise IOError("encoder %s not available" % encoder_name) - - -# -------------------------------------------------------------------- -# 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 - - 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 - - def _new(self, im): - new = Image() - new.im = im - new.mode = im.mode - new.size = im.size - new.palette = self.palette - if im.mode == "P" and not new.palette: - from PIL import ImagePalette - new.palette = ImagePalette.ImagePalette() - try: - new.info = self.info.copy() - except AttributeError: - # fallback (pre-1.5.2) - new.info = {} - for k, v in self.info: - new.info[k] = v - return new - - _makeself = _new # compatibility - - # Context Manager Support - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def close(self): - """ - Closes the file pointer, if possible. - - This operation will destroy the image core and release it's 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. - """ - try: - self.fp.close() - except Exception as msg: - if DEBUG: - print ("Error closing: %s" % msg) - - # 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 _dump(self, file=None, format=None): - import os - import tempfile - suffix = '' - if format: - suffix = '.'+format - if not file: - f, file = tempfile.mkstemp(suffix) - os.close(f) - - self.load() - if not format or format == "PPM": - self.im.save_ppm(file) - else: - if not file.endswith(format): - file = file + "." + format - self.save(file, format) - return file - - def __eq__(self, other): - a = (self.mode == other.mode) - b = (self.size == other.size) - c = (self.getpalette() == other.getpalette()) - d = (self.info == other.info) - e = (self.category == other.category) - f = (self.readonly == other.readonly) - g = (self.tobytes() == other.tobytes()) - return a and b and c and d and e and f and g - - def __ne__(self, other): - eq = (self == other) - return not eq - - 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 __getattr__(self, name): - if name == "__array_interface__": - # numpy array interface support - new = {} - shape, typestr = _conv_type_shape(self) - new['shape'] = shape - new['typestr'] = typestr - new['data'] = self.tobytes() - return new - raise AttributeError(name) - - 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", "P"): - self.putpalette(palette) - self.frombytes(data) - - def tobytes(self, encoder_name="raw", *args): - """ - Return image as a bytes object - - :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) - - # Declare tostring as alias to tobytes - def tostring(self, *args, **kw): - warnings.warn( - 'tostring() is deprecated. Please call tobytes() instead.', - DeprecationWarning, - stacklevel=2, - ) - return self.tobytes(*args, **kw) - - 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): - """Deprecated alias to frombytes. - - .. deprecated:: 2.0 - """ - warnings.warn( - 'fromstring() is deprecated. Please call frombytes() instead.', - DeprecationWarning) - return self.frombytes(*args, **kw) - - 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. This method will close the file - associated with the image. - - :returns: An image access object. - """ - 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 HAS_CFFI and USE_CFFI_ACCESS: - if self.pyaccess: - return self.pyaccess - from PIL 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 black and white (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 NONE, all non-zero values are set to 255 (white). To - use other thresholds, use the :py:meth:`~PIL.Image.Image.point` - method. - - :param mode: The requested mode. - :param matrix: An optional conversion matrix. If given, this - should be 4- or 16-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 NONE or FLOYDSTEINBERG (default). - :param palette: Palette to use when converting from mode "RGB" - to "P". Available palettes are WEB or ADAPTIVE. - :param colors: Number of colors to use for the ADAPTIVE palette. - Defaults to 256. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if not mode: - # determine default mode - if self.mode == "P": - self.load() - if self.palette: - mode = self.palette.mode - else: - mode = "RGB" - else: - return self.copy() - - self.load() - - if matrix: - # matrix conversion - if mode not in ("L", "RGB"): - raise ValueError("illegal conversion") - im = self.im.convert_matrix(mode, matrix) - return self._new(im) - - if mode == "P" and self.mode == "RGBA": - return self.quantize(colors) - - trns = None - delete_trns = False - # transparency handling - if "transparency" in self.info and \ - self.info['transparency'] is not None: - if self.mode in ('L', 'RGB') and mode == 'RGBA': - # Use transparent conversion to promote from transparent - # color to an alpha channel. - return self._new(self.im.convert_transparent( - mode, self.info['transparency'])) - 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) - 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': - delete_trns = True - - if mode == "P" and palette == ADAPTIVE: - im = self.im.quantize(colors) - new = self._new(im) - from PIL 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: - # 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: - raise ValueError("illegal conversion") - - 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: - 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): - - # methods: - # 0 = median cut - # 1 = maximum coverage - # 2 = fast octree - - # NOTE: this functionality will be moved to the extended - # quantizer interface in a later version of PIL. - - self.load() - - if method is None: - # defaults: - method = 0 - if self.mode == 'RGBA': - method = 2 - - if self.mode == 'RGBA' and method != 2: - # Caller specified an invalid mode. - raise ValueError('Fast Octree (method == 2) is the ' + - ' only valid method 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", 1, palette.im) - return self._makeself(im) - - im = self.im.quantize(colors, method, kmeans) - return self._new(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() - im = self.im.copy() - return self._new(im) - - 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. - - This is a lazy operation. Changes to the source image may or - may not be reflected in the cropped image. To break the - connection, call the :py:meth:`~PIL.Image.Image.load` method on - the cropped copy. - - :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. - """ - - self.load() - if box is None: - return self.copy() - - # lazy operation - return _ImageCrop(self, box) - - def draft(self, mode, size): - """ - NYI - - 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, or to extract a 128x192 - version from a PCD file. - - 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. - - :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. """ - - self.load() - - if isinstance(filter, collections.Callable): - filter = filter() - if not hasattr(filter, "filter"): - raise TypeError("filter argument should be ImageFilter.Filter " + - "instance or class") - - if self.im.bands == 1: - return self._new(filter.filter(self.im)) - # fix to handle multiband images since _imaging doesn't - 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. 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 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: - if bytes is str: - return [i8(c) for c in self.im.getpalette()] - else: - 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). - :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. - :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 offset(self, xoffset, yoffset=None): - """ - .. deprecated:: 2.0 - - .. note:: New code should use :py:func:`PIL.ImageChops.offset`. - - Returns a copy of the image where the 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. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - if warnings: - warnings.warn( - "'offset' is deprecated; use 'ImageChops.offset' instead", - DeprecationWarning, stacklevel=2 - ) - from PIL import ImageChops - return ImageChops.offset(self, xoffset, yoffset) - - 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)). 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 can be used for transparency effects. - - Note that if you paste an "RGBA" image, the alpha band is - ignored. You can work around this by using the same image as - both source image and mask. - - :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: - # cover all of self - box = (0, 0) + self.size - - if len(box) == 2: - # lower 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 + (box[0]+size[0], box[1]+size[1]) - - if isStringType(im): - from PIL 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.load() - if self.readonly: - self._copy() - - if mask: - mask.load() - self.im.paste(im, box, mask.im) - else: - self.im.paste(im, box) - - def point(self, lut, mode=None): - """ - Maps this image through a lookup table or function. - - :param lut: A lookup table, containing 256 (or 65336 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.load() - if self.readonly: - self._copy() - - if self.mode not in ("LA", "RGBA"): - # attempt to promote self to a matching alpha mode - try: - mode = getmodebase(self.mode) + "A" - try: - self.im.setmode(mode) - self.pyaccess = None - except (AttributeError, ValueError): - # do things the hard way - im = self.im.convert(mode) - if im.mode not in ("LA", "RGBA"): - raise ValueError # sanity check - self.im = im - self.pyaccess = None - self.mode = self.im.mode - except (KeyError, ValueError): - raise ValueError("illegal image mode") - - if self.mode == "LA": - 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.load() - if self.readonly: - self._copy() - - self.im.putdata(data, scale, offset) - - def putpalette(self, data, rawmode="RGB"): - """ - Attaches a palette to this image. The image must be a "P" or - "L" 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). - """ - from PIL import ImagePalette - - if self.mode not in ("L", "P"): - 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): - if bytes is str: - data = "".join(chr(x) for x in data) - else: - data = bytes(data) - palette = ImagePalette.raw(rawmode, data) - self.mode = "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. - - 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). - :param value: The pixel value. - """ - - self.load() - if self.readonly: - self._copy() - self.pyaccess = None - self.load() - - if self.pyaccess: - return self.pyaccess.putpixel(xy, value) - return self.im.putpixel(xy, value) - - def resize(self, size, resample=NEAREST): - """ - 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:attr:`PIL.Image.NEAREST` (use nearest neighbour), - :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 - environment), :py:attr:`PIL.Image.BICUBIC` (cubic spline - interpolation in a 4x4 environment), or - :py:attr:`PIL.Image.ANTIALIAS` (a high-quality downsampling filter). - If omitted, or if the image has mode "1" or "P", it is - set :py:attr:`PIL.Image.NEAREST`. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if resample not in (NEAREST, BILINEAR, BICUBIC, ANTIALIAS): - raise ValueError("unknown resampling filter") - - self.load() - - if self.mode in ("1", "P"): - resample = NEAREST - - if self.mode == 'RGBA': - return self.convert('RGBa').resize(size, resample).convert('RGBA') - - if resample == ANTIALIAS: - # requires stretch support (imToolkit & PIL 1.1.3) - try: - im = self.im.stretch(size, resample) - except AttributeError: - raise ValueError("unsupported resampling filter") - else: - im = self.im.resize(size, resample) - - return self._new(im) - - def rotate(self, angle, resample=NEAREST, expand=0): - """ - 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:attr:`PIL.Image.NEAREST` (use nearest neighbour), - :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:attr:`PIL.Image.BICUBIC` - (cubic spline interpolation in a 4x4 environment). - If omitted, or if the image has mode "1" or "P", it is - set :py:attr:`PIL.Image.NEAREST`. - :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. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if expand: - import math - angle = -angle * math.pi / 180 - matrix = [ - math.cos(angle), math.sin(angle), 0.0, - -math.sin(angle), math.cos(angle), 0.0 - ] - - def transform(x, y, matrix=matrix): - (a, b, c, d, e, f) = matrix - return a*x + b*y + c, d*x + e*y + f - - # calculate output size - w, h = self.size - xx = [] - yy = [] - for x, y in ((0, 0), (w, 0), (w, h), (0, h)): - x, y = transform(x, y) - xx.append(x) - yy.append(y) - w = int(math.ceil(max(xx)) - math.floor(min(xx))) - h = int(math.ceil(max(yy)) - math.floor(min(yy))) - - # adjust center - x, y = transform(w / 2.0, h / 2.0) - matrix[2] = self.size[0] / 2.0 - x - matrix[5] = self.size[1] / 2.0 - y - - return self.transform((w, h), AFFINE, matrix, resample) - - if resample not in (NEAREST, BILINEAR, BICUBIC): - raise ValueError("unknown resampling filter") - - self.load() - - if self.mode in ("1", "P"): - resample = NEAREST - - return self._new(self.im.rotate(angle, resample)) - - 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 later in - this handbook. - - 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 file: File name 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 options: Extra parameters to the image writer. - :returns: None - :exception KeyError: If the output format could not be determined - from the file name. Use the format option to solve this. - :exception IOError: If the file could not be written. The file - may have been created, and may contain partial data. - """ - - if isPath(fp): - filename = fp - else: - if hasattr(fp, "name") and isPath(fp.name): - filename = fp.name - else: - filename = "" - - # may mutate self! - self.load() - - self.encoderinfo = params - self.encoderconfig = () - - preinit() - - ext = os.path.splitext(filename)[1].lower() - - if not format: - try: - format = EXTENSION[ext] - except KeyError: - init() - try: - format = EXTENSION[ext] - except KeyError: - raise KeyError(ext) # unknown extension - - try: - save_handler = SAVE[format.upper()] - except KeyError: - init() - save_handler = SAVE[format.upper()] # unknown format - - if isPath(fp): - fp = builtins.open(fp, "wb") - close = 1 - else: - close = 0 - - try: - save_handler(self, fp, filename) - finally: - # do what we can to clean up - if close: - 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. - - Note that in the current version of the library, most sequence - formats only allows you to seek to the next frame. - - 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. - - On Unix platforms, this method saves the image to a temporary - PPM file, and calls the **xv** utility. - - On Windows, it saves the image to a temporary BMP file, and uses - the standard BMP display utility to show it (usually Paint). - - :param title: Optional title to use for the image window, - where possible. - :param command: command used to show the image - """ - - _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). - - :returns: A tuple containing bands. - """ - - self.load() - if self.im.bands == 1: - ims = [self.copy()] - else: - ims = [] - for i in range(self.im.bands): - ims.append(self._new(self.im.getband(i))) - return tuple(ims) - - 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=ANTIALIAS): - """ - 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 the bilinear and bicubic filters in the current - version of PIL are not well-suited for thumbnail generation. - You should use :py:attr:`PIL.Image.ANTIALIAS` unless speed is much more - important than quality. - - Also 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:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`, - :py:attr:`PIL.Image.BICUBIC`, or :py:attr:`PIL.Image.ANTIALIAS` - (best quality). If omitted, it defaults to - :py:attr:`PIL.Image.ANTIALIAS`. (was :py:attr:`PIL.Image.NEAREST` - prior to version 2.5.0) - :returns: None - """ - - # preserve aspect ratio - x, y = self.size - if x > size[0]: - y = int(max(y * size[0] / x, 1)) - x = int(size[0]) - if y > size[1]: - x = int(max(x * size[1] / y, 1)) - y = int(size[1]) - size = x, y - - if size == self.size: - return - - self.draft(None, size) - - self.load() - - try: - im = self.resize(size, resample) - except ValueError: - if resample != ANTIALIAS: - raise - im = self.resize(size, NEAREST) # fallback - - self.im = im.im - self.mode = im.mode - self.size = size - - self.readonly = 0 - self.pyaccess = None - - # FIXME: the different tranform 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): - """ - 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:attr:`PIL.Image.EXTENT` (cut out a rectangular subregion), - :py:attr:`PIL.Image.AFFINE` (affine transform), - :py:attr:`PIL.Image.PERSPECTIVE` (perspective transform), - :py:attr:`PIL.Image.QUAD` (map a quadrilateral to a rectangle), or - :py:attr:`PIL.Image.MESH` (map a number of source quadrilaterals - in one operation). - :param data: Extra data to the transformation method. - :param resample: Optional resampling filter. It can be one of - :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), - :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:attr:`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:attr:`PIL.Image.NEAREST`. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if self.mode == 'RGBA': - return self.convert('RGBa').transform( - size, method, data, resample, fill).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, None) - if method == MESH: - # list of quads - for box, quad in data: - im.__transformer(box, self, QUAD, quad, resample, fill) - else: - im.__transformer((0, 0)+size, self, method, data, resample, fill) - - return im - - def __transformer(self, box, image, method, data, - resample=NEAREST, fill=1): - - # FIXME: this should be turned into a lazy operation (?) - - w = box[2]-box[0] - h = box[3]-box[1] - - if method == AFFINE: - # change argument order to match implementation - data = (data[2], data[0], data[1], - data[5], data[3], data[4]) - elif method == EXTENT: - # convert extent to an affine transform - x0, y0, x1, y1 = data - xs = float(x1 - x0) / w - ys = float(y1 - y0) / h - method = AFFINE - data = (x0 + xs/2, xs, 0, y0 + ys/2, 0, ys) - elif method == PERSPECTIVE: - # change argument order to match implementation - data = (data[2], data[0], data[1], - data[5], data[3], data[4], - data[6], data[7]) - 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): - raise ValueError("unknown resampling filter") - - 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:attr:`PIL.Image.FLIP_LEFT_RIGHT`, - :py:attr:`PIL.Image.FLIP_TOP_BOTTOM`, :py:attr:`PIL.Image.ROTATE_90`, - :py:attr:`PIL.Image.ROTATE_180`, or :py:attr:`PIL.Image.ROTATE_270`. - :returns: Returns a flipped or rotated copy of this image. - """ - - self.load() - im = self.im.transpose(method) - return self._new(im) - - -# -------------------------------------------------------------------- -# Lazy operations - -class _ImageCrop(Image): - - def __init__(self, im, box): - - Image.__init__(self) - - x0, y0, x1, y1 = box - if x1 < x0: - x1 = x0 - if y1 < y0: - y1 = y0 - - self.mode = im.mode - self.size = x1-x0, y1-y0 - - self.__crop = x0, y0, x1, y1 - - self.im = im.im - - def load(self): - - # lazy evaluation! - if self.__crop: - self.im = self.im.crop(self.__crop) - self.__crop = None - - if self.im: - return self.im.pixel_access(self.readonly) - - # FIXME: future versions should optimize crop/paste - # sequences! - - -# -------------------------------------------------------------------- -# 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 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. - :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. - """ - - if color is None: - # don't initialize - return Image()._new(core.new(mode, size)) - - if isStringType(color): - # css3-style specifier - - from PIL import ImageColor - color = ImageColor.getcolor(color, mode) - - return Image()._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 - **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. - :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. - """ - - # 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): - """Deprecated alias to frombytes. - - .. deprecated:: 2.0 - """ - warnings.warn( - 'fromstring() is deprecated. Please call frombytes() instead.', - DeprecationWarning, - stacklevel=2 - ) - return frombytes(*args, **kw) - - -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.fromstring`. 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. - :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 - """ - - # 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 == (): - if warnings: - warnings.warn( - "the frombuffer defaults may change in a future release; " - "for portability, change the call to read:\n" - " frombuffer(mode, size, data, 'raw', mode, 0, 1)", - RuntimeWarning, stacklevel=2 - ) - args = mode, 0, -1 # may change to (mode, 0, 1) post-1.1.6 - if args[0] in _MAPMODES: - im = new(mode, (1, 1)) - im = im._new( - core.map_buffer(data, size, decoder_name, None, 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. - - :param obj: Object with array interface - :param mode: Mode to use (will be determined from type if None) - :returns: An image memory. - - .. versionadded:: 1.1.6 - """ - arr = obj.__array_interface__ - shape = arr['shape'] - ndim = len(shape) - try: - strides = arr['strides'] - except KeyError: - strides = None - if mode is None: - try: - typekey = (1, 1) + shape[2:], arr['typestr'] - mode, rawmode = _fromarray_typemap[typekey] - except KeyError: - # print typekey - raise TypeError("Cannot handle this data type") - 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 = 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) - -_fromarray_typemap = { - # (shape, typestr) => mode, rawmode - # first two members of shape are set to one - # ((1, 1), "|b1"): ("1", "1"), # broken - ((1, 1), "|u1"): ("L", "L"), - ((1, 1), "|i1"): ("I", "I;8"), - ((1, 1), "i2"): ("I", "I;16B"), - ((1, 1), "i4"): ("I", "I;32B"), - ((1, 1), "f4"): ("F", "F;32BF"), - ((1, 1), "f8"): ("F", "F;64BF"), - ((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 > 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`. - - :param file: A filename (string) 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 IOError: If the file cannot be found, or the image cannot be - opened and identified. - """ - - if mode != "r": - raise ValueError("bad mode %r" % mode) - - if isPath(fp): - filename = fp - fp = builtins.open(fp, "rb") - else: - filename = "" - - prefix = fp.read(16) - - preinit() - - for i in ID: - try: - factory, accept = OPEN[i] - if not accept or accept(prefix): - fp.seek(0) - im = factory(fp, filename) - _decompression_bomb_check(im.size) - return im - except (SyntaxError, IndexError, TypeError): - # import traceback - # traceback.print_exc() - pass - - if init(): - - for i in ID: - try: - factory, accept = OPEN[i] - if not accept or accept(prefix): - fp.seek(0) - im = factory(fp, filename) - _decompression_bomb_check(im.size) - return im - except (SyntaxError, IndexError, TypeError): - # import traceback - # traceback.print_exc() - pass - - raise IOError("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. - :param im2: The second image. Must have the same mode and 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 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. - :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 im in bands[1:]: - if im.mode != getmodetype(mode): - raise ValueError("mode mismatch") - if im.size != bands[0].size: - raise ValueError("size mismatch") - im = core.new(mode, bands[0].size) - for i in range(getmodebands(mode)): - bands[i].load() - im.putband(bands[i].im, i) - return bands[0]._new(im) - - -# -------------------------------------------------------------------- -# 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_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() - - -# -------------------------------------------------------------------- -# Simple display support. User code may override this. - -def _show(image, **options): - # override me, as necessary - _showxv(image, **options) - - -def _showxv(image, title=None, **options): - from PIL import ImageShow - ImageShow.show(image, title, **options) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageChops.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageChops.py deleted file mode 100644 index ba5350e..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageChops.py +++ /dev/null @@ -1,283 +0,0 @@ -# -# 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 PIL 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 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. - - .. 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. - - .. 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. - - .. 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/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageCms.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageCms.py deleted file mode 100644 index fc17695..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageCms.py +++ /dev/null @@ -1,952 +0,0 @@ -""" -The Python Imaging Library. -$Id$ - -Optional color managment 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 - -See the README file for information on usage and redistribution. See -below for the original description. -""" - -from __future__ import print_function - -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 arount 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" - -# --------------------------------------------------------------------. - -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 import_err - _imagingcms = import_err(ex) -from PIL._util import isStringType - -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 accurancy - "LOWRESPRECALC": 2048, # Use less memory to minimize resouces - "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): - # accepts a string (filename), a file-like object, or a low-level - # profile object - if isStringType(profile): - self._set(core.profile_open(profile), profile) - elif hasattr(profile, "read"): - self._set(core.profile_frombytes(profile.read())) - else: - self._set(profile) # assume it's already a 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 - - -class ImageCmsTransform(Image.ImagePointHandler): - - """Transform. This can be used with the procedural API, or with the - standard Image.point() method. - """ - - 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 - - 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) - 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) - 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. - """ - - import sys - if sys.platform == "win32": - 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) - else: - try: - get = _imagingcms.get_display_profile - except AttributeError: - return None - else: - profile = get() - 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=0, 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 - PyCMSError will be raised. If inPlace == TRUE and outputMode != im.mode, - a PyCMSError will be raised. If an error occurs during application of - the profiles, a PyCMSError will be raised. If outputMode is not a mode - supported by the outputProfile (or by pyCMS), a 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 PIL 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 - - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - - 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 (1 = True, None or 0 = False). If True, the - original image is modified in-place, and None is returned. If False - (default), a new Image object is returned with the transform applied. - :param flags: Integer (0-...) specifying additional flags - :returns: Either None or a new PIL image object, depending on 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 (IOError, TypeError, ValueError) as v: - raise PyCMSError(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 vaild filename for an ICC profile, a 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 (IOError, TypeError, ValueError) as v: - raise PyCMSError(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 - PyCMSError will be raised. If an error occurs during creation of the - transform, a PyCMSError will be raised. - - If inMode or outMode are not a mode supported by the outputProfile (or - by pyCMS), a 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 - - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - - 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 (IOError, TypeError, ValueError) as v: - raise PyCMSError(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 PyCMSError will be raised. - - If an error occurs during creation of the transform, a PyCMSError will - be raised. - - If inMode or outMode are not a mode supported by the outputProfile - (or by pyCMS), a 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 - - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - - 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 - - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - - 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 (IOError, TypeError, ValueError) as v: - raise PyCMSError(v) - -buildTransformFromOpenProfiles = buildTransform -buildProofTransformFromOpenProfiles = buildProofTransform - - -def applyTransform(im, transform, inPlace=0): - """ - (pyCMS) Applies a transform to a given image. - - If im.mode != transform.inMode, a PyCMSError is raised. - - If inPlace == TRUE and transform.inMode != transform.outMode, a - PyCMSError is raised. - - If im.mode, transfer.inMode, or transfer.outMode is not supported by - pyCMSdll or the profiles you used for the transform, a PyCMSError is - raised. - - If an error occurs while the transform is being applied, a 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 calcuation 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 Image object of - the same dimensions in mode transform.outMode. - - :param im: A PIL 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 (1 == True, 0 or None == False). If True, im is - modified in place and None is returned, if False, a new Image object - with the transform applied is returned (and im is not changed). The - default is False. - :returns: Either None, or a new PIL Image object, depending on the value of - inPlace - :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) - - return imOut - - -def createProfile(colorSpace, colorTemp=-1): - """ - (pyCMS) Creates a profile. - - If colorSpace not in ["LAB", "XYZ", "sRGB"], a PyCMSError is raised - - If using LAB and colorTemp != a positive integer, a PyCMSError is raised. - - If an error occurs while creating the profile, a 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: - raise PyCMSError( - "Color temperature must be numeric, \"%s\" not valid" - % colorTemp) - - try: - return core.createProfile(colorSpace, colorTemp) - except (TypeError, ValueError) as v: - raise PyCMSError(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 PyCMSError is raised If an error occurs while trying to obtain the - name tag, a 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.product_model - manufacturer = profile.profile.product_manufacturer - - if not (model or manufacturer): - return profile.profile.product_description + "\n" - if not manufacturer or len(model) > 30: - return model + "\n" - return "%s - %s\n" % (model, manufacturer) - - except (AttributeError, IOError, TypeError, ValueError) as v: - raise PyCMSError(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 PyCMSError is raised. - - If an error occurs while trying to obtain the info tag, a 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.product_description - cpright = profile.profile.product_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, IOError, TypeError, ValueError) as v: - raise PyCMSError(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 PyCMSError is raised. - - If an error occurs while trying to obtain the copyright tag, a 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.product_copyright + "\n" - except (AttributeError, IOError, TypeError, ValueError) as v: - raise PyCMSError(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 PyCMSError is raised. - - If an error occurs while trying to obtain the manufacturer tag, a - 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.product_manufacturer + "\n" - except (AttributeError, IOError, TypeError, ValueError) as v: - raise PyCMSError(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 PyCMSError is raised. - - If an error occurs while trying to obtain the model tag, a 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.product_model + "\n" - except (AttributeError, IOError, TypeError, ValueError) as v: - raise PyCMSError(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 PyCMSError is raised. - - If an error occurs while trying to obtain the description tag, a 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.product_description + "\n" - except (AttributeError, IOError, TypeError, ValueError) as v: - raise PyCMSError(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 PyCMSError is raised. - - If an error occurs while trying to obtain the default intent, a - PyCMSError is raised. - - Use this function to determine the default (and usually best optomized) - 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. - - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - - 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, IOError, TypeError, ValueError) as v: - raise PyCMSError(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 - renderingIntent 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 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 - - INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) - INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) - INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) - INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) - - see the pyCMS documentation for details on rendering intents and what - they do. - :param direction: Integer specifing 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, IOError, TypeError, ValueError) as v: - raise PyCMSError(v) - - -def versions(): - """ - (pyCMS) Fetches versions. - """ - - import sys - return ( - VERSION, core.littlecms_version, - sys.version.split()[0], Image.VERSION - ) - -# -------------------------------------------------------------------- - -if __name__ == "__main__": - # create a cheap manual from the __doc__ strings for the functions above - - from PIL import ImageCms - print(__doc__) - - for f in dir(ImageCms): - doc = None - try: - exec("doc = %s.__doc__" % (f)) - if "pyCMS" in doc: - # so we don't get the __doc__ string for imported modules - print("=" * 80) - print("%s" % f) - print(doc) - except (AttributeError, TypeError): - pass - -# End of file diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageColor.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageColor.py deleted file mode 100644 index 98a241b..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageColor.py +++ /dev/null @@ -1,276 +0,0 @@ -# -# 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. -# - -from PIL import Image -import re - -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])`` - """ - try: - rgb = colormap[color] - except KeyError: - try: - # fall back on case-insensitive lookup - rgb = colormap[color.lower()] - except KeyError: - rgb = None - # found color in cache - if rgb: - if isinstance(rgb, tuple): - return rgb - colormap[color] = rgb = getrgb(rgb) - return rgb - # check for known string formats - m = re.match("#\w\w\w$", color) - if m: - return ( - int(color[1]*2, 16), - int(color[2]*2, 16), - int(color[3]*2, 16) - ) - m = re.match("#\w\w\w\w\w\w$", color) - if m: - return ( - int(color[1:3], 16), - int(color[3:5], 16), - int(color[5:7], 16) - ) - m = re.match("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("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("hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\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("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 - color = (r*299 + g*587 + b*114)//1000 - if mode[-1] == 'A': - return (color, alpha) - else: - if mode[-1] == 'A': - return color + (alpha,) - return color - -colormap = { - # X11 colour table (from "CSS3 module: Color working draft"), 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", - "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/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageDraw.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageDraw.py deleted file mode 100644 index a03d260..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageDraw.py +++ /dev/null @@ -1,379 +0,0 @@ -# -# 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 numbers - -from PIL import Image, ImageColor -from PIL._util import isStringType - -try: - import warnings -except ImportError: - warnings = None - -## -# A simple 2D drawing interface for PIL images. -#

-# Application code should use the Draw factory, instead of -# directly. - -class ImageDraw: - - ## - # 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. - - def __init__(self, im, mode=None): - im.load() - if im.readonly: - im._copy() # make it writable - 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, mode) - else: - self.ink = self.draw.draw_ink(-1, mode) - 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 - - ## - # Set the default pen color. - - def setink(self, ink): - # compatibility - if warnings: - warnings.warn( - "'setink' is deprecated; use keyword arguments instead", - DeprecationWarning, stacklevel=2 - ) - if isStringType(ink): - ink = ImageColor.getcolor(ink, self.mode) - if self.palette and not isinstance(ink, numbers.Number): - ink = self.palette.getcolor(ink) - self.ink = self.draw.draw_ink(ink, self.mode) - - ## - # Set the default background color. - - def setfill(self, onoff): - # compatibility - if warnings: - warnings.warn( - "'setfill' is deprecated; use keyword arguments instead", - DeprecationWarning, stacklevel=2 - ) - self.fill = onoff - - ## - # Set the default font. - - def setfont(self, font): - # compatibility - self.font = font - - ## - # Get the current default font. - - def getfont(self): - if not self.font: - # FIXME: should add a font repository - from PIL 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 isStringType(ink): - 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, self.mode) - if fill is not None: - if isStringType(fill): - 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, self.mode) - return ink, fill - - ## - # Draw an arc. - - def arc(self, xy, start, end, fill=None): - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_arc(xy, start, end, ink) - - ## - # Draw a bitmap. - - def bitmap(self, xy, bitmap, fill=None): - 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) - - ## - # Draw a chord. - - def chord(self, xy, start, end, fill=None, outline=None): - 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: - self.draw.draw_chord(xy, start, end, ink, 0) - - ## - # Draw an ellipse. - - def ellipse(self, xy, fill=None, outline=None): - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_ellipse(xy, fill, 1) - if ink is not None: - self.draw.draw_ellipse(xy, ink, 0) - - ## - # Draw a line, or a connected sequence of line segments. - - def line(self, xy, fill=None, width=0): - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_lines(xy, ink, width) - - ## - # (Experimental) Draw a shape. - - def shape(self, shape, fill=None, outline=None): - # experimental - 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: - self.draw.draw_outline(shape, ink, 0) - - ## - # Draw a pieslice. - - def pieslice(self, xy, start, end, fill=None, outline=None): - 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: - self.draw.draw_pieslice(xy, start, end, ink, 0) - - ## - # Draw one or more individual pixels. - - def point(self, xy, fill=None): - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_points(xy, ink) - - ## - # Draw a polygon. - - def polygon(self, xy, fill=None, outline=None): - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_polygon(xy, fill, 1) - if ink is not None: - self.draw.draw_polygon(xy, ink, 0) - - ## - # Draw a rectangle. - - def rectangle(self, xy, fill=None, outline=None): - ink, fill = self._getink(outline, fill) - if fill is not None: - self.draw.draw_rectangle(xy, fill, 1) - if ink is not None: - self.draw.draw_rectangle(xy, ink, 0) - - ## - # Draw text. - - def text(self, xy, text, fill=None, font=None, anchor=None): - ink, fill = self._getink(fill) - if font is None: - font = self.getfont() - if ink is None: - ink = fill - if ink is not None: - try: - mask, offset = font.getmask2(text, self.fontmode) - xy = xy[0] + offset[0], xy[1] + offset[1] - except AttributeError: - try: - mask = font.getmask(text, self.fontmode) - except TypeError: - mask = font.getmask(text) - self.draw.draw_bitmap(xy, mask, ink) - - ## - # Get the size of a given string, in pixels. - - def textsize(self, text, font=None): - if font is None: - font = self.getfont() - return font.getsize(text) - -## -# 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. - -def Draw(im, mode=None): - try: - return im.getdraw(mode) - except AttributeError: - return ImageDraw(im, mode) - -# experimental access to the outline API -try: - Outline = Image.core.outline -except: - Outline = 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. -# @return A (drawing context, drawing resource factory) tuple. - -def getdraw(im=None, hints=None): - # FIXME: this needs more work! - # FIXME: come up with a better 'hints' scheme. - handler = None - if not hints or "nicest" in hints: - try: - from PIL import _imagingagg as handler - except ImportError: - pass - if handler is None: - from PIL import ImageDraw2 as handler - if im: - im = handler.Draw(im) - return im, handler - -## -# (experimental) Fills a bounded region with a given color. -# -# @param image Target image. -# @param xy Seed position (a 2-item coordinate tuple). -# @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. - -def floodfill(image, xy, value, border=None): - "Fill bounded region." - # based on an implementation by Eric S. Raymond - pixel = image.load() - x, y = xy - try: - background = pixel[x, y] - if background == value: - return # seed point already has fill color - pixel[x, y] = value - except IndexError: - return # seed point outside image - edge = [(x, y)] - if border is None: - while edge: - newedge = [] - for (x, y) in edge: - for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): - try: - p = pixel[s, t] - except IndexError: - pass - else: - if p == background: - pixel[s, t] = value - newedge.append((s, t)) - edge = newedge - else: - while edge: - newedge = [] - for (x, y) in edge: - for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): - try: - p = pixel[s, t] - except IndexError: - pass - else: - if p != value and p != border: - pixel[s, t] = value - newedge.append((s, t)) - edge = newedge diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageDraw2.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageDraw2.py deleted file mode 100644 index 146cc8b..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageDraw2.py +++ /dev/null @@ -1,106 +0,0 @@ -# -# 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. -# - -from PIL import Image, ImageColor, ImageDraw, ImageFont, ImagePath - -class Pen: - def __init__(self, color, width=1, opacity=255): - self.color = ImageColor.getrgb(color) - self.width = width - -class Brush: - def __init__(self, color, opacity=255): - self.color = ImageColor.getrgb(color) - -class Font: - 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: - - 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): - (xoffset, yoffset) = offset - self.transform = (1, 0, xoffset, 0, 1, yoffset) - - def arc(self, xy, start, end, *options): - self.render("arc", xy, start, end, *options) - - def chord(self, xy, start, end, *options): - self.render("chord", xy, start, end, *options) - - def ellipse(self, xy, *options): - self.render("ellipse", xy, *options) - - def line(self, xy, *options): - self.render("line", xy, *options) - - def pieslice(self, xy, start, end, *options): - self.render("pieslice", xy, start, end, *options) - - def polygon(self, xy, *options): - self.render("polygon", xy, *options) - - def rectangle(self, xy, *options): - self.render("rectangle", xy, *options) - - def symbol(self, xy, symbol, *options): - raise NotImplementedError("not in this version") - - def text(self, xy, text, font): - 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 self.draw.textsize(text, font=font.font) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageEnhance.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageEnhance.py deleted file mode 100644 index f802dc1..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageEnhance.py +++ /dev/null @@ -1,87 +0,0 @@ -# -# 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 PIL 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.degenerate = image.convert("L").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) - - -class Brightness(_Enhance): - """Adjust image brightness. - - This class can be used to control the brighntess 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) - - -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) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFile.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFile.py deleted file mode 100644 index adb27f2..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFile.py +++ /dev/null @@ -1,506 +0,0 @@ -# -# 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. -# - -from PIL import Image -from PIL._util import isPath -import traceback, os, sys -import io - -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" -} - -def raise_ioerror(error): - try: - message = Image.core.getcodecstatus(error) - except AttributeError: - message = ERRORS.get(error) - if not message: - message = "decoder error %d" % error - raise IOError(message + " when reading image file") - -# -# -------------------------------------------------------------------- -# Helpers - -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): - Image.Image.__init__(self) - - 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 - else: - # stream - self.fp = fp - self.filename = filename - - try: - self._open() - except IndexError as v: # end of data - if Image.DEBUG > 1: - traceback.print_exc() - raise SyntaxError(v) - except TypeError as v: # end of data (ord) - if Image.DEBUG > 1: - traceback.print_exc() - raise SyntaxError(v) - except KeyError as v: # unsupported mode - if Image.DEBUG > 1: - traceback.print_exc() - raise SyntaxError(v) - except EOFError as v: # got header but not the first frame - if Image.DEBUG > 1: - traceback.print_exc() - raise SyntaxError(v) - - if not self.mode or self.size[0] <= 0: - raise SyntaxError("not identified by this driver") - - def draft(self, mode, size): - "Set draft mode" - - pass - - def verify(self): - "Check file integrity" - - # raise exception if something's wrong. must be called - # directly after open, and closes file when finished. - self.fp = None - - def load(self): - "Load image data based on tile list" - - pixel = Image.Image.load(self) - - if self.tile is None: - raise IOError("cannot load this image") - if not self.tile: - return pixel - - self.map = None - - readonly = 0 - - if self.filename and len(self.tile) == 1 and not hasattr(sys, 'pypy_version_info'): - # As of pypy 2.1.0, memory mapping was failing here. - # try memory mapping - d, e, o, a = self.tile[0] - if d == "raw" and a[0] == self.mode and a[0] in Image._MAPMODES: - try: - if hasattr(Image.core, "map"): - # use built-in mapper - self.map = Image.core.map(self.filename) - self.map.seek(o) - self.im = self.map.readimage( - self.mode, self.size, a[1], a[2] - ) - else: - # use mmap, if possible - import mmap - file = open(self.filename, "r+") - size = os.path.getsize(self.filename) - # FIXME: on Unix, use PROT_READ etc - self.map = mmap.mmap(file.fileno(), size) - self.im = Image.core.map_buffer( - self.map, self.size, d, e, o, a - ) - readonly = 1 - except (AttributeError, EnvironmentError, ImportError): - self.map = None - - self.load_prepare() - - # look for read/seek overrides - try: - read = self.load_read - except AttributeError: - read = self.fp.read - - try: - seek = self.load_seek - except AttributeError: - seek = self.fp.seek - - 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 d, e, o, a in self.tile: - d = Image._getdecoder(self.mode, d, a, self.decoderconfig) - seek(o) - try: - d.setimage(self.im, e) - except ValueError: - continue - b = prefix - t = len(b) - while True: - try: - s = read(self.decodermaxblock) - except IndexError as ie: # truncated png/gif - if LOAD_TRUNCATED_IMAGES: - break - else: - raise IndexError(ie) - - if not s and not d.handles_eof: # truncated jpeg - self.tile = [] - - # JpegDecode needs to clean things up here either way - # If we don't destroy the decompressor, we have a memory leak. - d.cleanup() - - if LOAD_TRUNCATED_IMAGES: - break - else: - raise IOError("image file is truncated (%d bytes not processed)" % len(b)) - - b = b + s - n, e = d.decode(b) - if n < 0: - break - b = b[n:] - t = t + n - - self.tile = [] - self.readonly = readonly - - self.fp = None # might be shared - - if not self.map and (not LOAD_TRUNCATED_IMAGES or t == 0) and e < 0: - # still raised if decoder fails to return anything - raise_ioerror(e) - - # post processing - if hasattr(self, "tile_post_rotate"): - # FIXME: This is a hack to handle rotated PCD's - self.im = self.im.rotate(self.tile_post_rotate) - self.size = self.im.size - - self.load_end() - - 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 - - -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 IOError("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. - - In Python 2.x, this is an old-style class. - """ - incremental = None - image = None - data = None - decoder = None - 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 IOError: 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_ioerror(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: - try: - fp = io.BytesIO(self.data) - im = Image.open(fp) - finally: - fp.close() # explicitly close the virtual file - except IOError: - # 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 close(self): - """ - (Consumer) Close the stream. - - :returns: An image object. - :exception IOError: 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 IOError("image was incomplete") - if not self.image: - raise IOError("cannot parse this image") - if self.data: - # incremental parsing not possible; reopen the file - # not that we have all data - try: - fp = io.BytesIO(self.data) - self.image = Image.open(fp) - finally: - self.image.load() - fp.close() # explicitly close the virtual file - 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 specifiy 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 - try: - fh = fp.fileno() - fp.flush() - except (AttributeError, io.UnsupportedOperation): - # 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, 0) - e.setimage(im.im, b) - while True: - l, s, d = e.encode(bufsize) - fp.write(d) - if s: - break - if s < 0: - raise IOError("encoder error %d when writing image file" % s) - 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, 0) - e.setimage(im.im, b) - s = e.encode_to_file(fh, bufsize) - if s < 0: - raise IOError("encoder error %d when writing image file" % s) - try: - fp.flush() - except: pass - - -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) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFileIO.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFileIO.py deleted file mode 100644 index e57d3f4..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFileIO.py +++ /dev/null @@ -1,40 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# kludge to get basic ImageFileIO functionality -# -# History: -# 1998-08-06 fl Recreated -# -# Copyright (c) Secret Labs AB 1998-2002. -# -# See the README file for information on usage and redistribution. -# -""" -The **ImageFileIO** module can be used to read an image from a -socket, or any other stream device. - -Deprecated. New code should use the :class:`PIL.ImageFile.Parser` -class in the :mod:`PIL.ImageFile` module instead. - -.. seealso:: modules :class:`PIL.ImageFile.Parser` -""" - -from io import BytesIO - - -class ImageFileIO(BytesIO): - def __init__(self, fp): - """ - Adds buffering to a stream file object, in order to - provide **seek** and **tell** methods required - by the :func:`PIL.Image.Image.open` method. The stream object must - implement **read** and **close** methods. - - :param fp: Stream file handle. - - .. seealso:: modules :func:`PIL.Image.open` - """ - data = fp.read() - BytesIO.__init__(self, data) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFilter.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFilter.py deleted file mode 100644 index ac8fe9f..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFilter.py +++ /dev/null @@ -1,269 +0,0 @@ -# -# 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. -# - -from functools import reduce - - -class Filter(object): - pass - - -class Kernel(Filter): - """ - 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. - """ - - def __init__(self, size, kernel, scale=None, offset=0): - if scale is None: - # default scale is sum of kernel - scale = 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 - - def filter(self, image): - if image.mode == "P": - raise ValueError("cannot filter palette images") - return image.filter(*self.filterargs) - - -class BuiltinFilter(Kernel): - def __init__(self): - pass - - -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(Filter): - """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 UnsharpMask(Filter): - """Unsharp mask filter. - - See Wikipedia's entry on `digital unsharp masking`_ for an explanation of - the parameters. - - .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking - """ - 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" - 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 - ) - - -class CONTOUR(BuiltinFilter): - name = "Contour" - filterargs = (3, 3), 1, 255, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1 - ) - - -class DETAIL(BuiltinFilter): - name = "Detail" - filterargs = (3, 3), 6, 0, ( - 0, -1, 0, - -1, 10, -1, - 0, -1, 0 - ) - - -class EDGE_ENHANCE(BuiltinFilter): - name = "Edge-enhance" - filterargs = (3, 3), 2, 0, ( - -1, -1, -1, - -1, 10, -1, - -1, -1, -1 - ) - - -class EDGE_ENHANCE_MORE(BuiltinFilter): - name = "Edge-enhance More" - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 9, -1, - -1, -1, -1 - ) - - -class EMBOSS(BuiltinFilter): - name = "Emboss" - filterargs = (3, 3), 1, 128, ( - -1, 0, 0, - 0, 1, 0, - 0, 0, 0 - ) - - -class FIND_EDGES(BuiltinFilter): - name = "Find Edges" - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1 - ) - - -class SMOOTH(BuiltinFilter): - name = "Smooth" - filterargs = (3, 3), 13, 0, ( - 1, 1, 1, - 1, 5, 1, - 1, 1, 1 - ) - - -class SMOOTH_MORE(BuiltinFilter): - name = "Smooth More" - 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 - ) - - -class SHARPEN(BuiltinFilter): - name = "Sharpen" - filterargs = (3, 3), 16, 0, ( - -2, -2, -2, - -2, 32, -2, - -2, -2, -2 - ) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFont.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFont.py deleted file mode 100644 index 18d09b8..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageFont.py +++ /dev/null @@ -1,406 +0,0 @@ -# -# 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. -# - -from __future__ import print_function - -from PIL import Image -from PIL._util import isDirectory, isPath -import os, sys - -try: - import warnings -except ImportError: - warnings = None - -class _imagingft_not_installed: - # module placeholder - def __getattr__(self, id): - raise ImportError("The _imagingft C module is not installed") - -try: - from PIL 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): - - file = open(filename, "rb") - - for ext in (".png", ".gif", ".pbm"): - try: - fullname = os.path.splitext(filename)[0] + ext - image = Image.open(fullname) - except: - pass - else: - if image and image.mode in ("1", "L"): - break - else: - raise IOError("cannot find glyph data file") - - self.file = fullname - - return self._load_pilfont_data(file, image) - - def _load_pilfont_data(self, file, image): - - # read PILfont header - if file.readline() != b"PILfont\n": - raise SyntaxError("Not a PILfont file") - d = 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) - - # delegate critical operations to internal type - self.getsize = self.font.getsize - self.getmask = self.font.getmask - -## -# 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="", file=None): - # FIXME: use service provider instead - if file: - if warnings: - warnings.warn('file parameter deprecated, please use font parameter instead.', DeprecationWarning) - font = file - - if isPath(font): - self.font = core.getfont(font, size, index, encoding) - else: - self.font_bytes = font.read() - self.font = core.getfont("", size, index, encoding, self.font_bytes) - - def getname(self): - return self.font.family, self.font.style - - def getmetrics(self): - return self.font.ascent, self.font.descent - - def getsize(self, text): - return self.font.getsize(text)[0] - - def getoffset(self, text): - return self.font.getsize(text)[1] - - def getmask(self, text, mode=""): - return self.getmask2(text, mode)[0] - - def getmask2(self, text, mode="", fill=Image.core.fill): - size, offset = self.font.getsize(text) - im = fill("L", size, 0) - self.font.render(text, im.id, mode=="1") - return im, offset - -## -# 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. - -class TransposedFont: - "Wrapper for writing rotated or mirrored text" - - def __init__(self, font, orientation=None): - self.font = font - self.orientation = orientation # any 'transpose' argument, or None - - def getsize(self, text): - 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=""): - im = self.font.getmask(text, mode) - 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 IOError: If the file could not be read. - """ - f = ImageFont() - f._load_pilfont(filename) - return f - - -def truetype(font=None, size=10, index=0, encoding="", filename=None): - """ - Load a TrueType or OpenType font file, and create a font object. - This function loads a font object from the given file, and creates - a font object for a font of the given size. - - This function requires the _imagingft service. - - :param filename: A truetype font file. Under Windows, if the file - is not found in this filename, the loader also looks in - Windows :file:`fonts/` directory. - :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). Common - encodings are "unic" (Unicode), "symb" (Microsoft - Symbol), "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), - and "armn" (Apple Roman). See the FreeType documentation - for more information. - :return: A font object. - :exception IOError: If the file could not be read. - """ - - if filename: - if warnings: - warnings.warn('filename parameter deprecated, please use font parameter instead.', DeprecationWarning) - font = filename - - try: - return FreeTypeFont(font, size, index, encoding) - except IOError: - 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: - filename = os.path.join(windir, "fonts", font) - return FreeTypeFont(filename, size, index, encoding) - 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 IOError: If the file could not be read. - """ - for dir in sys.path: - if isDirectory(dir): - if not isinstance(filename, str): - if bytes is str: - filename = filename.encode("utf-8") - else: - filename = filename.decode("utf-8") - try: - return load(os.path.join(dir, filename)) - except IOError: - pass - raise IOError("cannot find font file") - - -def load_default(): - """Load a "better than nothing" default font. - - .. versionadded:: 1.1.4 - - :return: A font object. - """ - from io import BytesIO - import base64 - f = ImageFont() - f._load_pilfont_data( - # courB08 - BytesIO(base64.decodestring(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.decodestring(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 - - -if __name__ == "__main__": - # create font data chunk for embedding - import base64, os, sys - font = "../Tests/images/courB08" - print(" f._load_pilfont_data(") - print(" # %s" % os.path.basename(font)) - print(" BytesIO(base64.decodestring(b'''") - base64.encode(open(font + ".pil", "rb"), sys.stdout) - print("''')), Image.open(BytesIO(base64.decodestring(b'''") - base64.encode(open(font + ".pbm", "rb"), sys.stdout) - print("'''))))") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageGrab.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageGrab.py deleted file mode 100644 index 9bb1909..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageGrab.py +++ /dev/null @@ -1,49 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# screen grabber (windows only) -# -# 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. -# - -from PIL import Image - - -try: - # built-in driver (1.1.3 and later) - grabber = Image.core.grabscreen -except AttributeError: - # stand-alone driver (pil plus) - import _grabscreen - grabber = _grabscreen.grab - - -def grab(bbox=None): - size, data = grabber() - im = Image.frombytes( - "RGB", size, data, - # RGB, 32-bit line padding, origo in lower left corner - "raw", "BGR", (size[0]*3 + 3) & -4, -1 - ) - if bbox: - im = im.crop(bbox) - return im - - -def grabclipboard(): - debug = 0 # temporary interface - data = Image.core.grabclipboard(debug) - if isinstance(data, bytes): - from PIL import BmpImagePlugin - import io - return BmpImagePlugin.DibImageFile(io.BytesIO(data)) - return data diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMath.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMath.py deleted file mode 100644 index adfcc4f..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMath.py +++ /dev/null @@ -1,227 +0,0 @@ -# -# 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. -# - -from PIL import Image -from PIL import _imagingmath - -try: - import builtins -except ImportError: - import __builtin__ - builtins = __builtin__ - -VERBOSE = 0 - -def _isconstant(v): - return isinstance(v, int) or isinstance(v, 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: - raise TypeError("bad operand type for '%s'" % op) - _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: - raise TypeError("bad operand type for '%s'" % op) - _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 - - if bytes is str: - # Provide __nonzero__ for pre-Py3k - __nonzero__ = __bool__ - del __bool__ - - 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) - - if bytes is str: - # Provide __div__ and __rdiv__ for pre-Py3k - __div__ = __truediv__ - __rdiv__ = __rtruediv__ - del __truediv__ - del __rtruediv__ - - # 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/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMode.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMode.py deleted file mode 100644 index c3931b5..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMode.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# 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 = {} - -## -# Wrapper for mode strings. - -class ModeDescriptor: - - 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 - -## -# Gets a mode descriptor for the given mode. - -def getmode(mode): - if not _modes: - # initialize mode cache - from PIL import Image - # core modes - for m, (basemode, basetype, bands) in Image._MODEINFO.items(): - _modes[m] = ModeDescriptor(m, bands, basemode, basetype) - # extra experimental modes - _modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L") - _modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L") - # mapping modes - _modes["I;16"] = ModeDescriptor("I;16", "I", "L", "L") - _modes["I;16L"] = ModeDescriptor("I;16L", "I", "L", "L") - _modes["I;16B"] = ModeDescriptor("I;16B", "I", "L", "L") - return _modes[mode] diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMorph.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMorph.py deleted file mode 100644 index b24dd13..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageMorph.py +++ /dev/null @@ -1,244 +0,0 @@ -# A binary morphology add-on for the Python Imaging Library -# -# History: -# 2014-06-04 Initial version. -# -# Copyright (c) 2014 Dov Grobgeld - -from PIL import Image -from PIL import _imagingmorph -import re - -LUT_SIZE = 1 << 9 - - -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], [6, 3, 0, - 7, 4, 1, - 8, 5, 2]), res)) - # mirror - if 'M' in options: - n = len(patterns) - for pattern, res in patterns[0:n]: - patterns.append( - (self._string_permute(pattern, [2, 1, 0, - 5, 4, 3, - 8, 7, 6]), 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 = '%d' % (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) - -# # Debugging -# for p,r in patterns: -# print p,r -# print '--' - - # compile the patterns into regular expressions for speed - for i in range(len(patterns)): - p = patterns[i][0].replace('.', 'X').replace('X', '[01]') - p = re.compile(p) - patterns[i] = (p, patterns[i][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') - - 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.""" - if self.lut is None: - raise Exception('No operator loaded') - - 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.""" - - 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) != 8192: - 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 - -# End of file diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageOps.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageOps.py deleted file mode 100644 index 64c35cc..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageOps.py +++ /dev/null @@ -1,436 +0,0 @@ -# -# 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. -# - -from PIL import Image -from PIL._util import isStringType -import operator -from functools import reduce - -# -# 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 isStringType(color): - from PIL 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 IOError("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): - """ - Colorize grayscale image. The **black** and **white** - arguments should be RGB tuples; this function calculates a color - wedge mapping all black pixels in the source image to the first - color, and all white pixels to the second color. - - :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. - :return: An image. - """ - assert image.mode == "L" - black = _color(black, "RGB") - white = _color(white, "RGB") - red = []; green = []; blue = [] - for i in range(256): - red.append(black[0]+i*(white[0]-black[0])//255) - green.append(black[1]+i*(white[1]-black[1])//255) - blue.append(black[2]+i*(white[2]-black[2])//255) - image = image.convert("RGB") - return _lut(image, red + green + blue) - - -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 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: What resampling filter to use. - :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 = (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. - """ - "Add border to 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.NEAREST, 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 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.NEAREST`. - :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). - :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 inputs are valid - if not isinstance(centering, list): - centering = [centering[0], centering[1]] - - if centering[0] > 1.0 or centering[0] < 0.0: - centering [0] = 0.50 - if centering[1] > 1.0 or centering[1] < 0.0: - centering[1] = 0.50 - - if bleed > 0.49999 or bleed < 0.0: - 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 - bleedPixels = ( - int((float(bleed) * float(image.size[0])) + 0.5), - int((float(bleed) * float(image.size[1])) + 0.5) - ) - - liveArea = (0, 0, image.size[0], image.size[1]) - if bleed > 0.0: - liveArea = ( - bleedPixels[0], bleedPixels[1], image.size[0] - bleedPixels[0] - 1, - image.size[1] - bleedPixels[1] - 1 - ) - - liveSize = (liveArea[2] - liveArea[0], liveArea[3] - liveArea[1]) - - # calculate the aspect ratio of the liveArea - liveAreaAspectRatio = float(liveSize[0])/float(liveSize[1]) - - # calculate the aspect ratio of the output image - aspectRatio = float(size[0]) / float(size[1]) - - # figure out if the sides or top/bottom will be cropped off - if liveAreaAspectRatio >= aspectRatio: - # liveArea is wider than what's needed, crop the sides - cropWidth = int((aspectRatio * float(liveSize[1])) + 0.5) - cropHeight = liveSize[1] - else: - # liveArea is taller than what's needed, crop the top and bottom - cropWidth = liveSize[0] - cropHeight = int((float(liveSize[0])/aspectRatio) + 0.5) - - # make the crop - leftSide = int(liveArea[0] + (float(liveSize[0]-cropWidth) * centering[0])) - if leftSide < 0: - leftSide = 0 - topSide = int(liveArea[1] + (float(liveSize[1]-cropHeight) * centering[1])) - if topSide < 0: - topSide = 0 - - out = image.crop( - (leftSide, topSide, leftSide + cropWidth, topSide + cropHeight) - ) - - # resize the image and return it - return out.resize(size, method) - - -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 posterize. - :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) - -# -------------------------------------------------------------------- -# PIL USM components, from Kevin Cazabon. - -def gaussian_blur(im, radius=None): - """ PIL_usm.gblur(im, [radius])""" - - if radius is None: - radius = 5.0 - - im.load() - - return im.im.gaussian_blur(radius) - -gblur = gaussian_blur - -def unsharp_mask(im, radius=None, percent=None, threshold=None): - """ PIL_usm.usm(im, [radius, percent, threshold])""" - - if radius is None: - radius = 5.0 - if percent is None: - percent = 150 - if threshold is None: - threshold = 3 - - im.load() - - return im.im.unsharp_mask(radius, percent, threshold) - -usm = unsharp_mask diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImagePalette.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImagePalette.py deleted file mode 100644 index 5988682..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImagePalette.py +++ /dev/null @@ -1,209 +0,0 @@ -# -# 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 PIL import Image, ImageColor - - -class ImagePalette: - "Color palette for palette mapped images" - - 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 list(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 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'): - #py3k has a tobytes, tostring is deprecated. - 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: - # allocate new color slot - if isinstance(self.palette, bytes): - self.palette = [int(x) for x in self.palette] - index = len(self.colors) - if index >= 256: - raise ValueError("cannot allocate more than 256 colors") - 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, mode="RGB"): - lut = [] - for i in range(256): - lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5)) - return lut - -def new(mode, data): - return Image.core.new_palette(mode, data) - -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 - - fp = open(filename, "rb") - - lut = None - - if not lut: - try: - from PIL import GimpPaletteFile - fp.seek(0) - p = GimpPaletteFile.GimpPaletteFile(fp) - lut = p.getpalette() - except (SyntaxError, ValueError): - #import traceback - #traceback.print_exc() - pass - - if not lut: - try: - from PIL import GimpGradientFile - fp.seek(0) - p = GimpGradientFile.GimpGradientFile(fp) - lut = p.getpalette() - except (SyntaxError, ValueError): - #import traceback - #traceback.print_exc() - pass - - if not lut: - try: - from PIL import PaletteFile - fp.seek(0) - p = PaletteFile.PaletteFile(fp) - lut = p.getpalette() - except (SyntaxError, ValueError): - import traceback - traceback.print_exc() - pass - - if not lut: - raise IOError("cannot load palette") - - return lut # data, rawmode diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImagePath.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImagePath.py deleted file mode 100644 index 656d5ce..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImagePath.py +++ /dev/null @@ -1,66 +0,0 @@ -# -# 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 PIL import Image - - -# the Python class below is overridden by the C implementation. - - -class Path: - - def __init__(self, xy): - pass - - ## - # Compacts the path, by removing points that are close to each - # other. This method modifies the path in place. - - def compact(self, distance=2): - pass - - ## - # Gets the bounding box. - - def getbbox(self): - pass - - ## - # Maps the path through a function. - - def map(self, function): - pass - - ## - # Converts the path to Python list. - # - # @param flat By default, this function returns a list of 2-tuples - # [(x, y), ...]. If this argument is true, it returns a flat - # list [x, y, ...] instead. - # @return A list of coordinates. - - def tolist(self, flat=0): - pass - - ## - # Transforms the path. - - def transform(self, matrix): - pass - - -# override with C implementation -Path = Image.core.path diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageQt.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageQt.py deleted file mode 100644 index ca8b14b..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageQt.py +++ /dev/null @@ -1,89 +0,0 @@ -# -# 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. -# - -from PIL import Image -from PIL._util import isPath - -try: - from PyQt5.QtGui import QImage, qRgba -except: - from PyQt4.QtGui import QImage, qRgba - -## -# (Internal) Turns an RGB color into a Qt compatible color integer. - -def rgb(r, g, b, a=255): - # 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) - -## -# An PIL image wrapper for Qt. This is a subclass of PyQt4's QImage -# class. -# -# @param im A PIL Image object, or a file name (given either as Python -# string or a PyQt string object). - -class ImageQt(QImage): - - def __init__(self, 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 = unicode(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": - try: - data = im.tobytes("raw", "BGRA") - except SystemError: - # workaround for earlier versions - r, g, b, a = im.split() - im = Image.merge("RGBA", (b, g, r, a)) - format = QImage.Format_ARGB32 - else: - raise ValueError("unsupported image mode %r" % im.mode) - - # must keep a reference, or Qt will crash! - self.__data = data or im.tobytes() - - QImage.__init__(self, self.__data, im.size[0], im.size[1], format) - - if colortable: - self.setColorTable(colortable) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageSequence.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageSequence.py deleted file mode 100644 index 513c924..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageSequence.py +++ /dev/null @@ -1,41 +0,0 @@ -# -# 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 - - def __getitem__(self, ix): - try: - if ix: - self.im.seek(ix) - return self.im - except EOFError: - raise IndexError # end of sequence diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageShow.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageShow.py deleted file mode 100644 index 40fe629..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageShow.py +++ /dev/null @@ -1,171 +0,0 @@ -# -# 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. -# - -from __future__ import print_function - -from PIL import Image -import os, sys - -if sys.version_info >= (3, 3): - from shlex import quote -else: - from pipes import quote - -_viewers = [] - -def register(viewer, order=1): - try: - if issubclass(viewer, Viewer): - viewer = viewer() - except TypeError: - pass # raised if viewer wasn't a class - if order > 0: - _viewers.append(viewer) - elif order < 0: - _viewers.insert(0, viewer) - -## -# Displays a given image. -# -# @param image An image object. -# @param title Optional title. Not all viewers can display the title. -# @param **options Additional viewer options. -# @return True if a suitable viewer was found, false otherwise. - -def show(image, title=None, **options): - for viewer in _viewers: - if viewer.show(image, title=title, **options): - return 1 - return 0 - -## -# Base class for viewers. - -class Viewer: - - # main api - - def show(self, image, **options): - - # save temporary image to disk - if image.mode[:4] == "I;16": - # @PIL88 @PIL101 - # "I;16" isn't an 'official' mode, but we still want to - # provide a simple way to show 16-bit images. - base = "L" - # FIXME: auto-contrast if max() > 255? - else: - base = Image.getmodebase(image.mode) - if base != image.mode and image.mode != "1": - image = image.convert(base) - - return self.show_image(image, **options) - - # hook methods - - format = None - - def get_format(self, image): - # return format name, or None to save as PGM/PPM - return self.format - - def get_command(self, file, **options): - raise NotImplementedError - - def save_image(self, image): - # save to temporary file, and return filename - return image._dump(format=self.get_format(image)) - - def show_image(self, image, **options): - # display given image - return self.show_file(self.save_image(image), **options) - - def show_file(self, file, **options): - # display given file - os.system(self.get_command(file, **options)) - return 1 - -# -------------------------------------------------------------------- - -if sys.platform == "win32": - - class WindowsViewer(Viewer): - format = "BMP" - def get_command(self, file, **options): - return ('start "Pillow" /WAIT "%s" ' - '&& ping -n 2 127.0.0.1 >NUL ' - '&& del /f "%s"' % (file, file)) - - register(WindowsViewer) - -elif sys.platform == "darwin": - - class MacViewer(Viewer): - format = "BMP" - def get_command(self, file, **options): - # on darwin open returns immediately resulting in the temp - # file removal while app is opening - command = "open -a /Applications/Preview.app" - command = "(%s %s; sleep 20; rm -f %s)&" % (command, quote(file), quote(file)) - return command - - register(MacViewer) - -else: - - # unixoids - - def which(executable): - path = os.environ.get("PATH") - if not path: - return None - for dirname in path.split(os.pathsep): - filename = os.path.join(dirname, executable) - if os.path.isfile(filename): - # FIXME: make sure it's executable - return filename - return None - - class UnixViewer(Viewer): - def show_file(self, file, **options): - command, executable = self.get_command_ex(file, **options) - command = "(%s %s; rm -f %s)&" % (command, quote(file), quote(file)) - os.system(command) - return 1 - - # implementations - - class DisplayViewer(UnixViewer): - def get_command_ex(self, file, **options): - command = executable = "display" - return command, executable - - if which("display"): - register(DisplayViewer) - - class XVViewer(UnixViewer): - 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 which("xv"): - register(XVViewer) - -if __name__ == "__main__": - # usage: python ImageShow.py imagefile [title] - print(show(Image.open(sys.argv[1]), *sys.argv[2:])) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageStat.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageStat.py deleted file mode 100644 index d84e2cb..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageStat.py +++ /dev/null @@ -1,147 +0,0 @@ -# -# 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 operator, math -from functools import reduce - - -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(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): - sum = 0.0 - for j in range(256): - sum += j * self.h[i + j] - v.append(sum) - 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 - l = self.count[i]//2 - b = i * 256 - for j in range(256): - s = s + self.h[b+j] - if s > l: - 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/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageTk.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageTk.py deleted file mode 100644 index 1e81d24..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageTk.py +++ /dev/null @@ -1,296 +0,0 @@ -# -# 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. -# - -try: - import tkinter -except ImportError: - import Tkinter - tkinter = Tkinter - del Tkinter - -from PIL 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 - -# -------------------------------------------------------------------- -# 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: - if "file" in kw: - image = Image.open(kw["file"]) - del kw["file"] - elif "data" in kw: - from io import BytesIO - image = Image.open(BytesIO(kw["data"])) - del kw["data"] - - 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: - 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. 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 as v: - # activate Tkinter hook - try: - from PIL import _imagingtk - try: - _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: - if "file" in kw: - image = Image.open(kw["file"]) - del kw["file"] - elif "data" in kw: - from io import BytesIO - image = Image.open(BytesIO(kw["data"])) - del kw["data"] - - 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: - 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.""" - photo.tk.call("PyImagingPhotoGet", photo) - -# -------------------------------------------------------------------- -# Helper for the Image.show method. - -def _show(image, title): - - 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) - tkinter.Label.__init__(self, master, image=self.image, - bg="black", bd=0) - - if not tkinter._default_root: - raise IOError("tkinter not initialized") - top = tkinter.Toplevel() - if title: - top.title(title) - UI(top, image).pack() diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageTransform.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageTransform.py deleted file mode 100644 index 5a8f9e9..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageTransform.py +++ /dev/null @@ -1,95 +0,0 @@ -# -# 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 PIL 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) - -## -# 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. -# -# @def AffineTransform(matrix) -# @param matrix A 6-tuple (a, b, c, d, e, f) containing -# the first two rows from an affine transform matrix. -# @see Image#Image.transform - -class AffineTransform(Transform): - method = Image.AFFINE - -## -# 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. -# -# @def ExtentTransform(bbox) -# @param bbox A 4-tuple (x0, y0, x1, y1) which specifies -# two points in the input image's coordinate system. -# @see Image#Image.transform - -class ExtentTransform(Transform): - method = Image.EXTENT - -## -# Define an quad image transform. -#

-# Maps a quadrilateral (a region defined by four corners) from the -# image to a rectangle of the given size. -# -# @def QuadTransform(xy) -# @param xy An 8-tuple (x0, y0, x1, y1, x2, y2, y3, y3) which -# contain the upper left, lower left, lower right, and upper right -# corner of the source quadrilateral. -# @see Image#Image.transform - -class QuadTransform(Transform): - method = Image.QUAD - -## -# Define an mesh image transform. A mesh transform consists of one -# or more individual quad transforms. -# -# @def MeshTransform(data) -# @param data A list of (bbox, quad) tuples. -# @see Image#Image.transform - -class MeshTransform(Transform): - method = Image.MESH diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageWin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageWin.py deleted file mode 100644 index aa90b88..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImageWin.py +++ /dev/null @@ -1,251 +0,0 @@ -# -# 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. -# - -import warnings -from PIL import Image - - -class HDC: - """ - Wraps a 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 a 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 a 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. 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 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() - - ## - # Deprecated aliases to frombytes & tobytes. - - def fromstring(self, *args, **kw): - warnings.warn( - 'fromstring() is deprecated. Please call frombytes() instead.', - DeprecationWarning, - stacklevel=2 - ) - return self.frombytes(*args, **kw) - - def tostring(self): - warnings.warn( - 'tostring() is deprecated. Please call tobytes() instead.', - DeprecationWarning, - stacklevel=2 - ) - return self.tobytes() - -## -# Create a Window with the given title size. - -class Window: - - 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() - -## -# Create an image window which displays the given image. - -class ImageWindow(Window): - - def __init__(self, image, title="PIL"): - if not isinstance(image, Dib): - image = Dib(image) - self.image = image - width, height = image.size - Window.__init__(self, 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/Linux_x86_64/lib/python3.4/site-packages/PIL/ImtImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/ImtImagePlugin.py deleted file mode 100644 index e68b003..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/ImtImagePlugin.py +++ /dev/null @@ -1,93 +0,0 @@ -# -# 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. -# - - -__version__ = "0.2" - -import re - -from PIL 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 not b"\n" 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] == 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("IMT", ImtImageFile) - -# -# no extension registered (".im" is simply too common) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/IptcImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/IptcImagePlugin.py deleted file mode 100644 index 8557561..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/IptcImagePlugin.py +++ /dev/null @@ -1,287 +0,0 @@ -# -# 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. -# - -from __future__ import print_function - -__version__ = "0.3" - - -from PIL import Image, ImageFile, _binary -import os, tempfile - -i8 = _binary.i8 -i16 = _binary.i16be -i32 = _binary.i32be -o8 = _binary.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 IOError("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 _is_raw(self, offset, size): - # - # check if the file can be mapped - - # DISABLED: the following only slows things down... - return 0 - - self.fp.seek(offset) - t, sz = self.field() - if sz != size[0]: - return 0 - y = 1 - while True: - self.fp.seek(sz, 1) - t, s = self.field() - if t != (8, 10): - break - if s != sz: - return 0 - y += 1 - return y == size[1] - - 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 list(self.info.keys()): - if isinstance(self.info[tag], list): - self.info[tag].append(tagdata) - else: - self.info[tag] = [self.info[tag], tagdata] - else: - self.info[tag] = tagdata - - # print tag, self.info[tag] - - # 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: - raise IOError("Unknown IPTC image compression") - - # tile - if tag == (8,10): - if compression == "raw" and self._is_raw(offset, self.size): - self.tile = [(compression, (offset, size + 5, -1), - (0, 0, self.size[0], self.size[1]))] - else: - 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: - try: - # fast - self.im = Image.core.open_ppm(outfile) - except: - # slightly slower - im = Image.open(outfile) - im.load() - self.im = im.im - finally: - try: os.unlink(outfile) - except: pass - - -Image.register_open("IPTC", IptcImageFile) - -Image.register_extension("IPTC", ".iim") - -## -# Get IPTC information from TIFF, JPEG, or IPTC file. -# -# @param im An image containing IPTC data. -# @return A dictionary containing IPTC information, or None if -# no IPTC information block was found. - -def getiptcinfo(im): - - from PIL 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 - try: - app = im.app["APP13"] - if app[:14] == "Photoshop 3.0\x00": - app = app[14:] - # parse the image resource block - offset = 0 - while app[offset:offset+4] == "8BIM": - offset += 4 - # resource code - code = JpegImagePlugin.i16(app, offset) - offset += 2 - # resource name (usually empty) - name_len = i8(app[offset]) - name = app[offset+1:offset+1+name_len] - offset = 1 + offset + name_len - if offset & 1: - offset += 1 - # resource data block - size = JpegImagePlugin.i32(app, offset) - offset += 4 - if code == 0x0404: - # 0x0404 contains IPTC/NAA data - data = app[offset:offset+size] - break - offset = offset + size - if offset & 1: - offset += 1 - except (AttributeError, KeyError): - pass - - 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/Linux_x86_64/lib/python3.4/site-packages/PIL/Jpeg2KImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/Jpeg2KImagePlugin.py deleted file mode 100644 index 53b10ca..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/Jpeg2KImagePlugin.py +++ /dev/null @@ -1,277 +0,0 @@ -# -# 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. -# - -__version__ = "0.1" - -from PIL import Image, ImageFile -import struct -import os -import io - - -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, xtsiz, ytsiz, \ - xtosiz, ytosiz, csiz \ - = struct.unpack('>HHIIIIIIIIH', siz[:38]) - ssiz = [None]*csiz - xrsiz = [None]*csiz - yrsiz = [None]*csiz - for i in range(csiz): - ssiz[i], xrsiz[i], yrsiz[i] \ - = struct.unpack('>BBB', siz[36 + 3 * i:39 + 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 PIL (size, mode) tuple.""" - - # Find the JP2 header box - header = 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 - 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 - - 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('>BBB', content[:3]) - if meth == 1: - cs = struct.unpack('>I', content[3:7])[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 - - return (size, mode) - -## -# 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" - self.size, self.mode = _parse_jp2_header(self.fp) - 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: - fd = -1 - try: - pos = self.fp.tell() - self.fp.seek(0, 2) - length = self.fp.tell() - self.fp.seek(pos, 0) - except: - length = -1 - - self.tile = [('jpeg2k', (0, 0) + self.size, 0, - (self.codec, self.reduce, self.layers, fd, length))] - - def load(self): - if self.reduce: - power = 1 << self.reduce - adjust = power >> 1 - self.size = (int((self.size[0] + adjust) / power), - int((self.size[1] + adjust) / power)) - - if self.tile: - # 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)] - - 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) - 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: - 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('JPEG2000', Jpeg2KImageFile, _accept) -Image.register_save('JPEG2000', _save) - -Image.register_extension('JPEG2000', '.jp2') -Image.register_extension('JPEG2000', '.j2k') -Image.register_extension('JPEG2000', '.jpc') -Image.register_extension('JPEG2000', '.jpf') -Image.register_extension('JPEG2000', '.jpx') -Image.register_extension('JPEG2000', '.j2c') - -Image.register_mime('JPEG2000', 'image/jp2') -Image.register_mime('JPEG2000', 'image/jpx') diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/JpegImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/JpegImagePlugin.py deleted file mode 100644 index a434c55..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/JpegImagePlugin.py +++ /dev/null @@ -1,625 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# JPEG (JFIF) file handling -# -# See "Digital Compression and Coding of Continous-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. -# - -__version__ = "0.6" - -import array -import struct -from PIL import Image, ImageFile, _binary -from PIL.JpegPresets import presets -from PIL._util import isStringType - -i8 = _binary.i8 -o8 = _binary.o8 -i16 = _binary.i16be -i32 = _binary.i32be - - -# -# 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: - 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": - # 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 == 0xFFEE and s[:5] == b"Adobe": - self.info["adobe"] = i16(s, 5) - # extract Adobe custom properties - try: - adobe_transform = i8(s[1]) - except: - pass - else: - self.info["adobe_transform"] = adobe_transform - - -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.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 = None - - 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): - return prefix[0:1] == b"\377" - - -## -# 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(1) - - if i8(s[0]) != 255: - raise SyntaxError("not a JPEG file") - - # 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 = b"\xff" - continue - - if i in MARKER: - name, description, handler = MARKER[i] - # print hex(i), name, description - 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" - else: - raise SyntaxError("no marker found") - - def draft(self, mode, size): - - if len(self.tile) != 1: - return - - d, e, o, a = self.tile[0] - scale = 0 - - if a[0] == "RGB" and mode in ["L", "YCbCr"]: - self.mode = mode - a = mode, "" - - if size: - scale = max(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, 1) - - return self - - def load_djpeg(self): - - # ALTERNATIVE: handle JPEGs via the IJG command line utilities - - import subprocess - import tempfile - import os - 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: - self.im = Image.core.open_ppm(path) - finally: - try: - os.unlink(path) - except: - pass - - self.mode = self.im.mode - self.size = self.im.size - - self.tile = [] - - def _getexif(self): - return _getexif(self) - - -def _getexif(self): - # Extract EXIF information. This method is highly experimental, - # and is likely to be replaced with something better in a future - # version. - from PIL import TiffImagePlugin - import io - - def fixup(value): - if len(value) == 1: - return value[0] - return value - # The EXIF record consists of a TIFF file embedded in a JPEG - # application marker (!). - try: - data = self.info["exif"] - except KeyError: - return None - file = io.BytesIO(data[6:]) - head = file.read(8) - exif = {} - # process dictionary - info = TiffImagePlugin.ImageFileDirectory(head) - info.load(file) - for key, value in info.items(): - exif[key] = fixup(value) - # get exif extension - try: - file.seek(exif[0x8769]) - except KeyError: - pass - else: - info = TiffImagePlugin.ImageFileDirectory(head) - info.load(file) - for key, value in info.items(): - exif[key] = fixup(value) - # get gpsinfo extension - try: - file.seek(exif[0x8825]) - except KeyError: - pass - else: - info = TiffImagePlugin.ImageFileDirectory(head) - info.load(file) - exif[0x8825] = gps = {} - for key, value in info.items(): - gps[key] = fixup(value) - return exif - -# -------------------------------------------------------------------- -# stuff to save JPEG files - -RAWMODE = { - "1": "L", - "L": "L", - "RGB": "RGB", - "RGBA": "RGB", - "RGBX": "RGB", - "CMYK": "CMYK;I", # assume adobe conventions - "YCbCr": "YCbCr", -} - -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, - } - - -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): - 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: - raise IOError("cannot write mode %s as JPEG" % im.mode) - - info = im.encoderinfo - - dpi = info.get("dpi", (0, 0)) - - quality = info.get("quality", 0) - subsampling = info.get("subsampling", -1) - qtables = info.get("qtables") - - if quality == "keep": - quality = 0 - subsampling = "keep" - qtables = "keep" - elif quality in presets: - preset = presets[quality] - quality = 0 - 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 isStringType(qtables) 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:1:1": - 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 isStringType(qtables): - try: - lines = [int(num) for line in qtables.splitlines() - for num in line.split('#', 1)[0].split()] - except ValueError: - raise ValueError("Invalid quantization table") - 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 - table = array.array('b', table) - except TypeError: - raise ValueError("Invalid quantization table") - 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 - - # get keyword arguments - im.encoderconfig = ( - quality, - # "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" in info or "progression" in info, - info.get("smooth", 0), - "optimize" in info, - info.get("streamtype", 0), - dpi[0], dpi[1], - subsampling, - qtables, - extra, - info.get("exif", b"") - ) - - # 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 pizel size is - # channels*size, this is a value that's been used in a django patch. - # https://github.com/jdriscoll/django-imagekit/issues/50 - bufsize = 0 - if "optimize" in info or "progressive" in info or "progression" in info: - if quality >= 95: - 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 - bufsize = max(ImageFile.MAXBLOCK, bufsize, len(info.get("exif", b"")) + 5) - - 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. - import os - import subprocess - tempfile = im._dump() - subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) - try: - os.unlink(file) - except: - pass - -# -------------------------------------------------------------------q- -# Registry stuff - -Image.register_open("JPEG", JpegImageFile, _accept) -Image.register_save("JPEG", _save) - -Image.register_extension("JPEG", ".jfif") -Image.register_extension("JPEG", ".jpe") -Image.register_extension("JPEG", ".jpg") -Image.register_extension("JPEG", ".jpeg") - -Image.register_mime("JPEG", "image/jpeg") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/JpegPresets.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/JpegPresets.py deleted file mode 100644 index e7bec14..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/JpegPresets.py +++ /dev/null @@ -1,241 +0,0 @@ -""" -JPEG quality settings equivalent to the Photoshop settings. - -More presets can be added to the presets dict if needed. - -Can be use when saving JPEG file. - -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.: http://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:1:1 (or 4:2:0?). - -You can get the subsampling of a JPEG with the -`JpegImagePlugin.get_subsampling(im)` function. - - -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.: http://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, -http://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.: http://www.jpegcameras.com/libjpeg/libjpeg-3.html - -""" - -presets = { - 'web_low': {'subsampling': 2, # "4:1:1" - '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:1:1" - '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:1:1" - '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:1:1" - '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] - ]}, -} \ No newline at end of file diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/McIdasImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/McIdasImagePlugin.py deleted file mode 100644 index 3aef10b..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/McIdasImagePlugin.py +++ /dev/null @@ -1,70 +0,0 @@ -# -# 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. -# - -__version__ = "0.2" - -import struct -from PIL 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("MCIDAS", McIdasImageFile, _accept) - -# no default extension diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/MicImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/MicImagePlugin.py deleted file mode 100644 index 84e9628..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/MicImagePlugin.py +++ /dev/null @@ -1,95 +0,0 @@ -# -# 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. -# - - -__version__ = "0.1" - - -from PIL import Image, TiffImagePlugin -from PIL.OleFileIO import * - - -# -# -------------------------------------------------------------------- - - -def _accept(prefix): - return prefix[:8] == MAGIC - -## -# Image plugin for Microsoft's Image Composer file format. - -class MicImageFile(TiffImagePlugin.TiffImageFile): - - format = "MIC" - format_description = "Microsoft Image Composer" - - def _open(self): - - # read the OLE directory and see if this is a likely - # to be a Microsoft Image Composer file - - try: - self.ole = OleFileIO(self.fp) - except IOError: - raise SyntaxError("not an MIC file; invalid OLE file") - - # find ACI subfiles with Image members (maybe not the - # best way to identify MIC files, but what the... ;-) - - self.images = [] - for file in self.ole.listdir(): - if file[1:] and file[0][-4:] == ".ACI" and file[1] == "Image": - self.images.append(file) - - # 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 = 0 - - if len(self.images) > 1: - self.category = Image.CONTAINER - - self.seek(0) - - def seek(self, frame): - - try: - filename = self.images[frame] - except IndexError: - raise EOFError("no such frame") - - self.fp = self.ole.openstream(filename) - - TiffImagePlugin.TiffImageFile._open(self) - - self.frame = frame - - def tell(self): - - return self.frame - -# -# -------------------------------------------------------------------- - -Image.register_open("MIC", MicImageFile, _accept) - -Image.register_extension("MIC", ".mic") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/MpegImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/MpegImagePlugin.py deleted file mode 100644 index 02e6adc..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/MpegImagePlugin.py +++ /dev/null @@ -1,83 +0,0 @@ -# -# 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. -# - -__version__ = "0.1" - -from PIL import Image, ImageFile -from PIL._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("MPEG", MpegImageFile) - -Image.register_extension("MPEG", ".mpg") -Image.register_extension("MPEG", ".mpeg") - -Image.register_mime("MPEG", "video/mpeg") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/MspImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/MspImagePlugin.py deleted file mode 100644 index 743ebe1..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/MspImagePlugin.py +++ /dev/null @@ -1,101 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# 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 -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1995-97. -# -# See the README file for information on usage and redistribution. -# - - -__version__ = "0.1" - -from PIL import Image, ImageFile, _binary - - -# -# read MSP files - -i16 = _binary.i16le - -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 s[:4] not in [b"DanM", b"LinS"]: - raise SyntaxError("not an MSP file") - - # Header checksum - sum = 0 - for i in range(0, 32, 2): - sum = sum ^ i16(s[i:i+2]) - if sum != 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+2*self.size[1], None)] - -# -# write MSP files (uncompressed only) - -o16 = _binary.o16le - -def _save(im, fp, filename): - - if im.mode != "1": - raise IOError("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 - - sum = 0 - for h in header: - sum = sum ^ h - header[12] = sum # 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("MSP", MspImageFile, _accept) -Image.register_save("MSP", _save) - -Image.register_extension("MSP", ".msp") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/OleFileIO-README.md b/Linux_x86_64/lib/python3.4/site-packages/PIL/OleFileIO-README.md deleted file mode 100644 index 11a0e90..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/OleFileIO-README.md +++ /dev/null @@ -1,351 +0,0 @@ -OleFileIO_PL -============ - -[OleFileIO_PL](http://www.decalage.info/python/olefileio) is a Python module to parse and read [Microsoft OLE2 files (also called Structured Storage, Compound File Binary Format or Compound Document File Format)](http://en.wikipedia.org/wiki/Compound_File_Binary_Format), such as Microsoft Office documents, Image Composer and FlashPix files, Outlook messages, StickyNotes, several Microscopy file formats ... - -This is an improved version of the OleFileIO module from [PIL](http://www.pythonware.com/products/pil/index.htm), the excellent Python Imaging Library, created and maintained by Fredrik Lundh. The API is still compatible with PIL, but since 2005 I have improved the internal implementation significantly, with new features, bugfixes and a more robust design. - -As far as I know, this module is now the most complete and robust Python implementation to read MS OLE2 files, portable on several operating systems. (please tell me if you know other similar Python modules) - -OleFileIO_PL can be used as an independent module or with PIL. The goal is to have it integrated into [Pillow](http://python-pillow.github.io/), the friendly fork of PIL. - -OleFileIO\_PL is mostly meant for developers. If you are looking for tools to analyze OLE files or to extract data, then please also check [python-oletools](http://www.decalage.info/python/oletools), which are built upon OleFileIO_PL. - -News ----- - -Follow all updates and news on Twitter: - -- **2014-02-04 v0.30**: now compatible with Python 3.x, thanks to Martin Panter who did most of the hard work. -- 2013-07-24 v0.26: added methods to parse stream/storage timestamps, improved listdir to include storages, fixed parsing of direntry timestamps -- 2013-05-27 v0.25: improved metadata extraction, properties parsing and exception handling, fixed [issue #12](https://bitbucket.org/decalage/olefileio_pl/issue/12/error-when-converting-timestamps-in-ole) -- 2013-05-07 v0.24: new features to extract metadata (get\_metadata method and OleMetadata class), improved getproperties to convert timestamps to Python datetime -- 2012-10-09: published [python-oletools](http://www.decalage.info/python/oletools), a package of analysis tools based on OleFileIO_PL -- 2012-09-11 v0.23: added support for file-like objects, fixed [issue #8](https://bitbucket.org/decalage/olefileio_pl/issue/8/bug-with-file-object) -- 2012-02-17 v0.22: fixed issues #7 (bug in getproperties) and #2 (added close method) -- 2011-10-20: code hosted on bitbucket to ease contributions and bug tracking -- 2010-01-24 v0.21: fixed support for big-endian CPUs, such as PowerPC Macs. -- 2009-12-11 v0.20: small bugfix in OleFileIO.open when filename is not plain str. -- 2009-12-10 v0.19: fixed support for 64 bits platforms (thanks to Ben G. and Martijn for reporting the bug) -- see changelog in source code for more info. - -Download --------- - -The archive is available on [the project page](https://bitbucket.org/decalage/olefileio_pl/downloads). - -Features --------- - -- Parse and read any OLE file such as Microsoft Office 97-2003 legacy document formats (Word .doc, Excel .xls, PowerPoint .ppt, Visio .vsd, Project .mpp), Image Composer and FlashPix files, Outlook messages, StickyNotes, Zeiss AxioVision ZVI files, Olympus FluoView OIB files, ... -- List all the streams and storages contained in an OLE file -- Open streams as files -- Parse and read property streams, containing metadata of the file -- Portable, pure Python module, no dependency - - -Main improvements over the original version of OleFileIO in PIL: ----------------------------------------------------------------- - -- Compatible with Python 3.x and 2.6+ -- Many bug fixes -- Support for files larger than 6.8MB -- Support for 64 bits platforms and big-endian CPUs -- Robust: many checks to detect malformed files -- Runtime option to choose if malformed files should be parsed or raise exceptions -- Improved API -- Metadata extraction, stream/storage timestamps (e.g. for document forensics) -- Can open file-like objects -- Added setup.py and install.bat to ease installation -- More convenient slash-based syntax for stream paths - - - -How to use this module ----------------------- - -OleFileIO_PL can be used as an independent module or with PIL. The main functions and methods are explained below. - -For more information, see also the file **OleFileIO_PL.html**, sample code at the end of the module itself, and docstrings within the code. - -### About the structure of OLE files ### - -An OLE file can be seen as a mini file system or a Zip archive: It contains **streams** of data that look like files embedded within the OLE file. Each stream has a name. For example, the main stream of a MS Word document containing its text is named "WordDocument". - -An OLE file can also contain **storages**. A storage is a folder that contains streams or other storages. For example, a MS Word document with VBA macros has a storage called "Macros". - -Special streams can contain **properties**. A property is a specific value that can be used to store information such as the metadata of a document (title, author, creation date, etc). Property stream names usually start with the character '\x05'. - -For example, a typical MS Word document may look like this: - - \x05DocumentSummaryInformation (stream) - \x05SummaryInformation (stream) - WordDocument (stream) - Macros (storage) - PROJECT (stream) - PROJECTwm (stream) - VBA (storage) - Module1 (stream) - ThisDocument (stream) - _VBA_PROJECT (stream) - dir (stream) - ObjectPool (storage) - - - -### Import OleFileIO_PL ### - - :::python - import OleFileIO_PL - -As of version 0.30, the code has been changed to be compatible with Python 3.x. As a consequence, compatibility with Python 2.5 or older is not provided anymore. However, a copy of v0.26 is available as OleFileIO_PL2.py. If your application needs to be compatible with Python 2.5 or older, you may use the following code to load the old version when needed: - - :::python - try: - import OleFileIO_PL - except: - import OleFileIO_PL2 as OleFileIO_PL - -If you think OleFileIO_PL should stay compatible with Python 2.5 or older, please [contact me](http://decalage.info/contact). - - -### Test if a file is an OLE container ### - -Use isOleFile to check if the first bytes of the file contain the Magic for OLE files, before opening it. isOleFile returns True if it is an OLE file, False otherwise (new in v0.16). - - :::python - assert OleFileIO_PL.isOleFile('myfile.doc') - - -### Open an OLE file from disk ### - -Create an OleFileIO object with the file path as parameter: - - :::python - ole = OleFileIO_PL.OleFileIO('myfile.doc') - -### Open an OLE file from a file-like object ### - -This is useful if the file is not on disk, e.g. already stored in a string or as a file-like object. - - :::python - ole = OleFileIO_PL.OleFileIO(f) - -For example the code below reads a file into a string, then uses BytesIO to turn it into a file-like object. - - :::python - data = open('myfile.doc', 'rb').read() - f = io.BytesIO(data) # or StringIO.StringIO for Python 2.x - ole = OleFileIO_PL.OleFileIO(f) - -### How to handle malformed OLE files ### - -By default, the parser is configured to be as robust and permissive as possible, allowing to parse most malformed OLE files. Only fatal errors will raise an exception. It is possible to tell the parser to be more strict in order to raise exceptions for files that do not fully conform to the OLE specifications, using the raise_defect option (new in v0.14): - - :::python - ole = OleFileIO_PL.OleFileIO('myfile.doc', raise_defects=DEFECT_INCORRECT) - -When the parsing is done, the list of non-fatal issues detected is available as a list in the parsing_issues attribute of the OleFileIO object (new in 0.25): - - :::python - print('Non-fatal issues raised during parsing:') - if ole.parsing_issues: - for exctype, msg in ole.parsing_issues: - print('- %s: %s' % (exctype.__name__, msg)) - else: - print('None') - - -### Syntax for stream and storage path ### - -Two different syntaxes are allowed for methods that need or return the path of streams and storages: - -1) Either a **list of strings** including all the storages from the root up to the stream/storage name. For example a stream called "WordDocument" at the root will have ['WordDocument'] as full path. A stream called "ThisDocument" located in the storage "Macros/VBA" will be ['Macros', 'VBA', 'ThisDocument']. This is the original syntax from PIL. While hard to read and not very convenient, this syntax works in all cases. - -2) Or a **single string with slashes** to separate storage and stream names (similar to the Unix path syntax). The previous examples would be 'WordDocument' and 'Macros/VBA/ThisDocument'. This syntax is easier, but may fail if a stream or storage name contains a slash. (new in v0.15) - -Both are case-insensitive. - -Switching between the two is easy: - - :::python - slash_path = '/'.join(list_path) - list_path = slash_path.split('/') - - -### Get the list of streams ### - -listdir() returns a list of all the streams contained in the OLE file, including those stored in storages. Each stream is listed itself as a list, as described above. - - :::python - print(ole.listdir()) - -Sample result: - - :::python - [['\x01CompObj'], ['\x05DocumentSummaryInformation'], ['\x05SummaryInformation'] - , ['1Table'], ['Macros', 'PROJECT'], ['Macros', 'PROJECTwm'], ['Macros', 'VBA', - 'Module1'], ['Macros', 'VBA', 'ThisDocument'], ['Macros', 'VBA', '_VBA_PROJECT'] - , ['Macros', 'VBA', 'dir'], ['ObjectPool'], ['WordDocument']] - -As an option it is possible to choose if storages should also be listed, with or without streams (new in v0.26): - - :::python - ole.listdir (streams=False, storages=True) - - -### Test if known streams/storages exist: ### - -exists(path) checks if a given stream or storage exists in the OLE file (new in v0.16). - - :::python - if ole.exists('worddocument'): - print("This is a Word document.") - if ole.exists('macros/vba'): - print("This document seems to contain VBA macros.") - - -### Read data from a stream ### - -openstream(path) opens a stream as a file-like object. - -The following example extracts the "Pictures" stream from a PPT file: - - :::python - pics = ole.openstream('Pictures') - data = pics.read() - - -### Get information about a stream/storage ### - -Several methods can provide the size, type and timestamps of a given stream/storage: - -get_size(path) returns the size of a stream in bytes (new in v0.16): - - :::python - s = ole.get_size('WordDocument') - -get_type(path) returns the type of a stream/storage, as one of the following constants: STGTY\_STREAM for a stream, STGTY\_STORAGE for a storage, STGTY\_ROOT for the root entry, and False for a non existing path (new in v0.15). - - :::python - t = ole.get_type('WordDocument') - -get\_ctime(path) and get\_mtime(path) return the creation and modification timestamps of a stream/storage, as a Python datetime object with UTC timezone. Please note that these timestamps are only present if the application that created the OLE file explicitly stored them, which is rarely the case. When not present, these methods return None (new in v0.26). - - :::python - c = ole.get_ctime('WordDocument') - m = ole.get_mtime('WordDocument') - -The root storage is a special case: You can get its creation and modification timestamps using the OleFileIO.root attribute (new in v0.26): - - :::python - c = ole.root.getctime() - m = ole.root.getmtime() - -### Extract metadata ### - -get_metadata() will check if standard property streams exist, parse all the properties they contain, and return an OleMetadata object with the found properties as attributes (new in v0.24). - - :::python - meta = ole.get_metadata() - print('Author:', meta.author) - print('Title:', meta.title) - print('Creation date:', meta.create_time) - # print all metadata: - meta.dump() - -Available attributes include: - - codepage, title, subject, author, keywords, comments, template, - last_saved_by, revision_number, total_edit_time, last_printed, create_time, - last_saved_time, num_pages, num_words, num_chars, thumbnail, - creating_application, security, codepage_doc, category, presentation_target, - bytes, lines, paragraphs, slides, notes, hidden_slides, mm_clips, - scale_crop, heading_pairs, titles_of_parts, manager, company, links_dirty, - chars_with_spaces, unused, shared_doc, link_base, hlinks, hlinks_changed, - version, dig_sig, content_type, content_status, language, doc_version - -See the source code of the OleMetadata class for more information. - - -### Parse a property stream ### - -get\_properties(path) can be used to parse any property stream that is not handled by get\_metadata. It returns a dictionary indexed by integers. Each integer is the index of the property, pointing to its value. For example in the standard property stream '\x05SummaryInformation', the document title is property #2, and the subject is #3. - - :::python - p = ole.getproperties('specialprops') - -By default as in the original PIL version, timestamp properties are converted into a number of seconds since Jan 1,1601. With the option convert\_time, you can obtain more convenient Python datetime objects (UTC timezone). If some time properties should not be converted (such as total editing time in '\x05SummaryInformation'), the list of indexes can be passed as no_conversion (new in v0.25): - - :::python - p = ole.getproperties('specialprops', convert_time=True, no_conversion=[10]) - - -### Close the OLE file ### - -Unless your application is a simple script that terminates after processing an OLE file, do not forget to close each OleFileIO object after parsing to close the file on disk. (new in v0.22) - - :::python - ole.close() - -### Use OleFileIO_PL as a script ### - -OleFileIO_PL can also be used as a script from the command-line to display the structure of an OLE file and its metadata, for example: - - OleFileIO_PL.py myfile.doc - -You can use the option -c to check that all streams can be read fully, and -d to generate very verbose debugging information. - -## Real-life examples ## - -A real-life example: [using OleFileIO_PL for malware analysis and forensics](http://blog.gregback.net/2011/03/using-remnux-for-forensic-puzzle-6/). - -See also [this paper](https://computer-forensics.sans.org/community/papers/gcfa/grow-forensic-tools-taxonomy-python-libraries-helpful-forensic-analysis_6879) about python tools for forensics, which features OleFileIO_PL. - -About Python 2 and 3 --------------------- - -OleFileIO\_PL used to support only Python 2.x. As of version 0.30, the code has been changed to be compatible with Python 3.x. As a consequence, compatibility with Python 2.5 or older is not provided anymore. However, a copy of v0.26 is available as OleFileIO_PL2.py. See above the "import" section for a workaround. - -If you think OleFileIO_PL should stay compatible with Python 2.5 or older, please [contact me](http://decalage.info/contact). - -How to contribute ------------------ - -The code is available in [a Mercurial repository on bitbucket](https://bitbucket.org/decalage/olefileio_pl). You may use it to submit enhancements or to report any issue. - -If you would like to help us improve this module, or simply provide feedback, please [contact me](http://decalage.info/contact). You can help in many ways: - -- test this module on different platforms / Python versions -- find and report bugs -- improve documentation, code samples, docstrings -- write unittest test cases -- provide tricky malformed files - -How to report bugs ------------------- - -To report a bug, for example a normal file which is not parsed correctly, please use the [issue reporting page](https://bitbucket.org/decalage/olefileio_pl/issues?status=new&status=open), or if you prefer to do it privately, use this [contact form](http://decalage.info/contact). Please provide all the information about the context and how to reproduce the bug. - -If possible please join the debugging output of OleFileIO_PL. For this, launch the following command : - - OleFileIO_PL.py -d -c file >debug.txt - -License -------- - -OleFileIO_PL is open-source. - -OleFileIO_PL changes are Copyright (c) 2005-2014 by Philippe Lagadec. - -The Python Imaging Library (PIL) is - -- Copyright (c) 1997-2005 by Secret Labs AB - -- Copyright (c) 1995-2005 by Fredrik Lundh - -By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, understood, and will comply with the following terms and conditions: - -Permission to use, copy, modify, and distribute this software and its associated documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appears in all copies, and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Secret Labs AB or the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. - -SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/OleFileIO.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/OleFileIO.py deleted file mode 100644 index 8a3c77b..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/OleFileIO.py +++ /dev/null @@ -1,2077 +0,0 @@ -#!/usr/local/bin/python -# -*- coding: latin-1 -*- -""" -OleFileIO_PL: -Module to read Microsoft OLE2 files (also called Structured Storage or -Microsoft Compound Document File Format), such as Microsoft Office -documents, Image Composer and FlashPix files, Outlook messages, ... -This version is compatible with Python 2.6+ and 3.x - -version 0.30 2014-02-04 Philippe Lagadec - http://www.decalage.info - -Project website: http://www.decalage.info/python/olefileio - -Improved version of the OleFileIO module from PIL library v1.1.6 -See: http://www.pythonware.com/products/pil/index.htm - -The Python Imaging Library (PIL) is - Copyright (c) 1997-2005 by Secret Labs AB - Copyright (c) 1995-2005 by Fredrik Lundh -OleFileIO_PL changes are Copyright (c) 2005-2014 by Philippe Lagadec - -See source code and LICENSE.txt for information on usage and redistribution. - -WARNING: THIS IS (STILL) WORK IN PROGRESS. -""" - -# Starting with OleFileIO_PL v0.30, only Python 2.6+ and 3.x is supported -# This import enables print() as a function rather than a keyword -# (main requirement to be compatible with Python 3.x) -# The comment on the line below should be printed on Python 2.5 or older: -from __future__ import print_function # This version of OleFileIO_PL requires Python 2.6+ or 3.x. - - -__author__ = "Philippe Lagadec, Fredrik Lundh (Secret Labs AB)" -__date__ = "2014-02-04" -__version__ = '0.30' - -#--- LICENSE ------------------------------------------------------------------ - -# OleFileIO_PL is an improved version of the OleFileIO module from the -# Python Imaging Library (PIL). - -# OleFileIO_PL changes are Copyright (c) 2005-2014 by Philippe Lagadec -# -# The Python Imaging Library (PIL) is -# Copyright (c) 1997-2005 by Secret Labs AB -# Copyright (c) 1995-2005 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its associated -# documentation, you agree that you have read, understood, and will comply with -# the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and its -# associated documentation for any purpose and without fee is hereby granted, -# provided that the above copyright notice appears in all copies, and that both -# that copyright notice and this permission notice appear in supporting -# documentation, and that the name of Secret Labs AB or the author(s) not be used -# in advertising or publicity pertaining to distribution of the software -# without specific, written prior permission. -# -# SECRET LABS AB AND THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -# IN NO EVENT SHALL SECRET LABS AB OR THE AUTHORS BE LIABLE FOR ANY SPECIAL, -# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. - -#----------------------------------------------------------------------------- -# CHANGELOG: (only OleFileIO_PL changes compared to PIL 1.1.6) -# 2005-05-11 v0.10 PL: - a few fixes for Python 2.4 compatibility -# (all changes flagged with [PL]) -# 2006-02-22 v0.11 PL: - a few fixes for some Office 2003 documents which raise -# exceptions in _OleStream.__init__() -# 2006-06-09 v0.12 PL: - fixes for files above 6.8MB (DIFAT in loadfat) -# - added some constants -# - added header values checks -# - added some docstrings -# - getsect: bugfix in case sectors >512 bytes -# - getsect: added conformity checks -# - DEBUG_MODE constant to activate debug display -# 2007-09-04 v0.13 PL: - improved/translated (lots of) comments -# - updated license -# - converted tabs to 4 spaces -# 2007-11-19 v0.14 PL: - added OleFileIO._raise_defect() to adapt sensitivity -# - improved _unicode() to use Python 2.x unicode support -# - fixed bug in _OleDirectoryEntry -# 2007-11-25 v0.15 PL: - added safety checks to detect FAT loops -# - fixed _OleStream which didn't check stream size -# - added/improved many docstrings and comments -# - moved helper functions _unicode and _clsid out of -# OleFileIO class -# - improved OleFileIO._find() to add Unix path syntax -# - OleFileIO._find() is now case-insensitive -# - added get_type() and get_rootentry_name() -# - rewritten loaddirectory and _OleDirectoryEntry -# 2007-11-27 v0.16 PL: - added _OleDirectoryEntry.kids_dict -# - added detection of duplicate filenames in storages -# - added detection of duplicate references to streams -# - added get_size() and exists() to _OleDirectoryEntry -# - added isOleFile to check header before parsing -# - added __all__ list to control public keywords in pydoc -# 2007-12-04 v0.17 PL: - added _load_direntry to fix a bug in loaddirectory -# - improved _unicode(), added workarounds for Python <2.3 -# - added set_debug_mode and -d option to set debug mode -# - fixed bugs in OleFileIO.open and _OleDirectoryEntry -# - added safety check in main for large or binary -# properties -# - allow size>0 for storages for some implementations -# 2007-12-05 v0.18 PL: - fixed several bugs in handling of FAT, MiniFAT and -# streams -# - added option '-c' in main to check all streams -# 2009-12-10 v0.19 PL: - bugfix for 32 bit arrays on 64 bits platforms -# (thanks to Ben G. and Martijn for reporting the bug) -# 2009-12-11 v0.20 PL: - bugfix in OleFileIO.open when filename is not plain str -# 2010-01-22 v0.21 PL: - added support for big-endian CPUs such as PowerPC Macs -# 2012-02-16 v0.22 PL: - fixed bug in getproperties, patch by chuckleberryfinn -# (https://bitbucket.org/decalage/olefileio_pl/issue/7) -# - added close method to OleFileIO (fixed issue #2) -# 2012-07-25 v0.23 PL: - added support for file-like objects (patch by mete0r_kr) -# 2013-05-05 v0.24 PL: - getproperties: added conversion from filetime to python -# datetime -# - main: displays properties with date format -# - new class OleMetadata to parse standard properties -# - added get_metadata method -# 2013-05-07 v0.24 PL: - a few improvements in OleMetadata -# 2013-05-24 v0.25 PL: - getproperties: option to not convert some timestamps -# - OleMetaData: total_edit_time is now a number of seconds, -# not a timestamp -# - getproperties: added support for VT_BOOL, VT_INT, V_UINT -# - getproperties: filter out null chars from strings -# - getproperties: raise non-fatal defects instead of -# exceptions when properties cannot be parsed properly -# 2013-05-27 PL: - getproperties: improved exception handling -# - _raise_defect: added option to set exception type -# - all non-fatal issues are now recorded, and displayed -# when run as a script -# 2013-07-11 v0.26 PL: - added methods to get modification and creation times -# of a directory entry or a storage/stream -# - fixed parsing of direntry timestamps -# 2013-07-24 PL: - new options in listdir to list storages and/or streams -# 2014-02-04 v0.30 PL: - upgraded code to support Python 3.x by Martin Panter -# - several fixes for Python 2.6 (xrange, MAGIC) -# - reused i32 from Pillow's _binary - -#----------------------------------------------------------------------------- -# TODO (for version 1.0): -# + isOleFile should accept file-like objects like open -# + fix how all the methods handle unicode str and/or bytes as arguments -# + add path attrib to _OleDirEntry, set it once and for all in init or -# append_kids (then listdir/_list can be simplified) -# - TESTS with Linux, MacOSX, Python 1.5.2, various files, PIL, ... -# - add underscore to each private method, to avoid their display in -# pydoc/epydoc documentation - Remove it for classes to be documented -# - replace all raised exceptions with _raise_defect (at least in OleFileIO) -# - merge code from _OleStream and OleFileIO.getsect to read sectors -# (maybe add a class for FAT and MiniFAT ?) -# - add method to check all streams (follow sectors chains without storing all -# stream in memory, and report anomalies) -# - use _OleDirectoryEntry.kids_dict to improve _find and _list ? -# - fix Unicode names handling (find some way to stay compatible with Py1.5.2) -# => if possible avoid converting names to Latin-1 -# - review DIFAT code: fix handling of DIFSECT blocks in FAT (not stop) -# - rewrite OleFileIO.getproperties -# - improve docstrings to show more sample uses -# - see also original notes and FIXME below -# - remove all obsolete FIXMEs -# - OleMetadata: fix version attrib according to -# http://msdn.microsoft.com/en-us/library/dd945671%28v=office.12%29.aspx - -# IDEAS: -# - in OleFileIO._open and _OleStream, use size=None instead of 0x7FFFFFFF for -# streams with unknown size -# - use arrays of int instead of long integers for FAT/MiniFAT, to improve -# performance and reduce memory usage ? (possible issue with values >2^31) -# - provide tests with unittest (may need write support to create samples) -# - move all debug code (and maybe dump methods) to a separate module, with -# a class which inherits OleFileIO ? -# - fix docstrings to follow epydoc format -# - add support for 4K sectors ? -# - add support for big endian byte order ? -# - create a simple OLE explorer with wxPython - -# FUTURE EVOLUTIONS to add write support: -# 1) add ability to write a stream back on disk from BytesIO (same size, no -# change in FAT/MiniFAT). -# 2) rename a stream/storage if it doesn't change the RB tree -# 3) use rbtree module to update the red-black tree + any rename -# 4) remove a stream/storage: free sectors in FAT/MiniFAT -# 5) allocate new sectors in FAT/MiniFAT -# 6) create new storage/stream -#----------------------------------------------------------------------------- - -# -# THIS IS WORK IN PROGRESS -# -# The Python Imaging Library -# $Id$ -# -# stuff to deal with OLE2 Structured Storage files. this module is -# used by PIL to read Image Composer and FlashPix files, but can also -# be used to read other files of this type. -# -# History: -# 1997-01-20 fl Created -# 1997-01-22 fl Fixed 64-bit portability quirk -# 2003-09-09 fl Fixed typo in OleFileIO.loadfat (noted by Daniel Haertle) -# 2004-02-29 fl Changed long hex constants to signed integers -# -# Notes: -# FIXME: sort out sign problem (eliminate long hex constants) -# FIXME: change filename to use "a/b/c" instead of ["a", "b", "c"] -# FIXME: provide a glob mechanism function (using fnmatchcase) -# -# Literature: -# -# "FlashPix Format Specification, Appendix A", Kodak and Microsoft, -# September 1996. -# -# Quotes: -# -# "If this document and functionality of the Software conflict, -# the actual functionality of the Software represents the correct -# functionality" -- Microsoft, in the OLE format specification -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1997. -# -# See the README file for information on usage and redistribution. -# - -#------------------------------------------------------------------------------ - - -import io -import sys -import struct, array, os.path, datetime - -#[PL] Define explicitly the public API to avoid private objects in pydoc: -__all__ = ['OleFileIO', 'isOleFile', 'MAGIC'] - -# For Python 3.x, need to redefine long as int: -if str is not bytes: - long = int - -# Need to make sure we use xrange both on Python 2 and 3.x: -try: - # on Python 2 we need xrange: - iterrange = xrange -except: - # no xrange, for Python 3 it was renamed as range: - iterrange = range - -#[PL] workaround to fix an issue with array item size on 64 bits systems: -if array.array('L').itemsize == 4: - # on 32 bits platforms, long integers in an array are 32 bits: - UINT32 = 'L' -elif array.array('I').itemsize == 4: - # on 64 bits platforms, integers in an array are 32 bits: - UINT32 = 'I' -else: - raise ValueError('Need to fix a bug with 32 bit arrays, please contact author...') - - -#[PL] These workarounds were inspired from the Path module -# (see http://www.jorendorff.com/articles/python/path/) -#TODO: test with old Python versions - -# Pre-2.3 workaround for basestring. -try: - basestring -except NameError: - try: - # is Unicode supported (Python >2.0 or >1.6 ?) - basestring = (str, unicode) - except NameError: - basestring = str - -#[PL] Experimental setting: if True, OLE filenames will be kept in Unicode -# if False (default PIL behaviour), all filenames are converted to Latin-1. -KEEP_UNICODE_NAMES = False - -#[PL] DEBUG display mode: False by default, use set_debug_mode() or "-d" on -# command line to change it. -DEBUG_MODE = False -def debug_print(msg): - print(msg) -def debug_pass(msg): - pass -debug = debug_pass - -def set_debug_mode(debug_mode): - """ - Set debug mode on or off, to control display of debugging messages. - mode: True or False - """ - global DEBUG_MODE, debug - DEBUG_MODE = debug_mode - if debug_mode: - debug = debug_print - else: - debug = debug_pass - -MAGIC = b'\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1' - -#[PL]: added constants for Sector IDs (from AAF specifications) -MAXREGSECT = 0xFFFFFFFA; # maximum SECT -DIFSECT = 0xFFFFFFFC; # (-4) denotes a DIFAT sector in a FAT -FATSECT = 0xFFFFFFFD; # (-3) denotes a FAT sector in a FAT -ENDOFCHAIN = 0xFFFFFFFE; # (-2) end of a virtual stream chain -FREESECT = 0xFFFFFFFF; # (-1) unallocated sector - -#[PL]: added constants for Directory Entry IDs (from AAF specifications) -MAXREGSID = 0xFFFFFFFA; # maximum directory entry ID -NOSTREAM = 0xFFFFFFFF; # (-1) unallocated directory entry - -#[PL] object types in storage (from AAF specifications) -STGTY_EMPTY = 0 # empty directory entry (according to OpenOffice.org doc) -STGTY_STORAGE = 1 # element is a storage object -STGTY_STREAM = 2 # element is a stream object -STGTY_LOCKBYTES = 3 # element is an ILockBytes object -STGTY_PROPERTY = 4 # element is an IPropertyStorage object -STGTY_ROOT = 5 # element is a root storage - - -# -# -------------------------------------------------------------------- -# property types - -VT_EMPTY=0; VT_NULL=1; VT_I2=2; VT_I4=3; VT_R4=4; VT_R8=5; VT_CY=6; -VT_DATE=7; VT_BSTR=8; VT_DISPATCH=9; VT_ERROR=10; VT_BOOL=11; -VT_VARIANT=12; VT_UNKNOWN=13; VT_DECIMAL=14; VT_I1=16; VT_UI1=17; -VT_UI2=18; VT_UI4=19; VT_I8=20; VT_UI8=21; VT_INT=22; VT_UINT=23; -VT_VOID=24; VT_HRESULT=25; VT_PTR=26; VT_SAFEARRAY=27; VT_CARRAY=28; -VT_USERDEFINED=29; VT_LPSTR=30; VT_LPWSTR=31; VT_FILETIME=64; -VT_BLOB=65; VT_STREAM=66; VT_STORAGE=67; VT_STREAMED_OBJECT=68; -VT_STORED_OBJECT=69; VT_BLOB_OBJECT=70; VT_CF=71; VT_CLSID=72; -VT_VECTOR=0x1000; - -# map property id to name (for debugging purposes) - -VT = {} -for keyword, var in list(vars().items()): - if keyword[:3] == "VT_": - VT[var] = keyword - -# -# -------------------------------------------------------------------- -# Some common document types (root.clsid fields) - -WORD_CLSID = "00020900-0000-0000-C000-000000000046" -#TODO: check Excel, PPT, ... - -#[PL]: Defect levels to classify parsing errors - see OleFileIO._raise_defect() -DEFECT_UNSURE = 10 # a case which looks weird, but not sure it's a defect -DEFECT_POTENTIAL = 20 # a potential defect -DEFECT_INCORRECT = 30 # an error according to specifications, but parsing - # can go on -DEFECT_FATAL = 40 # an error which cannot be ignored, parsing is - # impossible - -#[PL] add useful constants to __all__: -for key in list(vars().keys()): - if key.startswith('STGTY_') or key.startswith('DEFECT_'): - __all__.append(key) - - -#--- FUNCTIONS ---------------------------------------------------------------- - -def isOleFile (filename): - """ - Test if file is an OLE container (according to its header). - filename: file name or path (str, unicode) - return: True if OLE, False otherwise. - """ - f = open(filename, 'rb') - header = f.read(len(MAGIC)) - if header == MAGIC: - return True - else: - return False - - -if bytes is str: - # version for Python 2.x - def i8(c): - return ord(c) -else: - # version for Python 3.x - def i8(c): - return c if c.__class__ is int else c[0] - - -#TODO: replace i16 and i32 with more readable struct.unpack equivalent? - -def i16(c, o = 0): - """ - Converts a 2-bytes (16 bits) string to an integer. - - c: string containing bytes to convert - o: offset of bytes to convert in string - """ - return i8(c[o]) | (i8(c[o+1])<<8) - - -def i32(c, o = 0): - """ - Converts a 4-bytes (32 bits) string to an integer. - - c: string containing bytes to convert - o: offset of bytes to convert in string - """ -## return int(ord(c[o])+(ord(c[o+1])<<8)+(ord(c[o+2])<<16)+(ord(c[o+3])<<24)) -## # [PL]: added int() because "<<" gives long int since Python 2.4 - # copied from Pillow's _binary: - return i8(c[o]) | (i8(c[o+1])<<8) | (i8(c[o+2])<<16) | (i8(c[o+3])<<24) - - -def _clsid(clsid): - """ - Converts a CLSID to a human-readable string. - clsid: string of length 16. - """ - assert len(clsid) == 16 - # if clsid is only made of null bytes, return an empty string: - # (PL: why not simply return the string with zeroes?) - if not clsid.strip(b"\0"): - return "" - return (("%08X-%04X-%04X-%02X%02X-" + "%02X" * 6) % - ((i32(clsid, 0), i16(clsid, 4), i16(clsid, 6)) + - tuple(map(i8, clsid[8:16])))) - - - -# UNICODE support: -# (necessary to handle storages/streams names which use Unicode) - -def _unicode(s, errors='replace'): - """ - Map unicode string to Latin 1. (Python with Unicode support) - - s: UTF-16LE unicode string to convert to Latin-1 - errors: 'replace', 'ignore' or 'strict'. - """ - #TODO: test if it OleFileIO works with Unicode strings, instead of - # converting to Latin-1. - try: - # First the string is converted to plain Unicode: - # (assuming it is encoded as UTF-16 little-endian) - u = s.decode('UTF-16LE', errors) - if bytes is not str or KEEP_UNICODE_NAMES: - return u - else: - # Second the unicode string is converted to Latin-1 - return u.encode('latin_1', errors) - except: - # there was an error during Unicode to Latin-1 conversion: - raise IOError('incorrect Unicode name') - - -def filetime2datetime(filetime): - """ - convert FILETIME (64 bits int) to Python datetime.datetime - """ - # TODO: manage exception when microseconds is too large - # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ - _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) - #debug('timedelta days=%d' % (filetime//(10*1000000*3600*24))) - return _FILETIME_null_date + datetime.timedelta(microseconds=filetime//10) - - - -#=== CLASSES ================================================================== - -class OleMetadata: - """ - class to parse and store metadata from standard properties of OLE files. - - Available attributes: - codepage, title, subject, author, keywords, comments, template, - last_saved_by, revision_number, total_edit_time, last_printed, create_time, - last_saved_time, num_pages, num_words, num_chars, thumbnail, - creating_application, security, codepage_doc, category, presentation_target, - bytes, lines, paragraphs, slides, notes, hidden_slides, mm_clips, - scale_crop, heading_pairs, titles_of_parts, manager, company, links_dirty, - chars_with_spaces, unused, shared_doc, link_base, hlinks, hlinks_changed, - version, dig_sig, content_type, content_status, language, doc_version - - Note: an attribute is set to None when not present in the properties of the - OLE file. - - References for SummaryInformation stream: - - http://msdn.microsoft.com/en-us/library/dd942545.aspx - - http://msdn.microsoft.com/en-us/library/dd925819%28v=office.12%29.aspx - - http://msdn.microsoft.com/en-us/library/windows/desktop/aa380376%28v=vs.85%29.aspx - - http://msdn.microsoft.com/en-us/library/aa372045.aspx - - http://sedna-soft.de/summary-information-stream/ - - http://poi.apache.org/apidocs/org/apache/poi/hpsf/SummaryInformation.html - - References for DocumentSummaryInformation stream: - - http://msdn.microsoft.com/en-us/library/dd945671%28v=office.12%29.aspx - - http://msdn.microsoft.com/en-us/library/windows/desktop/aa380374%28v=vs.85%29.aspx - - http://poi.apache.org/apidocs/org/apache/poi/hpsf/DocumentSummaryInformation.html - - new in version 0.25 - """ - - # attribute names for SummaryInformation stream properties: - # (ordered by property id, starting at 1) - SUMMARY_ATTRIBS = ['codepage', 'title', 'subject', 'author', 'keywords', 'comments', - 'template', 'last_saved_by', 'revision_number', 'total_edit_time', - 'last_printed', 'create_time', 'last_saved_time', 'num_pages', - 'num_words', 'num_chars', 'thumbnail', 'creating_application', - 'security'] - - # attribute names for DocumentSummaryInformation stream properties: - # (ordered by property id, starting at 1) - DOCSUM_ATTRIBS = ['codepage_doc', 'category', 'presentation_target', 'bytes', 'lines', 'paragraphs', - 'slides', 'notes', 'hidden_slides', 'mm_clips', - 'scale_crop', 'heading_pairs', 'titles_of_parts', 'manager', - 'company', 'links_dirty', 'chars_with_spaces', 'unused', 'shared_doc', - 'link_base', 'hlinks', 'hlinks_changed', 'version', 'dig_sig', - 'content_type', 'content_status', 'language', 'doc_version'] - - def __init__(self): - """ - Constructor for OleMetadata - All attributes are set to None by default - """ - # properties from SummaryInformation stream - self.codepage = None - self.title = None - self.subject = None - self.author = None - self.keywords = None - self.comments = None - self.template = None - self.last_saved_by = None - self.revision_number = None - self.total_edit_time = None - self.last_printed = None - self.create_time = None - self.last_saved_time = None - self.num_pages = None - self.num_words = None - self.num_chars = None - self.thumbnail = None - self.creating_application = None - self.security = None - # properties from DocumentSummaryInformation stream - self.codepage_doc = None - self.category = None - self.presentation_target = None - self.bytes = None - self.lines = None - self.paragraphs = None - self.slides = None - self.notes = None - self.hidden_slides = None - self.mm_clips = None - self.scale_crop = None - self.heading_pairs = None - self.titles_of_parts = None - self.manager = None - self.company = None - self.links_dirty = None - self.chars_with_spaces = None - self.unused = None - self.shared_doc = None - self.link_base = None - self.hlinks = None - self.hlinks_changed = None - self.version = None - self.dig_sig = None - self.content_type = None - self.content_status = None - self.language = None - self.doc_version = None - - - def parse_properties(self, olefile): - """ - Parse standard properties of an OLE file, from the streams - "\x05SummaryInformation" and "\x05DocumentSummaryInformation", - if present. - Properties are converted to strings, integers or python datetime objects. - If a property is not present, its value is set to None. - """ - # first set all attributes to None: - for attrib in (self.SUMMARY_ATTRIBS + self.DOCSUM_ATTRIBS): - setattr(self, attrib, None) - if olefile.exists("\x05SummaryInformation"): - # get properties from the stream: - # (converting timestamps to python datetime, except total_edit_time, - # which is property #10) - props = olefile.getproperties("\x05SummaryInformation", - convert_time=True, no_conversion=[10]) - # store them into this object's attributes: - for i in range(len(self.SUMMARY_ATTRIBS)): - # ids for standards properties start at 0x01, until 0x13 - value = props.get(i+1, None) - setattr(self, self.SUMMARY_ATTRIBS[i], value) - if olefile.exists("\x05DocumentSummaryInformation"): - # get properties from the stream: - props = olefile.getproperties("\x05DocumentSummaryInformation", - convert_time=True) - # store them into this object's attributes: - for i in range(len(self.DOCSUM_ATTRIBS)): - # ids for standards properties start at 0x01, until 0x13 - value = props.get(i+1, None) - setattr(self, self.DOCSUM_ATTRIBS[i], value) - - def dump(self): - """ - Dump all metadata, for debugging purposes. - """ - print('Properties from SummaryInformation stream:') - for prop in self.SUMMARY_ATTRIBS: - value = getattr(self, prop) - print('- %s: %s' % (prop, repr(value))) - print('Properties from DocumentSummaryInformation stream:') - for prop in self.DOCSUM_ATTRIBS: - value = getattr(self, prop) - print('- %s: %s' % (prop, repr(value))) - - -#--- _OleStream --------------------------------------------------------------- - -class _OleStream(io.BytesIO): - """ - OLE2 Stream - - Returns a read-only file object which can be used to read - the contents of a OLE stream (instance of the BytesIO class). - To open a stream, use the openstream method in the OleFile class. - - This function can be used with either ordinary streams, - or ministreams, depending on the offset, sectorsize, and - fat table arguments. - - Attributes: - - size: actual size of data stream, after it was opened. - """ - - # FIXME: should store the list of sects obtained by following - # the fat chain, and load new sectors on demand instead of - # loading it all in one go. - - def __init__(self, fp, sect, size, offset, sectorsize, fat, filesize): - """ - Constructor for _OleStream class. - - fp : file object, the OLE container or the MiniFAT stream - sect : sector index of first sector in the stream - size : total size of the stream - offset : offset in bytes for the first FAT or MiniFAT sector - sectorsize: size of one sector - fat : array/list of sector indexes (FAT or MiniFAT) - filesize : size of OLE file (for debugging) - return : a BytesIO instance containing the OLE stream - """ - debug('_OleStream.__init__:') - debug(' sect=%d (%X), size=%d, offset=%d, sectorsize=%d, len(fat)=%d, fp=%s' - %(sect,sect,size,offset,sectorsize,len(fat), repr(fp))) - #[PL] To detect malformed documents with FAT loops, we compute the - # expected number of sectors in the stream: - unknown_size = False - if size==0x7FFFFFFF: - # this is the case when called from OleFileIO._open(), and stream - # size is not known in advance (for example when reading the - # Directory stream). Then we can only guess maximum size: - size = len(fat)*sectorsize - # and we keep a record that size was unknown: - unknown_size = True - debug(' stream with UNKNOWN SIZE') - nb_sectors = (size + (sectorsize-1)) // sectorsize - debug('nb_sectors = %d' % nb_sectors) - # This number should (at least) be less than the total number of - # sectors in the given FAT: - if nb_sectors > len(fat): - raise IOError('malformed OLE document, stream too large') - # optimization(?): data is first a list of strings, and join() is called - # at the end to concatenate all in one string. - # (this may not be really useful with recent Python versions) - data = [] - # if size is zero, then first sector index should be ENDOFCHAIN: - if size == 0 and sect != ENDOFCHAIN: - debug('size == 0 and sect != ENDOFCHAIN:') - raise IOError('incorrect OLE sector index for empty stream') - #[PL] A fixed-length for loop is used instead of an undefined while - # loop to avoid DoS attacks: - for i in range(nb_sectors): - # Sector index may be ENDOFCHAIN, but only if size was unknown - if sect == ENDOFCHAIN: - if unknown_size: - break - else: - # else this means that the stream is smaller than declared: - debug('sect=ENDOFCHAIN before expected size') - raise IOError('incomplete OLE stream') - # sector index should be within FAT: - if sect<0 or sect>=len(fat): - debug('sect=%d (%X) / len(fat)=%d' % (sect, sect, len(fat))) - debug('i=%d / nb_sectors=%d' %(i, nb_sectors)) -## tmp_data = b"".join(data) -## f = open('test_debug.bin', 'wb') -## f.write(tmp_data) -## f.close() -## debug('data read so far: %d bytes' % len(tmp_data)) - raise IOError('incorrect OLE FAT, sector index out of range') - #TODO: merge this code with OleFileIO.getsect() ? - #TODO: check if this works with 4K sectors: - try: - fp.seek(offset + sectorsize * sect) - except: - debug('sect=%d, seek=%d, filesize=%d' % - (sect, offset+sectorsize*sect, filesize)) - raise IOError('OLE sector index out of range') - sector_data = fp.read(sectorsize) - # [PL] check if there was enough data: - # Note: if sector is the last of the file, sometimes it is not a - # complete sector (of 512 or 4K), so we may read less than - # sectorsize. - if len(sector_data)!=sectorsize and sect!=(len(fat)-1): - debug('sect=%d / len(fat)=%d, seek=%d / filesize=%d, len read=%d' % - (sect, len(fat), offset+sectorsize*sect, filesize, len(sector_data))) - debug('seek+len(read)=%d' % (offset+sectorsize*sect+len(sector_data))) - raise IOError('incomplete OLE sector') - data.append(sector_data) - # jump to next sector in the FAT: - try: - sect = fat[sect] - except IndexError: - # [PL] if pointer is out of the FAT an exception is raised - raise IOError('incorrect OLE FAT, sector index out of range') - #[PL] Last sector should be a "end of chain" marker: - if sect != ENDOFCHAIN: - raise IOError('incorrect last sector index in OLE stream') - data = b"".join(data) - # Data is truncated to the actual stream size: - if len(data) >= size: - data = data[:size] - # actual stream size is stored for future use: - self.size = size - elif unknown_size: - # actual stream size was not known, now we know the size of read - # data: - self.size = len(data) - else: - # read data is less than expected: - debug('len(data)=%d, size=%d' % (len(data), size)) - raise IOError('OLE stream size is less than declared') - # when all data is read in memory, BytesIO constructor is called - io.BytesIO.__init__(self, data) - # Then the _OleStream object can be used as a read-only file object. - - -#--- _OleDirectoryEntry ------------------------------------------------------- - -class _OleDirectoryEntry: - - """ - OLE2 Directory Entry - """ - #[PL] parsing code moved from OleFileIO.loaddirectory - - # struct to parse directory entries: - # <: little-endian byte order, standard sizes - # (note: this should guarantee that Q returns a 64 bits int) - # 64s: string containing entry name in unicode (max 31 chars) + null char - # H: uint16, number of bytes used in name buffer, including null = (len+1)*2 - # B: uint8, dir entry type (between 0 and 5) - # B: uint8, color: 0=black, 1=red - # I: uint32, index of left child node in the red-black tree, NOSTREAM if none - # I: uint32, index of right child node in the red-black tree, NOSTREAM if none - # I: uint32, index of child root node if it is a storage, else NOSTREAM - # 16s: CLSID, unique identifier (only used if it is a storage) - # I: uint32, user flags - # Q (was 8s): uint64, creation timestamp or zero - # Q (was 8s): uint64, modification timestamp or zero - # I: uint32, SID of first sector if stream or ministream, SID of 1st sector - # of stream containing ministreams if root entry, 0 otherwise - # I: uint32, total stream size in bytes if stream (low 32 bits), 0 otherwise - # I: uint32, total stream size in bytes if stream (high 32 bits), 0 otherwise - STRUCT_DIRENTRY = '<64sHBBIII16sIQQIII' - # size of a directory entry: 128 bytes - DIRENTRY_SIZE = 128 - assert struct.calcsize(STRUCT_DIRENTRY) == DIRENTRY_SIZE - - - def __init__(self, entry, sid, olefile): - """ - Constructor for an _OleDirectoryEntry object. - Parses a 128-bytes entry from the OLE Directory stream. - - entry : string (must be 128 bytes long) - sid : index of this directory entry in the OLE file directory - olefile: OleFileIO containing this directory entry - """ - self.sid = sid - # ref to olefile is stored for future use - self.olefile = olefile - # kids is a list of children entries, if this entry is a storage: - # (list of _OleDirectoryEntry objects) - self.kids = [] - # kids_dict is a dictionary of children entries, indexed by their - # name in lowercase: used to quickly find an entry, and to detect - # duplicates - self.kids_dict = {} - # flag used to detect if the entry is referenced more than once in - # directory: - self.used = False - # decode DirEntry - ( - name, - namelength, - self.entry_type, - self.color, - self.sid_left, - self.sid_right, - self.sid_child, - clsid, - self.dwUserFlags, - self.createTime, - self.modifyTime, - self.isectStart, - sizeLow, - sizeHigh - ) = struct.unpack(_OleDirectoryEntry.STRUCT_DIRENTRY, entry) - if self.entry_type not in [STGTY_ROOT, STGTY_STORAGE, STGTY_STREAM, STGTY_EMPTY]: - olefile._raise_defect(DEFECT_INCORRECT, 'unhandled OLE storage type') - # only first directory entry can (and should) be root: - if self.entry_type == STGTY_ROOT and sid != 0: - olefile._raise_defect(DEFECT_INCORRECT, 'duplicate OLE root entry') - if sid == 0 and self.entry_type != STGTY_ROOT: - olefile._raise_defect(DEFECT_INCORRECT, 'incorrect OLE root entry') - #debug (struct.unpack(fmt_entry, entry[:len_entry])) - # name should be at most 31 unicode characters + null character, - # so 64 bytes in total (31*2 + 2): - if namelength>64: - olefile._raise_defect(DEFECT_INCORRECT, 'incorrect DirEntry name length') - # if exception not raised, namelength is set to the maximum value: - namelength = 64 - # only characters without ending null char are kept: - name = name[:(namelength-2)] - # name is converted from unicode to Latin-1: - self.name = _unicode(name) - - debug('DirEntry SID=%d: %s' % (self.sid, repr(self.name))) - debug(' - type: %d' % self.entry_type) - debug(' - sect: %d' % self.isectStart) - debug(' - SID left: %d, right: %d, child: %d' % (self.sid_left, - self.sid_right, self.sid_child)) - - # sizeHigh is only used for 4K sectors, it should be zero for 512 bytes - # sectors, BUT apparently some implementations set it as 0xFFFFFFFF, 1 - # or some other value so it cannot be raised as a defect in general: - if olefile.sectorsize == 512: - if sizeHigh != 0 and sizeHigh != 0xFFFFFFFF: - debug('sectorsize=%d, sizeLow=%d, sizeHigh=%d (%X)' % - (olefile.sectorsize, sizeLow, sizeHigh, sizeHigh)) - olefile._raise_defect(DEFECT_UNSURE, 'incorrect OLE stream size') - self.size = sizeLow - else: - self.size = sizeLow + (long(sizeHigh)<<32) - debug(' - size: %d (sizeLow=%d, sizeHigh=%d)' % (self.size, sizeLow, sizeHigh)) - - self.clsid = _clsid(clsid) - # a storage should have a null size, BUT some implementations such as - # Word 8 for Mac seem to allow non-null values => Potential defect: - if self.entry_type == STGTY_STORAGE and self.size != 0: - olefile._raise_defect(DEFECT_POTENTIAL, 'OLE storage with size>0') - # check if stream is not already referenced elsewhere: - if self.entry_type in (STGTY_ROOT, STGTY_STREAM) and self.size>0: - if self.size < olefile.minisectorcutoff \ - and self.entry_type==STGTY_STREAM: # only streams can be in MiniFAT - # ministream object - minifat = True - else: - minifat = False - olefile._check_duplicate_stream(self.isectStart, minifat) - - - - def build_storage_tree(self): - """ - Read and build the red-black tree attached to this _OleDirectoryEntry - object, if it is a storage. - Note that this method builds a tree of all subentries, so it should - only be called for the root object once. - """ - debug('build_storage_tree: SID=%d - %s - sid_child=%d' - % (self.sid, repr(self.name), self.sid_child)) - if self.sid_child != NOSTREAM: - # if child SID is not NOSTREAM, then this entry is a storage. - # Let's walk through the tree of children to fill the kids list: - self.append_kids(self.sid_child) - - # Note from OpenOffice documentation: the safest way is to - # recreate the tree because some implementations may store broken - # red-black trees... - - # in the OLE file, entries are sorted on (length, name). - # for convenience, we sort them on name instead: - # (see rich comparison methods in this class) - self.kids.sort() - - - def append_kids(self, child_sid): - """ - Walk through red-black tree of children of this directory entry to add - all of them to the kids list. (recursive method) - - child_sid : index of child directory entry to use, or None when called - first time for the root. (only used during recursion) - """ - #[PL] this method was added to use simple recursion instead of a complex - # algorithm. - # if this is not a storage or a leaf of the tree, nothing to do: - if child_sid == NOSTREAM: - return - # check if child SID is in the proper range: - if child_sid<0 or child_sid>=len(self.olefile.direntries): - self.olefile._raise_defect(DEFECT_FATAL, 'OLE DirEntry index out of range') - # get child direntry: - child = self.olefile._load_direntry(child_sid) #direntries[child_sid] - debug('append_kids: child_sid=%d - %s - sid_left=%d, sid_right=%d, sid_child=%d' - % (child.sid, repr(child.name), child.sid_left, child.sid_right, child.sid_child)) - # the directory entries are organized as a red-black tree. - # (cf. Wikipedia for details) - # First walk through left side of the tree: - self.append_kids(child.sid_left) - # Check if its name is not already used (case-insensitive): - name_lower = child.name.lower() - if name_lower in self.kids_dict: - self.olefile._raise_defect(DEFECT_INCORRECT, - "Duplicate filename in OLE storage") - # Then the child_sid _OleDirectoryEntry object is appended to the - # kids list and dictionary: - self.kids.append(child) - self.kids_dict[name_lower] = child - # Check if kid was not already referenced in a storage: - if child.used: - self.olefile._raise_defect(DEFECT_INCORRECT, - 'OLE Entry referenced more than once') - child.used = True - # Finally walk through right side of the tree: - self.append_kids(child.sid_right) - # Afterwards build kid's own tree if it's also a storage: - child.build_storage_tree() - - - def __eq__(self, other): - "Compare entries by name" - return self.name == other.name - - def __lt__(self, other): - "Compare entries by name" - return self.name < other.name - - def __ne__(self, other): - return not self.__eq__(other) - - def __le__(self, other): - return self.__eq__(other) or self.__lt__(other) - - # Reflected __lt__() and __le__() will be used for __gt__() and __ge__() - - #TODO: replace by the same function as MS implementation ? - # (order by name length first, then case-insensitive order) - - - def dump(self, tab = 0): - "Dump this entry, and all its subentries (for debug purposes only)" - TYPES = ["(invalid)", "(storage)", "(stream)", "(lockbytes)", - "(property)", "(root)"] - print(" "*tab + repr(self.name), TYPES[self.entry_type], end=' ') - if self.entry_type in (STGTY_STREAM, STGTY_ROOT): - print(self.size, "bytes", end=' ') - print() - if self.entry_type in (STGTY_STORAGE, STGTY_ROOT) and self.clsid: - print(" "*tab + "{%s}" % self.clsid) - - for kid in self.kids: - kid.dump(tab + 2) - - - def getmtime(self): - """ - Return modification time of a directory entry. - - return: None if modification time is null, a python datetime object - otherwise (UTC timezone) - - new in version 0.26 - """ - if self.modifyTime == 0: - return None - return filetime2datetime(self.modifyTime) - - - def getctime(self): - """ - Return creation time of a directory entry. - - return: None if modification time is null, a python datetime object - otherwise (UTC timezone) - - new in version 0.26 - """ - if self.createTime == 0: - return None - return filetime2datetime(self.createTime) - - -#--- OleFileIO ---------------------------------------------------------------- - -class OleFileIO: - """ - OLE container object - - This class encapsulates the interface to an OLE 2 structured - storage file. Use the {@link listdir} and {@link openstream} methods to - access the contents of this file. - - Object names are given as a list of strings, one for each subentry - level. The root entry should be omitted. For example, the following - code extracts all image streams from a Microsoft Image Composer file:: - - ole = OleFileIO("fan.mic") - - for entry in ole.listdir(): - if entry[1:2] == "Image": - fin = ole.openstream(entry) - fout = open(entry[0:1], "wb") - while True: - s = fin.read(8192) - if not s: - break - fout.write(s) - - You can use the viewer application provided with the Python Imaging - Library to view the resulting files (which happens to be standard - TIFF files). - """ - - def __init__(self, filename = None, raise_defects=DEFECT_FATAL): - """ - Constructor for OleFileIO class. - - filename: file to open. - raise_defects: minimal level for defects to be raised as exceptions. - (use DEFECT_FATAL for a typical application, DEFECT_INCORRECT for a - security-oriented application, see source code for details) - """ - # minimal level for defects to be raised as exceptions: - self._raise_defects_level = raise_defects - # list of defects/issues not raised as exceptions: - # tuples of (exception type, message) - self.parsing_issues = [] - if filename: - self.open(filename) - - - def _raise_defect(self, defect_level, message, exception_type=IOError): - """ - This method should be called for any defect found during file parsing. - It may raise an IOError exception according to the minimal level chosen - for the OleFileIO object. - - defect_level: defect level, possible values are: - DEFECT_UNSURE : a case which looks weird, but not sure it's a defect - DEFECT_POTENTIAL : a potential defect - DEFECT_INCORRECT : an error according to specifications, but parsing can go on - DEFECT_FATAL : an error which cannot be ignored, parsing is impossible - message: string describing the defect, used with raised exception. - exception_type: exception class to be raised, IOError by default - """ - # added by [PL] - if defect_level >= self._raise_defects_level: - raise exception_type(message) - else: - # just record the issue, no exception raised: - self.parsing_issues.append((exception_type, message)) - - - def open(self, filename): - """ - Open an OLE2 file. - Reads the header, FAT and directory. - - filename: string-like or file-like object - """ - #[PL] check if filename is a string-like or file-like object: - # (it is better to check for a read() method) - if hasattr(filename, 'read'): - # file-like object - self.fp = filename - else: - # string-like object: filename of file on disk - #TODO: if larger than 1024 bytes, this could be the actual data => BytesIO - self.fp = open(filename, "rb") - # old code fails if filename is not a plain string: - #if isinstance(filename, (bytes, basestring)): - # self.fp = open(filename, "rb") - #else: - # self.fp = filename - # obtain the filesize by using seek and tell, which should work on most - # file-like objects: - #TODO: do it above, using getsize with filename when possible? - #TODO: fix code to fail with clear exception when filesize cannot be obtained - self.fp.seek(0, os.SEEK_END) - try: - filesize = self.fp.tell() - finally: - self.fp.seek(0) - self._filesize = filesize - - # lists of streams in FAT and MiniFAT, to detect duplicate references - # (list of indexes of first sectors of each stream) - self._used_streams_fat = [] - self._used_streams_minifat = [] - - header = self.fp.read(512) - - if len(header) != 512 or header[:8] != MAGIC: - self._raise_defect(DEFECT_FATAL, "not an OLE2 structured storage file") - - # [PL] header structure according to AAF specifications: - ##Header - ##struct StructuredStorageHeader { // [offset from start (bytes), length (bytes)] - ##BYTE _abSig[8]; // [00H,08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, - ## // 0x1a, 0xe1} for current version - ##CLSID _clsid; // [08H,16] reserved must be zero (WriteClassStg/ - ## // GetClassFile uses root directory class id) - ##USHORT _uMinorVersion; // [18H,02] minor version of the format: 33 is - ## // written by reference implementation - ##USHORT _uDllVersion; // [1AH,02] major version of the dll/format: 3 for - ## // 512-byte sectors, 4 for 4 KB sectors - ##USHORT _uByteOrder; // [1CH,02] 0xFFFE: indicates Intel byte-ordering - ##USHORT _uSectorShift; // [1EH,02] size of sectors in power-of-two; - ## // typically 9 indicating 512-byte sectors - ##USHORT _uMiniSectorShift; // [20H,02] size of mini-sectors in power-of-two; - ## // typically 6 indicating 64-byte mini-sectors - ##USHORT _usReserved; // [22H,02] reserved, must be zero - ##ULONG _ulReserved1; // [24H,04] reserved, must be zero - ##FSINDEX _csectDir; // [28H,04] must be zero for 512-byte sectors, - ## // number of SECTs in directory chain for 4 KB - ## // sectors - ##FSINDEX _csectFat; // [2CH,04] number of SECTs in the FAT chain - ##SECT _sectDirStart; // [30H,04] first SECT in the directory chain - ##DFSIGNATURE _signature; // [34H,04] signature used for transactions; must - ## // be zero. The reference implementation - ## // does not support transactions - ##ULONG _ulMiniSectorCutoff; // [38H,04] maximum size for a mini stream; - ## // typically 4096 bytes - ##SECT _sectMiniFatStart; // [3CH,04] first SECT in the MiniFAT chain - ##FSINDEX _csectMiniFat; // [40H,04] number of SECTs in the MiniFAT chain - ##SECT _sectDifStart; // [44H,04] first SECT in the DIFAT chain - ##FSINDEX _csectDif; // [48H,04] number of SECTs in the DIFAT chain - ##SECT _sectFat[109]; // [4CH,436] the SECTs of first 109 FAT sectors - ##}; - - # [PL] header decoding: - # '<' indicates little-endian byte ordering for Intel (cf. struct module help) - fmt_header = '<8s16sHHHHHHLLLLLLLLLL' - header_size = struct.calcsize(fmt_header) - debug( "fmt_header size = %d, +FAT = %d" % (header_size, header_size + 109*4) ) - header1 = header[:header_size] - ( - self.Sig, - self.clsid, - self.MinorVersion, - self.DllVersion, - self.ByteOrder, - self.SectorShift, - self.MiniSectorShift, - self.Reserved, self.Reserved1, - self.csectDir, - self.csectFat, - self.sectDirStart, - self.signature, - self.MiniSectorCutoff, - self.MiniFatStart, - self.csectMiniFat, - self.sectDifStart, - self.csectDif - ) = struct.unpack(fmt_header, header1) - debug( struct.unpack(fmt_header, header1)) - - if self.Sig != MAGIC: - # OLE signature should always be present - self._raise_defect(DEFECT_FATAL, "incorrect OLE signature") - if self.clsid != bytearray(16): - # according to AAF specs, CLSID should always be zero - self._raise_defect(DEFECT_INCORRECT, "incorrect CLSID in OLE header") - debug( "MinorVersion = %d" % self.MinorVersion ) - debug( "DllVersion = %d" % self.DllVersion ) - if self.DllVersion not in [3, 4]: - # version 3: usual format, 512 bytes per sector - # version 4: large format, 4K per sector - self._raise_defect(DEFECT_INCORRECT, "incorrect DllVersion in OLE header") - debug( "ByteOrder = %X" % self.ByteOrder ) - if self.ByteOrder != 0xFFFE: - # For now only common little-endian documents are handled correctly - self._raise_defect(DEFECT_FATAL, "incorrect ByteOrder in OLE header") - # TODO: add big-endian support for documents created on Mac ? - self.SectorSize = 2**self.SectorShift - debug( "SectorSize = %d" % self.SectorSize ) - if self.SectorSize not in [512, 4096]: - self._raise_defect(DEFECT_INCORRECT, "incorrect SectorSize in OLE header") - if (self.DllVersion==3 and self.SectorSize!=512) \ - or (self.DllVersion==4 and self.SectorSize!=4096): - self._raise_defect(DEFECT_INCORRECT, "SectorSize does not match DllVersion in OLE header") - self.MiniSectorSize = 2**self.MiniSectorShift - debug( "MiniSectorSize = %d" % self.MiniSectorSize ) - if self.MiniSectorSize not in [64]: - self._raise_defect(DEFECT_INCORRECT, "incorrect MiniSectorSize in OLE header") - if self.Reserved != 0 or self.Reserved1 != 0: - self._raise_defect(DEFECT_INCORRECT, "incorrect OLE header (non-null reserved bytes)") - debug( "csectDir = %d" % self.csectDir ) - if self.SectorSize==512 and self.csectDir!=0: - self._raise_defect(DEFECT_INCORRECT, "incorrect csectDir in OLE header") - debug( "csectFat = %d" % self.csectFat ) - debug( "sectDirStart = %X" % self.sectDirStart ) - debug( "signature = %d" % self.signature ) - # Signature should be zero, BUT some implementations do not follow this - # rule => only a potential defect: - if self.signature != 0: - self._raise_defect(DEFECT_POTENTIAL, "incorrect OLE header (signature>0)") - debug( "MiniSectorCutoff = %d" % self.MiniSectorCutoff ) - debug( "MiniFatStart = %X" % self.MiniFatStart ) - debug( "csectMiniFat = %d" % self.csectMiniFat ) - debug( "sectDifStart = %X" % self.sectDifStart ) - debug( "csectDif = %d" % self.csectDif ) - - # calculate the number of sectors in the file - # (-1 because header doesn't count) - self.nb_sect = ( (filesize + self.SectorSize-1) // self.SectorSize) - 1 - debug( "Number of sectors in the file: %d" % self.nb_sect ) - - # file clsid (probably never used, so we don't store it) - clsid = _clsid(header[8:24]) - self.sectorsize = self.SectorSize #1 << i16(header, 30) - self.minisectorsize = self.MiniSectorSize #1 << i16(header, 32) - self.minisectorcutoff = self.MiniSectorCutoff # i32(header, 56) - - # check known streams for duplicate references (these are always in FAT, - # never in MiniFAT): - self._check_duplicate_stream(self.sectDirStart) - # check MiniFAT only if it is not empty: - if self.csectMiniFat: - self._check_duplicate_stream(self.MiniFatStart) - # check DIFAT only if it is not empty: - if self.csectDif: - self._check_duplicate_stream(self.sectDifStart) - - # Load file allocation tables - self.loadfat(header) - # Load direcory. This sets both the direntries list (ordered by sid) - # and the root (ordered by hierarchy) members. - self.loaddirectory(self.sectDirStart)#i32(header, 48)) - self.ministream = None - self.minifatsect = self.MiniFatStart #i32(header, 60) - - - def close(self): - """ - close the OLE file, to release the file object - """ - self.fp.close() - - - def _check_duplicate_stream(self, first_sect, minifat=False): - """ - Checks if a stream has not been already referenced elsewhere. - This method should only be called once for each known stream, and only - if stream size is not null. - first_sect: index of first sector of the stream in FAT - minifat: if True, stream is located in the MiniFAT, else in the FAT - """ - if minifat: - debug('_check_duplicate_stream: sect=%d in MiniFAT' % first_sect) - used_streams = self._used_streams_minifat - else: - debug('_check_duplicate_stream: sect=%d in FAT' % first_sect) - # some values can be safely ignored (not a real stream): - if first_sect in (DIFSECT,FATSECT,ENDOFCHAIN,FREESECT): - return - used_streams = self._used_streams_fat - #TODO: would it be more efficient using a dict or hash values, instead - # of a list of long ? - if first_sect in used_streams: - self._raise_defect(DEFECT_INCORRECT, 'Stream referenced twice') - else: - used_streams.append(first_sect) - - - def dumpfat(self, fat, firstindex=0): - "Displays a part of FAT in human-readable form for debugging purpose" - # [PL] added only for debug - if not DEBUG_MODE: - return - # dictionary to convert special FAT values in human-readable strings - VPL=8 # valeurs par ligne (8+1 * 8+1 = 81) - fatnames = { - FREESECT: "..free..", - ENDOFCHAIN: "[ END. ]", - FATSECT: "FATSECT ", - DIFSECT: "DIFSECT " - } - nbsect = len(fat) - nlines = (nbsect+VPL-1)//VPL - print("index", end=" ") - for i in range(VPL): - print("%8X" % i, end=" ") - print() - for l in range(nlines): - index = l*VPL - print("%8X:" % (firstindex+index), end=" ") - for i in range(index, index+VPL): - if i>=nbsect: - break - sect = fat[i] - if sect in fatnames: - nom = fatnames[sect] - else: - if sect == i+1: - nom = " --->" - else: - nom = "%8X" % sect - print(nom, end=" ") - print() - - - def dumpsect(self, sector, firstindex=0): - "Displays a sector in a human-readable form, for debugging purpose." - if not DEBUG_MODE: - return - VPL=8 # number of values per line (8+1 * 8+1 = 81) - tab = array.array(UINT32, sector) - nbsect = len(tab) - nlines = (nbsect+VPL-1)//VPL - print("index", end=" ") - for i in range(VPL): - print("%8X" % i, end=" ") - print() - for l in range(nlines): - index = l*VPL - print("%8X:" % (firstindex+index), end=" ") - for i in range(index, index+VPL): - if i>=nbsect: - break - sect = tab[i] - nom = "%8X" % sect - print(nom, end=" ") - print() - - def sect2array(self, sect): - """ - convert a sector to an array of 32 bits unsigned integers, - swapping bytes on big endian CPUs such as PowerPC (old Macs) - """ - a = array.array(UINT32, sect) - # if CPU is big endian, swap bytes: - if sys.byteorder == 'big': - a.byteswap() - return a - - - def loadfat_sect(self, sect): - """ - Adds the indexes of the given sector to the FAT - sect: string containing the first FAT sector, or array of long integers - return: index of last FAT sector. - """ - # a FAT sector is an array of ulong integers. - if isinstance(sect, array.array): - # if sect is already an array it is directly used - fat1 = sect - else: - # if it's a raw sector, it is parsed in an array - fat1 = self.sect2array(sect) - self.dumpsect(sect) - # The FAT is a sector chain starting at the first index of itself. - for isect in fat1: - #print("isect = %X" % isect) - if isect == ENDOFCHAIN or isect == FREESECT: - # the end of the sector chain has been reached - break - # read the FAT sector - s = self.getsect(isect) - # parse it as an array of 32 bits integers, and add it to the - # global FAT array - nextfat = self.sect2array(s) - self.fat = self.fat + nextfat - return isect - - - def loadfat(self, header): - """ - Load the FAT table. - """ - # The header contains a sector numbers - # for the first 109 FAT sectors. Additional sectors are - # described by DIF blocks - - sect = header[76:512] - debug( "len(sect)=%d, so %d integers" % (len(sect), len(sect)//4) ) - #fat = [] - # [PL] FAT is an array of 32 bits unsigned ints, it's more effective - # to use an array than a list in Python. - # It's initialized as empty first: - self.fat = array.array(UINT32) - self.loadfat_sect(sect) - #self.dumpfat(self.fat) -## for i in range(0, len(sect), 4): -## ix = i32(sect, i) -## #[PL] if ix == -2 or ix == -1: # ix == 0xFFFFFFFE or ix == 0xFFFFFFFF: -## if ix == 0xFFFFFFFE or ix == 0xFFFFFFFF: -## break -## s = self.getsect(ix) -## #fat = fat + [i32(s, i) for i in range(0, len(s), 4)] -## fat = fat + array.array(UINT32, s) - if self.csectDif != 0: - # [PL] There's a DIFAT because file is larger than 6.8MB - # some checks just in case: - if self.csectFat <= 109: - # there must be at least 109 blocks in header and the rest in - # DIFAT, so number of sectors must be >109. - self._raise_defect(DEFECT_INCORRECT, 'incorrect DIFAT, not enough sectors') - if self.sectDifStart >= self.nb_sect: - # initial DIFAT block index must be valid - self._raise_defect(DEFECT_FATAL, 'incorrect DIFAT, first index out of range') - debug( "DIFAT analysis..." ) - # We compute the necessary number of DIFAT sectors : - # (each DIFAT sector = 127 pointers + 1 towards next DIFAT sector) - nb_difat = (self.csectFat-109 + 126)//127 - debug( "nb_difat = %d" % nb_difat ) - if self.csectDif != nb_difat: - raise IOError('incorrect DIFAT') - isect_difat = self.sectDifStart - for i in iterrange(nb_difat): - debug( "DIFAT block %d, sector %X" % (i, isect_difat) ) - #TODO: check if corresponding FAT SID = DIFSECT - sector_difat = self.getsect(isect_difat) - difat = self.sect2array(sector_difat) - self.dumpsect(sector_difat) - self.loadfat_sect(difat[:127]) - # last DIFAT pointer is next DIFAT sector: - isect_difat = difat[127] - debug( "next DIFAT sector: %X" % isect_difat ) - # checks: - if isect_difat not in [ENDOFCHAIN, FREESECT]: - # last DIFAT pointer value must be ENDOFCHAIN or FREESECT - raise IOError('incorrect end of DIFAT') -## if len(self.fat) != self.csectFat: -## # FAT should contain csectFat blocks -## print("FAT length: %d instead of %d" % (len(self.fat), self.csectFat)) -## raise IOError('incorrect DIFAT') - # since FAT is read from fixed-size sectors, it may contain more values - # than the actual number of sectors in the file. - # Keep only the relevant sector indexes: - if len(self.fat) > self.nb_sect: - debug('len(fat)=%d, shrunk to nb_sect=%d' % (len(self.fat), self.nb_sect)) - self.fat = self.fat[:self.nb_sect] - debug('\nFAT:') - self.dumpfat(self.fat) - - - def loadminifat(self): - """ - Load the MiniFAT table. - """ - # MiniFAT is stored in a standard sub-stream, pointed to by a header - # field. - # NOTE: there are two sizes to take into account for this stream: - # 1) Stream size is calculated according to the number of sectors - # declared in the OLE header. This allocated stream may be more than - # needed to store the actual sector indexes. - # (self.csectMiniFat is the number of sectors of size self.SectorSize) - stream_size = self.csectMiniFat * self.SectorSize - # 2) Actually used size is calculated by dividing the MiniStream size - # (given by root entry size) by the size of mini sectors, *4 for - # 32 bits indexes: - nb_minisectors = (self.root.size + self.MiniSectorSize-1) // self.MiniSectorSize - used_size = nb_minisectors * 4 - debug('loadminifat(): minifatsect=%d, nb FAT sectors=%d, used_size=%d, stream_size=%d, nb MiniSectors=%d' % - (self.minifatsect, self.csectMiniFat, used_size, stream_size, nb_minisectors)) - if used_size > stream_size: - # This is not really a problem, but may indicate a wrong implementation: - self._raise_defect(DEFECT_INCORRECT, 'OLE MiniStream is larger than MiniFAT') - # In any case, first read stream_size: - s = self._open(self.minifatsect, stream_size, force_FAT=True).read() - #[PL] Old code replaced by an array: - #self.minifat = [i32(s, i) for i in range(0, len(s), 4)] - self.minifat = self.sect2array(s) - # Then shrink the array to used size, to avoid indexes out of MiniStream: - debug('MiniFAT shrunk from %d to %d sectors' % (len(self.minifat), nb_minisectors)) - self.minifat = self.minifat[:nb_minisectors] - debug('loadminifat(): len=%d' % len(self.minifat)) - debug('\nMiniFAT:') - self.dumpfat(self.minifat) - - def getsect(self, sect): - """ - Read given sector from file on disk. - sect: sector index - returns a string containing the sector data. - """ - # [PL] this original code was wrong when sectors are 4KB instead of - # 512 bytes: - #self.fp.seek(512 + self.sectorsize * sect) - #[PL]: added safety checks: - #print("getsect(%X)" % sect) - try: - self.fp.seek(self.sectorsize * (sect+1)) - except: - debug('getsect(): sect=%X, seek=%d, filesize=%d' % - (sect, self.sectorsize*(sect+1), self._filesize)) - self._raise_defect(DEFECT_FATAL, 'OLE sector index out of range') - sector = self.fp.read(self.sectorsize) - if len(sector) != self.sectorsize: - debug('getsect(): sect=%X, read=%d, sectorsize=%d' % - (sect, len(sector), self.sectorsize)) - self._raise_defect(DEFECT_FATAL, 'incomplete OLE sector') - return sector - - - def loaddirectory(self, sect): - """ - Load the directory. - sect: sector index of directory stream. - """ - # The directory is stored in a standard - # substream, independent of its size. - - # open directory stream as a read-only file: - # (stream size is not known in advance) - self.directory_fp = self._open(sect) - - #[PL] to detect malformed documents and avoid DoS attacks, the maximum - # number of directory entries can be calculated: - max_entries = self.directory_fp.size // 128 - debug('loaddirectory: size=%d, max_entries=%d' % - (self.directory_fp.size, max_entries)) - - # Create list of directory entries - #self.direntries = [] - # We start with a list of "None" object - self.direntries = [None] * max_entries -## for sid in iterrange(max_entries): -## entry = fp.read(128) -## if not entry: -## break -## self.direntries.append(_OleDirectoryEntry(entry, sid, self)) - # load root entry: - root_entry = self._load_direntry(0) - # Root entry is the first entry: - self.root = self.direntries[0] - # read and build all storage trees, starting from the root: - self.root.build_storage_tree() - - - def _load_direntry (self, sid): - """ - Load a directory entry from the directory. - This method should only be called once for each storage/stream when - loading the directory. - sid: index of storage/stream in the directory. - return: a _OleDirectoryEntry object - raise: IOError if the entry has always been referenced. - """ - # check if SID is OK: - if sid<0 or sid>=len(self.direntries): - self._raise_defect(DEFECT_FATAL, "OLE directory index out of range") - # check if entry was already referenced: - if self.direntries[sid] is not None: - self._raise_defect(DEFECT_INCORRECT, - "double reference for OLE stream/storage") - # if exception not raised, return the object - return self.direntries[sid] - self.directory_fp.seek(sid * 128) - entry = self.directory_fp.read(128) - self.direntries[sid] = _OleDirectoryEntry(entry, sid, self) - return self.direntries[sid] - - - def dumpdirectory(self): - """ - Dump directory (for debugging only) - """ - self.root.dump() - - - def _open(self, start, size = 0x7FFFFFFF, force_FAT=False): - """ - Open a stream, either in FAT or MiniFAT according to its size. - (openstream helper) - - start: index of first sector - size: size of stream (or nothing if size is unknown) - force_FAT: if False (default), stream will be opened in FAT or MiniFAT - according to size. If True, it will always be opened in FAT. - """ - debug('OleFileIO.open(): sect=%d, size=%d, force_FAT=%s' % - (start, size, str(force_FAT))) - # stream size is compared to the MiniSectorCutoff threshold: - if size < self.minisectorcutoff and not force_FAT: - # ministream object - if not self.ministream: - # load MiniFAT if it wasn't already done: - self.loadminifat() - # The first sector index of the miniFAT stream is stored in the - # root directory entry: - size_ministream = self.root.size - debug('Opening MiniStream: sect=%d, size=%d' % - (self.root.isectStart, size_ministream)) - self.ministream = self._open(self.root.isectStart, - size_ministream, force_FAT=True) - return _OleStream(self.ministream, start, size, 0, - self.minisectorsize, self.minifat, - self.ministream.size) - else: - # standard stream - return _OleStream(self.fp, start, size, 512, - self.sectorsize, self.fat, self._filesize) - - - def _list(self, files, prefix, node, streams=True, storages=False): - """ - (listdir helper) - files: list of files to fill in - prefix: current location in storage tree (list of names) - node: current node (_OleDirectoryEntry object) - streams: bool, include streams if True (True by default) - new in v0.26 - storages: bool, include storages if True (False by default) - new in v0.26 - (note: the root storage is never included) - """ - prefix = prefix + [node.name] - for entry in node.kids: - if entry.kids: - # this is a storage - if storages: - # add it to the list - files.append(prefix[1:] + [entry.name]) - # check its kids - self._list(files, prefix, entry, streams, storages) - else: - # this is a stream - if streams: - # add it to the list - files.append(prefix[1:] + [entry.name]) - - - def listdir(self, streams=True, storages=False): - """ - Return a list of streams stored in this file - - streams: bool, include streams if True (True by default) - new in v0.26 - storages: bool, include storages if True (False by default) - new in v0.26 - (note: the root storage is never included) - """ - files = [] - self._list(files, [], self.root, streams, storages) - return files - - - def _find(self, filename): - """ - Returns directory entry of given filename. (openstream helper) - Note: this method is case-insensitive. - - filename: path of stream in storage tree (except root entry), either: - - a string using Unix path syntax, for example: - 'storage_1/storage_1.2/stream' - - a list of storage filenames, path to the desired stream/storage. - Example: ['storage_1', 'storage_1.2', 'stream'] - return: sid of requested filename - raise IOError if file not found - """ - - # if filename is a string instead of a list, split it on slashes to - # convert to a list: - if isinstance(filename, basestring): - filename = filename.split('/') - # walk across storage tree, following given path: - node = self.root - for name in filename: - for kid in node.kids: - if kid.name.lower() == name.lower(): - break - else: - raise IOError("file not found") - node = kid - return node.sid - - - def openstream(self, filename): - """ - Open a stream as a read-only file object (BytesIO). - - filename: path of stream in storage tree (except root entry), either: - - a string using Unix path syntax, for example: - 'storage_1/storage_1.2/stream' - - a list of storage filenames, path to the desired stream/storage. - Example: ['storage_1', 'storage_1.2', 'stream'] - return: file object (read-only) - raise IOError if filename not found, or if this is not a stream. - """ - sid = self._find(filename) - entry = self.direntries[sid] - if entry.entry_type != STGTY_STREAM: - raise IOError("this file is not a stream") - return self._open(entry.isectStart, entry.size) - - - def get_type(self, filename): - """ - Test if given filename exists as a stream or a storage in the OLE - container, and return its type. - - filename: path of stream in storage tree. (see openstream for syntax) - return: False if object does not exist, its entry type (>0) otherwise: - - STGTY_STREAM: a stream - - STGTY_STORAGE: a storage - - STGTY_ROOT: the root entry - """ - try: - sid = self._find(filename) - entry = self.direntries[sid] - return entry.entry_type - except: - return False - - - def getmtime(self, filename): - """ - Return modification time of a stream/storage. - - filename: path of stream/storage in storage tree. (see openstream for - syntax) - return: None if modification time is null, a python datetime object - otherwise (UTC timezone) - - new in version 0.26 - """ - sid = self._find(filename) - entry = self.direntries[sid] - return entry.getmtime() - - - def getctime(self, filename): - """ - Return creation time of a stream/storage. - - filename: path of stream/storage in storage tree. (see openstream for - syntax) - return: None if creation time is null, a python datetime object - otherwise (UTC timezone) - - new in version 0.26 - """ - sid = self._find(filename) - entry = self.direntries[sid] - return entry.getctime() - - - def exists(self, filename): - """ - Test if given filename exists as a stream or a storage in the OLE - container. - - filename: path of stream in storage tree. (see openstream for syntax) - return: True if object exist, else False. - """ - try: - sid = self._find(filename) - return True - except: - return False - - - def get_size(self, filename): - """ - Return size of a stream in the OLE container, in bytes. - - filename: path of stream in storage tree (see openstream for syntax) - return: size in bytes (long integer) - raise: IOError if file not found, TypeError if this is not a stream. - """ - sid = self._find(filename) - entry = self.direntries[sid] - if entry.entry_type != STGTY_STREAM: - #TODO: Should it return zero instead of raising an exception ? - raise TypeError('object is not an OLE stream') - return entry.size - - - def get_rootentry_name(self): - """ - Return root entry name. Should usually be 'Root Entry' or 'R' in most - implementations. - """ - return self.root.name - - - def getproperties(self, filename, convert_time=False, no_conversion=None): - """ - Return properties described in substream. - - filename: path of stream in storage tree (see openstream for syntax) - convert_time: bool, if True timestamps will be converted to Python datetime - no_conversion: None or list of int, timestamps not to be converted - (for example total editing time is not a real timestamp) - return: a dictionary of values indexed by id (integer) - """ - # make sure no_conversion is a list, just to simplify code below: - if no_conversion == None: - no_conversion = [] - # stream path as a string to report exceptions: - streampath = filename - if not isinstance(streampath, str): - streampath = '/'.join(streampath) - - fp = self.openstream(filename) - - data = {} - - try: - # header - s = fp.read(28) - clsid = _clsid(s[8:24]) - - # format id - s = fp.read(20) - fmtid = _clsid(s[:16]) - fp.seek(i32(s, 16)) - - # get section - s = b"****" + fp.read(i32(fp.read(4))-4) - # number of properties: - num_props = i32(s, 4) - except BaseException as exc: - # catch exception while parsing property header, and only raise - # a DEFECT_INCORRECT then return an empty dict, because this is not - # a fatal error when parsing the whole file - msg = 'Error while parsing properties header in stream %s: %s' % ( - repr(streampath), exc) - self._raise_defect(DEFECT_INCORRECT, msg, type(exc)) - return data - - for i in range(num_props): - try: - id = 0 # just in case of an exception - id = i32(s, 8+i*8) - offset = i32(s, 12+i*8) - type = i32(s, offset) - - debug ('property id=%d: type=%d offset=%X' % (id, type, offset)) - - # test for common types first (should perhaps use - # a dictionary instead?) - - if type == VT_I2: # 16-bit signed integer - value = i16(s, offset+4) - if value >= 32768: - value = value - 65536 - elif type == VT_UI2: # 2-byte unsigned integer - value = i16(s, offset+4) - elif type in (VT_I4, VT_INT, VT_ERROR): - # VT_I4: 32-bit signed integer - # VT_ERROR: HRESULT, similar to 32-bit signed integer, - # see http://msdn.microsoft.com/en-us/library/cc230330.aspx - value = i32(s, offset+4) - elif type in (VT_UI4, VT_UINT): # 4-byte unsigned integer - value = i32(s, offset+4) # FIXME - elif type in (VT_BSTR, VT_LPSTR): - # CodePageString, see http://msdn.microsoft.com/en-us/library/dd942354.aspx - # size is a 32 bits integer, including the null terminator, and - # possibly trailing or embedded null chars - #TODO: if codepage is unicode, the string should be converted as such - count = i32(s, offset+4) - value = s[offset+8:offset+8+count-1] - # remove all null chars: - value = value.replace(b'\x00', b'') - elif type == VT_BLOB: - # binary large object (BLOB) - # see http://msdn.microsoft.com/en-us/library/dd942282.aspx - count = i32(s, offset+4) - value = s[offset+8:offset+8+count] - elif type == VT_LPWSTR: - # UnicodeString - # see http://msdn.microsoft.com/en-us/library/dd942313.aspx - # "the string should NOT contain embedded or additional trailing - # null characters." - count = i32(s, offset+4) - value = _unicode(s[offset+8:offset+8+count*2]) - elif type == VT_FILETIME: - value = long(i32(s, offset+4)) + (long(i32(s, offset+8))<<32) - # FILETIME is a 64-bit int: "number of 100ns periods - # since Jan 1,1601". - if convert_time and id not in no_conversion: - debug('Converting property #%d to python datetime, value=%d=%fs' - %(id, value, float(value)/10000000)) - # convert FILETIME to Python datetime.datetime - # inspired from http://code.activestate.com/recipes/511425-filetime-to-datetime/ - _FILETIME_null_date = datetime.datetime(1601, 1, 1, 0, 0, 0) - debug('timedelta days=%d' % (value//(10*1000000*3600*24))) - value = _FILETIME_null_date + datetime.timedelta(microseconds=value//10) - else: - # legacy code kept for backward compatibility: returns a - # number of seconds since Jan 1,1601 - value = value // 10000000 # seconds - elif type == VT_UI1: # 1-byte unsigned integer - value = i8(s[offset+4]) - elif type == VT_CLSID: - value = _clsid(s[offset+4:offset+20]) - elif type == VT_CF: - # PropertyIdentifier or ClipboardData?? - # see http://msdn.microsoft.com/en-us/library/dd941945.aspx - count = i32(s, offset+4) - value = s[offset+8:offset+8+count] - elif type == VT_BOOL: - # VARIANT_BOOL, 16 bits bool, 0x0000=Fals, 0xFFFF=True - # see http://msdn.microsoft.com/en-us/library/cc237864.aspx - value = bool(i16(s, offset+4)) - else: - value = None # everything else yields "None" - debug ('property id=%d: type=%d not implemented in parser yet' % (id, type)) - - # missing: VT_EMPTY, VT_NULL, VT_R4, VT_R8, VT_CY, VT_DATE, - # VT_DECIMAL, VT_I1, VT_I8, VT_UI8, - # see http://msdn.microsoft.com/en-us/library/dd942033.aspx - - # FIXME: add support for VT_VECTOR - # VT_VECTOR is a 32 uint giving the number of items, followed by - # the items in sequence. The VT_VECTOR value is combined with the - # type of items, e.g. VT_VECTOR|VT_BSTR - # see http://msdn.microsoft.com/en-us/library/dd942011.aspx - - #print("%08x" % id, repr(value), end=" ") - #print("(%s)" % VT[i32(s, offset) & 0xFFF]) - - data[id] = value - except BaseException as exc: - # catch exception while parsing each property, and only raise - # a DEFECT_INCORRECT, because parsing can go on - msg = 'Error while parsing property id %d in stream %s: %s' % ( - id, repr(streampath), exc) - self._raise_defect(DEFECT_INCORRECT, msg, type(exc)) - - return data - - def get_metadata(self): - """ - Parse standard properties streams, return an OleMetadata object - containing all the available metadata. - (also stored in the metadata attribute of the OleFileIO object) - - new in version 0.25 - """ - self.metadata = OleMetadata() - self.metadata.parse_properties(self) - return self.metadata - -# -# -------------------------------------------------------------------- -# This script can be used to dump the directory of any OLE2 structured -# storage file. - -if __name__ == "__main__": - - import sys - - # [PL] display quick usage info if launched from command-line - if len(sys.argv) <= 1: - print(__doc__) - print(""" -Launched from command line, this script parses OLE files and prints info. - -Usage: OleFileIO_PL.py [-d] [-c] [file2 ...] - -Options: --d : debug mode (display a lot of debug information, for developers only) --c : check all streams (for debugging purposes) -""") - sys.exit() - - check_streams = False - for filename in sys.argv[1:]: -## try: - # OPTIONS: - if filename == '-d': - # option to switch debug mode on: - set_debug_mode(True) - continue - if filename == '-c': - # option to switch check streams mode on: - check_streams = True - continue - - ole = OleFileIO(filename)#, raise_defects=DEFECT_INCORRECT) - print("-" * 68) - print(filename) - print("-" * 68) - ole.dumpdirectory() - for streamname in ole.listdir(): - if streamname[-1][0] == "\005": - print(streamname, ": properties") - props = ole.getproperties(streamname, convert_time=True) - props = sorted(props.items()) - for k, v in props: - #[PL]: avoid to display too large or binary values: - if isinstance(v, (basestring, bytes)): - if len(v) > 50: - v = v[:50] - if isinstance(v, bytes): - # quick and dirty binary check: - for c in (1,2,3,4,5,6,7,11,12,14,15,16,17,18,19,20, - 21,22,23,24,25,26,27,28,29,30,31): - if c in bytearray(v): - v = '(binary data)' - break - print(" ", k, v) - - if check_streams: - # Read all streams to check if there are errors: - print('\nChecking streams...') - for streamname in ole.listdir(): - # print name using repr() to convert binary chars to \xNN: - print('-', repr('/'.join(streamname)),'-', end=' ') - st_type = ole.get_type(streamname) - if st_type == STGTY_STREAM: - print('size %d' % ole.get_size(streamname)) - # just try to read stream in memory: - ole.openstream(streamname) - else: - print('NOT a stream : type=%d' % st_type) - print() - -## for streamname in ole.listdir(): -## # print name using repr() to convert binary chars to \xNN: -## print('-', repr('/'.join(streamname)),'-', end=' ') -## print(ole.getmtime(streamname)) -## print() - - print('Modification/Creation times of all directory entries:') - for entry in ole.direntries: - if entry is not None: - print('- %s: mtime=%s ctime=%s' % (entry.name, - entry.getmtime(), entry.getctime())) - print() - - # parse and display metadata: - meta = ole.get_metadata() - meta.dump() - print() - #[PL] Test a few new methods: - root = ole.get_rootentry_name() - print('Root entry name: "%s"' % root) - if ole.exists('worddocument'): - print("This is a Word document.") - print("type of stream 'WordDocument':", ole.get_type('worddocument')) - print("size :", ole.get_size('worddocument')) - if ole.exists('macros/vba'): - print("This document may contain VBA macros.") - - # print parsing issues: - print('\nNon-fatal issues raised during parsing:') - if ole.parsing_issues: - for exctype, msg in ole.parsing_issues: - print('- %s: %s' % (exctype.__name__, msg)) - else: - print('None') -## except IOError as v: -## print("***", "cannot read", file, "-", v) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PSDraw.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PSDraw.py deleted file mode 100644 index 88593bb..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PSDraw.py +++ /dev/null @@ -1,236 +0,0 @@ -# -# 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. -# - -from __future__ import print_function - -from PIL import EpsImagePlugin - -## -# Simple Postscript graphics interface. - -class PSDraw: - """ - Sets up printing to the given file. If **file** is omitted, - :py:attr:`sys.stdout` is assumed. - """ - - def __init__(self, fp=None): - if not fp: - import sys - fp = sys.stdout - self.fp = fp - - 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\n" - "restore 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-%s ISOLatin1Encoding /%s E\n" %\ - (font, font)) - self.isofont[font] = 1 - # rough - self.fp.write("/F0 %d /PSDraw-%s F\n" % (size, font)) - - def setink(self, ink): - """ - .. warning:: - - This has been in the PIL API for ages but was never implemented. - """ - print("*** NOT YET IMPLEMENTED ***") - - 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 = float(im.size[0] * 72) / dpi - y = float(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" % (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" % (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/Linux_x86_64/lib/python3.4/site-packages/PIL/PaletteFile.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PaletteFile.py deleted file mode 100644 index 5627f7b..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PaletteFile.py +++ /dev/null @@ -1,55 +0,0 @@ -# -# 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 PIL._binary import o8 - -## -# File handler for Teragon-style palette files. - -class PaletteFile: - - 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/Linux_x86_64/lib/python3.4/site-packages/PIL/PalmImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PalmImagePlugin.py deleted file mode 100644 index 203a6d9..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PalmImagePlugin.py +++ /dev/null @@ -1,225 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# - -## -# Image plugin for Palm pixmap images (output only). -## - -__version__ = "1.0" - -from PIL import Image, ImageFile, _binary - -_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 )) - -# 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 i in range(len(_Palm8BitColormapValues)): - palettedata = palettedata + _Palm8BitColormapValues[i] - for i in range(256 - len(_Palm8BitColormapValues)): - palettedata = palettedata + (0, 0, 0) - 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, - } - -o8 = _binary.o8 -o16b = _binary.o16be - -# -# -------------------------------------------------------------------- - -## -# (Internal) Image save plugin for the Palm format. - -def _save(im, fp, filename, check=0): - - 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" and "bpp" in im.encoderinfo and im.encoderinfo["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)) - # we ignore the palette here - im.mode = "P" - rawmode = "P;" + str(bpp) - version = 1 - - elif im.mode == "L" and "bpp" in im.info and im.info["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)) - # 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 IOError("cannot write mode %s as Palm" % im.mode) - - if check: - return check - - # - # make sure image data is available - im.load() - - # write header - - cols = im.size[0] - rows = im.size[1] - - rowbytes = ((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))]) - - fp.flush() - - -# -# -------------------------------------------------------------------- - -Image.register_save("Palm", _save) - -Image.register_extension("Palm", ".palm") - -Image.register_mime("Palm", "image/palm") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PcdImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PcdImagePlugin.py deleted file mode 100644 index 70066e7..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PcdImagePlugin.py +++ /dev/null @@ -1,78 +0,0 @@ -# -# 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. -# - - -__version__ = "0.1" - - -from PIL import Image, ImageFile, _binary - -i8 = _binary.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 - if orientation == 1: - self.tile_post_rotate = 90 # hack - 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 draft(self, mode, size): - - if len(self.tile) != 1: - return - - d, e, o, a = self.tile[0] - - if size: - scale = max(self.size[0] / size[0], self.size[1] / size[1]) - for s, o in [(4,0*2048), (2,0*2048), (1,96*2048)]: - 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) - - self.tile = [(d, e, o, a)] - - return self - -# -# registry - -Image.register_open("PCD", PcdImageFile) - -Image.register_extension("PCD", ".pcd") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PcfFontFile.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PcfFontFile.py deleted file mode 100644 index c40d398..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PcfFontFile.py +++ /dev/null @@ -1,250 +0,0 @@ -# -# 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. -# - -from PIL import Image -from PIL import FontFile -from PIL import _binary - -# -------------------------------------------------------------------- -# 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, -] - -i8 = _binary.i8 -l16 = _binary.i16le -l32 = _binary.i32le -b16 = _binary.i16be -b32 = _binary.i32be - -def sz(s, o): - return s[o:s.index(b"\0", o)] - -## -# Font file plugin for the X11 PCF format. - -class PcfFontFile(FontFile.FontFile): - - name = "name" - - def __init__(self, fp): - - magic = l32(fp.read(4)) - if magic != PCF_MAGIC: - raise SyntaxError("not a PCF file") - - FontFile.FontFile.__init__(self) - - 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), 1) # 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 IOError("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)) - - default = i16(fp.read(2)) - - nencoding = (lastCol - firstCol + 1) * (lastRow - firstRow + 1) - - for i in range(nencoding): - encodingOffset = i16(fp.read(2)) - if encodingOffset != 0xFFFF: - try: - encoding[i+firstCol] = encodingOffset - except IndexError: - break # only load ISO-8859-1 glyphs - - return encoding diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PcxImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PcxImagePlugin.py deleted file mode 100644 index 4f6d5a3..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PcxImagePlugin.py +++ /dev/null @@ -1,185 +0,0 @@ -# -# 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. -# - -__version__ = "0.6" - -from PIL import Image, ImageFile, ImagePalette, _binary - -i8 = _binary.i8 -i16 = _binary.i16le -o8 = _binary.o8 - -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") - if Image.DEBUG: - print ("BBox: %s %s %s %s" % bbox) - - - # format - version = i8(s[1]) - bits = i8(s[3]) - planes = i8(s[65]) - stride = i16(s,66) - if Image.DEBUG: - print ("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, 2) - 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 IOError("unknown PCX mode") - - self.mode = mode - self.size = bbox[2]-bbox[0], bbox[3]-bbox[1] - - bbox = (0, 0) + self.size - if Image.DEBUG: - print ("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"), -} - -o16 = _binary.o16le - -def _save(im, fp, filename, check=0): - - try: - version, bits, planes, rawmode = SAVE[im.mode] - except KeyError: - raise ValueError("Cannot save %s images as PCX" % im.mode) - - if check: - return check - - # 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. - - - if Image.DEBUG: - print ("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("PCX", PcxImageFile, _accept) -Image.register_save("PCX", _save) - -Image.register_extension("PCX", ".pcx") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PdfImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PdfImagePlugin.py deleted file mode 100644 index 5113f09..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PdfImagePlugin.py +++ /dev/null @@ -1,238 +0,0 @@ -# -# 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). -## - -__version__ = "0.4" - -from PIL import Image, ImageFile -from PIL._binary import i8 -import io - - -# -# -------------------------------------------------------------------- - -# object ids: -# 1. catalogue -# 2. pages -# 3. image -# 4. page -# 5. page contents - -def _obj(fp, obj, **dict): - fp.write("%d 0 obj\n" % obj) - if dict: - fp.write("<<\n") - for k, v in dict.items(): - if v is not None: - fp.write("/%s %s\n" % (k, v)) - fp.write(">>\n") - - -def _endobj(fp): - fp.write("endobj\n") - - -## -# (Internal) Image save plugin for the PDF format. - -def _save(im, fp, filename): - resolution = im.encoderinfo.get("resolution", 72.0) - - # - # make sure image data is available - im.load() - - xref = [0]*(5+1) # placeholders - - class TextWriter: - def __init__(self, fp): - self.fp = fp - - def __getattr__(self, name): - return getattr(self.fp, name) - - def write(self, value): - self.fp.write(value.encode('latin-1')) - - fp = TextWriter(fp) - - fp.write("%PDF-1.2\n") - fp.write("% created by PIL PDF driver " + __version__ + "\n") - - # - # Get image characteristics - - width, height = im.size - - # 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 = "/DeviceGray" - procset = "/ImageB" # grayscale - bits = 1 - elif im.mode == "L": - filter = "/DCTDecode" - # params = "<< /Predictor 15 /Columns %d >>" % (width-2) - colorspace = "/DeviceGray" - procset = "/ImageB" # grayscale - elif im.mode == "P": - filter = "/ASCIIHexDecode" - colorspace = "[ /Indexed /DeviceRGB 255 <" - palette = im.im.getpalette("RGB") - for i in range(256): - r = i8(palette[i*3]) - g = i8(palette[i*3+1]) - b = i8(palette[i*3+2]) - colorspace += "%02x%02x%02x " % (r, g, b) - colorspace += "> ]" - procset = "/ImageI" # indexed color - elif im.mode == "RGB": - filter = "/DCTDecode" - colorspace = "/DeviceRGB" - procset = "/ImageC" # color images - elif im.mode == "CMYK": - filter = "/DCTDecode" - colorspace = "/DeviceCMYK" - procset = "/ImageC" # color images - else: - raise ValueError("cannot save mode %s" % im.mode) - - # - # catalogue - - xref[1] = fp.tell() - _obj( - fp, 1, - Type="/Catalog", - Pages="2 0 R") - _endobj(fp) - - # - # pages - - xref[2] = fp.tell() - _obj( - fp, 2, - Type="/Pages", - Count=1, - Kids="[4 0 R]") - _endobj(fp) - - # - # 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", (len(data), 1), None) - 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) - - xref[3] = fp.tell() - _obj( - fp, 3, - Type="/XObject", - Subtype="/Image", - Width=width, # * 72.0 / resolution, - Height=height, # * 72.0 / resolution, - Length=len(op.getvalue()), - Filter=filter, - BitsPerComponent=bits, - DecodeParams=params, - ColorSpace=colorspace) - - fp.write("stream\n") - fp.fp.write(op.getvalue()) - fp.write("\nendstream\n") - - _endobj(fp) - - # - # page - - xref[4] = fp.tell() - _obj(fp, 4) - fp.write( - "<<\n/Type /Page\n/Parent 2 0 R\n" - "/Resources <<\n/ProcSet [ /PDF %s ]\n" - "/XObject << /image 3 0 R >>\n>>\n" - "/MediaBox [ 0 0 %d %d ]\n/Contents 5 0 R\n>>\n" % ( - procset, - int(width * 72.0 / resolution), - int(height * 72.0 / resolution))) - _endobj(fp) - - # - # page contents - - op = TextWriter(io.BytesIO()) - - op.write( - "q %d 0 0 %d 0 0 cm /image Do Q\n" % ( - int(width * 72.0 / resolution), - int(height * 72.0 / resolution))) - - xref[5] = fp.tell() - _obj(fp, 5, Length=len(op.fp.getvalue())) - - fp.write("stream\n") - fp.fp.write(op.fp.getvalue()) - fp.write("\nendstream\n") - - _endobj(fp) - - # - # trailer - startxref = fp.tell() - fp.write("xref\n0 %d\n0000000000 65535 f \n" % len(xref)) - for x in xref[1:]: - fp.write("%010d 00000 n \n" % x) - fp.write("trailer\n<<\n/Size %d\n/Root 1 0 R\n>>\n" % len(xref)) - fp.write("startxref\n%d\n%%%%EOF\n" % startxref) - fp.flush() - -# -# -------------------------------------------------------------------- - -Image.register_save("PDF", _save) - -Image.register_extension("PDF", ".pdf") - -Image.register_mime("PDF", "application/pdf") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PixarImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PixarImagePlugin.py deleted file mode 100644 index a4c9032..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PixarImagePlugin.py +++ /dev/null @@ -1,68 +0,0 @@ -# -# 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. -# - -__version__ = "0.1" - -from PIL import Image, ImageFile, _binary - -# -# helpers - -i16 = _binary.i16le -i32 = _binary.i32le - -## -# 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 (FIXME: add "_accept" hook) - s = self.fp.read(4) - if s != b"\200\350\000\000": - 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("PIXAR", PixarImageFile) - -# -# FIXME: what's the standard extension? diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PngImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PngImagePlugin.py deleted file mode 100644 index e794ef7..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PngImagePlugin.py +++ /dev/null @@ -1,667 +0,0 @@ -# -# 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. -# - -from __future__ import print_function - -__version__ = "0.9" - -import re - -from PIL import Image, ImageFile, ImagePalette, _binary -import zlib - -i8 = _binary.i8 -i16 = _binary.i16be -i32 = _binary.i32be - -is_cid = re.compile(b"\w\w\w\w").match - - -_MAGIC = b"\211PNG\r\n\032\n" - - -_MODES = { - # supported bits/color combinations, and corresponding modes/rawmodes - (1, 0): ("1", "1"), - (2, 0): ("L", "L;2"), - (4, 0): ("L", "L;4"), - (8, 0): ("L", "L"), - (16,0): ("I", "I;16B"), - (8, 2): ("RGB", "RGB"), - (16,2): ("RGB", "RGB;16B"), - (1, 3): ("P", "P;1"), - (2, 3): ("P", "P;2"), - (4, 3): ("P", "P;4"), - (8, 3): ("P", "P"), - (8, 4): ("LA", "LA"), - (16,4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available - (8, 6): ("RGBA", "RGBA"), - (16,6): ("RGBA", "RGBA;16B"), -} - - -_simple_palette = re.compile(b'^\xff+\x00\xff*$') - -# -------------------------------------------------------------------- -# Support classes. Suitable for PNG and related formats like MNG etc. - -class ChunkStream: - - def __init__(self, fp): - - self.fp = fp - self.queue = [] - - if not hasattr(Image.core, "crc32"): - self.crc = self.crc_skip - - def read(self): - "Fetch a new chunk. Returns header information." - - if self.queue: - cid, pos, length = self.queue[-1] - del self.queue[-1] - 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): - raise SyntaxError("broken PNG file (chunk %s)" % repr(cid)) - - return cid, pos, length - - 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" - - if Image.DEBUG: - print("STREAM", cid, pos, length) - return getattr(self, "chunk_" + cid.decode('ascii'))(pos, length) - - def crc(self, cid, data): - "Read and verify checksum" - - crc1 = Image.core.crc32(data, Image.core.crc32(cid)) - crc2 = i16(self.fp.read(2)), i16(self.fp.read(2)) - if crc1 != crc2: - raise SyntaxError("broken PNG file"\ - "(bad header checksum in %s)" % cid) - - 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: - cid, pos, length = self.read() - if cid == endchunk: - break - self.crc(cid, ImageFile._safe_read(self.fp, length)) - cids.append(cid) - - return cids - - -# -------------------------------------------------------------------- -# PNG chunk container (for use with save(pnginfo=)) - -class PngInfo: - - def __init__(self): - self.chunks = [] - - def add(self, cid, data): - self.chunks.append((cid, data)) - - def add_text(self, key, value, zip=0): - # The tEXt chunk stores latin-1 text - if not isinstance(key, bytes): - key = key.encode('latin-1', 'strict') - - if not isinstance(value, bytes): - value = value.encode('latin-1', 'replace') - - if zip: - import zlib - 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): - - ChunkStream.__init__(self, 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 - - 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") - if Image.DEBUG: - print("iCCP profile name", s[:i]) - print("Compression method", 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 = zlib.decompress(s[i+2:]) - 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: - 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 - self.im_tile = [("zip", (0,0)+self.im_size, pos, self.im_rawmode)] - 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): - i = s.find(b"\0") - if i >= 0: - self.im_info["transparency"] = i - else: - self.im_info["transparency"] = s - elif self.im_mode == "L": - 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_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: - k = s; v = b"" # fallback for broken tEXt tags - if k: - if bytes is not str: - k = k.decode('latin-1', 'strict') - v = v.decode('latin-1', 'replace') - - self.im_info[k] = self.im_text[k] = 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) - import zlib - try: - v = zlib.decompress(v[1:]) - except zlib.error: - v = b"" - - if k: - if bytes is not str: - k = k.decode('latin-1', 'strict') - v = v.decode('latin-1', 'replace') - - self.im_info[k] = self.im_text[k] = v - return s - -# -------------------------------------------------------------------- -# 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 self.fp.read(8) != _MAGIC: - raise SyntaxError("not a PNG file") - - # - # Parse headers up to the first IDAT 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: - if Image.DEBUG: - print(cid, pos, length, "(unknown)") - 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 = self.png.im_text # experimental - self.tile = self.png.im_tile - - if self.png.im_palette: - rawmode, data = self.png.im_palette - self.palette = ImagePalette.raw(rawmode, data) - - self.__idat = length # used by load_read() - - - 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() - - self.fp = None - - def load_prepare(self): - "internal: prepare to read PNG file" - - if self.info.get("interlace"): - self.decoderconfig = self.decoderconfig + (1,) - - 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"]: - self.png.push(cid, pos, length) - return b"" - - 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" - - self.png.close() - self.png = None - - -# -------------------------------------------------------------------- -# PNG writer - -o8 = _binary.o8 -o16 = _binary.o16be -o32 = _binary.o32be - -_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'), - "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) - hi, lo = Image.core.crc32(data, Image.core.crc32(cid)) - fp.write(o16(hi) + o16(lo)) - -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) - -def _save(im, fp, filename, chunk=putchunk, check=0): - # 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 - if "dictionary" in im.encoderinfo: - dictionary = im.encoderinfo["dictionary"] - else: - dictionary = b"" - - im.encoderconfig = ("optimize" in im.encoderinfo, - im.encoderinfo.get("compress_level", -1), - im.encoderinfo.get("compress_type", -1), - dictionary) - - # get the corresponding PNG mode - try: - rawmode, mode = _OUTMODES[mode] - except KeyError: - raise IOError("cannot write mode %s as PNG" % mode) - - if check: - return check - - # - # write minimal PNG file - - fp.write(_MAGIC) - - chunk(fp, b"IHDR", - o32(im.size[0]), o32(im.size[1]), # 0: size - mode, # 8: depth/type - b'\0', # 10: compression - b'\0', # 11: filter category - b'\0') # 12: interlace flag - - 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 == "L": - 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 IOError("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]) - - if 0: - # FIXME: to be supported some day - chunk(fp, b"gAMA", o32(int(gamma * 100000.0))) - - 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') - - info = im.encoderinfo.get("pnginfo") - if info: - for cid, data in info.chunks: - chunk(fp, cid, data) - - # ICC profile writing support -- 2008-06-06 Florian Hoech - if im.info.get("icc_profile"): - # 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(im.info["icc_profile"]) - chunk(fp, b"iCCP", data) - - ImageFile._save(im, _idat(fp, chunk), [("zip", (0,0)+im.size, 0, rawmode)]) - - chunk(fp, b"IEND", b"") - - try: - fp.flush() - except: - pass - - -# -------------------------------------------------------------------- -# 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) - hi, lo = Image.core.crc32(data, Image.core.crc32(cid)) - crc = o16(hi) + o16(lo) - 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("PNG", PngImageFile, _accept) -Image.register_save("PNG", _save) - -Image.register_extension("PNG", ".png") - -Image.register_mime("PNG", "image/png") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PpmImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PpmImagePlugin.py deleted file mode 100644 index 070efd1..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PpmImagePlugin.py +++ /dev/null @@ -1,168 +0,0 @@ -# -# 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. -# - - -__version__ = "0.2" - -import string - -from PIL import Image, ImageFile - -# -# -------------------------------------------------------------------- - -b_whitespace = string.whitespace -try: - import locale - locale_lang,locale_enc = locale.getlocale() - if locale_enc is None: - locale_lang,locale_enc = locale.getdefaultlocale() - b_whitespace = b_whitespace.decode(locale_enc) -except: pass -b_whitespace = b_whitespace.encode('ascii','ignore') - -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") - mode = MODES[self._token(s)] - - 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"#": - 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))] - - # ALTERNATIVE: load via builtin debug function - # self.im = Image.core.open_ppm(self.filename) - # self.mode = self.im.mode - # self.size = self.im.size - -# -# -------------------------------------------------------------------- - -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 IOError("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("PPM", PpmImageFile, _accept) -Image.register_save("PPM", _save) - -Image.register_extension("PPM", ".pbm") -Image.register_extension("PPM", ".pgm") -Image.register_extension("PPM", ".ppm") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PsdImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PsdImagePlugin.py deleted file mode 100644 index 9e64e7c..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PsdImagePlugin.py +++ /dev/null @@ -1,295 +0,0 @@ -# -# 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. -# - -__version__ = "0.4" - -from PIL import Image, ImageFile, ImagePalette, _binary - -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) -} - -# -# helpers - -i8 = _binary.i8 -i16 = _binary.i16be -i32 = _binary.i32be - -# --------------------------------------------------------------------. -# 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" - - def _open(self): - - read = self.fp.read - - # - # header - - s = read(26) - if s[:4] != b"8BPS" 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 IOError("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: - signature = read(4) - 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) - - # - # image descriptor - - self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) - - # keep the file open - self._fp = self.fp - self.frame = 0 - - def seek(self, layer): - # seek to given layer (1..max) - if layer == self.frame: - return - try: - if layer <= 0: - raise IndexError - 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: - raise EOFError("no such layer") - - 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 _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 - filler = read(12) - name = "" - size = i32(read(4)) - combined = 0 - if size: - length = i32(read(4)) - if length: - mask_y = i32(read(4)); mask_x = i32(read(4)) - mask_h = i32(read(4)) - mask_y; mask_w = i32(read(4)) - mask_x - file.seek(length - 16, 1) - combined += length + 4 - - length = i32(read(4)) - if length: - file.seek(length, 1) - 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(size - combined, 1) - 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("PSD", PsdImageFile, _accept) - -Image.register_extension("PSD", ".psd") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/PyAccess.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/PyAccess.py deleted file mode 100644 index f76beb8..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/PyAccess.py +++ /dev/null @@ -1,297 +0,0 @@ -# -# 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. -# - -from __future__ import print_function - -from cffi import FFI -import sys - -DEBUG = 0 - -defs = """ -struct Pixel_RGBA { - unsigned char r,g,b,a; -}; -struct Pixel_I16 { - unsigned char l,r; -}; -""" -ffi = FFI() -ffi.cdef(defs) - - -class PyAccess(object): - - 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 = vals['xsize'] - self.ysize = vals['ysize'] - - if DEBUG: - print (vals) - self._post_init() - - def _post_init(): 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). - :param value: The pixel value. - """ - if self.readonly: raise ValueError('Attempt to putpixel a read only image') - (x,y) = self.check_xy(xy) - 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). - """ - - (x,y) = self.check_xy(xy) - 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) - -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: - # 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: - # 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: - color = min(color[0], 65535) - - pixel.l = color & 0xFF - 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: - color = min(color[0], 65535) - - pixel.l = color >> 8 - 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: - # tuple - self.pixels[y][x] = color[0] - - -mode_map = {'1': _PyAccess8, - 'L': _PyAccess8, - 'P': _PyAccess8, - 'LA': _PyAccess32_2, - 'PA': _PyAccess32_2, - 'RGB': _PyAccess32_3, - 'LAB': _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: - if DEBUG: print ("PyAccess Not Implemented: %s" % img.mode) - return None - if DEBUG: print ("New PyAccess: %s" % img.mode) - return access_type(img, readonly) - - diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/SgiImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/SgiImagePlugin.py deleted file mode 100644 index b60df47..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/SgiImagePlugin.py +++ /dev/null @@ -1,89 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# SGI image file handling -# -# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. -# -# -# History: -# 1995-09-10 fl Created -# -# 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. -# - - -__version__ = "0.2" - - -from PIL import Image, ImageFile, _binary - -i8 = _binary.i8 -i16 = _binary.i16be -i32 = _binary.i32be - - -def _accept(prefix): - return i16(prefix) == 474 - -## -# Image plugin for SGI images. - -class SgiImageFile(ImageFile.ImageFile): - - format = "SGI" - format_description = "SGI Image File Format" - - def _open(self): - - # HEAD - s = self.fp.read(512) - if i16(s) != 474: - raise SyntaxError("not an SGI image file") - - # relevant header entries - compression = i8(s[2]) - - # bytes, dimension, zsize - layout = i8(s[3]), i16(s[4:]), i16(s[10:]) - - # determine mode from bytes/zsize - if layout == (1, 2, 1) or layout == (1, 1, 1): - self.mode = "L" - elif layout == (1, 3, 3): - self.mode = "RGB" - elif layout == (1, 3, 4): - self.mode = "RGBA" - else: - raise SyntaxError("unsupported SGI image mode") - - # size - self.size = i16(s[6:]), i16(s[8:]) - - - # decoder info - if compression == 0: - offset = 512 - pagesize = self.size[0]*self.size[1]*layout[0] - self.tile = [] - for layer in self.mode: - self.tile.append(("raw", (0,0)+self.size, offset, (layer,0,-1))) - offset = offset + pagesize - elif compression == 1: - self.tile = [("sgi_rle", (0,0)+self.size, 512, (self.mode, 0, -1))] - -# -# registry - -Image.register_open("SGI", SgiImageFile, _accept) - -Image.register_extension("SGI", ".bw") -Image.register_extension("SGI", ".rgb") -Image.register_extension("SGI", ".rgba") - -Image.register_extension("SGI", ".sgi") # really? diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/SpiderImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/SpiderImagePlugin.py deleted file mode 100644 index 306b348..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/SpiderImagePlugin.py +++ /dev/null @@ -1,312 +0,0 @@ -# -# 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: -# http://www.wadsworth.org/spider_doc/spider/docs/spider.html -# -# Details about the Spider image format: -# http://www.wadsworth.org/spider_doc/spider/docs/image_doc.html -# - -from __future__ import print_function - -from PIL import Image, ImageFile -import os -import struct -import sys - - -def isInt(f): - try: - i = int(f) - if f-i == 0: - return 1 - else: - return 0 - except: - 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 - # print "labrec = %d, labbyt = %d, lenbyt = %d" % (labrec,labbyt,lenbyt) - if labbyt != (labrec * lenbyt): - return 0 - # looks like a valid header - return labbyt - - -def isSpiderImage(filename): - fp = open(filename, 'rb') - f = fp.read(92) # read 23 * 4 bytes - fp.close() - 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" - - 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: - raise SyntaxError("not a valid Spider file") - - 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 - - # 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: - return - if frame >= self.nimages: - raise EOFError("attempt to seek past end of file") - 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): - (min, max) = self.getextrema() - m = 1 - if max != min: - m = depth / (max-min) - b = -m * min - 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) - - -# -------------------------------------------------------------------- -# Image series - -# given a list of filenames, return a list of images -def loadImageSeries(filelist=None): - " create a list of Image.images for use in 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: - im = Image.open(img).convert2byte() - except: - 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 = 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 IOError("Error creating Spider header") - - # write the SPIDER header - try: - fp = open(filename, 'wb') - except: - raise IOError("Unable to open %s for writing" % filename) - fp.writelines(hdr) - - rawmode = "F;32NF" # 32-bit native floating point - ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, 0, 1))]) - - fp.close() - - -def _save_spider(im, fp, filename): - # get the filename extension and register it with Image - fn, ext = os.path.splitext(filename) - Image.register_extension("SPIDER", ext) - _save(im, fp, filename) - -# -------------------------------------------------------------------- - -Image.register_open("SPIDER", SpiderImageFile) -Image.register_save("SPIDER", _save_spider) - -if __name__ == "__main__": - - if not sys.argv[1:]: - print("Syntax: python SpiderImagePlugin.py Spiderimage [outfile]") - sys.exit() - - filename = sys.argv[1] - if not isSpiderImage(filename): - print("input image must be in Spider format") - sys.exit() - - outfile = "" - if len(sys.argv[1:]) > 1: - outfile = sys.argv[2] - - im = Image.open(filename) - 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 outfile != "": - # 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, "SPIDER") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/SunImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/SunImagePlugin.py deleted file mode 100644 index 0db02ad..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/SunImagePlugin.py +++ /dev/null @@ -1,82 +0,0 @@ -# -# 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. -# - - -__version__ = "0.3" - - -from PIL import Image, ImageFile, ImagePalette, _binary - -i16 = _binary.i16be -i32 = _binary.i32be - - -def _accept(prefix): - return i32(prefix) == 0x59a66a95 - -## -# Image plugin for Sun raster files. - -class SunImageFile(ImageFile.ImageFile): - - format = "SUN" - format_description = "Sun Raster File" - - def _open(self): - - # HEAD - s = self.fp.read(32) - if i32(s) != 0x59a66a95: - raise SyntaxError("not an SUN raster file") - - offset = 32 - - self.size = i32(s[4:8]), i32(s[8:12]) - - depth = i32(s[12:16]) - if depth == 1: - self.mode, rawmode = "1", "1;I" - elif depth == 8: - self.mode = rawmode = "L" - elif depth == 24: - self.mode, rawmode = "RGB", "BGR" - else: - raise SyntaxError("unsupported mode") - - compression = i32(s[20:24]) - - if i32(s[24:28]) != 0: - length = i32(s[28:32]) - offset = offset + length - self.palette = ImagePalette.raw("RGB;L", self.fp.read(length)) - if self.mode == "L": - self.mode = rawmode = "P" - - stride = (((self.size[0] * depth + 7) // 8) + 3) & (~3) - - if compression == 1: - self.tile = [("raw", (0,0)+self.size, offset, (rawmode, stride))] - elif compression == 2: - self.tile = [("sun_rle", (0,0)+self.size, offset, rawmode)] - -# -# registry - -Image.register_open("SUN", SunImageFile, _accept) - -Image.register_extension("SUN", ".ras") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/TarIO.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/TarIO.py deleted file mode 100644 index bba493e..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/TarIO.py +++ /dev/null @@ -1,56 +0,0 @@ -# -# 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. -# - -from PIL import ContainerIO - -## -# A file object that provides read access to a given member of a TAR -# file. - -class TarIO(ContainerIO.ContainerIO): - - ## - # Create file object. - # - # @param tarfile Name of TAR file. - # @param file Name of member file. - - def __init__(self, tarfile, file): - - fh = open(tarfile, "rb") - - while True: - - s = fh.read(512) - if len(s) != 512: - raise IOError("unexpected end of tar file") - - name = s[:100].decode('utf-8') - i = name.find('\0') - if i == 0: - raise IOError("cannot find subfile") - if i > 0: - name = name[:i] - - size = int(s[124:135], 8) - - if file == name: - break - - fh.seek((size + 511) & (~511), 1) - - # Open region - ContainerIO.ContainerIO.__init__(self, fh, fh.tell(), size) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/TgaImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/TgaImagePlugin.py deleted file mode 100644 index 55790db..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/TgaImagePlugin.py +++ /dev/null @@ -1,197 +0,0 @@ -# -# 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. -# - - -__version__ = "0.3" - -from PIL import Image, ImageFile, ImagePalette, _binary - - -# -# -------------------------------------------------------------------- -# Read RGA file - -i8 = _binary.i8 -i16 = _binary.i16le -i32 = _binary.i32le - - -MODES = { - # map imagetype/depth to rawmode - (1, 8): "P", - (3, 1): "1", - (3, 8): "L", - (2, 16): "BGR;5", - (2, 24): "BGR", - (2, 32): "BGRA", -} - - -def _accept(prefix): - return prefix[0:1] == b"\0" - -## -# 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 = 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 id != 0 or 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 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 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 - -o8 = _binary.o8 -o16 = _binary.o16le -o32 = _binary.o32le - -SAVE = { - "1": ("1", 1, 0, 3), - "L": ("L", 8, 0, 3), - "P": ("P", 8, 1, 1), - "RGB": ("BGR", 24, 0, 2), - "RGBA": ("BGRA", 32, 0, 2), -} - -def _save(im, fp, filename, check=0): - - try: - rawmode, bits, colormaptype, imagetype = SAVE[im.mode] - except KeyError: - raise IOError("cannot write mode %s as TGA" % im.mode) - - if check: - return check - - if colormaptype: - colormapfirst, colormaplength, colormapentry = 0, 256, 24 - else: - colormapfirst, colormaplength, colormapentry = 0, 0, 0 - - if im.mode == "RGBA": - flags = 8 - else: - flags = 0 - - orientation = im.info.get("orientation", -1) - if orientation > 0: - flags = flags | 0x20 - - fp.write(b"\000" + - 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 colormaptype: - fp.write(im.im.getpalette("RGB", "BGR")) - - ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode, 0, orientation))]) - -# -# -------------------------------------------------------------------- -# Registry - -Image.register_open("TGA", TgaImageFile, _accept) -Image.register_save("TGA", _save) - -Image.register_extension("TGA", ".tga") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/TiffImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/TiffImagePlugin.py deleted file mode 100644 index 2e49931..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/TiffImagePlugin.py +++ /dev/null @@ -1,1177 +0,0 @@ -# -# 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. -# - -from __future__ import print_function - -__version__ = "1.3.5" - -from PIL import Image, ImageFile -from PIL import ImagePalette -from PIL import _binary -from PIL._util import isStringType - -import warnings -import array, sys -import collections -import itertools -import os - -# Set these to true to force use of libtiff for reading or writing. -READ_LIBTIFF = False -WRITE_LIBTIFF= False - -II = b"II" # little-endian (intel-style) -MM = b"MM" # big-endian (motorola-style) - -i8 = _binary.i8 -o8 = _binary.o8 - -if sys.byteorder == "little": - native_prefix = II -else: - native_prefix = MM - -# -# -------------------------------------------------------------------- -# Read TIFF files - -il16 = _binary.i16le -il32 = _binary.i32le -ol16 = _binary.o16le -ol32 = _binary.o32le - -ib16 = _binary.i16be -ib32 = _binary.i32be -ob16 = _binary.o16be -ob32 = _binary.o32be - -# 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 -SOFTWARE = 305 -DATE_TIME = 306 -ARTIST = 315 -PREDICTOR = 317 -COLORMAP = 320 -TILEOFFSETS = 324 -EXTRASAMPLES = 338 -SAMPLEFORMAT = 339 -JPEGTABLES = 347 -COPYRIGHT = 33432 -IPTC_NAA_CHUNK = 33723 # newsphoto properties -PHOTOSHOP_CHUNK = 34377 # photoshop properties -ICCPROFILE = 34675 -EXIFIFD = 34665 -XMP = 700 - -# https://github.com/fiji/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", -} - -COMPRESSION_INFO_REV = dict([(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"), - (II, 0, 1, 2, (1,), ()): ("1", "1;IR"), - (II, 0, 1, 1, (8,), ()): ("L", "L;I"), - (II, 0, 1, 2, (8,), ()): ("L", "L;IR"), - (II, 0, 3, 1, (32,), ()): ("F", "F;32F"), - (II, 1, 1, 1, (1,), ()): ("1", "1"), - (II, 1, 1, 2, (1,), ()): ("1", "1;R"), - (II, 1, 1, 1, (8,), ()): ("L", "L"), - (II, 1, 1, 1, (8,8), (2,)): ("LA", "LA"), - (II, 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"), - (II, 1, 2, 1, (16,), ()): ("I;16S", "I;16S"), - (II, 1, 1, 1, (32,), ()): ("I", "I;32N"), - (II, 1, 2, 1, (32,), ()): ("I", "I;32S"), - (II, 1, 3, 1, (32,), ()): ("F", "F;32F"), - (II, 2, 1, 1, (8,8,8), ()): ("RGB", "RGB"), - (II, 2, 1, 2, (8,8,8), ()): ("RGB", "RGB;R"), - (II, 2, 1, 1, (8,8,8,8), ()): ("RGBA", "RGBA"), # missing ExtraSamples - (II, 2, 1, 1, (8,8,8,8), (0,)): ("RGBX", "RGBX"), - (II, 2, 1, 1, (8,8,8,8), (1,)): ("RGBA", "RGBa"), - (II, 2, 1, 1, (8,8,8,8), (2,)): ("RGBA", "RGBA"), - (II, 2, 1, 1, (8,8,8,8), (999,)): ("RGBA", "RGBA"), # corel draw 10 - (II, 3, 1, 1, (1,), ()): ("P", "P;1"), - (II, 3, 1, 2, (1,), ()): ("P", "P;1R"), - (II, 3, 1, 1, (2,), ()): ("P", "P;2"), - (II, 3, 1, 2, (2,), ()): ("P", "P;2R"), - (II, 3, 1, 1, (4,), ()): ("P", "P;4"), - (II, 3, 1, 2, (4,), ()): ("P", "P;4R"), - (II, 3, 1, 1, (8,), ()): ("P", "P"), - (II, 3, 1, 1, (8,8), (2,)): ("PA", "PA"), - (II, 3, 1, 2, (8,), ()): ("P", "P;R"), - (II, 5, 1, 1, (8,8,8,8), ()): ("CMYK", "CMYK"), - (II, 6, 1, 1, (8,8,8), ()): ("YCbCr", "YCbCr"), - (II, 8, 1, 1, (8,8,8), ()): ("LAB", "LAB"), - - (MM, 0, 1, 1, (1,), ()): ("1", "1;I"), - (MM, 0, 1, 2, (1,), ()): ("1", "1;IR"), - (MM, 0, 1, 1, (8,), ()): ("L", "L;I"), - (MM, 0, 1, 2, (8,), ()): ("L", "L;IR"), - (MM, 1, 1, 1, (1,), ()): ("1", "1"), - (MM, 1, 1, 2, (1,), ()): ("1", "1;R"), - (MM, 1, 1, 1, (8,), ()): ("L", "L"), - (MM, 1, 1, 1, (8,8), (2,)): ("LA", "LA"), - (MM, 1, 1, 2, (8,), ()): ("L", "L;R"), - (MM, 1, 1, 1, (16,), ()): ("I;16B", "I;16B"), - (MM, 1, 2, 1, (16,), ()): ("I;16BS", "I;16BS"), - (MM, 1, 2, 1, (32,), ()): ("I;32BS", "I;32BS"), - (MM, 1, 3, 1, (32,), ()): ("F", "F;32BF"), - (MM, 2, 1, 1, (8,8,8), ()): ("RGB", "RGB"), - (MM, 2, 1, 2, (8,8,8), ()): ("RGB", "RGB;R"), - (MM, 2, 1, 1, (8,8,8,8), (0,)): ("RGBX", "RGBX"), - (MM, 2, 1, 1, (8,8,8,8), (1,)): ("RGBA", "RGBa"), - (MM, 2, 1, 1, (8,8,8,8), (2,)): ("RGBA", "RGBA"), - (MM, 2, 1, 1, (8,8,8,8), (999,)): ("RGBA", "RGBA"), # corel draw 10 - (MM, 3, 1, 1, (1,), ()): ("P", "P;1"), - (MM, 3, 1, 2, (1,), ()): ("P", "P;1R"), - (MM, 3, 1, 1, (2,), ()): ("P", "P;2"), - (MM, 3, 1, 2, (2,), ()): ("P", "P;2R"), - (MM, 3, 1, 1, (4,), ()): ("P", "P;4"), - (MM, 3, 1, 2, (4,), ()): ("P", "P;4R"), - (MM, 3, 1, 1, (8,), ()): ("P", "P"), - (MM, 3, 1, 1, (8,8), (2,)): ("PA", "PA"), - (MM, 3, 1, 2, (8,), ()): ("P", "P;R"), - (MM, 5, 1, 1, (8,8,8,8), ()): ("CMYK", "CMYK"), - (MM, 6, 1, 1, (8,8,8), ()): ("YCbCr", "YCbCr"), - (MM, 8, 1, 1, (8,8,8), ()): ("LAB", "LAB"), - -} - -PREFIXES = [b"MM\000\052", b"II\052\000", b"II\xBC\000"] - -def _accept(prefix): - return prefix[:4] in PREFIXES - -## -# Wrapper for TIFF IFDs. - -class ImageFileDirectory(collections.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 - ImageFileDirectory[key] = value - value = ImageFileDirectory[key] - - Also contains a dictionary of tag types as read from the tiff - image file, 'ImageFileDirectory.tagtype' - - - Data Structures: - 'public' - * self.tagtype = {} Key: numerical tiff tag number - Value: integer corresponding to the data type from - `TiffTags.TYPES` - - 'internal' - * self.tags = {} Key: numerical tiff tag number - Value: Decoded data, Generally a tuple. - * If set from __setval__ -- always a tuple - * Numeric types -- always a tuple - * String type -- not a tuple, returned as string - * Undefined data -- not a tuple, returned as bytes - * Byte -- not a tuple, returned as byte. - * self.tagdata = {} Key: numerical tiff tag number - Value: undecoded byte string from file - - - Tags will be found in either self.tags or self.tagdata, but - not both. The union of the two should contain all the tags - from the Tiff image file. External classes shouldn't - reference these unless they're really sure what they're doing. - """ - - def __init__(self, prefix=II): - """ - :prefix: 'II'|'MM' tiff endianness - """ - self.prefix = prefix[:2] - if self.prefix == MM: - self.i16, self.i32 = ib16, ib32 - self.o16, self.o32 = ob16, ob32 - elif self.prefix == II: - self.i16, self.i32 = il16, il32 - self.o16, self.o32 = ol16, ol32 - else: - raise SyntaxError("not a TIFF IFD") - self.reset() - - def reset(self): - #: Tags is an incomplete dictionary of the tags of the image. - #: For a complete dictionary, use the as_dict method. - self.tags = {} - self.tagdata = {} - self.tagtype = {} # added 2008-06-05 by Florian Hoech - self.next = None - - def __str__(self): - return str(self.as_dict()) - - def as_dict(self): - """Return a dictionary of the image's tags.""" - return dict(self.items()) - - def named(self): - """Returns the complete tag dictionary, with named tags where posible.""" - from PIL import TiffTags - result = {} - for tag_code, value in self.items(): - tag_name = TiffTags.TAGS.get(tag_code, tag_code) - result[tag_name] = value - return result - - - # dictionary API - - def __len__(self): - return len(self.tagdata) + len(self.tags) - - def __getitem__(self, tag): - try: - return self.tags[tag] - except KeyError: - data = self.tagdata[tag] # unpack on the fly - type = self.tagtype[tag] - size, handler = self.load_dispatch[type] - self.tags[tag] = data = handler(self, data) - del self.tagdata[tag] - return data - - def getscalar(self, tag, default=None): - try: - value = self[tag] - if len(value) != 1: - if tag == SAMPLEFORMAT: - # work around broken (?) matrox library - # (from Ted Wright, via Bob Klimek) - raise KeyError # use default - raise ValueError("not a scalar") - return value[0] - except KeyError: - if default is None: - raise - return default - - def __contains__(self, tag): - return tag in self.tags or tag in self.tagdata - - if bytes is str: - def has_key(self, tag): - return tag in self - - def __setitem__(self, tag, value): - # tags are tuples for integers - # tags are not tuples for byte, string, and undefined data. - # see load_* - if not isinstance(value, tuple): - value = (value,) - self.tags[tag] = value - - def __delitem__(self, tag): - self.tags.pop(tag, self.tagdata.pop(tag, None)) - - def __iter__(self): - return itertools.chain(self.tags.__iter__(), self.tagdata.__iter__()) - - def items(self): - keys = list(self.__iter__()) - values = [self[key] for key in keys] - return zip(keys, values) - - # load primitives - - load_dispatch = {} - - def load_byte(self, data): - return data - load_dispatch[1] = (1, load_byte) - - def load_string(self, data): - if data[-1:] == b'\0': - data = data[:-1] - return data.decode('latin-1', 'replace') - load_dispatch[2] = (1, load_string) - - def load_short(self, data): - l = [] - for i in range(0, len(data), 2): - l.append(self.i16(data, i)) - return tuple(l) - load_dispatch[3] = (2, load_short) - - def load_long(self, data): - l = [] - for i in range(0, len(data), 4): - l.append(self.i32(data, i)) - return tuple(l) - load_dispatch[4] = (4, load_long) - - def load_rational(self, data): - l = [] - for i in range(0, len(data), 8): - l.append((self.i32(data, i), self.i32(data, i+4))) - return tuple(l) - load_dispatch[5] = (8, load_rational) - - def load_float(self, data): - a = array.array("f", data) - if self.prefix != native_prefix: - a.byteswap() - return tuple(a) - load_dispatch[11] = (4, load_float) - - def load_double(self, data): - a = array.array("d", data) - if self.prefix != native_prefix: - a.byteswap() - return tuple(a) - load_dispatch[12] = (8, load_double) - - def load_undefined(self, data): - # Untyped data - return data - load_dispatch[7] = (1, load_undefined) - - def load(self, fp): - # load tag dictionary - - self.reset() - - i16 = self.i16 - i32 = self.i32 - - for i in range(i16(fp.read(2))): - - ifd = fp.read(12) - - tag, typ = i16(ifd), i16(ifd, 2) - - if Image.DEBUG: - from PIL import TiffTags - tagname = TiffTags.TAGS.get(tag, "unknown") - typname = TiffTags.TYPES.get(typ, "unknown") - print("tag: %s (%d)" % (tagname, tag), end=' ') - print("- type: %s (%d)" % (typname, typ), end=' ') - - try: - dispatch = self.load_dispatch[typ] - except KeyError: - if Image.DEBUG: - print("- unsupported type", typ) - continue # ignore unsupported type - - size, handler = dispatch - - size = size * i32(ifd, 4) - - # Get and expand tag value - if size > 4: - here = fp.tell() - fp.seek(i32(ifd, 8)) - data = ImageFile._safe_read(fp, size) - fp.seek(here) - else: - data = ifd[8:8+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)) - continue - - self.tagdata[tag] = data - self.tagtype[tag] = typ - - if Image.DEBUG: - if tag in (COLORMAP, IPTC_NAA_CHUNK, PHOTOSHOP_CHUNK, ICCPROFILE, XMP): - print("- value: " % size) - else: - print("- value:", self[tag]) - - self.next = i32(fp.read(4)) - - # save primitives - - def save(self, fp): - - o16 = self.o16 - o32 = self.o32 - - fp.write(o16(len(self.tags))) - - # always write in ascending tag order - tags = sorted(self.tags.items()) - - directory = [] - append = directory.append - - offset = fp.tell() + len(self.tags) * 12 + 4 - - stripoffsets = None - - # pass 1: convert tags to binary format - for tag, value in tags: - - typ = None - - if tag in self.tagtype: - typ = self.tagtype[tag] - - if Image.DEBUG: - print ("Tag %s, Type: %s, Value: %s" % (tag, typ, value)) - - if typ == 1: - # byte data - if isinstance(value, tuple): - data = value = value[-1] - else: - data = value - elif typ == 7: - # untyped data - data = value = b"".join(value) - elif isStringType(value[0]): - # string data - if isinstance(value, tuple): - value = value[-1] - typ = 2 - # was b'\0'.join(str), which led to \x00a\x00b sorts - # of strings which I don't see in in the wild tiffs - # and doesn't match the tiff spec: 8-bit byte that - # contains a 7-bit ASCII code; the last byte must be - # NUL (binary zero). Also, I don't think this was well - # excersized before. - data = value = b"" + value.encode('ascii', 'replace') + b"\0" - else: - # integer data - if tag == STRIPOFFSETS: - stripoffsets = len(directory) - typ = 4 # to avoid catch-22 - elif tag in (X_RESOLUTION, Y_RESOLUTION) or typ==5: - # identify rational data fields - typ = 5 - if isinstance(value[0], tuple): - # long name for flatten - value = tuple(itertools.chain.from_iterable(value)) - elif not typ: - typ = 3 - for v in value: - if v >= 65536: - typ = 4 - if typ == 3: - data = b"".join(map(o16, value)) - else: - data = b"".join(map(o32, value)) - - if Image.DEBUG: - from PIL import TiffTags - tagname = TiffTags.TAGS.get(tag, "unknown") - typname = TiffTags.TYPES.get(typ, "unknown") - print("save: %s (%d)" % (tagname, tag), end=' ') - print("- type: %s (%d)" % (typname, typ), end=' ') - if tag in (COLORMAP, IPTC_NAA_CHUNK, PHOTOSHOP_CHUNK, ICCPROFILE, XMP): - size = len(data) - print("- value: " % size) - else: - print("- value:", value) - - # figure out if data fits into the directory - if len(data) == 4: - append((tag, typ, len(value), data, b"")) - elif len(data) < 4: - append((tag, typ, len(value), data + (4-len(data))*b"\0", b"")) - else: - count = len(value) - if typ == 5: - count = count // 2 # adjust for rational data field - - append((tag, typ, count, o32(offset), data)) - offset += len(data) - if offset & 1: - offset += 1 # word padding - - # update strip offset data to point beyond auxiliary data - if stripoffsets is not None: - tag, typ, count, value, data = directory[stripoffsets] - assert not data, "multistrip support not yet implemented" - value = o32(self.i32(value) + offset) - directory[stripoffsets] = tag, typ, count, value, data - - # pass 2: write directory to file - for tag, typ, count, value, data in directory: - if Image.DEBUG > 1: - print(tag, typ, count, repr(value), repr(data)) - fp.write(o16(tag) + o16(typ) + o32(count) + value) - - # -- overwrite here for multi-page -- - fp.write(b"\0\0\0\0") # end of directory - - # pass 3: write auxiliary data to file - for tag, typ, count, value, data in directory: - fp.write(data) - if len(data) & 1: - fp.write(b"\0") - - return offset - -## -# Image plugin for TIFF files. - -class TiffImageFile(ImageFile.ImageFile): - - format = "TIFF" - format_description = "Adobe TIFF" - - def _open(self): - "Open the first image in a TIFF file" - - # Header - ifh = self.fp.read(8) - - if ifh[:4] not in PREFIXES: - raise SyntaxError("not a TIFF file") - - # image file directory (tag dictionary) - self.tag = self.ifd = ImageFileDirectory(ifh[:2]) - - # setup frame pointers - self.__first = self.__next = self.ifd.i32(ifh, 4) - self.__frame = -1 - self.__fp = self.fp - - if Image.DEBUG: - print ("*** TiffImageFile._open ***") - print ("- __first:", self.__first) - print ("- ifh: ", ifh) - - # and load the first frame - self._seek(0) - - def seek(self, frame): - "Select a given frame as current image" - - if frame < 0: - frame = 0 - self._seek(frame) - - def tell(self): - "Return the current frame number" - - return self._tell() - - def _seek(self, frame): - - self.fp = self.__fp - if frame < self.__frame: - # rewind file - self.__frame = -1 - self.__next = self.__first - while self.__frame < frame: - if not self.__next: - raise EOFError("no more images in TIFF file") - self.fp.seek(self.__next) - self.tag.load(self.fp) - self.__next = self.tag.next - self.__frame += 1 - self._setup() - - def _tell(self): - - return self.__frame - - def _decoder(self, rawmode, layer, tile=None): - "Setup decoder contexts" - - args = None - if rawmode == "RGB" and self._planar_configuration == 2: - rawmode = rawmode[layer] - compression = self._compression - if compression == "raw": - args = (rawmode, 0, 1) - elif compression == "jpeg": - args = rawmode, "" - if JPEGTABLES in self.tag: - # Hack to handle abbreviated JPEG headers - self.tile_prefix = self.tag[JPEGTABLES] - elif compression == "packbits": - args = rawmode - elif compression == "tiff_lzw": - args = rawmode - if 317 in self.tag: - # Section 14: Differencing Predictor - self.decoderconfig = (self.tag[PREDICTOR][0],) - - if ICCPROFILE in self.tag: - self.info['icc_profile'] = self.tag[ICCPROFILE] - - return args - - def _load_libtiff(self): - """ Overload method triggered when we detect a compressed tiff - Calls out to libtiff """ - - pixel = Image.Image.load(self) - - if self.tile is None: - raise IOError("cannot load this image") - if not self.tile: - return pixel - - self.load_prepare() - - if not len(self.tile) == 1: - raise IOError("Not exactly one tile") - - # (self._compression, (extents tuple), 0, (rawmode, self._compression, fp)) - ignored, extents, ignored_2, args = self.tile[0] - decoder = Image._getdecoder(self.mode, 'libtiff', args, self.decoderconfig) - try: - decoder.setimage(self.im, extents) - except ValueError: - raise IOError("Couldn't set the image") - - 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 IOError if there's no underlying fp. Easier to deal - # with here by reordering. - if Image.DEBUG: - print ("have getvalue. just sending in a string from getvalue") - n,err = decoder.decode(self.fp.getvalue()) - elif hasattr(self.fp, "fileno"): - # we've got a actual file on disk, pass in the fp. - if Image.DEBUG: - print ("have fileno, calling fileno version of the decoder.") - self.fp.seek(0) - n,err = decoder.decode(b"fpfp") # 4 bytes, otherwise the trace might error out - else: - # we have something else. - if Image.DEBUG: - print ("don't have fileno or getvalue. just reading") - # UNDONE -- so much for that buffer size thing. - n,err = decoder.decode(self.fp.read()) - - - self.tile = [] - self.readonly = 0 - # libtiff closed the fp in a, we need to close self.fp, if possible - if hasattr(self.fp, 'close'): - self.fp.close() - self.fp = None # might be shared - - if err < 0: - raise IOError(err) - - self.load_end() - - return Image.Image.load(self) - - def _setup(self): - "Setup this image object based on current tags" - - if 0xBC01 in self.tag: - raise IOError("Windows Media Photo files not yet supported") - - getscalar = self.tag.getscalar - - # extract relevant tags - self._compression = COMPRESSION_INFO[getscalar(COMPRESSION, 1)] - self._planar_configuration = getscalar(PLANAR_CONFIGURATION, 1) - - # photometric is a required tag, but not everyone is reading - # the specification - photo = getscalar(PHOTOMETRIC_INTERPRETATION, 0) - - fillorder = getscalar(FILLORDER, 1) - - if Image.DEBUG: - print("*** Summary ***") - print("- compression:", self._compression) - print("- photometric_interpretation:", photo) - print("- planar_configuration:", self._planar_configuration) - print("- fill_order:", fillorder) - - # size - xsize = getscalar(IMAGEWIDTH) - ysize = getscalar(IMAGELENGTH) - self.size = xsize, ysize - - if Image.DEBUG: - print("- size:", self.size) - - format = getscalar(SAMPLEFORMAT, 1) - - # mode: check photometric interpretation and bits per pixel - key = ( - self.tag.prefix, photo, format, fillorder, - self.tag.get(BITSPERSAMPLE, (1,)), - self.tag.get(EXTRASAMPLES, ()) - ) - if Image.DEBUG: - print("format key:", key) - try: - self.mode, rawmode = OPEN_INFO[key] - except KeyError: - if Image.DEBUG: - print("- unsupported format") - raise SyntaxError("unknown pixel mode") - - if Image.DEBUG: - print("- raw mode:", rawmode) - print("- pil mode:", self.mode) - - self.info["compression"] = self._compression - - xres = getscalar(X_RESOLUTION, (1, 1)) - yres = getscalar(Y_RESOLUTION, (1, 1)) - - if xres and not isinstance(xres, tuple): - xres = (xres, 1.) - if yres and not isinstance(yres, tuple): - yres = (yres, 1.) - if xres and yres: - xres = xres[0] / (xres[1] or 1) - yres = yres[0] / (yres[1] or 1) - resunit = getscalar(RESOLUTION_UNIT, 1) - if resunit == 2: # dots per inch - self.info["dpi"] = xres, yres - elif resunit == 3: # dots per centimeter. convert to dpi - self.info["dpi"] = xres * 2.54, yres * 2.54 - else: # No absolute unit of measurement - self.info["resolution"] = xres, yres - - # build tile descriptors - x = y = l = 0 - self.tile = [] - if STRIPOFFSETS in self.tag: - # striped image - offsets = self.tag[STRIPOFFSETS] - h = getscalar(ROWSPERSTRIP, ysize) - w = self.size[0] - if READ_LIBTIFF or self._compression in ["tiff_ccitt", "group3", "group4", - "tiff_jpeg", "tiff_adobe_deflate", - "tiff_thunderscan", "tiff_deflate", - "tiff_sgilog", "tiff_sgilog24", - "tiff_raw_16"]: - ## if Image.DEBUG: - ## print "Activating g4 compression for whole file" - - # 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 - # replace the existing load function with our - # _load_libtiff function. - - self.load = self._load_libtiff - - # 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()) - except IOError: - # io.BytesIO have a fileno, but returns an IOError if - # it doesn't use a file descriptor. - fp = False - - # 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: - key = ( - self.tag.prefix, photo, format, 1, - self.tag.get(BITSPERSAMPLE, (1,)), - self.tag.get(EXTRASAMPLES, ()) - ) - if Image.DEBUG: - print("format key:", 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 self.mode in ('I;16B', 'I;16') and 'I;16' in rawmode: - rawmode = 'I;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, fp ) - self.tile.append( - (self._compression, - (0, 0, w, ysize), - 0, a)) - a = None - - else: - for i in range(len(offsets)): - a = self._decoder(rawmode, l, i) - self.tile.append( - (self._compression, - (0, min(y, ysize), w, min(y+h, ysize)), - offsets[i], a)) - if Image.DEBUG: - print ("tiles: ", self.tile) - y = y + h - if y >= self.size[1]: - x = y = 0 - l += 1 - a = None - elif TILEOFFSETS in self.tag: - # tiled image - w = getscalar(322) - h = getscalar(323) - a = None - for o in self.tag[TILEOFFSETS]: - if not a: - a = self._decoder(rawmode, l) - # FIXME: this doesn't work if the image size - # is not a multiple of the tile size... - self.tile.append( - (self._compression, - (x, y, x+w, y+h), - o, a)) - x = x + w - if x >= self.size[0]: - x, y = 0, y + h - if y >= self.size[1]: - x = y = 0 - l += 1 - a = None - else: - if Image.DEBUG: - print("- unsupported data organization") - raise SyntaxError("unknown data organization") - - # fixup palette descriptor - - if self.mode == "P": - palette = [o8(a // 256) for a in self.tag[COLORMAP]] - self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) -# -# -------------------------------------------------------------------- -# Write TIFF files - -# little endian is default except for image modes with explict 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 _cvt_res(value): - # convert value to TIFF rational number -- (numerator, denominator) - if isinstance(value, collections.Sequence): - assert(len(value) % 2 == 0) - return value - if isinstance(value, int): - return (value, 1) - value = float(value) - return (int(value * 65536), 65536) - -def _save(im, fp, filename): - - try: - rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] - except KeyError: - raise IOError("cannot write mode %s as TIFF" % im.mode) - - ifd = ImageFileDirectory(prefix) - - compression = im.encoderinfo.get('compression',im.info.get('compression','raw')) - - libtiff = WRITE_LIBTIFF or compression != 'raw' - - # required for color libtiff images - ifd[PLANAR_CONFIGURATION] = getattr(im, '_planar_configuration', 1) - - # -- multi-page -- skip TIFF header on subsequent pages - if not libtiff and fp.tell() == 0: - # tiff header (write via IFD to get everything right) - # PIL always starts the first IFD at offset 8 - fp.write(ifd.prefix + ifd.o16(42) + ifd.o32(8)) - - ifd[IMAGEWIDTH] = im.size[0] - ifd[IMAGELENGTH] = im.size[1] - - # write any arbitrary tags passed in as an ImageFileDirectory - info = im.encoderinfo.get("tiffinfo",{}) - if Image.DEBUG: - print ("Tiffinfo Keys: %s"% info.keys) - keys = list(info.keys()) - for key in keys: - ifd[key] = info.get(key) - try: - ifd.tagtype[key] = info.tagtype[key] - except: - 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'): - # 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: - ifd[key] = im.tag[key] - ifd.tagtype[key] = im.tag.tagtype.get(key, None) - - # 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"] - - if "description" in im.encoderinfo: - ifd[IMAGEDESCRIPTION] = im.encoderinfo["description"] - if "resolution" in im.encoderinfo: - ifd[X_RESOLUTION] = ifd[Y_RESOLUTION] \ - = _cvt_res(im.encoderinfo["resolution"]) - if "x resolution" in im.encoderinfo: - ifd[X_RESOLUTION] = _cvt_res(im.encoderinfo["x resolution"]) - if "y resolution" in im.encoderinfo: - ifd[Y_RESOLUTION] = _cvt_res(im.encoderinfo["y resolution"]) - if "resolution unit" in im.encoderinfo: - unit = im.encoderinfo["resolution unit"] - if unit == "inch": - ifd[RESOLUTION_UNIT] = 2 - elif unit == "cm" or unit == "centimeter": - ifd[RESOLUTION_UNIT] = 3 - else: - ifd[RESOLUTION_UNIT] = 1 - if "software" in im.encoderinfo: - ifd[SOFTWARE] = im.encoderinfo["software"] - if "date time" in im.encoderinfo: - ifd[DATE_TIME] = im.encoderinfo["date time"] - if "artist" in im.encoderinfo: - ifd[ARTIST] = im.encoderinfo["artist"] - if "copyright" in im.encoderinfo: - ifd[COPYRIGHT] = im.encoderinfo["copyright"] - - dpi = im.encoderinfo.get("dpi") - if dpi: - ifd[RESOLUTION_UNIT] = 2 - ifd[X_RESOLUTION] = _cvt_res(dpi[0]) - ifd[Y_RESOLUTION] = _cvt_res(dpi[1]) - - 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 == "P": - 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] - ifd[STRIPBYTECOUNTS] = stride * im.size[1] - ifd[STRIPOFFSETS] = 0 # this is adjusted by IFD writer - ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression,1) # no compression by default - - if libtiff: - if Image.DEBUG: - print ("Saving using libtiff encoder") - print (ifd.items()) - _fp = 0 - if hasattr(fp, "fileno"): - fp.seek(0) - _fp = os.dup(fp.fileno()) - - blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS, ROWSPERSTRIP, ICCPROFILE] # ICC Profile crashes. - 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. - for k,v in itertools.chain(ifd.items(), getattr(im, 'ifd', {}).items()): - if k not in atts and k not in blocklist: - if type(v[0]) == tuple and len(v) > 1: - # A tuple of more than one rational tuples - # flatten to floats, following tiffcp.c->cpTag->TIFF_RATIONAL - atts[k] = [float(elt[0])/float(elt[1]) for elt in v] - continue - if type(v[0]) == tuple and len(v) == 1: - # A tuple of one rational tuples - # flatten to floats, following tiffcp.c->cpTag->TIFF_RATIONAL - atts[k] = float(v[0][0])/float(v[0][1]) - continue - if type(v) == tuple and len(v) > 2: - # List of ints? - if type(v[0]) in (int, float): - atts[k] = list(v) - continue - if type(v) == tuple and len(v) == 2: - # one rational tuple - # flatten to float, following tiffcp.c->cpTag->TIFF_RATIONAL - atts[k] = float(v[0])/float(v[1]) - continue - if type(v) == tuple and len(v) == 1: - v = v[0] - # drop through - if isStringType(v): - atts[k] = bytes(v.encode('ascii', 'replace')) + b"\0" - continue - else: - # int or similar - atts[k] = v - - if Image.DEBUG: - print (atts) - - # 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' - - a = (rawmode, compression, _fp, filename, atts) - # print (im.mode, compression, a, im.encoderconfig) - e = Image._getencoder(im.mode, 'libtiff', a, im.encoderconfig) - e.setimage(im.im, (0,0)+im.size) - while True: - l, s, d = e.encode(16*1024) # undone, change to self.decodermaxblock - if not _fp: - fp.write(d) - if s: - break - if s < 0: - raise IOError("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 - -# -# -------------------------------------------------------------------- -# Register - -Image.register_open("TIFF", TiffImageFile, _accept) -Image.register_save("TIFF", _save) - -Image.register_extension("TIFF", ".tif") -Image.register_extension("TIFF", ".tiff") - -Image.register_mime("TIFF", "image/tiff") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/TiffTags.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/TiffTags.py deleted file mode 100644 index 92a4b5a..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/TiffTags.py +++ /dev/null @@ -1,213 +0,0 @@ -# -# 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. -## - -## -# Map tag numbers (or tag number, tag value tuples) to tag names. - -TAGS = { - - 254: "NewSubfileType", - 255: "SubfileType", - 256: "ImageWidth", - 257: "ImageLength", - 258: "BitsPerSample", - - 259: "Compression", - (259, 1): "Uncompressed", - (259, 2): "CCITT 1d", - (259, 3): "Group 3 Fax", - (259, 4): "Group 4 Fax", - (259, 5): "LZW", - (259, 6): "JPEG", - (259, 32773): "PackBits", - - 262: "PhotometricInterpretation", - (262, 0): "WhiteIsZero", - (262, 1): "BlackIsZero", - (262, 2): "RGB", - (262, 3): "RGB Palette", - (262, 4): "Transparency Mask", - (262, 5): "CMYK", - (262, 6): "YCbCr", - (262, 8): "CieLAB", - (262, 32803): "CFA", # TIFF/EP, Adobe DNG - (262, 32892): "LinearRaw", # Adobe DNG - - 263: "Thresholding", - 264: "CellWidth", - 265: "CellHeight", - 266: "FillOrder", - 269: "DocumentName", - - 270: "ImageDescription", - 271: "Make", - 272: "Model", - 273: "StripOffsets", - 274: "Orientation", - 277: "SamplesPerPixel", - 278: "RowsPerStrip", - 279: "StripByteCounts", - - 280: "MinSampleValue", - 281: "MaxSampleValue", - 282: "XResolution", - 283: "YResolution", - 284: "PlanarConfiguration", - (284, 1): "Contigous", - (284, 2): "Separate", - - 285: "PageName", - 286: "XPosition", - 287: "YPosition", - 288: "FreeOffsets", - 289: "FreeByteCounts", - - 290: "GrayResponseUnit", - 291: "GrayResponseCurve", - 292: "T4Options", - 293: "T6Options", - 296: "ResolutionUnit", - 297: "PageNumber", - - 301: "TransferFunction", - 305: "Software", - 306: "DateTime", - - 315: "Artist", - 316: "HostComputer", - 317: "Predictor", - 318: "WhitePoint", - 319: "PrimaryChromaticies", - - 320: "ColorMap", - 321: "HalftoneHints", - 322: "TileWidth", - 323: "TileLength", - 324: "TileOffsets", - 325: "TileByteCounts", - - 332: "InkSet", - 333: "InkNames", - 334: "NumberOfInks", - 336: "DotRange", - 337: "TargetPrinter", - 338: "ExtraSamples", - 339: "SampleFormat", - - 340: "SMinSampleValue", - 341: "SMaxSampleValue", - 342: "TransferRange", - - 347: "JPEGTables", - - # obsolete JPEG tags - 512: "JPEGProc", - 513: "JPEGInterchangeFormat", - 514: "JPEGInterchangeFormatLength", - 515: "JPEGRestartInterval", - 517: "JPEGLosslessPredictors", - 518: "JPEGPointTransforms", - 519: "JPEGQTables", - 520: "JPEGDCTables", - 521: "JPEGACTables", - - 529: "YCbCrCoefficients", - 530: "YCbCrSubSampling", - 531: "YCbCrPositioning", - 532: "ReferenceBlackWhite", - - # XMP - 700: "XMP", - - 33432: "Copyright", - - # various extensions (should check specs for "official" names) - 33723: "IptcNaaInfo", - 34377: "PhotoshopInfo", - - # Exif IFD - 34665: "ExifIFD", - - # ICC Profile - 34675: "ICCProfile", - - # 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", - 50741: "BestQualityScale", # FIXME! Dictionary contains duplicate keys 50741 - 50719: "DefaultCropOrigin", - 50720: "DefaultCropSize", - 50778: "CalibrationIlluminant1", - 50779: "CalibrationIlluminant2", - 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", - 50741: "MakerNoteSafety", # FIXME! Dictionary contains duplicate keys 50741 - - #ImageJ - 50838: "ImageJMetaDataByteCounts", # private tag registered with Adobe - 50839: "ImageJMetaData", # private tag registered with Adobe -} - -## -# Map type numbers to type names. - -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", - -} diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/WalImageFile.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/WalImageFile.py deleted file mode 100644 index d494bfd..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/WalImageFile.py +++ /dev/null @@ -1,132 +0,0 @@ -# -*- coding: iso-8859-1 -*- -# -# 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. -# - -# NOTE: This format cannot be automatically recognized, so the reader -# is not registered for use with Image.open(). To open a WAL file, use -# the WalImageFile.open() function instead. - -# This reader is based on the specification available from: -# http://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml -# and has been tested with a few sample files found using google. - -from __future__ import print_function - -from PIL import Image, _binary - -try: - import builtins -except ImportError: - import __builtin__ - builtins = __builtin__ - -i32 = _binary.i32le - -## -# 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 putpalette method. -# -# @param filename WAL file name, or an opened file handle. -# @return An image instance. - -def open(filename): - # FIXME: modify to return a WalImageFile instance instead of - # plain Image object ? - - if hasattr(filename, "read"): - fp = filename - else: - fp = builtins.open(filename, "rb") - - # 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) - - 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 - - -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" -) - -if __name__ == "__main__": - im = open("../hacks/sample.wal") - print(im.info, im.mode, im.size) - im.save("../out.png") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/WebPImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/WebPImagePlugin.py deleted file mode 100644 index ab60c8d..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/WebPImagePlugin.py +++ /dev/null @@ -1,79 +0,0 @@ -from PIL import Image -from PIL import ImageFile -from io import BytesIO -from PIL import _webp - - -_VALID_WEBP_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 - - return is_riff_file_format and is_webp_file and is_valid_vp8_mode - - -class WebPImageFile(ImageFile.ImageFile): - - format = "WEBP" - format_description = "WebP image" - - def _open(self): - 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)] - - def _getexif(self): - from PIL.JpegImagePlugin import _getexif - return _getexif(self) - - -def _save(im, fp, filename): - image_mode = im.mode - if im.mode not in _VALID_WEBP_MODES: - raise IOError("cannot write mode %s as WEBP" % image_mode) - - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - icc_profile = im.encoderinfo.get("icc_profile", "") - exif = im.encoderinfo.get("exif", "") - - data = _webp.WebPEncode( - im.tobytes(), - im.size[0], - im.size[1], - lossless, - float(quality), - im.mode, - icc_profile, - exif - ) - if data is None: - raise IOError("cannot write file as WEBP (encoder returned None)") - - fp.write(data) - - -Image.register_open("WEBP", WebPImageFile, _accept) -Image.register_save("WEBP", _save) - -Image.register_extension("WEBP", ".webp") -Image.register_mime("WEBP", "image/webp") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/WmfImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/WmfImagePlugin.py deleted file mode 100644 index 40b2037..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/WmfImagePlugin.py +++ /dev/null @@ -1,165 +0,0 @@ -# -# 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. -# - -__version__ = "0.2" - -from PIL import Image, ImageFile, _binary - -_handler = None - -if str != bytes: - long = int - -## -# Install application-specific WMF image handler. -# -# @param handler Handler object. - -def register_handler(handler): - 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()) - -# -------------------------------------------------------------------- - -word = _binary.i16le - -def short(c, o=0): - v = word(c, o) - if v >= 32768: - v -= 65536 - return v - -dword = _binary.i32le - -# -# -------------------------------------------------------------------- -# 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): - - # 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 - 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 - size = (x1 - x0) * 72 // inch, (y1 - y0) * 72 // inch - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - self.info["dpi"] = 72 - - # print self.mode, self.size, self.info - - # 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 = dword(s, 8); y0 = dword(s, 12) - x1 = dword(s, 16); y1 = dword(s, 20) - - # get frame (in 0.01 millimeter units) - frame = dword(s, 24), dword(s, 28), dword(s, 32), dword(s, 36) - - # normalize size to 72 dots per inch - size = x1 - x0, y1 - y0 - - # calculate dots per inch from bbox and frame - xdpi = 2540 * (x1 - y0) // (frame[2] - frame[0]) - ydpi = 2540 * (y1 - y0) // (frame[3] - frame[1]) - - 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 _save(im, fp, filename): - if _handler is None or not hasattr("_handler", "save"): - raise IOError("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_extension(WmfStubImageFile.format, ".wmf") -Image.register_extension(WmfStubImageFile.format, ".emf") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/XVThumbImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/XVThumbImagePlugin.py deleted file mode 100644 index e5bf55a..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/XVThumbImagePlugin.py +++ /dev/null @@ -1,74 +0,0 @@ -# -# 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) -# - -__version__ = "0.1" - -from PIL import Image, ImageFile, ImagePalette, _binary - -o8 = _binary.o8 - -# 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)) - -## -# Image plugin for XV thumbnail images. - -class XVThumbImageFile(ImageFile.ImageFile): - - format = "XVThumb" - format_description = "XV thumbnail image" - - def _open(self): - - # check magic - s = self.fp.read(6) - if s != b"P7 332": - 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 s[0] != b'#': - break - - # parse header line (already read) - s = s.strip().split() - - self.mode = "P" - self.size = int(s[0:1]), int(s[1:2]) - - self.palette = ImagePalette.raw("RGB", PALETTE) - - self.tile = [ - ("raw", (0, 0)+self.size, - self.fp.tell(), (self.mode, 0, 1) - )] - -# -------------------------------------------------------------------- - -Image.register_open("XVThumb", XVThumbImageFile) diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/XbmImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/XbmImagePlugin.py deleted file mode 100644 index 799d727..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/XbmImagePlugin.py +++ /dev/null @@ -1,94 +0,0 @@ -# -# 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. -# - -__version__ = "0.6" - -import re -from PIL import Image, ImageFile - -# XBM header -xbm_head = re.compile( - b"\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 IOError("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("XBM", XbmImageFile, _accept) -Image.register_save("XBM", _save) - -Image.register_extension("XBM", ".xbm") - -Image.register_mime("XBM", "image/xbm") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/XpmImagePlugin.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/XpmImagePlugin.py deleted file mode 100644 index 701a23b..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/XpmImagePlugin.py +++ /dev/null @@ -1,130 +0,0 @@ -# -# 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. -# - - -__version__ = "0.2" - - -import re -from PIL import Image, ImageFile, ImagePalette -from PIL._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) - - self.fp = None - - return b"".join(s) - -# -# Registry - -Image.register_open("XPM", XpmImageFile, _accept) - -Image.register_extension("XPM", ".xpm") - -Image.register_mime("XPM", "image/xpm") diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/__init__.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/__init__.py deleted file mode 100644 index d5894c4..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/__init__.py +++ /dev/null @@ -1,57 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# package placeholder -# -# Copyright (c) 1999 by Secret Labs AB. -# -# See the README file for information on usage and redistribution. -# - -# ;-) - -VERSION = '1.1.7' # PIL version -PILLOW_VERSION = '2.5.3' # Pillow - -_plugins = ['BmpImagePlugin', - 'BufrStubImagePlugin', - 'CurImagePlugin', - 'DcxImagePlugin', - 'EpsImagePlugin', - 'FitsStubImagePlugin', - 'FliImagePlugin', - 'FpxImagePlugin', - 'GbrImagePlugin', - 'GifImagePlugin', - 'GribStubImagePlugin', - 'Hdf5StubImagePlugin', - 'IcnsImagePlugin', - 'IcoImagePlugin', - 'ImImagePlugin', - 'ImtImagePlugin', - 'IptcImagePlugin', - 'JpegImagePlugin', - 'Jpeg2KImagePlugin', - 'McIdasImagePlugin', - 'MicImagePlugin', - 'MpegImagePlugin', - 'MspImagePlugin', - 'PalmImagePlugin', - 'PcdImagePlugin', - 'PcxImagePlugin', - 'PdfImagePlugin', - 'PixarImagePlugin', - 'PngImagePlugin', - 'PpmImagePlugin', - 'PsdImagePlugin', - 'SgiImagePlugin', - 'SpiderImagePlugin', - 'SunImagePlugin', - 'TgaImagePlugin', - 'TiffImagePlugin', - 'WebPImagePlugin', - 'WmfImagePlugin', - 'XbmImagePlugin', - 'XpmImagePlugin', - 'XVThumbImagePlugin'] diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/_binary.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/_binary.py deleted file mode 100644 index 71b2b78..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/_binary.py +++ /dev/null @@ -1,65 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Binary input/output support routines. -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1995-2003 by Fredrik Lundh -# Copyright (c) 2012 by Brian Crowell -# -# See the README file for information on usage and redistribution. -# - -if bytes is str: - def i8(c): - return ord(c) - - def o8(i): - return chr(i&255) -else: - def i8(c): - return c if c.__class__ is int else c[0] - - def o8(i): - return bytes((i&255,)) - -# Input, le = little endian, be = big endian -#TODO: replace with more readable struct.unpack equivalent -def i16le(c, o=0): - """ - Converts a 2-bytes (16 bits) string to an integer. - - c: string containing bytes to convert - o: offset of bytes to convert in string - """ - return i8(c[o]) | (i8(c[o+1])<<8) - -def i32le(c, o=0): - """ - Converts a 4-bytes (32 bits) string to an integer. - - c: string containing bytes to convert - o: offset of bytes to convert in string - """ - return i8(c[o]) | (i8(c[o+1])<<8) | (i8(c[o+2])<<16) | (i8(c[o+3])<<24) - -def i16be(c, o=0): - return (i8(c[o])<<8) | i8(c[o+1]) - -def i32be(c, o=0): - return (i8(c[o])<<24) | (i8(c[o+1])<<16) | (i8(c[o+2])<<8) | i8(c[o+3]) - -# Output, le = little endian, be = big endian -def o16le(i): - return o8(i) + o8(i>>8) - -def o32le(i): - return o8(i) + o8(i>>8) + o8(i>>16) + o8(i>>24) - -def o16be(i): - return o8(i>>8) + o8(i) - -def o32be(i): - return o8(i>>24) + o8(i>>16) + o8(i>>8) + o8(i) - diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/_imaging.cpython-34m.so b/Linux_x86_64/lib/python3.4/site-packages/PIL/_imaging.cpython-34m.so deleted file mode 100755 index 6beda98b95cf7d936dd9452ea1c6feaac480e4a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1217392 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�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 z%0D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μnY7x1aEcV-xevM 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 diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingcms.cpython-34m.so b/Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingcms.cpython-34m.so deleted file mode 100755 index 52f730ada6ce6e0910b7c6e9863f4845fd444525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49648 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 WGFd#QkC*?k`z67}G5#N$|Nj9bN(D9m diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingft.cpython-34m.so b/Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingft.cpython-34m.so deleted file mode 100755 index f9f11b0a4b1aa8e6de1122d01e6f9ad2e6aa828f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59848 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 DY+&Ax diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingmorph.cpython-34m.so b/Linux_x86_64/lib/python3.4/site-packages/PIL/_imagingmorph.cpython-34m.so deleted file mode 100755 index 67649189ce5a4a1fe387d91b05d4ef1319dd8848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31424 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 Io?8C@0Bl9;!~g&Q diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/_util.py b/Linux_x86_64/lib/python3.4/site-packages/PIL/_util.py deleted file mode 100644 index eb5c2c2..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/PIL/_util.py +++ /dev/null @@ -1,22 +0,0 @@ -import os - -if bytes is str: - def isStringType(t): - return isinstance(t, basestring) - def isPath(f): - return isinstance(f, basestring) -else: - def isStringType(t): - return isinstance(t, str) - def isPath(f): - return isinstance(f, (bytes, str)) - -# Checks if an object is a string, and that it points to a directory. -def isDirectory(f): - return isPath(f) and os.path.isdir(f) - -class deferred_error(object): - def __init__(self, ex): - self.ex = ex - def __getattr__(self, elt): - raise self.ex diff --git a/Linux_x86_64/lib/python3.4/site-packages/PIL/_webp.cpython-34m.so b/Linux_x86_64/lib/python3.4/site-packages/PIL/_webp.cpython-34m.so deleted file mode 100755 index 5b3c5cf98f304e8037e65ca1428f949b17d8644c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31544 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 I2krNN0lOOUmH+?% diff --git a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/PKG-INFO b/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/PKG-INFO deleted file mode 100644 index 0974e84..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/PKG-INFO +++ /dev/null @@ -1,2491 +0,0 @@ -Metadata-Version: 1.1 -Name: Pillow -Version: 2.5.3 -Summary: Python Imaging Library (Fork) -Home-page: http://python-pillow.github.io/ -Author: Alex Clark (fork author) -Author-email: aclark@aclark.net -License: Standard PIL License -Description: Pillow - ====== - - *Python Imaging Library (Fork)* - - Pillow is the "friendly" PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. For more information, please `read the documentation `_. - - .. image:: https://travis-ci.org/python-pillow/Pillow.svg?branch=master - :target: https://travis-ci.org/python-pillow/Pillow - :alt: Travis CI build status - - .. image:: https://pypip.in/v/Pillow/badge.png - :target: https://pypi.python.org/pypi/Pillow/ - :alt: Latest PyPI version - - .. image:: https://pypip.in/d/Pillow/badge.png - :target: https://pypi.python.org/pypi/Pillow/ - :alt: Number of PyPI downloads - - .. image:: https://coveralls.io/repos/python-pillow/Pillow/badge.png?branch=master - :target: https://coveralls.io/r/python-pillow/Pillow?branch=master - - - Changelog (Pillow) - ================== - - 2.5.3 (2014-08-18) - ------------------ - - - Fixed CVE-2014-3598, a DOS in the Jpeg2KImagePlugin - [Andrew Drake] - - - 2.5.2 (2014-08-13) - ------------------ - - - Fixed CVE-2014-3589, a DOS in the IcnsImagePlugin - [Andrew Drake] - - 2.5.1 (2014-07-10) - ------------------ - - - Fixed install issue if Multiprocessing.Pool is not available - [wiredfool] - - - 32bit mult overflow fix #782 - [wiredfool] - - 2.5.0 (2014-07-01) - ------------------ - - - Imagedraw rewrite - [terseus, wiredfool] - - - Add support for multithreaded test execution - [wiredfool] - - - Prevent shell injection #748 - [mbrown1413, wiredfool] - - - Support for Resolution in BMP files #734 - [gcq] - - - Fix error in setup.py for Python 3 - [matthew-brett] - - - Pyroma fix and add Python 3.4 to setup metadata #742 - [wirefool] - - - Top level flake8 fixes #741 - [aclark] - - - Remove obsolete Animated Raster Graphics (ARG) support - [hugovk] - - - Fix test_imagedraw failures #727 - [cgohlke] - - - Fix AttributeError: class Image has no attribute 'DEBUG' #726 - [cgohlke] - - - Fix msvc warning: 'inline' : macro redefinition #725 - [cgohlke] - - - Cleanup #654 - [dvska, hugovk, wiredfool] - - - 16-bit monochrome support for JPEG2000 - [videan42] - - - Fixed ImagePalette.save - [brightpisces] - - - Support JPEG qtables - [csinchok] - - - Add binary morphology addon - [dov, wiredfool] - - - Decompression bomb protection - [hugovk] - - - Put images in a single directory - [hugovk] - - - Support OpenJpeg 2.1 - [al45tair] - - - Remove unistd.h #include for all platforms - [wiredfool] - - - Use unittest for tests - [hugovk] - - - ImageCms fixes - [hugovk] - - - Added more ImageDraw tests - [hugovk] - - - Added tests for Spider files - [hugovk] - - - Use libtiff to write any compressed tiff files - [wiredfool] - - - Support for pickling Image objects - [hugovk] - - - Fixed resolution handling for EPS thumbnails - [eliempje] - - - Fixed rendering of some binary EPS files (Issue #302) - [eliempje] - - - Rename variables not to use built-in function names - [hugovk] - - - Ignore junk JPEG markers - [hugovk] - - - Change default interpolation for Image.thumbnail to Image.ANTIALIAS - [hugovk] - - - Add tests and fixes for saving PDFs - [hugovk] - - - Remove transparency resource after P->RGBA conversion - [hugovk] - - - Clean up preprocessor cruft for Windows - [CounterPillow] - - - Adjust Homebrew freetype detection logic - [jacknagel] - - - Added Image.close, context manager support. - [wiredfool] - - - Added support for 16 bit PGM files. - [wiredfool] - - - Updated OleFileIO to version 0.30 from upstream - [hugovk] - - - Added support for additional TIFF floating point format - [Hijackal] - - - Have the tempfile use a suffix with a dot - [wiredfool] - - - Fix variable name used for transparency manipulations - [nijel] - - 2.4.0 (2014-04-01) - ------------------ - - - Indexed Transparency handled for conversions between L, RGB, and P modes. Fixes #510 - [wiredfool] - - - Conversions enabled from RGBA->P, Fixes #544 - [wiredfool] - - - Improved icns support - [al45tair] - - - Fix libtiff leaking open files, fixes #580 - [wiredfool] - - - Fixes for Jpeg encoding in Python 3, fixes #577 - [wiredfool] - - - Added support for JPEG 2000 - [al45tair] - - - Add more detailed error messages to Image.py - [larsmans] - - - Avoid conflicting _expand functions in PIL & MINGW, fixes #538 - [aclark] - - - Merge from Philippe Lagadec’s OleFileIO_PL fork - [vadmium] - - - Fix ImageColor.getcolor - [homm] - - - Make ICO files work with the ImageFile.Parser interface, fixes #522 - [wiredfool] - - - Handle 32bit compiled python on 64bit architecture - [choppsv1] - - - Fix support for characters >128 using .pcf or .pil fonts in Py3k. Fixes #505 - [wiredfool] - - - Skip CFFI test earlier if it's not installed - [wiredfool] - - - Fixed opening and saving odd sized .pcx files, fixes #523 - [wiredfool] - - - Fixed palette handling when converting from mode P->RGB->P - [d_schmidt] - - - Fixed saving mode P image as a PNG with transparency = palette color 0 - [d-schmidt] - - - Improve heuristic used when saving progressive and optimized JPEGs with high quality values - [e98cuenc] - - - Fixed DOS with invalid palette size or invalid image size in BMP file - [wiredfool] - - - Added support for BMP version 4 and 5 - [eddwardo, wiredfool] - - - Fix segfault in getfont when passed a memory resident font - [wiredfool] - - - Fix crash on Saving a PNG when icc-profile is None - [brutasse] - - - Cffi+Python implementation of the PixelAccess object - [wiredfool] - - - PixelAccess returns unsigned ints for I16 mode - [wiredfool] - - - Minor patch on booleans + Travis - [sciunto] - - - Look in multiarch paths in GNU platforms - [pinotree] - - - Add arch support for pcc64, s390, s390x, armv7l, aarch64 - [manisandro] - - - Add arch support for ppc - [wiredfool] - - - Correctly quote file names for WindowsViewer command - [cgohlke] - - - Prefer homebrew freetype over X11 freetype (but still allow both) - [dmckeone] - - 2.3.1 (2014-03-14) - ------------------ - - - Fix insecure use of tempfile.mktemp (CVE-2014-1932 CVE-2014-1933) - [wiredfool] - - 2.3.0 (2014-01-01) - ------------------ - - - Stop leaking filename parameter passed to getfont - [jpharvey] - - - Report availability of LIBTIFF during setup and selftest - [cgohlke] - - - Fix msvc build error C1189: "No Target Architecture" - [cgohlke] - - - Fix memory leak in font_getsize - [wiredfool] - - - Correctly prioritize include and library paths - [ohanar] - - - Image.point fixes for numpy.array and docs - [wiredfool] - - - Save the transparency header by default for PNGs - [wiredfool] - - - Support for PNG tRNS header when converting from RGB->RGBA - [wiredfool] - - - PyQT5 Support - [wiredfool] - - - Updates for saving color tiffs w/compression using libtiff - [wiredfool] - - - 2gigapix image fixes and redux - [wiredfool] - - - Save arbitrary tags in Tiff image files - [wiredfool] - - - Quote filenames and title before using on command line - [tmccombs] - - - Fixed Viewer.show to return properly - [tmccombs] - - - Documentation fixes - [wiredfool] - - - Fixed memory leak saving images as webp when webpmux is available - [cezarsa] - - - Fix compiling with FreeType 2.5.1 - [stromnov] - - - Adds directories for NetBSD. - [deepy] - - - Support RGBA TIFF with missing ExtraSamples tag - [cgohlke] - - - Lossless WEBP Support - [wiredfool] - - - Take compression as an option in the save call for tiffs - [wiredfool] - - - Add support for saving lossless WebP. Just pass 'lossless=True' to save() - [liftoff] - - - LCMS support upgraded from version 1 to version 2, fixes #343 - [wiredfool] - - - Added more raw decoder 16 bit pixel formats - [svanheulen] - - - Document remaining Image* modules listed in PIL handbook - [irksep] - - - Document ImageEnhance, ImageFile, ImageFilter, ImageFont, ImageGrab, ImageMath, and ImageOps - [irksep] - - - Port and update docs for Image, ImageChops, ImageColor, and ImageDraw - [irksep] - - - Move or copy content from README.rst to docs/ - [irksep] - - - Respect CFLAGS/LDFLAGS when searching for headers/libs - [iElectric] - - - Port PIL Handbook tutorial and appendices - [irksep] - - - Alpha Premultiplication support for transform and resize - [wiredfool] - - - Fixes to make Pypy 2.1.0 work on Ubuntu 12.04/64 - [wiredfool] - - 2.2.2 (2013-12-11) - ------------------ - - - Fix #427: compiling with FreeType 2.5.1 - [stromnov] - - 2.2.1 (2013-10-02) - ------------------ - - - Fix #356: Error installing Pillow 2.2.0 on Mac OS X (due to hard dep on brew) - [wiredfool] - - 2.2.0 (2013-10-02) - ------------------ - - - Fix #254: Bug in image transformations resulting from uninitialized memory - [nikmolnar] - - - Fix for encoding of b_whitespace, similar to closed issue #272 - [mhogg] - - - Fix #273: Add numpy array interface support for 16 and 32 bit integer modes - [cgohlke] - - - Partial fix for #290: Add preliminary support for TIFF tags. - [wiredfool] - - - Fix #251 and #326: circumvent classification of pngtest_bad.png as malware - [cgohlke] - - - Add typedef uint64_t for MSVC. - [cgohlke] - - - Fix #329: setup.py: better support for C_INCLUDE_PATH, LD_RUN_PATH, etc. - [nu774] - - - Fix #328: _imagingcms.c: include windef.h to fix build issue on MSVC - [nu774] - - - Automatically discover homebrew include/ and lib/ paths on OSX - [donspaulding] - - - Fix bytes which should be bytearray - [manisandro] - - - Add respective paths for C_INCLUDE_PATH, LD_RUN_PATH (rpath) to build - if specified as environment variables. - [seanupton] - - - Fix #312 + gif optimize improvement - [d-schmidt] - - - Be more tolerant of tag read failures - [ericbuehl] - - - Fix #318: Catch truncated zTXt errors. - [vytisb] - - - Fix IOError when saving progressive JPEGs. - [e98cuenc] - - - Add RGBA support to ImageColor - [yoavweiss] - - - Fix #304: test for `str`, not `"utf-8"`. - [mjpieters] - - - Fix missing import os in _util.py. - [mnowotka] - - - Added missing exif tags. - [freyes] - - - Fail on all import errors, fixes #298. - [macfreek, wiredfool] - - - Fixed Windows fallback (wasn't using correct file in Windows fonts). - [lmollea] - - - Moved ImageFile and ImageFileIO comments to docstrings. - [freyes] - - - Restore compatibility with ISO C. - [cgohlke] - - - Use correct format character for C int type. - [cgohlke] - - - Allocate enough memory to hold pointers in encode.c. - [cgohlke] - - - Fix #279, fillorder double shuffling bug when FillOrder ==2 and decoding using libtiff. - [wiredfool] - - - Moved Image module comments to docstrings. - [freyes] - - - Add 16-bit TIFF support, fixes #274. - [wiredfool] - - - Ignore high ascii characters in string.whitespace, fixes #272. - [wiredfool] - - - Added clean/build to tox to make it behave like travis. - [freyes] - - - Adding support for metadata in webp images. - [heynemann] - - 2.1.0 (2013-07-02) - ------------------ - - - Add /usr/bin/env python shebangs to all scripts in /Scripts. - - - Add several TIFF decoders and encoders. - - - Added support for alpha transparent webp images. - - - Adding Python 3 support for StringIO. - - - Adding Python3 basestring compatibility without changing basestring. - - - Fix webp encode errors on win-amd64. - - - Better fix for ZeroDivisionError in ImageOps.fit for image.size height is 1. - - - Better support for ICO images. - - - Changed PY_VERSION_HEX, fixes #166. - - - Changes to put everything under the PIL namespace. - [wiredfool] - - - Changing StringIO to BytesIO. - - - Cleanup whitespace. - [Arfrever] - - - Don't skip 'import site' on initialization when running tests for inplace builds. - [cgohlke] - - - Enable warnings for test suite. - - - Fix for ZeroDivisionError in ImageOps.fit for image.size == (1,1) - - - Fix for if isinstance(filter, collections.Callable) crash. Python bug #7624 on <2.6.6 - - - Fix #193: remove double typedef declaration. - - - Fix msvc compile errors (#230). - - - Fix rendered characters have been chipped for some TrueType fonts. - - - Fix usage of pilfont.py script. - - - Fresh start for docs, generated by sphinx-apidoc. - - - Introduce --enable-x and fail if it is given and x is not available. - - - Partial work to add a wrapper for WebPGetFeatures to correctly support #204. - - - Significant performance improvement of `alpha_composite` function. - - - Support explicitly disabling features via --disable-* options. - - - Support selftest.py --installed, fixes #263. - - - Transparent WebP Support, #204 - - - Use PyCapsule for py3.1, fixes #237. - - - Workaround for: http://bugs.python.org/16754 in 3.2.x < 3.2.4 and 3.3.0. - - 2.0.0 (2013-03-15) - ------------------ - - .. Note:: Special thanks to Christoph Gohlke and Eric Soroos for assisting with a pre-PyCon 2013 release! - - - Many other bug fixes and enhancements by many other people. - - - Add Python 3 support. (Pillow >= 2.0.0 supports Python 2.6, 2.7, 3.2, 3.3. Pillow < 2.0.0 supports Python 2.4, 2.5, 2.6, 2.7.) - [fluggo] - - - Add PyPy support (experimental, please see: https://github.com/python-pillow/Pillow/issues/67) - - - Add WebP support. - [lqs] - - - Add Tiff G3/G4 support (experimental) - [wiredfool] - - - Backport PIL's PNG/Zip improvements. - [olt] - - - Various 64 bit and Windows fixes. - [cgohlke] - - - Add testing suite. - [cgohlke, fluggo] - - - Added support for PNG images with transparency palette. - [d-schmidt] - - 1.7.8 (2012-11-01) - ------------------ - - - Removed doctests.py that made tests of other packages fail. - [thomasdesvenain] - - - Fix opening psd files with RGBA layers when A mode is not of type 65535 but 3. - Fixes #3 - [thomasdesvenain] - - - 1.7.7 (2012-04-04) - ------------------ - - - UNDEF more types before including windows headers - [mattip] - - 1.7.6 (2012-01-20) - ------------------ - - - Bug fix: freetype not found on Mac OS X with case-sensitive filesystem - [gjo] - - - Bug fix: Backport fix to split() after open() (regression introduced in PIL 1.1.7). - [sfllaw] - - 1.7.5 (2011-09-07) - ------------------ - - - Fix for sys.platform = "linux3" - [blueyed] - - - Package cleanup and additional documentation - [aclark] - - 1.7.4 (2011-07-21) - ------------------ - - - Fix brown bag release - [aclark] - - 1.7.3 (2011-07-20) - ------------------ - - - Fix : resize need int values, append int conversion in thumbnail method - [harobed] - - 1.7.2 (2011-06-02) - ------------------ - - - Bug fix: Python 2.4 compat - [aclark] - - 1.7.1 (2011-05-31) - ------------------ - - - More multi-arch support - [SteveM, regebro, barry, aclark] - - 1.7.0 (2011-05-27) - ------------------ - - - Add support for multi-arch library directory /usr/lib/x86_64-linux-gnu - [aclark] - - 1.6 (12/01/2010) - ---------------- - - - Bug fix: /usr/x11/include should be added to include_dirs not library_dirs - [elro] - - - Doc fixes - [aclark] - - 1.5 (11/28/2010) - ---------------- - - - Module and package fixes - [aclark] - - 1.4 (11/28/2010) - ---------------- - - - Doc fixes - [aclark] - - 1.3 (11/28/2010) - ---------------- - - - Add support for /lib64 and /usr/lib64 library directories on Linux - [aclark] - - - Doc fixes - [aclark] - - 1.2 (08/02/2010) - ---------------- - - - On OS X also check for freetype2 in the X11 path - [jezdez] - - - Doc fixes - [aclark] - - 1.1 (07/31/2010) - ---------------- - - - Removed setuptools_hg requirement - [aclark] - - - Doc fixes - [aclark] - - 1.0 (07/30/2010) - ---------------- - - - Remove support for ``import Image``, etc. from the standard namespace. ``from PIL import Image`` etc. now required. - - Forked PIL based on `Hanno Schlichting's re-packaging `_ - [aclark] - - .. Note:: What follows is the original PIL 1.1.7 CHANGES - - :: - - -*- coding: utf-8 -*- - - The Python Imaging Library - $Id$ - - ACKNOWLEDGEMENTS: PIL wouldn't be what it is without the help of: - David Ascher, Phil Austin, Douglas Bagnall, Larry Bates, Anthony - Baxter, William Baxter, Denis Benoit, Jan Blom, Duncan Booth, Alexey - Borzenkov, Jeff Breidenbach, Roger Burnham, Zac Burns, Gene Cash, - Kevin Cazabon, Fred Clare, Greg Coats, Chris Cogdon, Greg Couch, Bill - Crutchfield, Abel Deuring, Tim Docker, Fred Drake, Graham Dumpleton, - Matthew Ellis, Eric Etheridge, Daniel Fetchinson, Robin Friedrich, - Pier Paolo Glave, Federico Di Gregorio, Markus Gritsch, Daniel - Haertle, Greg Hamilton, Mark Hammond, Bernhard Herzog, Rob Hooft, Bob - Ippolito, Jack Jansen, Bill Janssen, Edward Jones, Richard Jones, - HÃ¥kan Karlsson, Robert Kern, David Kirtley, Bob Klimek, Matthias - Klose, Andrew Kuchling, Magnus Källström, Victor Lacina, Ben Last, - Hamish Lawson, Cesare Leonardi, Andrew MacIntyre, Jan Matejek, Naveen - Michaud-Agrawal, Gordon McMillan, Skip Montanaro, Fredrik Nehr, - Russell Nelson, Luciano Nocera, Travis Oliphant, Piet van Oostrum, - Richard Oudkerk, Paul Pharr, Andres Polit, Conrado Porto Lopes Gouvêa, - Eric Raymond, Victor Reijs, Bertil Reinhammar, Nicholas Riley, Don - Rozenberg, Toby Sargeant, Barry Scott, Les Schaffer, Joel Shprentz, - Klamer Shutte, Gene Skonicki, Niki Spahiev, D. Alan Stewart, Perry - Stoll, Paul Svensson, Ulrik Svensson, Miki Tebeka, Michael van - Tellingen, Ivan Tkatchev, Dan Torop, Adam Twardoch, Rune Uhlin, Dmitry - Vasiliev, Sasha Voynow, Charles Waldman, Collin Winter, Dan Wolfe, - Ka-Ping Yee, and many others (if your name should be on this list, let - me know.) - - *** Changes from release 1.1.6 to 1.1.7 *** - - This section may not be fully complete. For changes since this file - was last updated, see the repository revision history: - - http://bitbucket.org/effbot/pil-2009-raclette/changesets/ - - (1.1.7 final) - - + Set GIF loop info property to the number of iterations if a NETSCAPE - loop extension is present, instead of always setting it to 1 (from - Valentino Volonghi). - - (1.1.7c1 released) - - + Improved PNG compression (from Alexey Borzenkov). - - + Read interlaced PNG files (from Conrado Porto Lopes Gouvêa) - - + Added various TGA improvements from Alexey Borzenkov, including - support for specifying image orientation. - - + Bumped block threshold to 16 megabytes, made size estimation a bit - more accurate. This speeds up allocation of large images. - - + Fixed rounding error in ImagingDrawWideLine. - - "gormish" writes: ImagingDrawWideLine() in Draw.c has a bug in every - version I've seen, which leads to different width lines depending on - the order of the points in the line. This is especially bad at some - angles where a 'width=2' line can completely disappear. - - + Added support for RGBA mode to the SGI module (based on code by - Karsten Hiddemann). - - + Handle repeated IPTC tags (adapted from a patch by Eric Bruning). - - Eric writes: According to the specification, some IPTC tags can be - repeated, e.g., tag 2:25 (keywords). PIL 1.1.6 only retained the last - instance of that tag. Below is a patch to store all tags. If there are - multiple tag instances, they are stored in a (python) list. Single tag - instances remain as strings. - - + Fixed potential crash in ImageFilter for small target images - (reported by Zac Burns and Daniel Fetchinson). - - + Use BMP instead of JPEG as temporary show format on Mac OS X. - - + Fixed putpixel/new for I;16 with colors > 255. - - + Added integer power support to ImagingMath. - - + Added limited support for I;16L mode (explicit little endian). - - + Moved WMF support into Image.core; enable WMF rendering by default - if renderer is available. - - + Mark the ARG plugin as obsolete. - - + Added version query mechanism to ImageCms and ImageFont, for - debugging. - - + Added (experimental) ImageCms function for fetching the ICC profile - for the current display (currently Windows only). - - Added HWND/HDC support to ImageCms.get_display_profile(). - - + Added WMF renderer (Windows only). - - + Added ImagePointHandler and ImageTransformHandler mixins; made - ImageCmsTransform work with im.point. - - + Fixed potential endless loop in the XVThumbnail reader (from Nikolai - Ugelvik). - - + Added Kevin Cazabon's pyCMS package. - - The C code has been moved to _imagingcms.c, the Python interface - module is installed as PIL.ImageCMS. - - Added support for in-memory ICC profiles. - - Unified buildTransform and buildTransformFromOpenProfiles. - - The profile can now be either a filename, a profile object, or a - file-like object containing an in-memory profile. - - Additional fixes from Florian Böch: - - Very nice - it just needs LCMS flags support so we can use black - point compensation and softproofing :) See attached patches. They - also fix a naming issue which could cause confusion - display - profile (ImageCms wording) actually means proof profile (lcms - wording), so I changed variable names and docstrings where - applicable. Patches are tested under Python 2.6. - - + Improved support for layer names in PSD files (from Sylvain Baubeau) - - Sylvain writes: I needed to be able to retrieve the names of the - layers in a PSD files. But PsdImagePlugin.py didn't do the job so I - wrote this very small patch. - - + Improved RGBA support for ImageTk for 8.4 and newer (from Con - Radchenko). - - This replaces the slow run-length based encoding model with true - compositing at the Tk level. - - + Added support for 16- and 32-bit images to McIdas loader. - - Based on file samples and stand-alone reader code provided by Craig - Swank. - - + Added ImagePalette support to putpalette. - - + Fixed problem with incremental parsing of PNG files. - - + Make selftest.py report non-zero status on failure (from Mark - Sienkiewicz) - - + Add big endian save support and multipage infrastructure to the TIFF - writer (from Sebastian Haase). - - + Handle files with GPS IFD but no basic EXIF IFD (reported by Kurt - Schwehr). - - + Added zTXT support (from Andrew Kuchling via Lowell Alleman). - - + Fixed potential infinite loop bug in ImageFont (from Guilherme Polo). - - + Added sample ICC profiles (from Kevin Cazabon) - - + Fixed array interface for I, F, and RGBA/RGBX images. - - + Added Chroma subsampling support for JPEG (from Justin Huff). - - Justin writes: Attached is a patch (against PIL 1.1.6) to provide - control over the chroma subsampling done by the JPEG encoder. This - is often useful for reducing compression artifacts around edges of - clipart and text. - - + Added USM/Gaussian Blur code from Kevin Cazabon. - - + Fixed bug w. uninitialized image data when cropping outside the - source image. - - + Use ImageShow to implement the Image.show method. - - Most notably, this picks the 'display' utility when available. It - also allows application code to register new display utilities via - the ImageShow registry. - - + Release the GIL in the PNG compressor (from Michael van Tellingen). - - + Revised JPEG CMYK handling. - - Always assume Adobe behaviour, both when reading and writing (based on - a patch by Kevin Cazabon, and test data by Tim V. and Charlie Clark, and - additional debugging by Michael van Tellingen). - - + Support for preserving ICC profiles (by Florian Böch via Tim Hatch). - - Florian writes: - - It's a beta, so still needs some testing, but should allow you to: - - retain embedded ICC profiles when saving from/to JPEG, PNG, TIFF. - Existing code doesn't need to be changed. - - access embedded profiles in JPEG, PNG, PSD, TIFF. - - It also includes patches for TIFF to retain IPTC, Photoshop and XMP - metadata when saving as TIFF again, read/write TIFF resolution - information correctly, and to correct inverted CMYK JPEG files. - - + Fixed potential memory leak in median cut quantizer (from Evgeny Salmin). - - + Fixed OverflowError when reading upside-down BMP images. - - + Added resolution save option for PDF files. - - Andreas Kostyrka writes: I've included a patched PdfImagePlugin.py - based on 1.1.6 as included in Ubuntu, that supports a "resolution" - save option. Not great, but it makes the PDF saving more useful by - allowing PDFs that are not exactly 72dpi. - - + Look for Tcl/Tk include files in version-specific include directory - (from Encolpe Degoute). - - + Fixed grayscale rounding error in ImageColor.getcolor (from Tim - Hatch). - - + Fixed calculation of mean value in ImageEnhance.Contrast (reported - by "roop" and Scott David Daniels). - - + Fixed truetype positioning when first character has a negative left - bearing (from Ned Batchelder): - - Ned writes: In PIL 1.1.6, ImageDraw.text will position the string - incorrectly if the first character has a negative left bearing. To - see the problem, show a string like "///" in an italic font. The - first slash will be clipped at the left, and the string will be - mis-positioned. - - + Fixed resolution unit bug in tiff reader/writer (based on code by - Florian Höch, Gary Bloom, and others). - - + Added simple transparency support for RGB images (reported by - Sebastian Spaeth). - - + Added support for Unicode filenames in ImageFont.truetype (from Donn - Ingle). - - + Fixed potential crash in ImageFont.getname method (from Donn Ingle). - - + Fixed encoding issue in PIL/WalImageFile (from Santiago M. Mola). - - *** Changes from release 1.1.5 to 1.1.6 *** - - (1.1.6 released) - - + Fixed some 64-bit compatibility warnings for Python 2.5. - - + Added threading support for the Sane driver (from Abel Deuring). - - (1.1.6b2 released) - - + Added experimental "floodfill" function to the ImageDraw module - (based on code by Eric Raymond). - - + The default arguments for "frombuffer" doesn't match "fromstring" - and the documentation; this is a bug, and will most likely be fixed - in a future version. In this release, PIL prints a warning message - instead. To silence the warning, change any calls of the form - "frombuffer(mode, size, data)" to - - frombuffer(mode, size, data, "raw", mode, 0, 1) - - + Added "fromarray" function, which takes an object implementing the - NumPy array interface and creates a PIL Image from it. (from Travis - Oliphant). - - + Added NumPy array interface support (__array_interface__) to the - Image class (based on code by Travis Oliphant). - - This allows you to easily convert between PIL image memories and - NumPy arrays: - - import numpy, Image - - im = Image.open('lena.jpg') - - a = numpy.asarray(im) # a is readonly - - im = Image.fromarray(a) - - + Fixed CMYK polarity for JPEG images, by treating all images as - "Adobe CMYK" images. (thanks to Cesare Leonardi and Kevin Cazabon - for samples, debugging, and patches). - - (1.1.6b1 released) - - + Added 'expand' option to the Image 'rotate' method. If true, the - output image is made large enough to hold the entire rotated image. - - + Changed the ImageDraw 'line' method to always draw the last pixel in - a polyline, independent of line angle. - - + Fixed bearing calculation and clipping in the ImageFont truetype - renderer; this could lead to clipped text, or crashes in the low- - level _imagingft module. (based on input from Adam Twardoch and - others). - - + Added ImageQt wrapper module, for converting PIL Image objects to - QImage objects in an efficient way. - - + Fixed 'getmodebands' to return the number of bands also for "PA" - and "LA" modes. Added 'getmodebandnames' helper that return the - band names. - - (1.1.6a2 released) - - + Added float/double support to the TIFF loader (from Russell - Nelson). - - + Fixed broken use of realloc() in path.c (from Jan Matejek) - - + Added save support for Spider images (from William Baxter). - - + Fixed broken 'paste' and 'resize' operations in pildriver - (from Bill Janssen). - - + Added support for duplex scanning to the Sane interface (Abel - Deuring). - - (1.1.6a1 released) - - + Fixed a memory leak in "convert(mode)", when converting from - L to P. - - + Added pixel access object. The "load" method now returns a - access object that can be used to directly get and set pixel - values, using ordinary [x, y] notation: - - pixel = im.load() - v = pixel[x, y] - pixel[x, y] = v - - If you're accessing more than a few pixels, this is a lot - faster than using getpixel/putpixel. - - + Fixed building on Cygwin (from Miki Tebeka). - - + Fixed "point(callable)" on unloaded images (reported by HÃ¥kan - Karlsson). - - + Fixed size bug in ImageWin.ImageWindow constructor (from Victor - Reijs) - - + Fixed ImageMath float() and int() operations for Python 2.4 - (reported by Don Rozenberg). - - + Fixed "RuntimeError: encoder error -8 in tostring" problem for - wide "RGB", "I", and "F" images. - - + Fixed line width calculation. - - (1.1.6a0 released) - - + Fixed byte order issue in Image.paste(ink) (from Ka-Ping Yee). - - + Fixed off-by-0.5 errors in the ANTIALIAS code (based on input - from Douglas Bagnall). - - + Added buffer interface support to the Path constructor. If - a buffer is provided, it is assumed to contain a flat array - of float coordinates (e.g. array.array('f', seq)). - - + Added new ImageMath module. - - + Fixed ImageOps.equalize when used with a small number of distinct - values (reported by David Kirtley). - - + Fixed potential integer division in PSDraw.image (from Eric Etheridge). - - *** Changes from release 1.1 to 1.1.5 *** - - (1.1.5c2 and 1.1.5 final released) - - + Added experimental PERSPECTIVE transform method (from Jeff Breiden- - bach). - - (1.1.5c1 released) - - + Make sure "thumbnail" never generates zero-wide or zero-high images - (reported by Gene Skonicki) - - + Fixed a "getcolors" bug that could result in a zero count for some - colors (reported by Richard Oudkerk). - - + Changed default "convert" palette to avoid "rounding errors" when - round-tripping white source pixels (reported by Henryk Gerlach and - Jeff Epler). - - (1.1.5b3 released) - - + Don't crash in "quantize" method if the number of colors requested - is larger than 256. This release raises a ValueError exception; - future versions may return a mode "RGB" image instead (reported - by Richard Oudkerk). - - + Added WBMP read/write support (based on code by Duncan Booth). - - (1.1.5b2 released) - - + Added DPI read/write support to the PNG codec. The decoder sets - the info["dpi"] attribute for PNG files with appropriate resolution - settings. The encoder uses the "dpi" option (based on code by Niki - Spahiev). - - + Added limited support for "point" mappings from mode "I" to mode "L". - Only 16-bit values are supported (other values are clipped), the lookup - table must contain exactly 65536 entries, and the mode argument must be - set to "L". - - + Added support for Mac OS X icns files (based on code by Bob Ippolito). - - + Added "ModeFilter" support to the ImageFilter module. - - + Added support for Spider images (from William Baxter). See the - comments in PIL/SpiderImagePlugin.py for more information on this - format. - - (1.1.5b1 released) - - + Added new Sane release (from Ralph Heinkel). See the Sane/README - and Sane/CHANGES files for more information. - - + Added experimental PngInfo chunk container to the PngImageFile - module. This can be used to add arbitrary chunks to a PNG file. - Create a PngInfo instance, use "add" or "add_text" to add chunks, - and pass the instance as the "pnginfo" option when saving the - file. - - + Added "getpalette" method. This returns the palette as a list, - or None if the image has no palette. To modify the palette, use - "getpalette" to fetch the current palette, modify the list, and - put it back using "putpalette". - - + Added optional flattening to the ImagePath "tolist" method. - tolist() or tolist(0) returns a list of 2-tuples, as before. - tolist(1) returns a flattened list instead. - - (1.1.5a5 released) - - + Fixed BILINEAR/BICUBIC/ANTIALIAS filtering for mode "LA". - - + Added "getcolors()" method. This is similar to the existing histo- - gram method, but looks at color values instead of individual layers, - and returns an unsorted list of (count, color) tuples. - - By default, the method returns None if finds more than 256 colors. - If you need to look for more colors, you can pass in a limit (this - is used to allocate internal tables, so you probably don't want to - pass in too large values). - - + Build improvements: Fixed building under AIX, improved detection of - FreeType2 and Mac OS X framework libraries, and more. Many thanks - to everyone who helped test the new "setup.py" script! - - (1.1.5a4 released) - - + The "save" method now looks for a file format driver before - creating the file. - - + Don't use antialiased truetype fonts when drawing in mode "P", "I", - and "F" images. - - + Rewrote the "setup.py" file. The new version scans for available - support libraries, and configures both the libImaging core library - and the bindings in one step. - - To use specific versions of the libraries, edit the ROOT variables - in the setup.py file. - - + Removed threaded "show" viewer; use the old "show" implementation - instead (Windows). - - + Added deprecation warnings to Image.offset, ImageDraw.setink, and - ImageDraw.setfill. - - + Added width option to ImageDraw.line(). The current implementation - works best for straight lines; it does not support line joins, so - polylines won't look good. - - + ImageDraw.Draw is now a factory function instead of a class. If - you need to create custom draw classes, inherit from the ImageDraw - class. All other code should use the factory function. - - + Fixed loading of certain PCX files (problem reported by Greg - Hamilton, who also provided samples). - - + Changed _imagingft.c to require FreeType 2.1 or newer. The - module can still be built with earlier versions; see comments - in _imagingft.c for details. - - (1.1.5a3 released) - - + Added 'getim' method, which returns a PyCObject wrapping an - Imaging pointer. The description string is set to IMAGING_MAGIC. - See Imaging.h for pointer and string declarations. - - + Fixed reading of TIFF JPEG images (problem reported by Ulrik - Svensson). - - + Made ImageColor work under Python 1.5.2 - - + Fixed division by zero "equalize" on very small images (from - Douglas Bagnall). - - (1.1.5a2 released) - - + The "paste" method now supports the alternative "paste(im, mask)" - syntax (in this case, the box defaults to im's bounding box). - - + The "ImageFile.Parser" class now works also for PNG files with - more than one IDAT block. - - + Added DPI read/write to the TIFF codec, and fixed writing of - rational values. The decoder sets the info["dpi"] attribute - for TIFF files with appropriate resolution settings. The - encoder uses the "dpi" option. - - + Disable interlacing for small (or narrow) GIF images, to - work around what appears to be a hard-to-find bug in PIL's - GIF encoder. - - + Fixed writing of mode "P" PDF images. Made mode "1" PDF - images smaller. - - + Made the XBM reader a bit more robust; the file may now start - with a few whitespace characters. - - + Added support for enhanced metafiles to the WMF driver. The - separate PILWMF kit lets you render both placeable WMF files - and EMF files as raster images. See - - http://effbot.org/downloads#pilwmf - - (1.1.5a1 released) - - + Replaced broken WMF driver with a WMF stub plugin (see below). - - + Fixed writing of mode "1", "L", and "CMYK" PDF images (based on - input from Nicholas Riley and others). - - + Fixed adaptive palette conversion for zero-width or zero-height - images (from Chris Cogdon) - - + Fixed reading of PNG images from QuickTime 6 (from Paul Pharr) - - + Added support for StubImageFile plugins, including stub plugins - for BUFR, FITS, GRIB, and HDF5 files. A stub plugin can identify - a given file format, but relies on application code to open and - save files in that format. - - + Added optional "encoding" argument to the ImageFont.truetype - factory. This argument can be used to specify non-Unicode character - maps for fonts that support that. For example, to draw text using - the Microsoft Symbol font, use: - - font = ImageFont.truetype("symbol.ttf", 16, encoding="symb") - draw.text((0, 0), unichr(0xF000 + 0xAA)) - - (note that the symbol font uses characters in the 0xF000-0xF0FF - range) - - Common encodings are "unic" (Unicode), "symb" (Microsoft Symbol), - "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), and "armn" (Apple - Roman). See the FreeType documentation for more information. - - + Made "putalpha" a bit more robust; you can now attach an alpha - layer to a plain "L" or "RGB" image, and you can also specify - constant alphas instead of alpha layers (using integers or colour - names). - - + Added experimental "LA" mode support. - - An "LA" image is an "L" image with an attached transparency layer. - Note that support for "LA" is not complete; some operations may - fail or produce unexpected results. - - + Added "RankFilter", "MinFilter", "MedianFilter", and "MaxFilter" - classes to the ImageFilter module. - - + Improved support for applications using multiple threads; PIL - now releases the global interpreter lock for many CPU-intensive - operations (based on work by Kevin Cazabon). - - + Ignore Unicode characters in the PCF loader (from Andres Polit) - - + Fixed typo in OleFileIO.loadfat, which could affect loading of - FlashPix and Image Composer images (Daniel Haertle) - - + Fixed building on platforms that have Freetype but don't have - Tcl/Tk (Jack Jansen, Luciano Nocera, Piet van Oostrum and others) - - + Added EXIF GPSInfo read support for JPEG files. To extract - GPSInfo information, open the file, extract the exif dictionary, - and check for the key 0x8825 (GPSInfo). If present, it contains - a dictionary mapping GPS keys to GPS values. For a list of keys, - see the EXIF specification. - - The "ExifTags" module contains a GPSTAGS dictionary mapping GPS - tags to tag names. - - + Added DPI read support to the PCX and DCX codecs (info["dpi"]). - - + The "show" methods now uses a built-in image viewer on Windows. - This viewer creates an instance of the ImageWindow class (see - below) and keeps it running in a separate thread. NOTE: This - was disabled in 1.1.5a4. - - + Added experimental "Window" and "ImageWindow" classes to the - ImageWin module. These classes allow you to create a WCK-style - toplevel window, and use it to display raster data. - - + Fixed some Python 1.5.2 issues (to build under 1.5.2, use the - Makefile.pre.in/Setup.in approach) - - + Added support for the TIFF FillOrder tag. PIL can read mode "1", - "L", "P" and "RGB" images with non-standard FillOrder (based on - input from Jeff Breidenbach). - - (1.1.4 final released) - - + Fixed ImageTk build problem on Unix. - - (1.1.4b2 released) - - + Improved building on Mac OS X (from Jack Jansen). - - + Improved building on Windows with MinGW (from Klamer Shutte). - - + If no font is specified, ImageDraw now uses the embedded default - font. Use the "load" or "truetype" methods to load a real font. - - + Added embedded default font to the ImageFont module (currently - an 8-pixel Courier font, taken from the X window distribution). - - (1.1.4b1 released) - - + Added experimental EXIF support for JPEG files. To extract EXIF - information from a JPEG file, open the file as usual, and call the - "_getexif" method. If successful, this method returns a dictionary - mapping EXIF TIFF tags to values. If the file does not contain EXIF - data, the "_getexif" method returns None. - - The "ExifTags" module contains a dictionary mapping tags to tag - names. - - This interface will most likely change in future versions. - - + Fixed a bug when using the "transparency" option with the GIF - writer. - - + Added limited support for "bitfield compression" in BMP files - and DIB buffers, for 15-bit, 16-bit, and 32-bit images. This - also fixes a problem with ImageGrab module when copying screen- - dumps from the clipboard on 15/16/32-bit displays. - - + Added experimental WAL (Quake 2 textures) loader. To use this - loader, import WalImageFile and call the "open" method in that - module. - - (1.1.4a4 released) - - + Added updated SANE driver (Andrew Kuchling, Abel Deuring) - - + Use Python's "mmap" module on non-Windows platforms to read some - uncompressed formats using memory mapping. Also added a "frombuffer" - function that allows you to access the contents of an existing string - or buffer object as if it were an image object. - - + Fixed a memory leak that could appear when processing mode "P" - images (from Pier Paolo Glave) - - + Ignore Unicode characters in the BDF loader (from Graham Dumpleton) - - (1.1.4a3 released; windows only) - - + Added experimental RGBA-on-RGB drawing support. To use RGBA - colours on an RGB image, pass "RGBA" as the second string to - the ImageDraw.Draw constructor. - - + Added support for non-ASCII strings (Latin-1) and Unicode - to the truetype font renderer. - - + The ImageWin "Dib" object can now be constructed directly from - an image object. - - + The ImageWin module now allows you use window handles as well - as device contexts. To use a window handle, wrap the handle in - an ImageWin.HWND object, and pass in this object instead of the - device context. - - (1.1.4a2 released) - - + Improved support for 16-bit unsigned integer images (mode "I;16"). - This includes TIFF reader support, and support for "getextrema" - and "point" (from Klamer Shutte). - - + Made the BdfFontFile reader a bit more robust (from Kevin Cazabon - and Dmitry Vasiliev) - - + Changed TIFF writer to always write Compression tag, even when - using the default compression (from Greg Couch). - - + Added "show" support for Mac OS X (from Dan Wolfe). - - + Added clipboard support to the "ImageGrab" module (Windows only). - The "grabclipboard" function returns an Image object, a list of - filenames (not in 1.1.4), or None if neither was found. - - (1.1.4a1 released) - - + Improved support for drawing RGB data in palette images. You can - now use RGB tuples or colour names (see below) when drawing in a - mode "P" image. The drawing layer automatically assigns color - indexes, as long as you don't use more than 256 unique colours. - - + Moved self test from MiniTest/test.py to ./selftest.py. - - + Added support for CSS3-style color strings to most places that - accept colour codes/tuples. This includes the "ImageDraw" module, - the Image "new" function, and the Image "paste" method. - - Colour strings can use one of the following formats: "#f00", - "#ff0000", "rgb(255,0,0)", "rgb(100%,0%,0%)", "hsl(0, 100%, 50%)", - or "red" (most X11-style colour names are supported). See the - documentation for the "ImageColor" module for more information. - - + Fixed DCX decoder (based on input from Larry Bates) - - + Added "IptcImagePlugin.getiptcinfo" helper to extract IPTC/NAA - newsphoto properties from JPEG, TIFF, or IPTC files. - - + Support for TrueType/OpenType fonts has been added to - the standard distribution. You need the freetype 2.0 - library. - - + Made the PCX reader a bit more robust when reading 2-bit - and 4-bit PCX images with odd image sizes. - - + Added "Kernel" class to the ImageFilter module. This class - allows you to filter images with user-defined 3x3 and 5x5 - convolution kernels. - - + Added "putdata" support for mode "I", "F" and "RGB". - - + The GIF writer now supports the transparency option (from - Denis Benoit). - - + A HTML version of the module documentation is now shipped - with the source code distribution. You'll find the files in - the Doc subdirectory. - - + Added support for Palm pixmaps (from Bill Janssen). This - change was listed for 1.1.3, but the "PalmImagePlugin" driver - didn't make it into the distribution. - - + Improved decoder error messages. - - (1.1.3 final released) - - + Made setup.py look for old versions of zlib. For some back- - ground, see: http://www.gzip.org/zlib/advisory-2002-03-11.txt - - (1.1.3c2 released) - - + Added setup.py file (tested on Unix and Windows). You still - need to build libImaging/imaging.lib in the traditional way, - but the setup.py script takes care of the rest. - - The old Setup.in/Makefile.pre.in build method is still - supported. - - + Fixed segmentation violation in ANTIALIAS filter (an internal - buffer wasn't properly allocated). - - (1.1.3c1 released) - - + Added ANTIALIAS downsampling filter for high-quality "resize" - and "thumbnail" operations. Also added filter option to the - "thumbnail" operation; the default value is NEAREST, but this - will most likely change in future versions. - - + Fixed plugin loader to be more robust if the __file__ - variable isn't set. - - + Added seek/tell support (for layers) to the PhotoShop - loader. Layer 0 is the main image. - - + Added new (but experimental) "ImageOps" module, which provides - shortcuts for commonly used operations on entire images. - - + Don't mess up when loading PNG images if the decoder leaves - data in the output buffer. This could cause internal errors - on some PNG images, with some versions of ZLIB. (Bug report - and patch provided by Bernhard Herzog.) - - + Don't mess up on Unicode filenames. - - + Don't mess up when drawing on big endian platforms. - - + Made the TIFF loader a bit more robust; it can now read some - more slightly broken TIFF files (based on input from Ted Wright, - Bob Klimek, and D. Alan Stewart) - - + Added OS/2 EMX build files (from Andrew MacIntyre) - - + Change "ImageFont" to reject image files if they don't have the - right mode. Older versions could leak memory for "P" images. - (Bug reported by Markus Gritsch). - - + Renamed some internal functions to avoid potential build - problem on Mac OS X. - - + Added DL_EXPORT where relevant (for Cygwin, based on input - from Robert Yodlowski) - - + (re)moved bogus __init__ call in BdfFontFile (bug spotted - by Fred Clare) - - + Added "ImageGrab" support (Windows only) - - + Added support for XBM hotspots (based on code contributed by - Bernhard Herzog). - - + Added write support for more TIFF tags, namely the Artist, - Copyright, DateTime, ResolutionUnit, Software, XResolution and - YResolution tags (from Greg Couch) - - + Added TransposedFont wrapper to ImageFont module - - + Added "optimize" flag to GIF encoder. If optimize is present - and non-zero, PIL will work harder to create a small file. - - + Raise "EOFError" (not IndexError) when reading beyond the - end of a TIFF sequence. - - + Support rewind ("seek(0)") for GIF and TIFF sequences. - - + Load grayscale GIF images as mode "L" - - + Added DPI read/write support to the JPEG codec. The decoder - sets the info["dpi"] attribute for JPEG files with JFIF dpi - settings. The encoder uses the "dpi" option: - - im = Image.open("file.jpg") - dpi = im.info["dpi"] # raises KeyError if DPI not known - im.save("out.jpg", dpi=dpi) - - Note that PIL doesn't always preserve the "info" attribute - for normal image operations. - - (1.1.2c1 and 1.1.2 final released) - - + Adapted to Python 2.1. Among other things, all uses of the - "regex" module has been repleased with "re". - - + Fixed attribute error when reading large PNG files (this bug - was introduced in maintenance code released after the 1.1.1 - release) - - + Ignore non-string objects in sys.path - - + Fixed Image.transform(EXTENT) for negative xoffsets - - + Fixed loading of image plugins if PIL is installed as a package. - (The plugin loader now always looks in the directory where the - Image.py module itself is found, even if that directory isn't on - the standard search path) - - + The Png plugin has been added to the list of preloaded standard - formats - - + Fixed bitmap/text drawing in fill mode. - - + Fixed "getextrema" to work also for multiband images. - - + Added transparency support for L and P images to the PNG codec. - - + Improved support for read-only images. The "load" method now - sets the "readonly" attribute for memory-mapped images. Operations - that modifies an image in place (such as "paste" and drawing operations) - creates an in-memory copy of the image, if necessary. (before this - change, any attempt to modify a memory-mapped image resulted in a - core dump...) - - + Added special cases for lists everywhere PIL expects a sequence. - This should speed up things like "putdata" and drawing operations. - - + The Image.offset method is deprecated. Use the ImageChops.offset - function instead. - - + Changed ImageChops operators to copy palette and info dictionary - from the first image argument. - - (1.1.1 released) - - + Additional fixes for Python 1.6/2.0, including TIFF "save" bug. - - + Changed "init" to properly load plugins when PIL is used as a - package. - - + Fixed broken "show" method (on Unix) - - *** Changes from release 1.0 to 1.1 *** - - + Adapted to Python 1.6 ("append" and other method changes) - - + Fixed Image.paste when pasting with solid colour and matte - layers ("L" or "RGBA" masks) (bug reported by Robert Kern) - - + To make it easier to distribute prebuilt versions of PIL, - the tkinit binding stuff has been moved to a separate - extension module, named "_imagingtk". - - *** Changes from release 0.3b2 to 1.0 final *** - - + If there's no 16-bit integer (like on a Cray T3E), set - INT16 to the smallest integer available. Most of the - library works just fine anyway (from Bill Crutchfield) - - + Tweaks to make drawing work on big-endian platforms. - - (1.0c2 released) - - + If PIL is built with the WITH_TKINTER flag, ImageTk can - automatically hook into a standard Tkinter build. You - no longer need to build your own Tkinter to use the - ImageTk module. - - The old way still works, though. For more information, - see Tk/install.txt. - - + Some tweaks to ImageTk to support multiple Tk interpreters - (from Greg Couch). - - + ImageFont "load_path" now scans directory mentioned in .pth - files (from Richard Jones). - - (1.0c1 released) - - + The TIFF plugin has been rewritten. The new plugin fully - supports all major PIL image modes (including F and I). - - + The ImageFile module now includes a Parser class, which can - be used to incrementally decode an image file (while down- - loading it from the net, for example). See the handbook for - details. - - + "show" now converts non-standard modes to "L" or "RGB" (as - appropriate), rather than writing weird things to disk for - "xv" to choke upon. (bug reported by Les Schaffer). - - (1.0b2 released) - - + Major speedups for rotate, transform(EXTENT), and transform(AFFINE) - when using nearest neighbour resampling. - - + Modified ImageDraw to be compatible with the Arrow graphics - interface. See the handbook for details. - - + PIL now automatically loads file codecs when used as a package - (from The Dragon De Monsyne). Also included an __init__.py file - in the standard distribution. - - + The GIF encoder has been modified to produce much smaller files. - - PIL now uses a run-length encoding method to encode GIF files. - On a random selection of GIF images grabbed from the web, this - version makes the images about twice as large as the original - LZW files, where the earlier version made them over 5 times - larger. YMMV, of course. - - + Added PCX write support (works with "1", "P", "L", and "RGB") - - + Added "bitmap" and "textsize" methods to ImageDraw. - - + Improved font rendering code. Fixed a bug or two, and moved - most of the time critical stuff to C. - - + Removed "bdf2pil.py". Use "pilfont.py" instead! - - + Improved 16-bit support (still experimental, though). - - The following methods now support "I;16" and "I;16B" images: - "getpixel", "copy", "convert" (to and from mode "I"), "resize", - "rotate", and "transform" with nearest neighbour filters, and - "save" using the IM format. The "new" and "open" functions - also work as expected. On Windows, 16-bit files are memory - mapped. - - NOTE: ALL other operations are still UNDEFINED on 16-bit images. - - + The "paste" method now supports constant sources. - - Just pass a colour value (a number or a tuple, depending on - the target image mode) instead of the source image. - - This was in fact implemented in an inefficient way in - earlier versions (the "paste" method generated a temporary - source image if you passed it a colour instead of an image). - In this version, this is handled on the C level instead. - - + Added experimental "RGBa" mode support. - - An "RGBa" image is an RGBA image where the colour components - have have been premultipled with the alpha value. PIL allows - you to convert an RGBA image to an RGBa image, and to paste - RGBa images on top of RGB images. Since this saves a bunch - of multiplications and shifts, it is typically about twice - as fast an ordinary RGBA paste. - - + Eliminated extra conversion step when pasting "RGBA" or "RGBa" - images on top of "RGB" images. - - + Fixed Image.BICUBIC resampling for "RGB" images. - - + Fixed PCX image file handler to properly read 8-bit PCX - files (bug introduced in 1.0b1, reported by Bernhard - Herzog) - - + Fixed PSDraw "image" method to restore the coordinate - system. - - + Fixed "blend" problem when applied to images that was - not already loaded (reported by Edward C. Jones) - - + Fixed -f option to "pilconvert.py" (from Anthony Baxter) - - (1.0b1 released) - - + Added Toby J. Sargeant's quantization package. To enable - quantization, use the "palette" option to "convert": - - imOut = im.convert("P", palette=Image.ADAPTIVE) - - This can be used with "L", "P", and "RGB" images. In this - version, dithering cannot be used with adaptive palettes. - - Note: ADAPTIVE currently maps to median cut quantization - with 256 colours. The quantization package also contains - a maximum coverage quantizer, which will be supported by - future versions of PIL. - - + Added Eric S. Raymond's "pildriver" image calculator to the - distribution. See the docstring for more information. - - + The "offset" method no longer dumps core if given positive - offsets (from Charles Waldman). - - + Fixed a resource leak that could cause ImageWin to run out of - GDI resources (from Roger Burnham). - - + Added "arc", "chord", and "pieslice" methods to ImageDraw (inspired - by code contributed by Richard Jones). - - + Added experimental 16-bit support, via modes "I;16" (little endian - data) and "I;16B" (big endian). Only a few methods properly support - such images (see above). - - + Added XV thumbnail file handler (from Gene Cash). - - + Fixed BMP image file handler to handle palette images with small - palettes (from Rob Hooft). - - + Fixed Sun raster file handler for palette images (from Charles - Waldman). - - + Improved various internal error messages. - - + Fixed Path constructor to handle arbitrary sequence objects. This - also affects the ImageDraw class (from Richard Jones). - - + Fixed a bug in JpegDecode that caused PIL to report "decoder error - -2" for some progressive JPEG files (reported by Magnus Källström, - who also provided samples). - - + Fixed a bug in JpegImagePlugin that caused PIL to hang when loading - JPEG files using 16-bit quantization tables. - - + The Image "transform" method now supports Image.QUAD transforms. - The data argument is an 8-tuple giving the upper left, lower - left, lower right, and upper right corner of the source quadri- - lateral. Also added Image.MESH transform which takes a list - of quadrilaterals. - - + The Image "resize", "rotate", and "transform" methods now support - Image.BILINEAR (2x2) and Image.BICUBIC (4x4) resampling filters. - Filters can be used with all transform methods. - - + The ImageDraw "rectangle" method now includes both the right - and the bottom edges when drawing filled rectangles. - - + The TGA decoder now works properly for runlength encoded images - which have more than one byte per pixel. - - + "getbands" on an YCbCr image now returns ("Y", "Cb", "Cr") - - + Some file drivers didn't handle the optional "modify" argument - to the load method. This resulted in exceptions when you used - "paste" (and other methods that modify an image in place) on a - newly opened file. - - *** Changes from release 0.2 (b5) to 0.3 (b2) *** - - (0.3b2 released) - - The test suite includes 825 individual tests. - - + An Image "getbands" method has been added. It returns a tuple - containing the individual band names for this image. To figure - out how many bands an image has, use "len(im.getbands())". - - + An Image "putpixel" method has been added. - - + The Image "point" method can now be used to convert "L" images - to any other format, via a lookup table. That table should - contain 256 values for each band in the output image. - - + Some file drivers (including FLI/FLC, GIF, and IM) accidently - overwrote the offset method with an internal attribute. All - drivers have been updated to use private attributes where - possible. - - + The Image "histogram" method now works for "I" and "F" images. - For these modes, PIL divides the range between the min and - max values used in the image into 256 bins. You can also - pass in your own min and max values via the "extrema" option: - - h = im.histogram(extrema=(0, 255)) - - + An Image "getextrema" method has been added. It returns the - min and max values used in the image. In this release, this - works for single band images only. - - + Changed the PNG driver to load and save mode "I" images as - 16-bit images. When saving, values outside the range 0..65535 - are clipped. - - + Fixed ImageFont.py to work with the new "pilfont" compiler. - - + Added JPEG "save" and "draft" support for mode "YCbCr" images. - Note that if you save an "YCbCr" image as a JPEG file and read - it back, it is read as an RGB file. To get around this, you - can use the "draft" method: - - im = Image.open("color.jpg") - im.draft("YCbCr", im.size) - - + Read "RGBA" TGA images. Also fixed the orientation bug; all - images should now come out the right way. - - + Changed mode name (and internal representation) from "YCrCb" - to "YCbCr" (!) - *** WARNING: MAY BREAK EXISTING CODE *** - - (0.3b1 released) - - The test suite includes 750 individual tests. - - + The "pilfont" package is now included in the standard PIL - distribution. The pilfont utility can be used to convert - X BDF and PCF raster font files to a format understood by - the ImageFont module. - - + GIF files are now interlaced by default. To write a - non-interlaced file, pass interlace=0 to the "save" - method. - - + The default string format has changed for the "fromstring" - and "tostring" methods. - *** WARNING: MAY BREAK EXISTING CODE *** - - NOTE: If no extra arguments are given, the first line in - the string buffer is the top line of the image, instead of - the bottom line. For RGB images, the string now contains - 3 bytes per pixel instead of 4. These changes were made - to make the methods compatible with the "fromstring" - factory function. - - To get the old behaviour, use the following syntax: - - data = im.tostring("raw", "RGBX", 0, -1) - im.fromstring(data, "raw", "RGBX", 0, -1) - - + "new" no longer gives a MemoryError if the width or height - is zero (this only happened on platforms where malloc(0) - or calloc(0) returns NULL). - - + "new" now adds a default palette object to "P" images. - - + You can now convert directly between all modes supported by - PIL. When converting colour images to "P", PIL defaults to - a "web" palette and dithering. When converting greyscale - images to "1", PIL uses a thresholding and dithering. - - + Added a "dither" option to "convert". By default, "convert" - uses floyd-steinberg error diffusion for "P" and "1" targets, - so this option is only used to *disable* dithering. Allowed - values are NONE (no dithering) or FLOYDSTEINBERG (default). - - imOut = im.convert("P", dither=Image.NONE) - - + Added a full set of "I" decoders. You can use "fromstring" - (and file decoders) to read any standard integer type as an - "I" image. - - + Added some support for "YCbCr" images (creation, conversion - from/to "L" and "RGB", IM YCC load/save) - - + "getpixel" now works properly with fractional coordinates. - - + ImageDraw "setink" now works with "I", "F", "RGB", "RGBA", - "RGBX", "CMYK", and "YCbCr" images. - - + ImImagePlugin no longer attaches palettes to "RGB" images. - - + Various minor fixes. - - (0.3a4 released) - - + Added experimental IPTC/NAA support. - - + Eliminated AttributeError exceptions after "crop" (from - Skip Montanaro) - - + Reads some uncompressed formats via memory mapping (this - is currently supported on Win32 only) - - + Fixed some last minute glitches in the last alpha release - (Types instead of types in Image.py, version numbers, etc.) - - + Eliminated some more bogus compiler warnings. - - + Various fixes to make PIL compile and run smoother on Macs - (from Jack Jansen). - - + Fixed "fromstring" and "tostring" for mode "I" images. - - (0.3a3 released) - - The test suite includes 530 individual tests. - - + Eliminated unexpected side-effect in "paste" with matte. "paste" - now works properly also if compiled with "gcc". - - + Adapted to Python 1.5 (build issues only) - - + Fixed the ImageDraw "point" method to draw also the last - point (!). - - + Added "I" and "RGBX" support to Image.new. - - + The plugin path is now properly prepended to the module search - path when a plugin module is imported. - - + Added "draw" method to the ImageWin.Dib class. This is used by - Topaz to print images on Windows printers. - - + "convert" now supports conversions from "P" to "1" and "F". - - + "paste" can now take a colour instead of an image as the first argument. - The colour must match the colour argument given to the new function, and - match the mode of the target image. - - + Fixed "paste" to allow a mask also for mode "F" images. - - + The BMP driver now saves mode "1" images. When loading images, the mode - is set to "L" for 8-bit files with greyscale palettes, and to "P" for - other 8-bit files. - - + The IM driver now reads and saves "1" images (file modes "0 1" or "L 1"). - - + The JPEG and GIF drivers now saves "1" images. For JPEG, the image - is saved as 8-bit greyscale (it will load as mode "L"). For GIF, the - image will be loaded as a "P" image. - - + Fixed a potential buffer overrun in the GIF encoder. - - (0.3a2 released) - - The test suite includes 400 individual tests. - - + Improvements to the test suite revealed a number of minor bugs, which - are all fixed. Note that crop/paste, 32-bit ImageDraw, and ImageFont - are still weak spots in this release. - - + Added "putpalette" method to the Image class. You can use this - to add or modify the palette for "P" and "L" images. If a palette - is added to an "L" image, it is automatically converted to a "P" - image. - - + Fixed ImageDraw to properly handle 32-bit image memories - ("RGB", "RGBA", "CMYK", "F") - - + Fixed "fromstring" and "tostring" not to mess up the mode attribute - in default mode. - - + Changed ImPlatform.h to work on CRAY's (don't have one at home, so I - haven't tried it). The previous version assumed that either "short" - or "int" were 16-bit wide. PIL still won't compile on platforms where - neither "short", "int" nor "long" are 32-bit wide. - - + Added file= and data= keyword arguments to PhotoImage and BitmapImage. - This allows you to use them as drop-in replacements for the corre- - sponding Tkinter classes. - - + Removed bogus references to the crack coder (ImagingCrack). - - (0.3a1 released) - - + Make sure image is loaded in "tostring". - - + Added floating point packer (native 32-bit floats only). - - *** Changes from release 0.1b1 to 0.2 (b5) *** - - + Modified "fromstring" and "tostring" methods to use file codecs. - Also added "fromstring" factory method to create an image directly - from data in a string. - - + Added support for 32-bit floating point images (mode "F"). You - can convert between "L" and "F" images, and apply a subset of the - available image processing methods on the "F" image. You can also - read virtually any data format into a floating point image memory; - see the section on "Decoding Floating Point Data" in the handbook - for more information. - - (0.2b5 released; on windows only) - - + Fixed the tobitmap() method to work properly for small bitmaps. - - + Added RMS and standard deviation to the ImageStat.Stat class. Also - modified the constructor to take an optional feature mask, and also - to accept either an image or a list containing the histogram data. - - + The BitmapImage code in ImageTk can now use a special bitmap - decoder, which has to be patched into Tk. See the "Tk/pilbitmap.txt" - file for details. If not installed, bitmaps are transferred to Tk as - XBM strings. - - + The PhotoImage code in ImageTk now uses a Tcl command ("PyImagingPaste") - instead of a special image type. This gives somewhat better performance, - and also allows PIL to support transparency. - *** WARNING: TKAPPINIT MUST BE MODIFIED *** - - + ImageTk now honours the alpha layer in RGBA images. Only fully - transparent pixels are made transparent (that is, the alpha layer - is treated as a mask). To treat the alpha laters as a matte, you - must paste the image on the background before handing it over to - ImageTk. - - + Added McIdas reader (supports 8-bit images only). - - + PIL now preloads drivers for BMP, GIF, JPEG, PPM, and TIFF. As - long as you only load and save these formats, you don't have to - wait for a full scan for drivers. To force scanning, call the - Image.init() function. - - + The "seek" and "tell" methods are now always available, also for - single-frame images. - - + Added optional mask argument to histogram method. The mask may - be an "1" or "L" image with the same size as the original image. - Only pixels where the mask is non-zero are included in the - histogram. - - + The "paste" method now allows you to specify only the lower left - corner (a 2-tuple), instead of the full region (a 4-tuple). - - + Reverted to old plugin scanning model; now scans all directory - names in the path when looking for plugins. - - + Added PIXAR raster support. Only uncompressed ("dumped") RGB - images can currently be read (based on information provided - by Greg Coats). - - + Added FlashPix (FPX) read support. Reads all pixel formats, but - only the highest resolution is read, and the viewing transform is - currently ignored. - - + Made PNG encoding somewhat more efficient in "optimize" mode; a - bug in 0.2b4 didn't enable all predictor filters when optimized - storage were requested. - - + Added Microsoft Image Composer (MIC) read support. When opened, - the first sprite in the file is loaded. You can use the seek method - to load additional sprites from the file. - - + Properly reads "P" and "CMYK" PSD images. - - + "pilconvert" no longer optimizes by default; use the -o option to - make the file as small as possible (at the expense of speed); use - the -q option to set the quality when compressing to JPEG. - - + Fixed "crop" not to drop the palette for "P" images. - - + Added and verified FLC support. - - + Paste with "L" or "RGBA" alpha is now several times faster on most - platforms. - - + Changed Image.new() to initialize the image to black, as described - in the handbook. To get an uninitialized image, use None as the - colour. - - + Fixed the PDF encoder to produce a valid header; Acrobat no longer - complains when you load PDF images created by PIL. - - + PIL only scans fully-qualified directory names in the path when - looking for plugins. - *** WARNING: MAY BREAK EXISTING CODE *** - - + Faster implementation of "save" used when filename is given, - or when file object has "fileno" and "flush" methods. - - + Don't crash in "crop" if region extends outside the source image. - - + Eliminated a massive memory leak in the "save" function. - - + The GIF decoder doesn't crash if the code size is set to an illegal - value. This could happen since another bug didn't handle local - palettes properly if they didn't have the same size as the - global palette (not very common). - - + Added predictor support (TIFF 6.0 section 14) to the TIFF decoder. - - + Fixed palette and padding problems in BMP driver. Now properly - writes "1", "L", "P" and "RGB" images. - - + Fixed getpixel()/getdata() to return correct pixel values. - - + Added PSD (PhotoShop) read support. Reads both uncompressed - and compressed images of most types. - - + Added GIF write support (writes "uncompressed" GIF files only, - due to unresolvable licensing issues). The "gifmaker.py" script - can be used to create GIF animations. - - + Reads 8-bit "L" and "P" TGA images. Also reads 16-bit "RGB" - images. - - + Added FLI read support. This driver has only been tested - on a few FLI samples. - - + Reads 2-bit and 4-bit PCX images. - - + Added MSP read and write support. Both version 1 and 2 can be - read, but only version 1 (uncompressed) files are written. - - + Fixed a bug in the FLI/FLC identification code that caused the - driver to raise an exception when parsing valid FLI/FLC files. - - + Improved performance when loading file format plugins, and when - opening files. - - + Added GIF animation support, via the "seek" and "tell" methods. - You can use "player.py" to play an animated GIF file. - - + Removed MNG support, since the spec is changing faster than I - can change the code. I've added support for the experimental - ARG format instead. Contact me for more information on this - format. - - + Added keyword options to the "save" method. The following options - are currently supported: - - format option description - -------------------------------------------------------- - JPEG optimize minimize output file at the - expense of compression speed. - - JPEG progressive enable progressive output. the - option value is ignored. - - JPEG quality set compression quality (1-100). - the default value is 75. - - JPEG smooth smooth dithered images. value - is strengh (1-100). default is - off (0). - - PNG optimize minimize output file at the - expense of compression speed. - - Expect more options in future releases. Also note that - file writers silently ignore unknown options. - - + Plugged memory leaks in the PNG and TIFF decoders. - - + Added PNG write support. - - + (internal) RGB unpackers and converters now set the pad byte - to 255 (full opacity). - - + Properly handles the "transparency" property for GIF, PNG - and XPM files. - - + Added a "putalpha" method, allowing you to attach a "1" or "L" - image as the alpha layer to an "RGBA" image. - - + Various improvements to the sample scripts: - - "pilconvert" Carries out some extra tricks in order to make - the resulting file as small as possible. - - "explode" (NEW) Split an image sequence into individual frames. - - "gifmaker" (NEW) Convert a sequence file into a GIF animation. - Note that the GIF encoder create "uncompressed" GIF - files, so animations created by this script are - rather large (typically 2-5 times the compressed - sizes). - - "image2py" (NEW) Convert a single image to a python module. See - comments in this script for details. - - "player" If multiple images are given on the command line, - they are interpreted as frames in a sequence. The - script assumes that they all have the same size. - Also note that this script now can play FLI/FLC - and GIF animations. - - This player can also execute embedded Python - animation applets (ARG format only). - - "viewer" Transparent images ("P" with transparency property, - and "RGBA") are superimposed on the standard Tk back- - ground. - - + Fixed colour argument to "new". For multilayer images, pass a - tuple: (Red, Green, Blue), (Red, Green, Blue, Alpha), or (Cyan, - Magenta, Yellow, Black). - - + Added XPM (X pixmap) read support. - - (0.2b3 released) - - + Added MNG (multi-image network graphics) read support. "Ming" - is a proposed animation standard, based on the PNG file format. - - You can use the "player" sample script to display some flavours - of this format. The MNG standard is still under development, - as is this driver. More information, including sample files, - can be found at - - + Added a "verify" method to images loaded from file. This method - scans the file for errors, without actually decoding the image - data, and raises a suitable exception if it finds any problems. - Currently implemented for PNG and MNG files only. - - + Added support for interlaced GIF images. - - + Added PNG read support -- if linked with the ZLIB compression library, - PIL reads all kinds of PNG images, except interlaced files. - - + Improved PNG identification support -- doesn't mess up on unknown - chunks, identifies all possible PNG modes, and verifies checksum - on PNG header chunks. - - + Added an experimental reader for placable Windows Meta Files (WMF). - This reader is still very incomplete, but it illustrates how PIL's - drawing capabilities can be used to render vector and metafile - formats. - - + Added restricted drivers for images from Image Tools (greyscale - only) and LabEye/IFUNC (common interchange modes only). - - + Some minor improvements to the sample scripts provided in the - "Scripts" directory. - - + The test images have been moved to the "Images" directory. - - (0.2b2 released) - (0.2b1 released; Windows only) - - + Fixed filling of complex polygons. The ImageDraw "line" and - "polygon" methods also accept Path objects. - - + The ImageTk "PhotoImage" object can now be constructed directly - from an image. You can also pass the object itself to Tkinter, - instead of using the "image" attribute. Finally, using "paste" - on a displayed image automatically updates the display. - - + The ImageTk "BitmapImage" object allows you to create transparent - overlays from 1-bit images. You can pass the object itself to - Tkinter. The constructor takes the same arguments as the Tkinter - BitmapImage class; use the "foreground" option to set the colour - of the overlay. - - + Added a "putdata" method to the Image class. This can be used to - load a 1-layer image with data from a sequence object or a string. - An optional floating point scale and offset can be used to adjust - the data to fit into the 8-bit pixel range. Also see the "getdata" - method. - - + Added the EXTENT method to the Image "transform" method. This can - be used to quickly crop, stretch, shrink, or mirror a subregion - from another image. - - + Adapted to Python 1.4. - - + Added a project makefile for Visual C++ 4.x. This allows you to - easily build a dynamically linked version of PIL for Windows 95 - and NT. - - + A Tk "booster" patch for Windows is available. It gives dramatic - performance improvements for some displays. Has been tested with - Tk 4.2 only, but is likely to work with Tk 4.1 as well. See the Tk - subdirectory for details. - - + You can now save 1-bit images in the XBM format. In addition, the - Image class now provides a "tobitmap" method which returns a string - containing an XBM representation of the image. Quite handy to use - with Tk. - - + More conversions, including "RGB" to "1" and more. - - (0.2a1 released) - - + Where earlier versions accepted lists, this version accepts arbitrary - Python sequences (including strings, in some cases). A few resource - leaks were plugged in the process. - - + The Image "paste" method now allows the box to extend outside - the target image. The size of the box, the image to be pasted, - and the optional mask must still match. - - + The ImageDraw module now supports filled polygons, outlined and - filled ellipses, and text. Font support is rudimentary, though. - - + The Image "point" method now takes an optional mode argument, - allowing you to convert the image while translating it. Currently, - this can only be used to convert "L" or "P" images to "1" images - (creating thresholded images or "matte" masks). - - + An Image "getpixel" method has been added. For single band images, - it returns the pixel value at a given position as an integer. - For n-band images, it returns an n-tuple of integers. - - + An Image "getdata" method has been added. It returns a sequence - object representing the image as a 1-dimensional array. Only len() - and [] can be used with this sequence. This method returns a - reference to the existing image data, so changes in the image - will be immediately reflected in the sequence object. - - + Fixed alignment problems in the Windows BMP writer. - - + If converting an "RGB" image to "RGB" or "L", you can give a second - argument containing a colour conversion matrix. - - + An Image "getbbox" method has been added. It returns the bounding - box of data in an image, considering the value 0 as background. - - + An Image "offset" method has been added. It returns a new image - where the contents of the image have been offset the given distance - in X and/or Y direction. Data wraps between edges. - - + Saves PDF images. The driver creates a binary PDF 1.1 files, using - JPEG compression for "L", "RGB", and "CMYK" images, and hex encoding - (same as for PostScript) for other formats. - - + The "paste" method now accepts "1" masks. Zero means transparent, - any other pixel value means opaque. This is faster than using an - "L" transparency mask. - - + Properly writes EPS files (and properly prints images to postscript - printers as well). - - + Reads 4-bit BMP files, as well as 4 and 8-bit Windows ICO and CUR - files. Cursor animations are not supported. - - + Fixed alignment problems in the Sun raster loader. - - + Added "draft" and "thumbnail" methods. The draft method is used - to optimize loading of JPEG and PCD files, the thumbnail method is - used to create a thumbnail representation of an image. - - + Added Windows display support, via the ImageWin class (see the - handbook for details). - - + Added raster conversion for EPS files. This requires GNU or Aladdin - Ghostscript, and probably works on UNIX only. - - + Reads PhotoCD (PCD) images. The base resolution (768x512) can be - read from a PhotoCD file. - - + Eliminated some compiler warnings. Bindings now compile cleanly in C++ - mode. Note that the Imaging library itself must be compiled in C mode. - - + Added "bdf2pil.py", which converts BDF fonts into images with associated - metrics. This is definitely work in progress. For info, see description - in script for details. - - + Fixed a bug in the "ImageEnhance.py" module. - - + Fixed a bug in the netpbm save hack in "GifImagePlugin.py" - - + Fixed 90 and 270 degree rotation of rectangular images. - - + Properly reads 8-bit TIFF palette-color images. - - + Reads plane separated RGB and CMYK TIFF images. - - + Added driver debug mode. This is enabled by setting Image.DEBUG - to a non-zero value. Try the -D option to "pilfile.py" and see what - happens. - - + Don't crash on "atend" constructs in PostScript files. - - + Only the Image module imports _imaging directly. Other modules - should refer to the binding module as "Image.core". - - *** Changes from release 0.0 to 0.1 (b1) *** - - + A handbook is available (distributed separately). - - + The coordinate system is changed so that (0,0) is now located - in the upper left corner. This is in compliancy with ISO 12087 - and 90% of all other image processing and graphics libraries. - - + Modes "1" (bilevel) and "P" (palette) have been introduced. Note - that bilevel images are stored with one byte per pixel. - - + The Image "crop" and "paste" methods now accepts None as the - box argument, to refer to the full image (self, that is). - - + The Image "crop" method now works properly. - - + The Image "point" method is now available. You can use either a - lookup table or a function taking one argument. - - + The Image join function has been renamed to "merge". - - + An Image "composite" function has been added. It is identical - to copy() followed by paste(mask). - - + An Image "eval" function has been added. It is currently identical - to point(function); that is, only a single image can be processed. - - + A set of channel operations has been added. See the "ImageChops" - module, test_chops.py, and the handbook for details. - - + Added the "pilconvert" utility, which converts image files. Note - that the number of output formats are still quite restricted. - - + Added the "pilfile" utility, which quickly identifies image files - (without loading them, in most cases). - - + Added the "pilprint" utility, which prints image files to Postscript - printers. - - + Added a rudimentary version of the "pilview" utility, which is - simple image viewer based on Tk. Only File/Exit and Image/Next - works properly. - - + An interface to Tk has been added. See "Lib/ImageTk.py" and README - for details. - - + An interface to Jack Jansen's Img library has been added (thanks to - Jack). This allows you to read images through the Img extensions file - format handlers. See the file "Lib/ImgExtImagePlugin.py" for details. - - + Postscript printing is provided through the PSDraw module. See the - handbook for details. - -Keywords: Imaging -Platform: UNKNOWN -Classifier: Development Status :: 6 - Mature -Classifier: Topic :: Multimedia :: Graphics -Classifier: Topic :: Multimedia :: Graphics :: Capture :: Digital Camera -Classifier: Topic :: Multimedia :: Graphics :: Capture :: Scanners -Classifier: Topic :: Multimedia :: Graphics :: Capture :: Screen Capture -Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion -Classifier: Topic :: Multimedia :: Graphics :: Viewers -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 diff --git a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/SOURCES.txt b/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/SOURCES.txt deleted file mode 100644 index b8fd432..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/SOURCES.txt +++ /dev/null @@ -1,593 +0,0 @@ -.coveragerc -.gitattributes -.travis.yml -CHANGES.rst -MANIFEST.in -Makefile -README.rst -_imaging.c -_imagingcms.c -_imagingft.c -_imagingmath.c -_imagingmorph.c -_imagingtk.c -_webp.c -decode.c -display.c -encode.c -map.c -mp_compile.py -outline.c -path.c -py3.h -requirements.txt -selftest.py -setup.cfg -setup.py -test-installed.py -tox.ini -PIL/BdfFontFile.py -PIL/BmpImagePlugin.py -PIL/BufrStubImagePlugin.py -PIL/ContainerIO.py -PIL/CurImagePlugin.py -PIL/DcxImagePlugin.py -PIL/EpsImagePlugin.py -PIL/ExifTags.py -PIL/FitsStubImagePlugin.py -PIL/FliImagePlugin.py -PIL/FontFile.py -PIL/FpxImagePlugin.py -PIL/GbrImagePlugin.py -PIL/GdImageFile.py -PIL/GifImagePlugin.py -PIL/GimpGradientFile.py -PIL/GimpPaletteFile.py -PIL/GribStubImagePlugin.py -PIL/Hdf5StubImagePlugin.py -PIL/IcnsImagePlugin.py -PIL/IcoImagePlugin.py -PIL/ImImagePlugin.py -PIL/Image.py -PIL/ImageChops.py -PIL/ImageCms.py -PIL/ImageColor.py -PIL/ImageDraw.py -PIL/ImageDraw2.py -PIL/ImageEnhance.py -PIL/ImageFile.py -PIL/ImageFileIO.py -PIL/ImageFilter.py -PIL/ImageFont.py -PIL/ImageGrab.py -PIL/ImageMath.py -PIL/ImageMode.py -PIL/ImageMorph.py -PIL/ImageOps.py -PIL/ImagePalette.py -PIL/ImagePath.py -PIL/ImageQt.py -PIL/ImageSequence.py -PIL/ImageShow.py -PIL/ImageStat.py -PIL/ImageTk.py -PIL/ImageTransform.py -PIL/ImageWin.py -PIL/ImtImagePlugin.py -PIL/IptcImagePlugin.py -PIL/Jpeg2KImagePlugin.py -PIL/JpegImagePlugin.py -PIL/JpegPresets.py -PIL/McIdasImagePlugin.py -PIL/MicImagePlugin.py -PIL/MpegImagePlugin.py -PIL/MspImagePlugin.py -PIL/OleFileIO-README.md -PIL/OleFileIO.py -PIL/PSDraw.py -PIL/PaletteFile.py -PIL/PalmImagePlugin.py -PIL/PcdImagePlugin.py -PIL/PcfFontFile.py -PIL/PcxImagePlugin.py -PIL/PdfImagePlugin.py -PIL/PixarImagePlugin.py -PIL/PngImagePlugin.py -PIL/PpmImagePlugin.py -PIL/PsdImagePlugin.py -PIL/PyAccess.py -PIL/SgiImagePlugin.py -PIL/SpiderImagePlugin.py -PIL/SunImagePlugin.py -PIL/TarIO.py -PIL/TgaImagePlugin.py -PIL/TiffImagePlugin.py -PIL/TiffTags.py -PIL/WalImageFile.py -PIL/WebPImagePlugin.py -PIL/WmfImagePlugin.py -PIL/XVThumbImagePlugin.py -PIL/XbmImagePlugin.py -PIL/XpmImagePlugin.py -PIL/__init__.py -PIL/_binary.py -PIL/_util.py -Pillow.egg-info/PKG-INFO -Pillow.egg-info/SOURCES.txt -Pillow.egg-info/dependency_links.txt -Pillow.egg-info/top_level.txt -Pillow.egg-info/zip-safe -Sane/CHANGES -Sane/README.rst -Sane/_sane.c -Sane/demo_numarray.py -Sane/demo_pil.py -Sane/sane.py -Sane/sanedoc.txt -Sane/setup.py -Scripts/README.rst -Scripts/enhancer.py -Scripts/explode.py -Scripts/gifmaker.py -Scripts/painter.py -Scripts/pilconvert.py -Scripts/pildriver.py -Scripts/pilfile.py -Scripts/pilfont.py -Scripts/pilprint.py -Scripts/player.py -Scripts/thresholder.py -Scripts/viewer.py -Tests/README.rst -Tests/bench_cffi_access.py -Tests/bench_get.py -Tests/check_icns_dos.py -Tests/check_j2k_dos.py -Tests/crash_ttf_memory_error.py -Tests/helper.py -Tests/import_all.py -Tests/large_memory_numpy_test.py -Tests/large_memory_test.py -Tests/make_hash.py -Tests/show_icc.py -Tests/show_mcidas.py -Tests/test_000_sanity.py -Tests/test_bmp_reference.py -Tests/test_cffi.py -Tests/test_decompression_bomb.py -Tests/test_file_bmp.py -Tests/test_file_eps.py -Tests/test_file_fli.py -Tests/test_file_gif.py -Tests/test_file_icns.py -Tests/test_file_ico.py -Tests/test_file_jpeg.py -Tests/test_file_jpeg2k.py -Tests/test_file_libtiff.py -Tests/test_file_libtiff_small.py -Tests/test_file_msp.py -Tests/test_file_pcx.py -Tests/test_file_pdf.py -Tests/test_file_png.py -Tests/test_file_ppm.py -Tests/test_file_psd.py -Tests/test_file_spider.py -Tests/test_file_tar.py -Tests/test_file_tiff.py -Tests/test_file_tiff_metadata.py -Tests/test_file_webp.py -Tests/test_file_webp_alpha.py -Tests/test_file_webp_lossless.py -Tests/test_file_webp_metadata.py -Tests/test_file_xbm.py -Tests/test_file_xpm.py -Tests/test_font_bdf.py -Tests/test_font_pcf.py -Tests/test_format_lab.py -Tests/test_image.py -Tests/test_image_array.py -Tests/test_image_convert.py -Tests/test_image_copy.py -Tests/test_image_crop.py -Tests/test_image_draft.py -Tests/test_image_filter.py -Tests/test_image_frombytes.py -Tests/test_image_getbands.py -Tests/test_image_getbbox.py -Tests/test_image_getcolors.py -Tests/test_image_getdata.py -Tests/test_image_getextrema.py -Tests/test_image_getim.py -Tests/test_image_getpalette.py -Tests/test_image_getpixel.py -Tests/test_image_getprojection.py -Tests/test_image_histogram.py -Tests/test_image_load.py -Tests/test_image_mode.py -Tests/test_image_offset.py -Tests/test_image_point.py -Tests/test_image_putalpha.py -Tests/test_image_putdata.py -Tests/test_image_putpalette.py -Tests/test_image_putpixel.py -Tests/test_image_quantize.py -Tests/test_image_resize.py -Tests/test_image_rotate.py -Tests/test_image_split.py -Tests/test_image_thumbnail.py -Tests/test_image_tobitmap.py -Tests/test_image_tobytes.py -Tests/test_image_transform.py -Tests/test_image_transpose.py -Tests/test_imagechops.py -Tests/test_imagecms.py -Tests/test_imagecolor.py -Tests/test_imagedraw.py -Tests/test_imageenhance.py -Tests/test_imagefile.py -Tests/test_imagefileio.py -Tests/test_imagefilter.py -Tests/test_imagefont.py -Tests/test_imagegrab.py -Tests/test_imagemath.py -Tests/test_imagemode.py -Tests/test_imagemorph.py -Tests/test_imageops.py -Tests/test_imageops_usm.py -Tests/test_imagepalette.py -Tests/test_imagepath.py -Tests/test_imageqt.py -Tests/test_imagesequence.py -Tests/test_imageshow.py -Tests/test_imagestat.py -Tests/test_imagetk.py -Tests/test_imagetransform.py -Tests/test_imagewin.py -Tests/test_lib_image.py -Tests/test_lib_pack.py -Tests/test_locale.py -Tests/test_mode_i16.py -Tests/test_numpy.py -Tests/test_olefileio.py -Tests/test_pickle.py -Tests/test_pyroma.py -Tests/test_shell_injection.py -Tests/threaded_save.py -Tests/versions.py -Tests/fonts/FreeMono.ttf -Tests/fonts/helvO18.pcf -Tests/icc/CMY.icm -Tests/icc/YCC709.icm -Tests/icc/sRGB.icm -Tests/images/10ct_32bit_128.tiff -Tests/images/12bit.cropped.tif -Tests/images/12in16bit.tif -Tests/images/16_bit_binary.pgm -Tests/images/16_bit_binary_pgm.png -Tests/images/16bit.MM.cropped.tif -Tests/images/16bit.MM.deflate.tif -Tests/images/16bit.cropped.j2k -Tests/images/16bit.cropped.jp2 -Tests/images/16bit.cropped.tif -Tests/images/16bit.deflate.tif -Tests/images/binary_preview_map.eps -Tests/images/broken.png -Tests/images/caption_6_33_22.png -Tests/images/corner.lut -Tests/images/courB08.bdf -Tests/images/courB08.pbm -Tests/images/courB08.pil -Tests/images/create_eps.gnuplot -Tests/images/dilation4.lut -Tests/images/dilation8.lut -Tests/images/edge.lut -Tests/images/erosion4.lut -Tests/images/erosion8.lut -Tests/images/flower.jpg -Tests/images/flower.webp -Tests/images/flower2.jpg -Tests/images/flower2.webp -Tests/images/g4-fillorder-test.png -Tests/images/g4-fillorder-test.tif -Tests/images/high_ascii_chars.png -Tests/images/icc_profile_none.png -Tests/images/imagedraw_arc.png -Tests/images/imagedraw_bitmap.png -Tests/images/imagedraw_chord.png -Tests/images/imagedraw_ellipse.png -Tests/images/imagedraw_floodfill.png -Tests/images/imagedraw_floodfill2.png -Tests/images/imagedraw_line.png -Tests/images/imagedraw_pieslice.png -Tests/images/imagedraw_point.png -Tests/images/imagedraw_polygon.png -Tests/images/imagedraw_rectangle.png -Tests/images/junk_jpeg_header.jpg -Tests/images/l_trns.png -Tests/images/lab-green.tif -Tests/images/lab-red.tif -Tests/images/lab.tif -Tests/images/lena.Lab.tif -Tests/images/lena.fli -Tests/images/lena.gif -Tests/images/lena.ico -Tests/images/lena.jpg -Tests/images/lena.png -Tests/images/lena.ppm -Tests/images/lena.psd -Tests/images/lena.spider -Tests/images/lena.tar -Tests/images/lena.tif -Tests/images/lena.webp -Tests/images/lena.xpm -Tests/images/lena_bw.png -Tests/images/lena_bw_500.png -Tests/images/lena_g4.tif -Tests/images/lena_g4_500.tif -Tests/images/lena_webp_bits.ppm -Tests/images/lena_webp_write.ppm -Tests/images/morph_a.png -Tests/images/multiline_text.png -Tests/images/non_zero_bb.eps -Tests/images/non_zero_bb.png -Tests/images/non_zero_bb_scale2.png -Tests/images/p_trns_single.png -Tests/images/pil123p.png -Tests/images/pil123rgba.png -Tests/images/pil136.tiff -Tests/images/pil168.tif -Tests/images/pil184.pcx -Tests/images/pil_sample_cmyk.jpg -Tests/images/pil_sample_rgb.jpg -Tests/images/pillow.icns -Tests/images/pillow.ico -Tests/images/pillow2.icns -Tests/images/pillow3.icns -Tests/images/pngtest_bad.png.bin -Tests/images/pport_g4.tif -Tests/images/python.ico -Tests/images/rgb.jpg -Tests/images/rgb_trns.png -Tests/images/rgb_trns_ycbc.j2k -Tests/images/rgb_trns_ycbc.jp2 -Tests/images/test-card-lossless.jp2 -Tests/images/test-card-lossy-tiled.jp2 -Tests/images/test-card.png -Tests/images/test-ole-file.doc -Tests/images/test.colors.gif -Tests/images/tiff_adobe_deflate.tif -Tests/images/transparent.png -Tests/images/transparent.webp -Tests/images/zero_bb.eps -Tests/images/zero_bb.png -Tests/images/zero_bb_scale2.png -Tests/images/bmp/README.txt -Tests/images/bmp/b/badbitcount.bmp -Tests/images/bmp/b/badbitssize.bmp -Tests/images/bmp/b/baddens1.bmp -Tests/images/bmp/b/baddens2.bmp -Tests/images/bmp/b/badfilesize.bmp -Tests/images/bmp/b/badheadersize.bmp -Tests/images/bmp/b/badpalettesize.bmp -Tests/images/bmp/b/badplanes.bmp -Tests/images/bmp/b/badrle.bmp -Tests/images/bmp/b/badwidth.bmp -Tests/images/bmp/b/pal8badindex.bmp -Tests/images/bmp/b/reallybig.bmp -Tests/images/bmp/b/rletopdown.bmp -Tests/images/bmp/b/shortfile.bmp -Tests/images/bmp/g/pal1.bmp -Tests/images/bmp/g/pal1bg.bmp -Tests/images/bmp/g/pal1wb.bmp -Tests/images/bmp/g/pal4.bmp -Tests/images/bmp/g/pal4rle.bmp -Tests/images/bmp/g/pal8-0.bmp -Tests/images/bmp/g/pal8.bmp -Tests/images/bmp/g/pal8nonsquare.bmp -Tests/images/bmp/g/pal8os2.bmp -Tests/images/bmp/g/pal8rle.bmp -Tests/images/bmp/g/pal8topdown.bmp -Tests/images/bmp/g/pal8v4.bmp -Tests/images/bmp/g/pal8v5.bmp -Tests/images/bmp/g/pal8w124.bmp -Tests/images/bmp/g/pal8w125.bmp -Tests/images/bmp/g/pal8w126.bmp -Tests/images/bmp/g/rgb16-565.bmp -Tests/images/bmp/g/rgb16-565pal.bmp -Tests/images/bmp/g/rgb16.bmp -Tests/images/bmp/g/rgb24.bmp -Tests/images/bmp/g/rgb24pal.bmp -Tests/images/bmp/g/rgb32.bmp -Tests/images/bmp/g/rgb32bf.bmp -Tests/images/bmp/html/bkgd.png -Tests/images/bmp/html/bmpsuite.html -Tests/images/bmp/html/fakealpha.png -Tests/images/bmp/html/pal1.png -Tests/images/bmp/html/pal1bg.png -Tests/images/bmp/html/pal1p1.png -Tests/images/bmp/html/pal2.png -Tests/images/bmp/html/pal4.png -Tests/images/bmp/html/pal4rletrns-0.png -Tests/images/bmp/html/pal4rletrns-b.png -Tests/images/bmp/html/pal4rletrns.png -Tests/images/bmp/html/pal8.png -Tests/images/bmp/html/pal8nonsquare-e.png -Tests/images/bmp/html/pal8nonsquare-v.png -Tests/images/bmp/html/pal8rletrns-0.png -Tests/images/bmp/html/pal8rletrns-b.png -Tests/images/bmp/html/pal8rletrns.png -Tests/images/bmp/html/pal8w124.png -Tests/images/bmp/html/pal8w125.png -Tests/images/bmp/html/pal8w126.png -Tests/images/bmp/html/rgb16-231.png -Tests/images/bmp/html/rgb16-565.png -Tests/images/bmp/html/rgb16.png -Tests/images/bmp/html/rgb24.jpg -Tests/images/bmp/html/rgb24.png -Tests/images/bmp/html/rgba16-4444.png -Tests/images/bmp/html/rgba32.png -Tests/images/bmp/q/pal1p1.bmp -Tests/images/bmp/q/pal2.bmp -Tests/images/bmp/q/pal4rletrns.bmp -Tests/images/bmp/q/pal8offs.bmp -Tests/images/bmp/q/pal8os2sp.bmp -Tests/images/bmp/q/pal8os2v2-16.bmp -Tests/images/bmp/q/pal8os2v2.bmp -Tests/images/bmp/q/pal8oversizepal.bmp -Tests/images/bmp/q/pal8rletrns.bmp -Tests/images/bmp/q/rgb16-231.bmp -Tests/images/bmp/q/rgb24jpeg.bmp -Tests/images/bmp/q/rgb24largepal.bmp -Tests/images/bmp/q/rgb24lprof.bmp -Tests/images/bmp/q/rgb24png.bmp -Tests/images/bmp/q/rgb24prof.bmp -Tests/images/bmp/q/rgb32-111110.bmp -Tests/images/bmp/q/rgb32fakealpha.bmp -Tests/images/bmp/q/rgba16-4444.bmp -Tests/images/bmp/q/rgba32.bmp -Tests/images/bmp/q/rgba32abf.bmp -Tests/images/imagedraw/line_horizontal_slope1px_w2px.png -Tests/images/imagedraw/line_horizontal_w101px.png -Tests/images/imagedraw/line_horizontal_w2px_inverted.png -Tests/images/imagedraw/line_horizontal_w2px_normal.png -Tests/images/imagedraw/line_horizontal_w3px.png -Tests/images/imagedraw/line_oblique_45_w3px_a.png -Tests/images/imagedraw/line_oblique_45_w3px_b.png -Tests/images/imagedraw/line_vertical_slope1px_w2px.png -Tests/images/imagedraw/line_vertical_w101px.png -Tests/images/imagedraw/line_vertical_w2px_inverted.png -Tests/images/imagedraw/line_vertical_w2px_normal.png -Tests/images/imagedraw/line_vertical_w3px.png -Tests/images/imagedraw/square.png -Tests/images/imagedraw/triangle_right.png -Tk/README.rst -Tk/tkImaging.c -depends/README.rst -depends/install_openjpeg.sh -depends/install_webp.sh -docs/BUILDME -docs/COPYING -docs/Guardfile -docs/LICENSE -docs/Makefile -docs/PIL.rst -docs/about.rst -docs/conf.py -docs/developer.rst -docs/guides.rst -docs/index.rst -docs/installation.rst -docs/make.bat -docs/original-readme.rst -docs/plugins.rst -docs/porting-pil-to-pillow.rst -docs/requirements.txt -docs/_build/.gitignore -docs/_static/.gitignore -docs/_templates/.gitignore -docs/_templates/sidebarhelp.html -docs/handbook/appendices.rst -docs/handbook/concepts.rst -docs/handbook/image-file-formats.rst -docs/handbook/overview.rst -docs/handbook/tutorial.rst -docs/handbook/writing-your-own-file-decoder.rst -docs/reference/Image.rst -docs/reference/ImageChops.rst -docs/reference/ImageColor.rst -docs/reference/ImageDraw.rst -docs/reference/ImageEnhance.rst -docs/reference/ImageFile.rst -docs/reference/ImageFilter.rst -docs/reference/ImageFont.rst -docs/reference/ImageGrab.rst -docs/reference/ImageMath.rst -docs/reference/ImageOps.rst -docs/reference/ImagePalette.rst -docs/reference/ImagePath.rst -docs/reference/ImageQt.rst -docs/reference/ImageSequence.rst -docs/reference/ImageStat.rst -docs/reference/ImageTk.rst -docs/reference/ImageWin.rst -docs/reference/PSDraw.rst -docs/reference/index.rst -libImaging/Access.c -libImaging/AlphaComposite.c -libImaging/Antialias.c -libImaging/Bands.c -libImaging/Bit.h -libImaging/BitDecode.c -libImaging/Blend.c -libImaging/Chops.c -libImaging/Convert.c -libImaging/ConvertYCbCr.c -libImaging/Copy.c -libImaging/Crc32.c -libImaging/Crop.c -libImaging/Dib.c -libImaging/Draw.c -libImaging/Effects.c -libImaging/EpsEncode.c -libImaging/Except.c -libImaging/File.c -libImaging/Fill.c -libImaging/Filter.c -libImaging/FliDecode.c -libImaging/Geometry.c -libImaging/GetBBox.c -libImaging/Gif.h -libImaging/GifDecode.c -libImaging/GifEncode.c -libImaging/HexDecode.c -libImaging/Histo.c -libImaging/ImDib.h -libImaging/ImPlatform.h -libImaging/Imaging.h -libImaging/Incremental.c -libImaging/Jpeg.h -libImaging/Jpeg2K.h -libImaging/Jpeg2KDecode.c -libImaging/Jpeg2KEncode.c -libImaging/JpegDecode.c -libImaging/JpegEncode.c -libImaging/Lzw.h -libImaging/LzwDecode.c -libImaging/Matrix.c -libImaging/ModeFilter.c -libImaging/MspDecode.c -libImaging/Negative.c -libImaging/Offset.c -libImaging/Pack.c -libImaging/PackDecode.c -libImaging/Palette.c -libImaging/Paste.c -libImaging/PcdDecode.c -libImaging/PcxDecode.c -libImaging/PcxEncode.c -libImaging/Point.c -libImaging/Quant.c -libImaging/QuantHash.c -libImaging/QuantHash.h -libImaging/QuantHeap.c -libImaging/QuantHeap.h -libImaging/QuantOctree.c -libImaging/QuantOctree.h -libImaging/QuantTypes.h -libImaging/RankFilter.c -libImaging/Raw.h -libImaging/RawDecode.c -libImaging/RawEncode.c -libImaging/Storage.c -libImaging/SunRleDecode.c -libImaging/TgaRleDecode.c -libImaging/TiffDecode.c -libImaging/TiffDecode.h -libImaging/Unpack.c -libImaging/UnpackYCC.c -libImaging/UnsharpMask.c -libImaging/XbmDecode.c -libImaging/XbmEncode.c -libImaging/Zip.h -libImaging/ZipDecode.c -libImaging/ZipEncode.c \ No newline at end of file diff --git a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/dependency_links.txt b/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/installed-files.txt b/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/installed-files.txt deleted file mode 100644 index 7786051..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/installed-files.txt +++ /dev/null @@ -1,188 +0,0 @@ -../PIL/ImtImagePlugin.py -../PIL/BdfFontFile.py -../PIL/_binary.py -../PIL/ExifTags.py -../PIL/ImageFileIO.py -../PIL/PdfImagePlugin.py -../PIL/GifImagePlugin.py -../PIL/TiffTags.py -../PIL/McIdasImagePlugin.py -../PIL/ImageMorph.py -../PIL/MspImagePlugin.py -../PIL/TgaImagePlugin.py -../PIL/PalmImagePlugin.py -../PIL/ImageChops.py -../PIL/ImagePath.py -../PIL/MicImagePlugin.py -../PIL/PSDraw.py -../PIL/ImageQt.py -../PIL/Jpeg2KImagePlugin.py -../PIL/ImageMath.py -../PIL/EpsImagePlugin.py -../PIL/ImageFont.py -../PIL/MpegImagePlugin.py -../PIL/ContainerIO.py -../PIL/IcnsImagePlugin.py -../PIL/SgiImagePlugin.py -../PIL/ImageDraw.py -../PIL/GimpGradientFile.py -../PIL/ImageOps.py -../PIL/ImageColor.py -../PIL/__init__.py -../PIL/GimpPaletteFile.py -../PIL/TarIO.py -../PIL/PpmImagePlugin.py -../PIL/ImageFilter.py -../PIL/FontFile.py -../PIL/ImageEnhance.py -../PIL/PaletteFile.py -../PIL/TiffImagePlugin.py -../PIL/FitsStubImagePlugin.py -../PIL/XpmImagePlugin.py -../PIL/WmfImagePlugin.py -../PIL/FpxImagePlugin.py -../PIL/Hdf5StubImagePlugin.py -../PIL/SpiderImagePlugin.py -../PIL/GbrImagePlugin.py -../PIL/JpegPresets.py -../PIL/PixarImagePlugin.py -../PIL/XVThumbImagePlugin.py -../PIL/ImageShow.py -../PIL/BmpImagePlugin.py -../PIL/SunImagePlugin.py -../PIL/BufrStubImagePlugin.py -../PIL/PcfFontFile.py -../PIL/OleFileIO.py -../PIL/ImageCms.py -../PIL/PsdImagePlugin.py -../PIL/ImagePalette.py -../PIL/ImImagePlugin.py -../PIL/ImageStat.py -../PIL/ImageFile.py -../PIL/ImageTk.py -../PIL/IcoImagePlugin.py -../PIL/ImageGrab.py -../PIL/ImageMode.py -../PIL/_util.py -../PIL/GribStubImagePlugin.py -../PIL/ImageSequence.py -../PIL/DcxImagePlugin.py -../PIL/CurImagePlugin.py -../PIL/JpegImagePlugin.py -../PIL/WalImageFile.py -../PIL/PcxImagePlugin.py -../PIL/GdImageFile.py -../PIL/ImageDraw2.py -../PIL/PyAccess.py -../PIL/PcdImagePlugin.py -../PIL/Image.py -../PIL/ImageWin.py -../PIL/WebPImagePlugin.py -../PIL/IptcImagePlugin.py -../PIL/FliImagePlugin.py -../PIL/XbmImagePlugin.py -../PIL/ImageTransform.py -../PIL/PngImagePlugin.py -../PIL/OleFileIO-README.md -../PIL/__pycache__/ImtImagePlugin.cpython-34.pyc -../PIL/__pycache__/BdfFontFile.cpython-34.pyc -../PIL/__pycache__/_binary.cpython-34.pyc -../PIL/__pycache__/ExifTags.cpython-34.pyc -../PIL/__pycache__/ImageFileIO.cpython-34.pyc -../PIL/__pycache__/PdfImagePlugin.cpython-34.pyc -../PIL/__pycache__/GifImagePlugin.cpython-34.pyc -../PIL/__pycache__/TiffTags.cpython-34.pyc -../PIL/__pycache__/McIdasImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageMorph.cpython-34.pyc -../PIL/__pycache__/MspImagePlugin.cpython-34.pyc -../PIL/__pycache__/TgaImagePlugin.cpython-34.pyc -../PIL/__pycache__/PalmImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageChops.cpython-34.pyc -../PIL/__pycache__/ImagePath.cpython-34.pyc -../PIL/__pycache__/MicImagePlugin.cpython-34.pyc -../PIL/__pycache__/PSDraw.cpython-34.pyc -../PIL/__pycache__/ImageQt.cpython-34.pyc -../PIL/__pycache__/Jpeg2KImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageMath.cpython-34.pyc -../PIL/__pycache__/EpsImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageFont.cpython-34.pyc -../PIL/__pycache__/MpegImagePlugin.cpython-34.pyc -../PIL/__pycache__/ContainerIO.cpython-34.pyc -../PIL/__pycache__/IcnsImagePlugin.cpython-34.pyc -../PIL/__pycache__/SgiImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageDraw.cpython-34.pyc -../PIL/__pycache__/GimpGradientFile.cpython-34.pyc -../PIL/__pycache__/ImageOps.cpython-34.pyc -../PIL/__pycache__/ImageColor.cpython-34.pyc -../PIL/__pycache__/__init__.cpython-34.pyc -../PIL/__pycache__/GimpPaletteFile.cpython-34.pyc -../PIL/__pycache__/TarIO.cpython-34.pyc -../PIL/__pycache__/PpmImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageFilter.cpython-34.pyc -../PIL/__pycache__/FontFile.cpython-34.pyc -../PIL/__pycache__/ImageEnhance.cpython-34.pyc -../PIL/__pycache__/PaletteFile.cpython-34.pyc -../PIL/__pycache__/TiffImagePlugin.cpython-34.pyc -../PIL/__pycache__/FitsStubImagePlugin.cpython-34.pyc -../PIL/__pycache__/XpmImagePlugin.cpython-34.pyc -../PIL/__pycache__/WmfImagePlugin.cpython-34.pyc -../PIL/__pycache__/FpxImagePlugin.cpython-34.pyc -../PIL/__pycache__/Hdf5StubImagePlugin.cpython-34.pyc -../PIL/__pycache__/SpiderImagePlugin.cpython-34.pyc -../PIL/__pycache__/GbrImagePlugin.cpython-34.pyc -../PIL/__pycache__/JpegPresets.cpython-34.pyc -../PIL/__pycache__/PixarImagePlugin.cpython-34.pyc -../PIL/__pycache__/XVThumbImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageShow.cpython-34.pyc -../PIL/__pycache__/BmpImagePlugin.cpython-34.pyc -../PIL/__pycache__/SunImagePlugin.cpython-34.pyc -../PIL/__pycache__/BufrStubImagePlugin.cpython-34.pyc -../PIL/__pycache__/PcfFontFile.cpython-34.pyc -../PIL/__pycache__/OleFileIO.cpython-34.pyc -../PIL/__pycache__/ImageCms.cpython-34.pyc -../PIL/__pycache__/PsdImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImagePalette.cpython-34.pyc -../PIL/__pycache__/ImImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageStat.cpython-34.pyc -../PIL/__pycache__/ImageFile.cpython-34.pyc -../PIL/__pycache__/ImageTk.cpython-34.pyc -../PIL/__pycache__/IcoImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageGrab.cpython-34.pyc -../PIL/__pycache__/ImageMode.cpython-34.pyc -../PIL/__pycache__/_util.cpython-34.pyc -../PIL/__pycache__/GribStubImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageSequence.cpython-34.pyc -../PIL/__pycache__/DcxImagePlugin.cpython-34.pyc -../PIL/__pycache__/CurImagePlugin.cpython-34.pyc -../PIL/__pycache__/JpegImagePlugin.cpython-34.pyc -../PIL/__pycache__/WalImageFile.cpython-34.pyc -../PIL/__pycache__/PcxImagePlugin.cpython-34.pyc -../PIL/__pycache__/GdImageFile.cpython-34.pyc -../PIL/__pycache__/ImageDraw2.cpython-34.pyc -../PIL/__pycache__/PyAccess.cpython-34.pyc -../PIL/__pycache__/PcdImagePlugin.cpython-34.pyc -../PIL/__pycache__/Image.cpython-34.pyc -../PIL/__pycache__/ImageWin.cpython-34.pyc -../PIL/__pycache__/WebPImagePlugin.cpython-34.pyc -../PIL/__pycache__/IptcImagePlugin.cpython-34.pyc -../PIL/__pycache__/FliImagePlugin.cpython-34.pyc -../PIL/__pycache__/XbmImagePlugin.cpython-34.pyc -../PIL/__pycache__/ImageTransform.cpython-34.pyc -../PIL/__pycache__/PngImagePlugin.cpython-34.pyc -../PIL/_imaging.cpython-34m.so -../PIL/_imagingft.cpython-34m.so -../PIL/_imagingcms.cpython-34m.so -../PIL/_webp.cpython-34m.so -../PIL/_imagingmath.cpython-34m.so -../PIL/_imagingmorph.cpython-34m.so -./ -dependency_links.txt -PKG-INFO -SOURCES.txt -zip-safe -top_level.txt -../../../../bin/pilfile.py -../../../../bin/pilprint.py -../../../../bin/pilconvert.py -../../../../bin/pildriver.py -../../../../bin/pilfont.py diff --git a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/top_level.txt b/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/top_level.txt deleted file mode 100644 index b338169..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -PIL diff --git a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/zip-safe b/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/Pillow-2.5.3.egg-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/PKG-INFO b/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/PKG-INFO deleted file mode 100644 index c823c75..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/PKG-INFO +++ /dev/null @@ -1,54 +0,0 @@ -Metadata-Version: 1.1 -Name: simplejson -Version: 3.6.4 -Summary: Simple, fast, extensible JSON encoder/decoder for Python -Home-page: http://github.com/simplejson/simplejson -Author: Bob Ippolito -Author-email: bob@redivi.com -License: MIT License -Description: simplejson is a simple, fast, complete, correct and extensible - JSON encoder and decoder for Python 2.5+ - and Python 3.3+. It is pure Python code with no dependencies, - but includes an optional C extension for a serious speed boost. - - The latest documentation for simplejson can be read online here: - http://simplejson.readthedocs.org/ - - simplejson is the externally maintained development version of the - json library included with Python 2.6 and Python 3.0, but maintains - backwards compatibility with Python 2.5. - - The encoder can be specialized to provide serialization in any kind of - situation, without any special support by the objects to be serialized - (somewhat like pickle). This is best done with the ``default`` kwarg - to dumps. - - The decoder can handle incoming JSON strings of any specified encoding - (UTF-8 by default). It can also be specialized to post-process JSON - objects with the ``object_hook`` or ``object_pairs_hook`` kwargs. This - is particularly useful for implementing protocols such as JSON-RPC - that have a richer type system than JSON itself. - - For those of you that have legacy systems to maintain, there is a - very old fork of simplejson in the `python2.2`_ branch that supports - Python 2.2. This is based off of a very old version of simplejson, - is not maintained, and should only be used as a last resort. - - .. _python2.2: https://github.com/simplejson/simplejson/tree/python2.2 - -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: License :: OSI Approved :: Academic Free License (AFL) -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.5 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/SOURCES.txt b/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/SOURCES.txt deleted file mode 100644 index 76f095a..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/SOURCES.txt +++ /dev/null @@ -1,48 +0,0 @@ -CHANGES.txt -LICENSE.txt -MANIFEST.in -README.rst -conf.py -index.rst -setup.cfg -setup.py -scripts/make_docs.py -simplejson/__init__.py -simplejson/_speedups.c -simplejson/compat.py -simplejson/decoder.py -simplejson/encoder.py -simplejson/ordered_dict.py -simplejson/scanner.py -simplejson/tool.py -simplejson.egg-info/PKG-INFO -simplejson.egg-info/SOURCES.txt -simplejson.egg-info/dependency_links.txt -simplejson.egg-info/top_level.txt -simplejson/tests/__init__.py -simplejson/tests/test_bigint_as_string.py -simplejson/tests/test_bitsize_int_as_string.py -simplejson/tests/test_check_circular.py -simplejson/tests/test_decimal.py -simplejson/tests/test_decode.py -simplejson/tests/test_default.py -simplejson/tests/test_dump.py -simplejson/tests/test_encode_basestring_ascii.py -simplejson/tests/test_encode_for_html.py -simplejson/tests/test_errors.py -simplejson/tests/test_fail.py -simplejson/tests/test_float.py -simplejson/tests/test_for_json.py -simplejson/tests/test_indent.py -simplejson/tests/test_item_sort_key.py -simplejson/tests/test_namedtuple.py -simplejson/tests/test_pass1.py -simplejson/tests/test_pass2.py -simplejson/tests/test_pass3.py -simplejson/tests/test_recursion.py -simplejson/tests/test_scanstring.py -simplejson/tests/test_separators.py -simplejson/tests/test_speedups.py -simplejson/tests/test_tool.py -simplejson/tests/test_tuple.py -simplejson/tests/test_unicode.py \ No newline at end of file diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/dependency_links.txt b/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/installed-files.txt b/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/installed-files.txt deleted file mode 100644 index 7348207..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/installed-files.txt +++ /dev/null @@ -1,74 +0,0 @@ -../simplejson/scanner.py -../simplejson/compat.py -../simplejson/__init__.py -../simplejson/encoder.py -../simplejson/decoder.py -../simplejson/tool.py -../simplejson/ordered_dict.py -../simplejson/tests/test_namedtuple.py -../simplejson/tests/test_recursion.py -../simplejson/tests/test_encode_for_html.py -../simplejson/tests/test_for_json.py -../simplejson/tests/test_bigint_as_string.py -../simplejson/tests/test_item_sort_key.py -../simplejson/tests/__init__.py -../simplejson/tests/test_scanstring.py -../simplejson/tests/test_speedups.py -../simplejson/tests/test_pass3.py -../simplejson/tests/test_tool.py -../simplejson/tests/test_tuple.py -../simplejson/tests/test_errors.py -../simplejson/tests/test_unicode.py -../simplejson/tests/test_fail.py -../simplejson/tests/test_separators.py -../simplejson/tests/test_encode_basestring_ascii.py -../simplejson/tests/test_check_circular.py -../simplejson/tests/test_decimal.py -../simplejson/tests/test_pass2.py -../simplejson/tests/test_decode.py -../simplejson/tests/test_indent.py -../simplejson/tests/test_bitsize_int_as_string.py -../simplejson/tests/test_pass1.py -../simplejson/tests/test_dump.py -../simplejson/tests/test_float.py -../simplejson/tests/test_default.py -../simplejson/__pycache__/scanner.cpython-34.pyc -../simplejson/__pycache__/compat.cpython-34.pyc -../simplejson/__pycache__/__init__.cpython-34.pyc -../simplejson/__pycache__/encoder.cpython-34.pyc -../simplejson/__pycache__/decoder.cpython-34.pyc -../simplejson/__pycache__/tool.cpython-34.pyc -../simplejson/__pycache__/ordered_dict.cpython-34.pyc -../simplejson/tests/__pycache__/test_namedtuple.cpython-34.pyc -../simplejson/tests/__pycache__/test_recursion.cpython-34.pyc -../simplejson/tests/__pycache__/test_encode_for_html.cpython-34.pyc -../simplejson/tests/__pycache__/test_for_json.cpython-34.pyc -../simplejson/tests/__pycache__/test_bigint_as_string.cpython-34.pyc -../simplejson/tests/__pycache__/test_item_sort_key.cpython-34.pyc -../simplejson/tests/__pycache__/__init__.cpython-34.pyc -../simplejson/tests/__pycache__/test_scanstring.cpython-34.pyc -../simplejson/tests/__pycache__/test_speedups.cpython-34.pyc -../simplejson/tests/__pycache__/test_pass3.cpython-34.pyc -../simplejson/tests/__pycache__/test_tool.cpython-34.pyc -../simplejson/tests/__pycache__/test_tuple.cpython-34.pyc -../simplejson/tests/__pycache__/test_errors.cpython-34.pyc -../simplejson/tests/__pycache__/test_unicode.cpython-34.pyc -../simplejson/tests/__pycache__/test_fail.cpython-34.pyc -../simplejson/tests/__pycache__/test_separators.cpython-34.pyc -../simplejson/tests/__pycache__/test_encode_basestring_ascii.cpython-34.pyc -../simplejson/tests/__pycache__/test_check_circular.cpython-34.pyc -../simplejson/tests/__pycache__/test_decimal.cpython-34.pyc -../simplejson/tests/__pycache__/test_pass2.cpython-34.pyc -../simplejson/tests/__pycache__/test_decode.cpython-34.pyc -../simplejson/tests/__pycache__/test_indent.cpython-34.pyc -../simplejson/tests/__pycache__/test_bitsize_int_as_string.cpython-34.pyc -../simplejson/tests/__pycache__/test_pass1.cpython-34.pyc -../simplejson/tests/__pycache__/test_dump.cpython-34.pyc -../simplejson/tests/__pycache__/test_float.cpython-34.pyc -../simplejson/tests/__pycache__/test_default.cpython-34.pyc -../simplejson/_speedups.cpython-34m.so -./ -dependency_links.txt -PKG-INFO -SOURCES.txt -top_level.txt diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/top_level.txt b/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/top_level.txt deleted file mode 100644 index 322630e..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson-3.6.4.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -simplejson diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/__init__.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/__init__.py deleted file mode 100644 index cbb5b34..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/__init__.py +++ /dev/null @@ -1,564 +0,0 @@ -r"""JSON (JavaScript Object Notation) is a subset of -JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data -interchange format. - -:mod:`simplejson` exposes an API familiar to users of the standard library -:mod:`marshal` and :mod:`pickle` modules. It is the externally maintained -version of the :mod:`json` library contained in Python 2.6, but maintains -compatibility with Python 2.4 and Python 2.5 and (currently) has -significant performance advantages, even without using the optional C -extension for speedups. - -Encoding basic Python object hierarchies:: - - >>> import simplejson as json - >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) - '["foo", {"bar": ["baz", null, 1.0, 2]}]' - >>> print(json.dumps("\"foo\bar")) - "\"foo\bar" - >>> print(json.dumps(u'\u1234')) - "\u1234" - >>> print(json.dumps('\\')) - "\\" - >>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)) - {"a": 0, "b": 0, "c": 0} - >>> from simplejson.compat import StringIO - >>> io = StringIO() - >>> json.dump(['streaming API'], io) - >>> io.getvalue() - '["streaming API"]' - -Compact encoding:: - - >>> import simplejson as json - >>> obj = [1,2,3,{'4': 5, '6': 7}] - >>> json.dumps(obj, separators=(',',':'), sort_keys=True) - '[1,2,3,{"4":5,"6":7}]' - -Pretty printing:: - - >>> import simplejson as json - >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=' ')) - { - "4": 5, - "6": 7 - } - -Decoding JSON:: - - >>> import simplejson as json - >>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}] - >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj - True - >>> json.loads('"\\"foo\\bar"') == u'"foo\x08ar' - True - >>> from simplejson.compat import StringIO - >>> io = StringIO('["streaming API"]') - >>> json.load(io)[0] == 'streaming API' - True - -Specializing JSON object decoding:: - - >>> import simplejson as json - >>> def as_complex(dct): - ... if '__complex__' in dct: - ... return complex(dct['real'], dct['imag']) - ... return dct - ... - >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}', - ... object_hook=as_complex) - (1+2j) - >>> from decimal import Decimal - >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1') - True - -Specializing JSON object encoding:: - - >>> import simplejson as json - >>> def encode_complex(obj): - ... if isinstance(obj, complex): - ... return [obj.real, obj.imag] - ... raise TypeError(repr(o) + " is not JSON serializable") - ... - >>> json.dumps(2 + 1j, default=encode_complex) - '[2.0, 1.0]' - >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j) - '[2.0, 1.0]' - >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j)) - '[2.0, 1.0]' - - -Using simplejson.tool from the shell to validate and pretty-print:: - - $ echo '{"json":"obj"}' | python -m simplejson.tool - { - "json": "obj" - } - $ echo '{ 1.2:3.4}' | python -m simplejson.tool - Expecting property name: line 1 column 3 (char 2) -""" -from __future__ import absolute_import -__version__ = '3.6.4' -__all__ = [ - 'dump', 'dumps', 'load', 'loads', - 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder', - 'OrderedDict', 'simple_first', -] - -__author__ = 'Bob Ippolito ' - -from decimal import Decimal - -from .scanner import JSONDecodeError -from .decoder import JSONDecoder -from .encoder import JSONEncoder, JSONEncoderForHTML -def _import_OrderedDict(): - import collections - try: - return collections.OrderedDict - except AttributeError: - from . import ordered_dict - return ordered_dict.OrderedDict -OrderedDict = _import_OrderedDict() - -def _import_c_make_encoder(): - try: - from ._speedups import make_encoder - return make_encoder - except ImportError: - return None - -_default_encoder = JSONEncoder( - skipkeys=False, - ensure_ascii=True, - check_circular=True, - allow_nan=True, - indent=None, - separators=None, - encoding='utf-8', - default=None, - use_decimal=True, - namedtuple_as_object=True, - tuple_as_array=True, - bigint_as_string=False, - item_sort_key=None, - for_json=False, - ignore_nan=False, - int_as_string_bitcount=None, -) - -def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, - allow_nan=True, cls=None, indent=None, separators=None, - encoding='utf-8', default=None, use_decimal=True, - namedtuple_as_object=True, tuple_as_array=True, - bigint_as_string=False, sort_keys=False, item_sort_key=None, - for_json=False, ignore_nan=False, int_as_string_bitcount=None, **kw): - """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a - ``.write()``-supporting file-like object). - - If *skipkeys* is true then ``dict`` keys that are not basic types - (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) - will be skipped instead of raising a ``TypeError``. - - If *ensure_ascii* is false, then the some chunks written to ``fp`` - may be ``unicode`` instances, subject to normal Python ``str`` to - ``unicode`` coercion rules. Unless ``fp.write()`` explicitly - understands ``unicode`` (as in ``codecs.getwriter()``) this is likely - to cause an error. - - If *check_circular* is false, then the circular reference check - for container types will be skipped and a circular reference will - result in an ``OverflowError`` (or worse). - - If *allow_nan* is false, then it will be a ``ValueError`` to - serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) - in strict compliance of the original JSON specification, instead of using - the JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). See - *ignore_nan* for ECMA-262 compliant behavior. - - If *indent* is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, *separators* should be an - ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')`` - if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most - compact JSON representation, you should specify ``(',', ':')`` to eliminate - whitespace. - - *encoding* is the character encoding for str instances, default is UTF-8. - - *default(obj)* is a function that should return a serializable version - of obj or raise ``TypeError``. The default simply raises ``TypeError``. - - If *use_decimal* is true (default: ``True``) then decimal.Decimal - will be natively serialized to JSON with full precision. - - If *namedtuple_as_object* is true (default: ``True``), - :class:`tuple` subclasses with ``_asdict()`` methods will be encoded - as JSON objects. - - If *tuple_as_array* is true (default: ``True``), - :class:`tuple` (and subclasses) will be encoded as JSON arrays. - - If *bigint_as_string* is true (default: ``False``), ints 2**53 and higher - or lower than -2**53 will be encoded as strings. This is to avoid the - rounding that happens in Javascript otherwise. Note that this is still a - lossy operation that will not round-trip correctly and should be used - sparingly. - - If *int_as_string_bitcount* is a positive number (n), then int of size - greater than or equal to 2**n or lower than or equal to -2**n will be - encoded as strings. - - If specified, *item_sort_key* is a callable used to sort the items in - each dictionary. This is useful if you want to sort items other than - in alphabetical order by key. This option takes precedence over - *sort_keys*. - - If *sort_keys* is true (default: ``False``), the output of dictionaries - will be sorted by item. - - If *for_json* is true (default: ``False``), objects with a ``for_json()`` - method will use the return value of that method for encoding as JSON - instead of the object. - - If *ignore_nan* is true (default: ``False``), then out of range - :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as - ``null`` in compliance with the ECMA-262 specification. If true, this will - override *allow_nan*. - - To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the - ``.default()`` method to serialize additional types), specify it with - the ``cls`` kwarg. NOTE: You should use *default* or *for_json* instead - of subclassing whenever possible. - - """ - # cached encoder - if (not skipkeys and ensure_ascii and - check_circular and allow_nan and - cls is None and indent is None and separators is None and - encoding == 'utf-8' and default is None and use_decimal - and namedtuple_as_object and tuple_as_array - and not bigint_as_string and not sort_keys - and not item_sort_key and not for_json - and not ignore_nan and int_as_string_bitcount is None - and not kw - ): - iterable = _default_encoder.iterencode(obj) - else: - if cls is None: - cls = JSONEncoder - iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, - check_circular=check_circular, allow_nan=allow_nan, indent=indent, - separators=separators, encoding=encoding, - default=default, use_decimal=use_decimal, - namedtuple_as_object=namedtuple_as_object, - tuple_as_array=tuple_as_array, - bigint_as_string=bigint_as_string, - sort_keys=sort_keys, - item_sort_key=item_sort_key, - for_json=for_json, - ignore_nan=ignore_nan, - int_as_string_bitcount=int_as_string_bitcount, - **kw).iterencode(obj) - # could accelerate with writelines in some versions of Python, at - # a debuggability cost - for chunk in iterable: - fp.write(chunk) - - -def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, - allow_nan=True, cls=None, indent=None, separators=None, - encoding='utf-8', default=None, use_decimal=True, - namedtuple_as_object=True, tuple_as_array=True, - bigint_as_string=False, sort_keys=False, item_sort_key=None, - for_json=False, ignore_nan=False, int_as_string_bitcount=None, **kw): - """Serialize ``obj`` to a JSON formatted ``str``. - - If ``skipkeys`` is false then ``dict`` keys that are not basic types - (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) - will be skipped instead of raising a ``TypeError``. - - If ``ensure_ascii`` is false, then the return value will be a - ``unicode`` instance subject to normal Python ``str`` to ``unicode`` - coercion rules instead of being escaped to an ASCII ``str``. - - If ``check_circular`` is false, then the circular reference check - for container types will be skipped and a circular reference will - result in an ``OverflowError`` (or worse). - - If ``allow_nan`` is false, then it will be a ``ValueError`` to - serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in - strict compliance of the JSON specification, instead of using the - JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). - - If ``indent`` is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, ``separators`` should be an - ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')`` - if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most - compact JSON representation, you should specify ``(',', ':')`` to eliminate - whitespace. - - ``encoding`` is the character encoding for str instances, default is UTF-8. - - ``default(obj)`` is a function that should return a serializable version - of obj or raise TypeError. The default simply raises TypeError. - - If *use_decimal* is true (default: ``True``) then decimal.Decimal - will be natively serialized to JSON with full precision. - - If *namedtuple_as_object* is true (default: ``True``), - :class:`tuple` subclasses with ``_asdict()`` methods will be encoded - as JSON objects. - - If *tuple_as_array* is true (default: ``True``), - :class:`tuple` (and subclasses) will be encoded as JSON arrays. - - If *bigint_as_string* is true (not the default), ints 2**53 and higher - or lower than -2**53 will be encoded as strings. This is to avoid the - rounding that happens in Javascript otherwise. - - If *int_as_string_bitcount* is a positive number (n), then int of size - greater than or equal to 2**n or lower than or equal to -2**n will be - encoded as strings. - - If specified, *item_sort_key* is a callable used to sort the items in - each dictionary. This is useful if you want to sort items other than - in alphabetical order by key. This option takes precendence over - *sort_keys*. - - If *sort_keys* is true (default: ``False``), the output of dictionaries - will be sorted by item. - - If *for_json* is true (default: ``False``), objects with a ``for_json()`` - method will use the return value of that method for encoding as JSON - instead of the object. - - If *ignore_nan* is true (default: ``False``), then out of range - :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as - ``null`` in compliance with the ECMA-262 specification. If true, this will - override *allow_nan*. - - To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the - ``.default()`` method to serialize additional types), specify it with - the ``cls`` kwarg. NOTE: You should use *default* instead of subclassing - whenever possible. - - """ - # cached encoder - if ( - not skipkeys and ensure_ascii and - check_circular and allow_nan and - cls is None and indent is None and separators is None and - encoding == 'utf-8' and default is None and use_decimal - and namedtuple_as_object and tuple_as_array - and not bigint_as_string and not sort_keys - and not item_sort_key and not for_json - and not ignore_nan and int_as_string_bitcount is None - and not kw - ): - return _default_encoder.encode(obj) - if cls is None: - cls = JSONEncoder - return cls( - skipkeys=skipkeys, ensure_ascii=ensure_ascii, - check_circular=check_circular, allow_nan=allow_nan, indent=indent, - separators=separators, encoding=encoding, default=default, - use_decimal=use_decimal, - namedtuple_as_object=namedtuple_as_object, - tuple_as_array=tuple_as_array, - bigint_as_string=bigint_as_string, - sort_keys=sort_keys, - item_sort_key=item_sort_key, - for_json=for_json, - ignore_nan=ignore_nan, - int_as_string_bitcount=int_as_string_bitcount, - **kw).encode(obj) - - -_default_decoder = JSONDecoder(encoding=None, object_hook=None, - object_pairs_hook=None) - - -def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, object_pairs_hook=None, - use_decimal=False, namedtuple_as_object=True, tuple_as_array=True, - **kw): - """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing - a JSON document) to a Python object. - - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - If *use_decimal* is true (default: ``False``) then it implies - parse_float=decimal.Decimal for parity with ``dump``. - - To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` - kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead - of subclassing whenever possible. - - """ - return loads(fp.read(), - encoding=encoding, cls=cls, object_hook=object_hook, - parse_float=parse_float, parse_int=parse_int, - parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, - use_decimal=use_decimal, **kw) - - -def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, object_pairs_hook=None, - use_decimal=False, **kw): - """Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON - document) to a Python object. - - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - If *use_decimal* is true (default: ``False``) then it implies - parse_float=decimal.Decimal for parity with ``dump``. - - To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` - kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead - of subclassing whenever possible. - - """ - if (cls is None and encoding is None and object_hook is None and - parse_int is None and parse_float is None and - parse_constant is None and object_pairs_hook is None - and not use_decimal and not kw): - return _default_decoder.decode(s) - if cls is None: - cls = JSONDecoder - if object_hook is not None: - kw['object_hook'] = object_hook - if object_pairs_hook is not None: - kw['object_pairs_hook'] = object_pairs_hook - if parse_float is not None: - kw['parse_float'] = parse_float - if parse_int is not None: - kw['parse_int'] = parse_int - if parse_constant is not None: - kw['parse_constant'] = parse_constant - if use_decimal: - if parse_float is not None: - raise TypeError("use_decimal=True implies parse_float=Decimal") - kw['parse_float'] = Decimal - return cls(encoding=encoding, **kw).decode(s) - - -def _toggle_speedups(enabled): - from . import decoder as dec - from . import encoder as enc - from . import scanner as scan - c_make_encoder = _import_c_make_encoder() - if enabled: - dec.scanstring = dec.c_scanstring or dec.py_scanstring - enc.c_make_encoder = c_make_encoder - enc.encode_basestring_ascii = (enc.c_encode_basestring_ascii or - enc.py_encode_basestring_ascii) - scan.make_scanner = scan.c_make_scanner or scan.py_make_scanner - else: - dec.scanstring = dec.py_scanstring - enc.c_make_encoder = None - enc.encode_basestring_ascii = enc.py_encode_basestring_ascii - scan.make_scanner = scan.py_make_scanner - dec.make_scanner = scan.make_scanner - global _default_decoder - _default_decoder = JSONDecoder( - encoding=None, - object_hook=None, - object_pairs_hook=None, - ) - global _default_encoder - _default_encoder = JSONEncoder( - skipkeys=False, - ensure_ascii=True, - check_circular=True, - allow_nan=True, - indent=None, - separators=None, - encoding='utf-8', - default=None, - ) - -def simple_first(kv): - """Helper function to pass to item_sort_key to sort simple - elements to the top, then container elements. - """ - return (isinstance(kv[1], (list, dict, tuple)), kv[0]) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/_speedups.cpython-34m.so b/Linux_x86_64/lib/python3.4/site-packages/simplejson/_speedups.cpython-34m.so deleted file mode 100755 index 6805b2334b69307882d9467ccbabe928d7d10593..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160008 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ð%-ZCMdiY<&8?4u_L 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 xX<({Z?#vL+)J(j= (3, 4): - from importlib import reload as reload_module - else: - from imp import reload as reload_module - import codecs - def b(s): - return codecs.latin_1_encode(s)[0] - def u(s): - return s - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - text_type = str - binary_type = bytes - string_types = (str,) - integer_types = (int,) - - def unichr(s): - return u(chr(s)) - - def fromhex(s): - return bytes.fromhex(s) - -long_type = integer_types[-1] diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/decoder.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/decoder.py deleted file mode 100644 index 545e658..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/decoder.py +++ /dev/null @@ -1,400 +0,0 @@ -"""Implementation of JSONDecoder -""" -from __future__ import absolute_import -import re -import sys -import struct -from .compat import fromhex, b, u, text_type, binary_type, PY3, unichr -from .scanner import make_scanner, JSONDecodeError - -def _import_c_scanstring(): - try: - from ._speedups import scanstring - return scanstring - except ImportError: - return None -c_scanstring = _import_c_scanstring() - -# NOTE (3.1.0): JSONDecodeError may still be imported from this module for -# compatibility, but it was never in the __all__ -__all__ = ['JSONDecoder'] - -FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL - -def _floatconstants(): - _BYTES = fromhex('7FF80000000000007FF0000000000000') - # The struct module in Python 2.4 would get frexp() out of range here - # when an endian is specified in the format string. Fixed in Python 2.5+ - if sys.byteorder != 'big': - _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1] - nan, inf = struct.unpack('dd', _BYTES) - return nan, inf, -inf - -NaN, PosInf, NegInf = _floatconstants() - -_CONSTANTS = { - '-Infinity': NegInf, - 'Infinity': PosInf, - 'NaN': NaN, -} - -STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS) -BACKSLASH = { - '"': u('"'), '\\': u('\u005c'), '/': u('/'), - 'b': u('\b'), 'f': u('\f'), 'n': u('\n'), 'r': u('\r'), 't': u('\t'), -} - -DEFAULT_ENCODING = "utf-8" - -def py_scanstring(s, end, encoding=None, strict=True, - _b=BACKSLASH, _m=STRINGCHUNK.match, _join=u('').join, - _PY3=PY3, _maxunicode=sys.maxunicode): - """Scan the string s for a JSON string. End is the index of the - character in s after the quote that started the JSON string. - Unescapes all valid JSON string escape sequences and raises ValueError - on attempt to decode an invalid string. If strict is False then literal - control characters are allowed in the string. - - Returns a tuple of the decoded string and the index of the character in s - after the end quote.""" - if encoding is None: - encoding = DEFAULT_ENCODING - chunks = [] - _append = chunks.append - begin = end - 1 - while 1: - chunk = _m(s, end) - if chunk is None: - raise JSONDecodeError( - "Unterminated string starting at", s, begin) - end = chunk.end() - content, terminator = chunk.groups() - # Content is contains zero or more unescaped string characters - if content: - if not _PY3 and not isinstance(content, text_type): - content = text_type(content, encoding) - _append(content) - # Terminator is the end of string, a literal control character, - # or a backslash denoting that an escape sequence follows - if terminator == '"': - break - elif terminator != '\\': - if strict: - msg = "Invalid control character %r at" - raise JSONDecodeError(msg, s, end) - else: - _append(terminator) - continue - try: - esc = s[end] - except IndexError: - raise JSONDecodeError( - "Unterminated string starting at", s, begin) - # If not a unicode escape sequence, must be in the lookup table - if esc != 'u': - try: - char = _b[esc] - except KeyError: - msg = "Invalid \\X escape sequence %r" - raise JSONDecodeError(msg, s, end) - end += 1 - else: - # Unicode escape sequence - msg = "Invalid \\uXXXX escape sequence" - esc = s[end + 1:end + 5] - escX = esc[1:2] - if len(esc) != 4 or escX == 'x' or escX == 'X': - raise JSONDecodeError(msg, s, end - 1) - try: - uni = int(esc, 16) - except ValueError: - raise JSONDecodeError(msg, s, end - 1) - end += 5 - # Check for surrogate pair on UCS-4 systems - # Note that this will join high/low surrogate pairs - # but will also pass unpaired surrogates through - if (_maxunicode > 65535 and - uni & 0xfc00 == 0xd800 and - s[end:end + 2] == '\\u'): - esc2 = s[end + 2:end + 6] - escX = esc2[1:2] - if len(esc2) == 4 and not (escX == 'x' or escX == 'X'): - try: - uni2 = int(esc2, 16) - except ValueError: - raise JSONDecodeError(msg, s, end) - if uni2 & 0xfc00 == 0xdc00: - uni = 0x10000 + (((uni - 0xd800) << 10) | - (uni2 - 0xdc00)) - end += 6 - char = unichr(uni) - # Append the unescaped character - _append(char) - return _join(chunks), end - - -# Use speedup if available -scanstring = c_scanstring or py_scanstring - -WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS) -WHITESPACE_STR = ' \t\n\r' - -def JSONObject(state, encoding, strict, scan_once, object_hook, - object_pairs_hook, memo=None, - _w=WHITESPACE.match, _ws=WHITESPACE_STR): - (s, end) = state - # Backwards compatibility - if memo is None: - memo = {} - memo_get = memo.setdefault - pairs = [] - # Use a slice to prevent IndexError from being raised, the following - # check will raise a more specific ValueError if the string is empty - nextchar = s[end:end + 1] - # Normally we expect nextchar == '"' - if nextchar != '"': - if nextchar in _ws: - end = _w(s, end).end() - nextchar = s[end:end + 1] - # Trivial empty object - if nextchar == '}': - if object_pairs_hook is not None: - result = object_pairs_hook(pairs) - return result, end + 1 - pairs = {} - if object_hook is not None: - pairs = object_hook(pairs) - return pairs, end + 1 - elif nextchar != '"': - raise JSONDecodeError( - "Expecting property name enclosed in double quotes", - s, end) - end += 1 - while True: - key, end = scanstring(s, end, encoding, strict) - key = memo_get(key, key) - - # To skip some function call overhead we optimize the fast paths where - # the JSON key separator is ": " or just ":". - if s[end:end + 1] != ':': - end = _w(s, end).end() - if s[end:end + 1] != ':': - raise JSONDecodeError("Expecting ':' delimiter", s, end) - - end += 1 - - try: - if s[end] in _ws: - end += 1 - if s[end] in _ws: - end = _w(s, end + 1).end() - except IndexError: - pass - - value, end = scan_once(s, end) - pairs.append((key, value)) - - try: - nextchar = s[end] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end] - except IndexError: - nextchar = '' - end += 1 - - if nextchar == '}': - break - elif nextchar != ',': - raise JSONDecodeError("Expecting ',' delimiter or '}'", s, end - 1) - - try: - nextchar = s[end] - if nextchar in _ws: - end += 1 - nextchar = s[end] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end] - except IndexError: - nextchar = '' - - end += 1 - if nextchar != '"': - raise JSONDecodeError( - "Expecting property name enclosed in double quotes", - s, end - 1) - - if object_pairs_hook is not None: - result = object_pairs_hook(pairs) - return result, end - pairs = dict(pairs) - if object_hook is not None: - pairs = object_hook(pairs) - return pairs, end - -def JSONArray(state, scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR): - (s, end) = state - values = [] - nextchar = s[end:end + 1] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end:end + 1] - # Look-ahead for trivial empty array - if nextchar == ']': - return values, end + 1 - elif nextchar == '': - raise JSONDecodeError("Expecting value or ']'", s, end) - _append = values.append - while True: - value, end = scan_once(s, end) - _append(value) - nextchar = s[end:end + 1] - if nextchar in _ws: - end = _w(s, end + 1).end() - nextchar = s[end:end + 1] - end += 1 - if nextchar == ']': - break - elif nextchar != ',': - raise JSONDecodeError("Expecting ',' delimiter or ']'", s, end - 1) - - try: - if s[end] in _ws: - end += 1 - if s[end] in _ws: - end = _w(s, end + 1).end() - except IndexError: - pass - - return values, end - -class JSONDecoder(object): - """Simple JSON decoder - - Performs the following translations in decoding by default: - - +---------------+-------------------+ - | JSON | Python | - +===============+===================+ - | object | dict | - +---------------+-------------------+ - | array | list | - +---------------+-------------------+ - | string | str, unicode | - +---------------+-------------------+ - | number (int) | int, long | - +---------------+-------------------+ - | number (real) | float | - +---------------+-------------------+ - | true | True | - +---------------+-------------------+ - | false | False | - +---------------+-------------------+ - | null | None | - +---------------+-------------------+ - - It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as - their corresponding ``float`` values, which is outside the JSON spec. - - """ - - def __init__(self, encoding=None, object_hook=None, parse_float=None, - parse_int=None, parse_constant=None, strict=True, - object_pairs_hook=None): - """ - *encoding* determines the encoding used to interpret any - :class:`str` objects decoded by this instance (``'utf-8'`` by - default). It has no effect when decoding :class:`unicode` objects. - - Note that currently only encodings that are a superset of ASCII work, - strings of other encodings should be passed in as :class:`unicode`. - - *object_hook*, if specified, will be called with the result of every - JSON object decoded and its return value will be used in place of the - given :class:`dict`. This can be used to provide custom - deserializations (e.g. to support JSON-RPC class hinting). - - *object_pairs_hook* is an optional function that will be called with - the result of any object literal decode with an ordered list of pairs. - The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders - that rely on the order that the key and value pairs are decoded (for - example, :func:`collections.OrderedDict` will remember the order of - insertion). If *object_hook* is also defined, the *object_pairs_hook* - takes priority. - - *parse_float*, if specified, will be called with the string of every - JSON float to be decoded. By default, this is equivalent to - ``float(num_str)``. This can be used to use another datatype or parser - for JSON floats (e.g. :class:`decimal.Decimal`). - - *parse_int*, if specified, will be called with the string of every - JSON int to be decoded. By default, this is equivalent to - ``int(num_str)``. This can be used to use another datatype or parser - for JSON integers (e.g. :class:`float`). - - *parse_constant*, if specified, will be called with one of the - following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This - can be used to raise an exception if invalid JSON numbers are - encountered. - - *strict* controls the parser's behavior when it encounters an - invalid control character in a string. The default setting of - ``True`` means that unescaped control characters are parse errors, if - ``False`` then control characters will be allowed in strings. - - """ - if encoding is None: - encoding = DEFAULT_ENCODING - self.encoding = encoding - self.object_hook = object_hook - self.object_pairs_hook = object_pairs_hook - self.parse_float = parse_float or float - self.parse_int = parse_int or int - self.parse_constant = parse_constant or _CONSTANTS.__getitem__ - self.strict = strict - self.parse_object = JSONObject - self.parse_array = JSONArray - self.parse_string = scanstring - self.memo = {} - self.scan_once = make_scanner(self) - - def decode(self, s, _w=WHITESPACE.match, _PY3=PY3): - """Return the Python representation of ``s`` (a ``str`` or ``unicode`` - instance containing a JSON document) - - """ - if _PY3 and isinstance(s, binary_type): - s = s.decode(self.encoding) - obj, end = self.raw_decode(s) - end = _w(s, end).end() - if end != len(s): - raise JSONDecodeError("Extra data", s, end, len(s)) - return obj - - def raw_decode(self, s, idx=0, _w=WHITESPACE.match, _PY3=PY3): - """Decode a JSON document from ``s`` (a ``str`` or ``unicode`` - beginning with a JSON document) and return a 2-tuple of the Python - representation and the index in ``s`` where the document ended. - Optionally, ``idx`` can be used to specify an offset in ``s`` where - the JSON document begins. - - This can be used to decode a JSON document from a string that may - have extraneous data at the end. - - """ - if idx < 0: - # Ensure that raw_decode bails on negative indexes, the regex - # would otherwise mask this behavior. #98 - raise JSONDecodeError('Expecting value', s, idx) - if _PY3 and not isinstance(s, text_type): - raise TypeError("Input string must be text, not bytes") - # strip UTF-8 bom - if len(s) > idx: - ord0 = ord(s[idx]) - if ord0 == 0xfeff: - idx += 1 - elif ord0 == 0xef and s[idx:idx + 3] == '\xef\xbb\xbf': - idx += 3 - return self.scan_once(s, idx=_w(s, idx).end()) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/encoder.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/encoder.py deleted file mode 100644 index db18244..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/encoder.py +++ /dev/null @@ -1,648 +0,0 @@ -"""Implementation of JSONEncoder -""" -from __future__ import absolute_import -import re -from operator import itemgetter -from decimal import Decimal -from .compat import u, unichr, binary_type, string_types, integer_types, PY3 -def _import_speedups(): - try: - from . import _speedups - return _speedups.encode_basestring_ascii, _speedups.make_encoder - except ImportError: - return None, None -c_encode_basestring_ascii, c_make_encoder = _import_speedups() - -from simplejson.decoder import PosInf - -#ESCAPE = re.compile(ur'[\x00-\x1f\\"\b\f\n\r\t\u2028\u2029]') -# This is required because u() will mangle the string and ur'' isn't valid -# python3 syntax -ESCAPE = re.compile(u'[\\x00-\\x1f\\\\"\\b\\f\\n\\r\\t\u2028\u2029]') -ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') -HAS_UTF8 = re.compile(r'[\x80-\xff]') -ESCAPE_DCT = { - '\\': '\\\\', - '"': '\\"', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', -} -for i in range(0x20): - #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) - ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,)) -for i in [0x2028, 0x2029]: - ESCAPE_DCT.setdefault(unichr(i), '\\u%04x' % (i,)) - -FLOAT_REPR = repr - -def encode_basestring(s, _PY3=PY3, _q=u('"')): - """Return a JSON representation of a Python string - - """ - if _PY3: - if isinstance(s, binary_type): - s = s.decode('utf-8') - else: - if isinstance(s, str) and HAS_UTF8.search(s) is not None: - s = s.decode('utf-8') - def replace(match): - return ESCAPE_DCT[match.group(0)] - return _q + ESCAPE.sub(replace, s) + _q - - -def py_encode_basestring_ascii(s, _PY3=PY3): - """Return an ASCII-only JSON representation of a Python string - - """ - if _PY3: - if isinstance(s, binary_type): - s = s.decode('utf-8') - else: - if isinstance(s, str) and HAS_UTF8.search(s) is not None: - s = s.decode('utf-8') - def replace(match): - s = match.group(0) - try: - return ESCAPE_DCT[s] - except KeyError: - n = ord(s) - if n < 0x10000: - #return '\\u{0:04x}'.format(n) - return '\\u%04x' % (n,) - else: - # surrogate pair - n -= 0x10000 - s1 = 0xd800 | ((n >> 10) & 0x3ff) - s2 = 0xdc00 | (n & 0x3ff) - #return '\\u{0:04x}\\u{1:04x}'.format(s1, s2) - return '\\u%04x\\u%04x' % (s1, s2) - return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"' - - -encode_basestring_ascii = ( - c_encode_basestring_ascii or py_encode_basestring_ascii) - -class JSONEncoder(object): - """Extensible JSON encoder for Python data structures. - - Supports the following objects and types by default: - - +-------------------+---------------+ - | Python | JSON | - +===================+===============+ - | dict, namedtuple | object | - +-------------------+---------------+ - | list, tuple | array | - +-------------------+---------------+ - | str, unicode | string | - +-------------------+---------------+ - | int, long, float | number | - +-------------------+---------------+ - | True | true | - +-------------------+---------------+ - | False | false | - +-------------------+---------------+ - | None | null | - +-------------------+---------------+ - - To extend this to recognize other objects, subclass and implement a - ``.default()`` method with another method that returns a serializable - object for ``o`` if possible, otherwise it should call the superclass - implementation (to raise ``TypeError``). - - """ - item_separator = ', ' - key_separator = ': ' - - def __init__(self, skipkeys=False, ensure_ascii=True, - check_circular=True, allow_nan=True, sort_keys=False, - indent=None, separators=None, encoding='utf-8', default=None, - use_decimal=True, namedtuple_as_object=True, - tuple_as_array=True, bigint_as_string=False, - item_sort_key=None, for_json=False, ignore_nan=False, - int_as_string_bitcount=None): - """Constructor for JSONEncoder, with sensible defaults. - - If skipkeys is false, then it is a TypeError to attempt - encoding of keys that are not str, int, long, float or None. If - skipkeys is True, such items are simply skipped. - - If ensure_ascii is true, the output is guaranteed to be str - objects with all incoming unicode characters escaped. If - ensure_ascii is false, the output will be unicode object. - - If check_circular is true, then lists, dicts, and custom encoded - objects will be checked for circular references during encoding to - prevent an infinite recursion (which would cause an OverflowError). - Otherwise, no such check takes place. - - If allow_nan is true, then NaN, Infinity, and -Infinity will be - encoded as such. This behavior is not JSON specification compliant, - but is consistent with most JavaScript based encoders and decoders. - Otherwise, it will be a ValueError to encode such floats. - - If sort_keys is true, then the output of dictionaries will be - sorted by key; this is useful for regression tests to ensure - that JSON serializations can be compared on a day-to-day basis. - - If indent is a string, then JSON array elements and object members - will be pretty-printed with a newline followed by that string repeated - for each level of nesting. ``None`` (the default) selects the most compact - representation without any newlines. For backwards compatibility with - versions of simplejson earlier than 2.1.0, an integer is also accepted - and is converted to a string with that many spaces. - - If specified, separators should be an (item_separator, key_separator) - tuple. The default is (', ', ': ') if *indent* is ``None`` and - (',', ': ') otherwise. To get the most compact JSON representation, - you should specify (',', ':') to eliminate whitespace. - - If specified, default is a function that gets called for objects - that can't otherwise be serialized. It should return a JSON encodable - version of the object or raise a ``TypeError``. - - If encoding is not None, then all input strings will be - transformed into unicode using that encoding prior to JSON-encoding. - The default is UTF-8. - - If use_decimal is true (not the default), ``decimal.Decimal`` will - be supported directly by the encoder. For the inverse, decode JSON - with ``parse_float=decimal.Decimal``. - - If namedtuple_as_object is true (the default), objects with - ``_asdict()`` methods will be encoded as JSON objects. - - If tuple_as_array is true (the default), tuple (and subclasses) will - be encoded as JSON arrays. - - If bigint_as_string is true (not the default), ints 2**53 and higher - or lower than -2**53 will be encoded as strings. This is to avoid the - rounding that happens in Javascript otherwise. - - If int_as_string_bitcount is a positive number (n), then int of size - greater than or equal to 2**n or lower than or equal to -2**n will be - encoded as strings. - - If specified, item_sort_key is a callable used to sort the items in - each dictionary. This is useful if you want to sort items other than - in alphabetical order by key. - - If for_json is true (not the default), objects with a ``for_json()`` - method will use the return value of that method for encoding as JSON - instead of the object. - - If *ignore_nan* is true (default: ``False``), then out of range - :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized - as ``null`` in compliance with the ECMA-262 specification. If true, - this will override *allow_nan*. - - """ - - self.skipkeys = skipkeys - self.ensure_ascii = ensure_ascii - self.check_circular = check_circular - self.allow_nan = allow_nan - self.sort_keys = sort_keys - self.use_decimal = use_decimal - self.namedtuple_as_object = namedtuple_as_object - self.tuple_as_array = tuple_as_array - self.bigint_as_string = bigint_as_string - self.item_sort_key = item_sort_key - self.for_json = for_json - self.ignore_nan = ignore_nan - self.int_as_string_bitcount = int_as_string_bitcount - if indent is not None and not isinstance(indent, string_types): - indent = indent * ' ' - self.indent = indent - if separators is not None: - self.item_separator, self.key_separator = separators - elif indent is not None: - self.item_separator = ',' - if default is not None: - self.default = default - self.encoding = encoding - - def default(self, o): - """Implement this method in a subclass such that it returns - a serializable object for ``o``, or calls the base implementation - (to raise a ``TypeError``). - - For example, to support arbitrary iterators, you could - implement default like this:: - - def default(self, o): - try: - iterable = iter(o) - except TypeError: - pass - else: - return list(iterable) - return JSONEncoder.default(self, o) - - """ - raise TypeError(repr(o) + " is not JSON serializable") - - def encode(self, o): - """Return a JSON string representation of a Python data structure. - - >>> from simplejson import JSONEncoder - >>> JSONEncoder().encode({"foo": ["bar", "baz"]}) - '{"foo": ["bar", "baz"]}' - - """ - # This is for extremely simple cases and benchmarks. - if isinstance(o, binary_type): - _encoding = self.encoding - if (_encoding is not None and not (_encoding == 'utf-8')): - o = o.decode(_encoding) - if isinstance(o, string_types): - if self.ensure_ascii: - return encode_basestring_ascii(o) - else: - return encode_basestring(o) - # This doesn't pass the iterator directly to ''.join() because the - # exceptions aren't as detailed. The list call should be roughly - # equivalent to the PySequence_Fast that ''.join() would do. - chunks = self.iterencode(o, _one_shot=True) - if not isinstance(chunks, (list, tuple)): - chunks = list(chunks) - if self.ensure_ascii: - return ''.join(chunks) - else: - return u''.join(chunks) - - def iterencode(self, o, _one_shot=False): - """Encode the given object and yield each string - representation as available. - - For example:: - - for chunk in JSONEncoder().iterencode(bigobject): - mysocket.write(chunk) - - """ - if self.check_circular: - markers = {} - else: - markers = None - if self.ensure_ascii: - _encoder = encode_basestring_ascii - else: - _encoder = encode_basestring - if self.encoding != 'utf-8': - def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding): - if isinstance(o, binary_type): - o = o.decode(_encoding) - return _orig_encoder(o) - - def floatstr(o, allow_nan=self.allow_nan, ignore_nan=self.ignore_nan, - _repr=FLOAT_REPR, _inf=PosInf, _neginf=-PosInf): - # Check for specials. Note that this type of test is processor - # and/or platform-specific, so do tests which don't depend on - # the internals. - - if o != o: - text = 'NaN' - elif o == _inf: - text = 'Infinity' - elif o == _neginf: - text = '-Infinity' - else: - return _repr(o) - - if ignore_nan: - text = 'null' - elif not allow_nan: - raise ValueError( - "Out of range float values are not JSON compliant: " + - repr(o)) - - return text - - key_memo = {} - int_as_string_bitcount = ( - 53 if self.bigint_as_string else self.int_as_string_bitcount) - if (_one_shot and c_make_encoder is not None - and self.indent is None): - _iterencode = c_make_encoder( - markers, self.default, _encoder, self.indent, - self.key_separator, self.item_separator, self.sort_keys, - self.skipkeys, self.allow_nan, key_memo, self.use_decimal, - self.namedtuple_as_object, self.tuple_as_array, - int_as_string_bitcount, - self.item_sort_key, self.encoding, self.for_json, - self.ignore_nan, Decimal) - else: - _iterencode = _make_iterencode( - markers, self.default, _encoder, self.indent, floatstr, - self.key_separator, self.item_separator, self.sort_keys, - self.skipkeys, _one_shot, self.use_decimal, - self.namedtuple_as_object, self.tuple_as_array, - int_as_string_bitcount, - self.item_sort_key, self.encoding, self.for_json, - Decimal=Decimal) - try: - return _iterencode(o, 0) - finally: - key_memo.clear() - - -class JSONEncoderForHTML(JSONEncoder): - """An encoder that produces JSON safe to embed in HTML. - - To embed JSON content in, say, a script tag on a web page, the - characters &, < and > should be escaped. They cannot be escaped - with the usual entities (e.g. &) because they are not expanded - within ' - self.assertEqual( - r'"\u003c/script\u003e\u003cscript\u003e' - r'alert(\"gotcha\")\u003c/script\u003e"', - self.encoder.encode(bad_string)) - self.assertEqual( - bad_string, self.decoder.decode( - self.encoder.encode(bad_string))) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_errors.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_errors.py deleted file mode 100644 index 8dede38..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_errors.py +++ /dev/null @@ -1,51 +0,0 @@ -import sys, pickle -from unittest import TestCase - -import simplejson as json -from simplejson.compat import u, b - -class TestErrors(TestCase): - def test_string_keys_error(self): - data = [{'a': 'A', 'b': (2, 4), 'c': 3.0, ('d',): 'D tuple'}] - self.assertRaises(TypeError, json.dumps, data) - - def test_decode_error(self): - err = None - try: - json.loads('{}\na\nb') - except json.JSONDecodeError: - err = sys.exc_info()[1] - else: - self.fail('Expected JSONDecodeError') - self.assertEqual(err.lineno, 2) - self.assertEqual(err.colno, 1) - self.assertEqual(err.endlineno, 3) - self.assertEqual(err.endcolno, 2) - - def test_scan_error(self): - err = None - for t in (u, b): - try: - json.loads(t('{"asdf": "')) - except json.JSONDecodeError: - err = sys.exc_info()[1] - else: - self.fail('Expected JSONDecodeError') - self.assertEqual(err.lineno, 1) - self.assertEqual(err.colno, 10) - - def test_error_is_pickable(self): - err = None - try: - json.loads('{}\na\nb') - except json.JSONDecodeError: - err = sys.exc_info()[1] - else: - self.fail('Expected JSONDecodeError') - s = pickle.dumps(err) - e = pickle.loads(s) - - self.assertEqual(err.msg, e.msg) - self.assertEqual(err.doc, e.doc) - self.assertEqual(err.pos, e.pos) - self.assertEqual(err.end, e.end) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_fail.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_fail.py deleted file mode 100644 index 788f3a5..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_fail.py +++ /dev/null @@ -1,176 +0,0 @@ -import sys -from unittest import TestCase - -import simplejson as json - -# 2007-10-05 -JSONDOCS = [ - # http://json.org/JSON_checker/test/fail1.json - '"A JSON payload should be an object or array, not a string."', - # http://json.org/JSON_checker/test/fail2.json - '["Unclosed array"', - # http://json.org/JSON_checker/test/fail3.json - '{unquoted_key: "keys must be quoted"}', - # http://json.org/JSON_checker/test/fail4.json - '["extra comma",]', - # http://json.org/JSON_checker/test/fail5.json - '["double extra comma",,]', - # http://json.org/JSON_checker/test/fail6.json - '[ , "<-- missing value"]', - # http://json.org/JSON_checker/test/fail7.json - '["Comma after the close"],', - # http://json.org/JSON_checker/test/fail8.json - '["Extra close"]]', - # http://json.org/JSON_checker/test/fail9.json - '{"Extra comma": true,}', - # http://json.org/JSON_checker/test/fail10.json - '{"Extra value after close": true} "misplaced quoted value"', - # http://json.org/JSON_checker/test/fail11.json - '{"Illegal expression": 1 + 2}', - # http://json.org/JSON_checker/test/fail12.json - '{"Illegal invocation": alert()}', - # http://json.org/JSON_checker/test/fail13.json - '{"Numbers cannot have leading zeroes": 013}', - # http://json.org/JSON_checker/test/fail14.json - '{"Numbers cannot be hex": 0x14}', - # http://json.org/JSON_checker/test/fail15.json - '["Illegal backslash escape: \\x15"]', - # http://json.org/JSON_checker/test/fail16.json - '[\\naked]', - # http://json.org/JSON_checker/test/fail17.json - '["Illegal backslash escape: \\017"]', - # http://json.org/JSON_checker/test/fail18.json - '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', - # http://json.org/JSON_checker/test/fail19.json - '{"Missing colon" null}', - # http://json.org/JSON_checker/test/fail20.json - '{"Double colon":: null}', - # http://json.org/JSON_checker/test/fail21.json - '{"Comma instead of colon", null}', - # http://json.org/JSON_checker/test/fail22.json - '["Colon instead of comma": false]', - # http://json.org/JSON_checker/test/fail23.json - '["Bad value", truth]', - # http://json.org/JSON_checker/test/fail24.json - "['single quote']", - # http://json.org/JSON_checker/test/fail25.json - '["\ttab\tcharacter\tin\tstring\t"]', - # http://json.org/JSON_checker/test/fail26.json - '["tab\\ character\\ in\\ string\\ "]', - # http://json.org/JSON_checker/test/fail27.json - '["line\nbreak"]', - # http://json.org/JSON_checker/test/fail28.json - '["line\\\nbreak"]', - # http://json.org/JSON_checker/test/fail29.json - '[0e]', - # http://json.org/JSON_checker/test/fail30.json - '[0e+]', - # http://json.org/JSON_checker/test/fail31.json - '[0e+-1]', - # http://json.org/JSON_checker/test/fail32.json - '{"Comma instead if closing brace": true,', - # http://json.org/JSON_checker/test/fail33.json - '["mismatch"}', - # http://code.google.com/p/simplejson/issues/detail?id=3 - u'["A\u001FZ control characters in string"]', - # misc based on coverage - '{', - '{]', - '{"foo": "bar"]', - '{"foo": "bar"', - 'nul', - 'nulx', - '-', - '-x', - '-e', - '-e0', - '-Infinite', - '-Inf', - 'Infinit', - 'Infinite', - 'NaM', - 'NuN', - 'falsy', - 'fal', - 'trug', - 'tru', - '1e', - '1ex', - '1e-', - '1e-x', -] - -SKIPS = { - 1: "why not have a string payload?", - 18: "spec doesn't specify any nesting limitations", -} - -class TestFail(TestCase): - def test_failures(self): - for idx, doc in enumerate(JSONDOCS): - idx = idx + 1 - if idx in SKIPS: - json.loads(doc) - continue - try: - json.loads(doc) - except json.JSONDecodeError: - pass - else: - self.fail("Expected failure for fail%d.json: %r" % (idx, doc)) - - def test_array_decoder_issue46(self): - # http://code.google.com/p/simplejson/issues/detail?id=46 - for doc in [u'[,]', '[,]']: - try: - json.loads(doc) - except json.JSONDecodeError: - e = sys.exc_info()[1] - self.assertEqual(e.pos, 1) - self.assertEqual(e.lineno, 1) - self.assertEqual(e.colno, 2) - except Exception: - e = sys.exc_info()[1] - self.fail("Unexpected exception raised %r %s" % (e, e)) - else: - self.fail("Unexpected success parsing '[,]'") - - def test_truncated_input(self): - test_cases = [ - ('', 'Expecting value', 0), - ('[', "Expecting value or ']'", 1), - ('[42', "Expecting ',' delimiter", 3), - ('[42,', 'Expecting value', 4), - ('["', 'Unterminated string starting at', 1), - ('["spam', 'Unterminated string starting at', 1), - ('["spam"', "Expecting ',' delimiter", 7), - ('["spam",', 'Expecting value', 8), - ('{', 'Expecting property name enclosed in double quotes', 1), - ('{"', 'Unterminated string starting at', 1), - ('{"spam', 'Unterminated string starting at', 1), - ('{"spam"', "Expecting ':' delimiter", 7), - ('{"spam":', 'Expecting value', 8), - ('{"spam":42', "Expecting ',' delimiter", 10), - ('{"spam":42,', 'Expecting property name enclosed in double quotes', - 11), - ('"', 'Unterminated string starting at', 0), - ('"spam', 'Unterminated string starting at', 0), - ('[,', "Expecting value", 1), - ] - for data, msg, idx in test_cases: - try: - json.loads(data) - except json.JSONDecodeError: - e = sys.exc_info()[1] - self.assertEqual( - e.msg[:len(msg)], - msg, - "%r doesn't start with %r for %r" % (e.msg, msg, data)) - self.assertEqual( - e.pos, idx, - "pos %r != %r for %r" % (e.pos, idx, data)) - except Exception: - e = sys.exc_info()[1] - self.fail("Unexpected exception raised %r %s" % (e, e)) - else: - self.fail("Unexpected success parsing '%r'" % (data,)) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_float.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_float.py deleted file mode 100644 index e382ec2..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_float.py +++ /dev/null @@ -1,35 +0,0 @@ -import math -from unittest import TestCase -from simplejson.compat import long_type, text_type -import simplejson as json -from simplejson.decoder import NaN, PosInf, NegInf - -class TestFloat(TestCase): - def test_degenerates_allow(self): - for inf in (PosInf, NegInf): - self.assertEqual(json.loads(json.dumps(inf)), inf) - # Python 2.5 doesn't have math.isnan - nan = json.loads(json.dumps(NaN)) - self.assertTrue((0 + nan) != nan) - - def test_degenerates_ignore(self): - for f in (PosInf, NegInf, NaN): - self.assertEqual(json.loads(json.dumps(f, ignore_nan=True)), None) - - def test_degenerates_deny(self): - for f in (PosInf, NegInf, NaN): - self.assertRaises(ValueError, json.dumps, f, allow_nan=False) - - def test_floats(self): - for num in [1617161771.7650001, math.pi, math.pi**100, - math.pi**-100, 3.1]: - self.assertEqual(float(json.dumps(num)), num) - self.assertEqual(json.loads(json.dumps(num)), num) - self.assertEqual(json.loads(text_type(json.dumps(num))), num) - - def test_ints(self): - for num in [1, long_type(1), 1<<32, 1<<64]: - self.assertEqual(json.dumps(num), str(num)) - self.assertEqual(int(json.dumps(num)), num) - self.assertEqual(json.loads(json.dumps(num)), num) - self.assertEqual(json.loads(text_type(json.dumps(num))), num) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_for_json.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_for_json.py deleted file mode 100644 index b791b88..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_for_json.py +++ /dev/null @@ -1,97 +0,0 @@ -import unittest -import simplejson as json - - -class ForJson(object): - def for_json(self): - return {'for_json': 1} - - -class NestedForJson(object): - def for_json(self): - return {'nested': ForJson()} - - -class ForJsonList(object): - def for_json(self): - return ['list'] - - -class DictForJson(dict): - def for_json(self): - return {'alpha': 1} - - -class ListForJson(list): - def for_json(self): - return ['list'] - - -class TestForJson(unittest.TestCase): - def assertRoundTrip(self, obj, other, for_json=True): - if for_json is None: - # None will use the default - s = json.dumps(obj) - else: - s = json.dumps(obj, for_json=for_json) - self.assertEqual( - json.loads(s), - other) - - def test_for_json_encodes_stand_alone_object(self): - self.assertRoundTrip( - ForJson(), - ForJson().for_json()) - - def test_for_json_encodes_object_nested_in_dict(self): - self.assertRoundTrip( - {'hooray': ForJson()}, - {'hooray': ForJson().for_json()}) - - def test_for_json_encodes_object_nested_in_list_within_dict(self): - self.assertRoundTrip( - {'list': [0, ForJson(), 2, 3]}, - {'list': [0, ForJson().for_json(), 2, 3]}) - - def test_for_json_encodes_object_nested_within_object(self): - self.assertRoundTrip( - NestedForJson(), - {'nested': {'for_json': 1}}) - - def test_for_json_encodes_list(self): - self.assertRoundTrip( - ForJsonList(), - ForJsonList().for_json()) - - def test_for_json_encodes_list_within_object(self): - self.assertRoundTrip( - {'nested': ForJsonList()}, - {'nested': ForJsonList().for_json()}) - - def test_for_json_encodes_dict_subclass(self): - self.assertRoundTrip( - DictForJson(a=1), - DictForJson(a=1).for_json()) - - def test_for_json_encodes_list_subclass(self): - self.assertRoundTrip( - ListForJson(['l']), - ListForJson(['l']).for_json()) - - def test_for_json_ignored_if_not_true_with_dict_subclass(self): - for for_json in (None, False): - self.assertRoundTrip( - DictForJson(a=1), - {'a': 1}, - for_json=for_json) - - def test_for_json_ignored_if_not_true_with_list_subclass(self): - for for_json in (None, False): - self.assertRoundTrip( - ListForJson(['l']), - ['l'], - for_json=for_json) - - def test_raises_typeerror_if_for_json_not_true_with_object(self): - self.assertRaises(TypeError, json.dumps, ForJson()) - self.assertRaises(TypeError, json.dumps, ForJson(), for_json=False) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_indent.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_indent.py deleted file mode 100644 index cea25a5..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_indent.py +++ /dev/null @@ -1,86 +0,0 @@ -from unittest import TestCase -import textwrap - -import simplejson as json -from simplejson.compat import StringIO - -class TestIndent(TestCase): - def test_indent(self): - h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh', - 'i-vhbjkhnth', - {'nifty': 87}, {'field': 'yes', 'morefield': False} ] - - expect = textwrap.dedent("""\ - [ - \t[ - \t\t"blorpie" - \t], - \t[ - \t\t"whoops" - \t], - \t[], - \t"d-shtaeou", - \t"d-nthiouh", - \t"i-vhbjkhnth", - \t{ - \t\t"nifty": 87 - \t}, - \t{ - \t\t"field": "yes", - \t\t"morefield": false - \t} - ]""") - - - d1 = json.dumps(h) - d2 = json.dumps(h, indent='\t', sort_keys=True, separators=(',', ': ')) - d3 = json.dumps(h, indent=' ', sort_keys=True, separators=(',', ': ')) - d4 = json.dumps(h, indent=2, sort_keys=True, separators=(',', ': ')) - - h1 = json.loads(d1) - h2 = json.loads(d2) - h3 = json.loads(d3) - h4 = json.loads(d4) - - self.assertEqual(h1, h) - self.assertEqual(h2, h) - self.assertEqual(h3, h) - self.assertEqual(h4, h) - self.assertEqual(d3, expect.replace('\t', ' ')) - self.assertEqual(d4, expect.replace('\t', ' ')) - # NOTE: Python 2.4 textwrap.dedent converts tabs to spaces, - # so the following is expected to fail. Python 2.4 is not a - # supported platform in simplejson 2.1.0+. - self.assertEqual(d2, expect) - - def test_indent0(self): - h = {3: 1} - def check(indent, expected): - d1 = json.dumps(h, indent=indent) - self.assertEqual(d1, expected) - - sio = StringIO() - json.dump(h, sio, indent=indent) - self.assertEqual(sio.getvalue(), expected) - - # indent=0 should emit newlines - check(0, '{\n"3": 1\n}') - # indent=None is more compact - check(None, '{"3": 1}') - - def test_separators(self): - lst = [1,2,3,4] - expect = '[\n1,\n2,\n3,\n4\n]' - expect_spaces = '[\n1, \n2, \n3, \n4\n]' - # Ensure that separators still works - self.assertEqual( - expect_spaces, - json.dumps(lst, indent=0, separators=(', ', ': '))) - # Force the new defaults - self.assertEqual( - expect, - json.dumps(lst, indent=0, separators=(',', ': '))) - # Added in 2.1.4 - self.assertEqual( - expect, - json.dumps(lst, indent=0)) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_item_sort_key.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_item_sort_key.py deleted file mode 100644 index b05bfc8..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_item_sort_key.py +++ /dev/null @@ -1,20 +0,0 @@ -from unittest import TestCase - -import simplejson as json -from operator import itemgetter - -class TestItemSortKey(TestCase): - def test_simple_first(self): - a = {'a': 1, 'c': 5, 'jack': 'jill', 'pick': 'axe', 'array': [1, 5, 6, 9], 'tuple': (83, 12, 3), 'crate': 'dog', 'zeak': 'oh'} - self.assertEqual( - '{"a": 1, "c": 5, "crate": "dog", "jack": "jill", "pick": "axe", "zeak": "oh", "array": [1, 5, 6, 9], "tuple": [83, 12, 3]}', - json.dumps(a, item_sort_key=json.simple_first)) - - def test_case(self): - a = {'a': 1, 'c': 5, 'Jack': 'jill', 'pick': 'axe', 'Array': [1, 5, 6, 9], 'tuple': (83, 12, 3), 'crate': 'dog', 'zeak': 'oh'} - self.assertEqual( - '{"Array": [1, 5, 6, 9], "Jack": "jill", "a": 1, "c": 5, "crate": "dog", "pick": "axe", "tuple": [83, 12, 3], "zeak": "oh"}', - json.dumps(a, item_sort_key=itemgetter(0))) - self.assertEqual( - '{"a": 1, "Array": [1, 5, 6, 9], "c": 5, "crate": "dog", "Jack": "jill", "pick": "axe", "tuple": [83, 12, 3], "zeak": "oh"}', - json.dumps(a, item_sort_key=lambda kv: kv[0].lower())) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_namedtuple.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_namedtuple.py deleted file mode 100644 index 4387894..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_namedtuple.py +++ /dev/null @@ -1,122 +0,0 @@ -from __future__ import absolute_import -import unittest -import simplejson as json -from simplejson.compat import StringIO - -try: - from collections import namedtuple -except ImportError: - class Value(tuple): - def __new__(cls, *args): - return tuple.__new__(cls, args) - - def _asdict(self): - return {'value': self[0]} - class Point(tuple): - def __new__(cls, *args): - return tuple.__new__(cls, args) - - def _asdict(self): - return {'x': self[0], 'y': self[1]} -else: - Value = namedtuple('Value', ['value']) - Point = namedtuple('Point', ['x', 'y']) - -class DuckValue(object): - def __init__(self, *args): - self.value = Value(*args) - - def _asdict(self): - return self.value._asdict() - -class DuckPoint(object): - def __init__(self, *args): - self.point = Point(*args) - - def _asdict(self): - return self.point._asdict() - -class DeadDuck(object): - _asdict = None - -class DeadDict(dict): - _asdict = None - -CONSTRUCTORS = [ - lambda v: v, - lambda v: [v], - lambda v: [{'key': v}], -] - -class TestNamedTuple(unittest.TestCase): - def test_namedtuple_dumps(self): - for v in [Value(1), Point(1, 2), DuckValue(1), DuckPoint(1, 2)]: - d = v._asdict() - self.assertEqual(d, json.loads(json.dumps(v))) - self.assertEqual( - d, - json.loads(json.dumps(v, namedtuple_as_object=True))) - self.assertEqual(d, json.loads(json.dumps(v, tuple_as_array=False))) - self.assertEqual( - d, - json.loads(json.dumps(v, namedtuple_as_object=True, - tuple_as_array=False))) - - def test_namedtuple_dumps_false(self): - for v in [Value(1), Point(1, 2)]: - l = list(v) - self.assertEqual( - l, - json.loads(json.dumps(v, namedtuple_as_object=False))) - self.assertRaises(TypeError, json.dumps, v, - tuple_as_array=False, namedtuple_as_object=False) - - def test_namedtuple_dump(self): - for v in [Value(1), Point(1, 2), DuckValue(1), DuckPoint(1, 2)]: - d = v._asdict() - sio = StringIO() - json.dump(v, sio) - self.assertEqual(d, json.loads(sio.getvalue())) - sio = StringIO() - json.dump(v, sio, namedtuple_as_object=True) - self.assertEqual( - d, - json.loads(sio.getvalue())) - sio = StringIO() - json.dump(v, sio, tuple_as_array=False) - self.assertEqual(d, json.loads(sio.getvalue())) - sio = StringIO() - json.dump(v, sio, namedtuple_as_object=True, - tuple_as_array=False) - self.assertEqual( - d, - json.loads(sio.getvalue())) - - def test_namedtuple_dump_false(self): - for v in [Value(1), Point(1, 2)]: - l = list(v) - sio = StringIO() - json.dump(v, sio, namedtuple_as_object=False) - self.assertEqual( - l, - json.loads(sio.getvalue())) - self.assertRaises(TypeError, json.dump, v, StringIO(), - tuple_as_array=False, namedtuple_as_object=False) - - def test_asdict_not_callable_dump(self): - for f in CONSTRUCTORS: - self.assertRaises(TypeError, - json.dump, f(DeadDuck()), StringIO(), namedtuple_as_object=True) - sio = StringIO() - json.dump(f(DeadDict()), sio, namedtuple_as_object=True) - self.assertEqual( - json.dumps(f({})), - sio.getvalue()) - - def test_asdict_not_callable_dumps(self): - for f in CONSTRUCTORS: - self.assertRaises(TypeError, - json.dumps, f(DeadDuck()), namedtuple_as_object=True) - self.assertEqual( - json.dumps(f({})), - json.dumps(f(DeadDict()), namedtuple_as_object=True)) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass1.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass1.py deleted file mode 100644 index f0b5b10..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass1.py +++ /dev/null @@ -1,71 +0,0 @@ -from unittest import TestCase - -import simplejson as json - -# from http://json.org/JSON_checker/test/pass1.json -JSON = r''' -[ - "JSON Test Pattern pass1", - {"object with 1 member":["array with 1 element"]}, - {}, - [], - -42, - true, - false, - null, - { - "integer": 1234567890, - "real": -9876.543210, - "e": 0.123456789e-12, - "E": 1.234567890E+34, - "": 23456789012E66, - "zero": 0, - "one": 1, - "space": " ", - "quote": "\"", - "backslash": "\\", - "controls": "\b\f\n\r\t", - "slash": "/ & \/", - "alpha": "abcdefghijklmnopqrstuvwyz", - "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", - "digit": "0123456789", - "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", - "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", - "true": true, - "false": false, - "null": null, - "array":[ ], - "object":{ }, - "address": "50 St. James Street", - "url": "http://www.JSON.org/", - "comment": "// /* */": " ", - " s p a c e d " :[1,2 , 3 - -, - -4 , 5 , 6 ,7 ],"compact": [1,2,3,4,5,6,7], - "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", - "quotes": "" \u0022 %22 0x22 034 "", - "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" -: "A key can be any string" - }, - 0.5 ,98.6 -, -99.44 -, - -1066, -1e1, -0.1e1, -1e-1, -1e00,2e+00,2e-00 -,"rosebud"] -''' - -class TestPass1(TestCase): - def test_parse(self): - # test in/out equivalence and parsing - res = json.loads(JSON) - out = json.dumps(res) - self.assertEqual(res, json.loads(out)) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass2.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass2.py deleted file mode 100644 index 5d812b3..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass2.py +++ /dev/null @@ -1,14 +0,0 @@ -from unittest import TestCase -import simplejson as json - -# from http://json.org/JSON_checker/test/pass2.json -JSON = r''' -[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] -''' - -class TestPass2(TestCase): - def test_parse(self): - # test in/out equivalence and parsing - res = json.loads(JSON) - out = json.dumps(res) - self.assertEqual(res, json.loads(out)) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass3.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass3.py deleted file mode 100644 index 821d60b..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_pass3.py +++ /dev/null @@ -1,20 +0,0 @@ -from unittest import TestCase - -import simplejson as json - -# from http://json.org/JSON_checker/test/pass3.json -JSON = r''' -{ - "JSON Test Pattern pass3": { - "The outermost value": "must be an object or array.", - "In this test": "It is an object." - } -} -''' - -class TestPass3(TestCase): - def test_parse(self): - # test in/out equivalence and parsing - res = json.loads(JSON) - out = json.dumps(res) - self.assertEqual(res, json.loads(out)) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_recursion.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_recursion.py deleted file mode 100644 index 662eb66..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_recursion.py +++ /dev/null @@ -1,67 +0,0 @@ -from unittest import TestCase - -import simplejson as json - -class JSONTestObject: - pass - - -class RecursiveJSONEncoder(json.JSONEncoder): - recurse = False - def default(self, o): - if o is JSONTestObject: - if self.recurse: - return [JSONTestObject] - else: - return 'JSONTestObject' - return json.JSONEncoder.default(o) - - -class TestRecursion(TestCase): - def test_listrecursion(self): - x = [] - x.append(x) - try: - json.dumps(x) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on list recursion") - x = [] - y = [x] - x.append(y) - try: - json.dumps(x) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on alternating list recursion") - y = [] - x = [y, y] - # ensure that the marker is cleared - json.dumps(x) - - def test_dictrecursion(self): - x = {} - x["test"] = x - try: - json.dumps(x) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on dict recursion") - x = {} - y = {"a": x, "b": x} - # ensure that the marker is cleared - json.dumps(y) - - def test_defaultrecursion(self): - enc = RecursiveJSONEncoder() - self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"') - enc.recurse = True - try: - enc.encode(JSONTestObject) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on default recursion") diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_scanstring.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_scanstring.py deleted file mode 100644 index 3d98f0d..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_scanstring.py +++ /dev/null @@ -1,194 +0,0 @@ -import sys -from unittest import TestCase - -import simplejson as json -import simplejson.decoder -from simplejson.compat import b, PY3 - -class TestScanString(TestCase): - # The bytes type is intentionally not used in most of these tests - # under Python 3 because the decoder immediately coerces to str before - # calling scanstring. In Python 2 we are testing the code paths - # for both unicode and str. - # - # The reason this is done is because Python 3 would require - # entirely different code paths for parsing bytes and str. - # - def test_py_scanstring(self): - self._test_scanstring(simplejson.decoder.py_scanstring) - - def test_c_scanstring(self): - if not simplejson.decoder.c_scanstring: - return - self._test_scanstring(simplejson.decoder.c_scanstring) - - def _test_scanstring(self, scanstring): - if sys.maxunicode == 65535: - self.assertEqual( - scanstring(u'"z\U0001d120x"', 1, None, True), - (u'z\U0001d120x', 6)) - else: - self.assertEqual( - scanstring(u'"z\U0001d120x"', 1, None, True), - (u'z\U0001d120x', 5)) - - self.assertEqual( - scanstring('"\\u007b"', 1, None, True), - (u'{', 8)) - - self.assertEqual( - scanstring('"A JSON payload should be an object or array, not a string."', 1, None, True), - (u'A JSON payload should be an object or array, not a string.', 60)) - - self.assertEqual( - scanstring('["Unclosed array"', 2, None, True), - (u'Unclosed array', 17)) - - self.assertEqual( - scanstring('["extra comma",]', 2, None, True), - (u'extra comma', 14)) - - self.assertEqual( - scanstring('["double extra comma",,]', 2, None, True), - (u'double extra comma', 21)) - - self.assertEqual( - scanstring('["Comma after the close"],', 2, None, True), - (u'Comma after the close', 24)) - - self.assertEqual( - scanstring('["Extra close"]]', 2, None, True), - (u'Extra close', 14)) - - self.assertEqual( - scanstring('{"Extra comma": true,}', 2, None, True), - (u'Extra comma', 14)) - - self.assertEqual( - scanstring('{"Extra value after close": true} "misplaced quoted value"', 2, None, True), - (u'Extra value after close', 26)) - - self.assertEqual( - scanstring('{"Illegal expression": 1 + 2}', 2, None, True), - (u'Illegal expression', 21)) - - self.assertEqual( - scanstring('{"Illegal invocation": alert()}', 2, None, True), - (u'Illegal invocation', 21)) - - self.assertEqual( - scanstring('{"Numbers cannot have leading zeroes": 013}', 2, None, True), - (u'Numbers cannot have leading zeroes', 37)) - - self.assertEqual( - scanstring('{"Numbers cannot be hex": 0x14}', 2, None, True), - (u'Numbers cannot be hex', 24)) - - self.assertEqual( - scanstring('[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', 21, None, True), - (u'Too deep', 30)) - - self.assertEqual( - scanstring('{"Missing colon" null}', 2, None, True), - (u'Missing colon', 16)) - - self.assertEqual( - scanstring('{"Double colon":: null}', 2, None, True), - (u'Double colon', 15)) - - self.assertEqual( - scanstring('{"Comma instead of colon", null}', 2, None, True), - (u'Comma instead of colon', 25)) - - self.assertEqual( - scanstring('["Colon instead of comma": false]', 2, None, True), - (u'Colon instead of comma', 25)) - - self.assertEqual( - scanstring('["Bad value", truth]', 2, None, True), - (u'Bad value', 12)) - - for c in map(chr, range(0x00, 0x1f)): - self.assertEqual( - scanstring(c + '"', 0, None, False), - (c, 2)) - self.assertRaises( - ValueError, - scanstring, c + '"', 0, None, True) - - self.assertRaises(ValueError, scanstring, '', 0, None, True) - self.assertRaises(ValueError, scanstring, 'a', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u0', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u01', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u012', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u0123', 0, None, True) - if sys.maxunicode > 65535: - self.assertRaises(ValueError, - scanstring, '\\ud834\\u"', 0, None, True) - self.assertRaises(ValueError, - scanstring, '\\ud834\\x0123"', 0, None, True) - - def test_issue3623(self): - self.assertRaises(ValueError, json.decoder.scanstring, "xxx", 1, - "xxx") - self.assertRaises(UnicodeDecodeError, - json.encoder.encode_basestring_ascii, b("xx\xff")) - - def test_overflow(self): - # Python 2.5 does not have maxsize, Python 3 does not have maxint - maxsize = getattr(sys, 'maxsize', getattr(sys, 'maxint', None)) - assert maxsize is not None - self.assertRaises(OverflowError, json.decoder.scanstring, "xxx", - maxsize + 1) - - def test_surrogates(self): - scanstring = json.decoder.scanstring - - def assertScan(given, expect, test_utf8=True): - givens = [given] - if not PY3 and test_utf8: - givens.append(given.encode('utf8')) - for given in givens: - (res, count) = scanstring(given, 1, None, True) - self.assertEqual(len(given), count) - self.assertEqual(res, expect) - - assertScan( - u'"z\\ud834\\u0079x"', - u'z\ud834yx') - assertScan( - u'"z\\ud834\\udd20x"', - u'z\U0001d120x') - assertScan( - u'"z\\ud834\\ud834\\udd20x"', - u'z\ud834\U0001d120x') - assertScan( - u'"z\\ud834x"', - u'z\ud834x') - assertScan( - u'"z\\udd20x"', - u'z\udd20x') - assertScan( - u'"z\ud834x"', - u'z\ud834x') - # It may look strange to join strings together, but Python is drunk. - # https://gist.github.com/etrepum/5538443 - assertScan( - u'"z\\ud834\udd20x12345"', - u''.join([u'z\ud834', u'\udd20x12345'])) - assertScan( - u'"z\ud834\\udd20x"', - u''.join([u'z\ud834', u'\udd20x'])) - # these have different behavior given UTF8 input, because the surrogate - # pair may be joined (in maxunicode > 65535 builds) - assertScan( - u''.join([u'"z\ud834', u'\udd20x"']), - u''.join([u'z\ud834', u'\udd20x']), - test_utf8=False) - - self.assertRaises(ValueError, - scanstring, u'"z\\ud83x"', 1, None, True) - self.assertRaises(ValueError, - scanstring, u'"z\\ud834\\udd2x"', 1, None, True) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_separators.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_separators.py deleted file mode 100644 index 91b4d4f..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_separators.py +++ /dev/null @@ -1,42 +0,0 @@ -import textwrap -from unittest import TestCase - -import simplejson as json - - -class TestSeparators(TestCase): - def test_separators(self): - h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh', 'i-vhbjkhnth', - {'nifty': 87}, {'field': 'yes', 'morefield': False} ] - - expect = textwrap.dedent("""\ - [ - [ - "blorpie" - ] , - [ - "whoops" - ] , - [] , - "d-shtaeou" , - "d-nthiouh" , - "i-vhbjkhnth" , - { - "nifty" : 87 - } , - { - "field" : "yes" , - "morefield" : false - } - ]""") - - - d1 = json.dumps(h) - d2 = json.dumps(h, indent=' ', sort_keys=True, separators=(' ,', ' : ')) - - h1 = json.loads(d1) - h2 = json.loads(d2) - - self.assertEqual(h1, h) - self.assertEqual(h2, h) - self.assertEqual(d2, expect) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_speedups.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_speedups.py deleted file mode 100644 index 0a2b63b..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_speedups.py +++ /dev/null @@ -1,39 +0,0 @@ -import sys -import unittest -from unittest import TestCase - -from simplejson import encoder, scanner - - -def has_speedups(): - return encoder.c_make_encoder is not None - - -def skip_if_speedups_missing(func): - def wrapper(*args, **kwargs): - if not has_speedups(): - if hasattr(unittest, 'SkipTest'): - raise unittest.SkipTest("C Extension not available") - else: - sys.stdout.write("C Extension not available") - return - return func(*args, **kwargs) - - return wrapper - - -class TestDecode(TestCase): - @skip_if_speedups_missing - def test_make_scanner(self): - self.assertRaises(AttributeError, scanner.c_make_scanner, 1) - - @skip_if_speedups_missing - def test_make_encoder(self): - self.assertRaises( - TypeError, - encoder.c_make_encoder, - None, - ("\xCD\x7D\x3D\x4E\x12\x4C\xF9\x79\xD7" - "\x52\xBA\x82\xF2\x27\x4A\x7D\xA0\xCA\x75"), - None - ) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_tool.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_tool.py deleted file mode 100644 index ac2a14c..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_tool.py +++ /dev/null @@ -1,97 +0,0 @@ -from __future__ import with_statement -import os -import sys -import textwrap -import unittest -import subprocess -import tempfile -try: - # Python 3.x - from test.support import strip_python_stderr -except ImportError: - # Python 2.6+ - try: - from test.test_support import strip_python_stderr - except ImportError: - # Python 2.5 - import re - def strip_python_stderr(stderr): - return re.sub( - r"\[\d+ refs\]\r?\n?$".encode(), - "".encode(), - stderr).strip() - -class TestTool(unittest.TestCase): - data = """ - - [["blorpie"],[ "whoops" ] , [ - ],\t"d-shtaeou",\r"d-nthiouh", - "i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field" - :"yes"} ] - """ - - expect = textwrap.dedent("""\ - [ - [ - "blorpie" - ], - [ - "whoops" - ], - [], - "d-shtaeou", - "d-nthiouh", - "i-vhbjkhnth", - { - "nifty": 87 - }, - { - "field": "yes", - "morefield": false - } - ] - """) - - def runTool(self, args=None, data=None): - argv = [sys.executable, '-m', 'simplejson.tool'] - if args: - argv.extend(args) - proc = subprocess.Popen(argv, - stdin=subprocess.PIPE, - stderr=subprocess.PIPE, - stdout=subprocess.PIPE) - out, err = proc.communicate(data) - self.assertEqual(strip_python_stderr(err), ''.encode()) - self.assertEqual(proc.returncode, 0) - return out - - def test_stdin_stdout(self): - self.assertEqual( - self.runTool(data=self.data.encode()), - self.expect.encode()) - - def test_infile_stdout(self): - with tempfile.NamedTemporaryFile() as infile: - infile.write(self.data.encode()) - infile.flush() - self.assertEqual( - self.runTool(args=[infile.name]), - self.expect.encode()) - - def test_infile_outfile(self): - with tempfile.NamedTemporaryFile() as infile: - infile.write(self.data.encode()) - infile.flush() - # outfile will get overwritten by tool, so the delete - # may not work on some platforms. Do it manually. - outfile = tempfile.NamedTemporaryFile() - try: - self.assertEqual( - self.runTool(args=[infile.name, outfile.name]), - ''.encode()) - with open(outfile.name, 'rb') as f: - self.assertEqual(f.read(), self.expect.encode()) - finally: - outfile.close() - if os.path.exists(outfile.name): - os.unlink(outfile.name) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_tuple.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_tuple.py deleted file mode 100644 index a6a9910..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_tuple.py +++ /dev/null @@ -1,51 +0,0 @@ -import unittest - -from simplejson.compat import StringIO -import simplejson as json - -class TestTuples(unittest.TestCase): - def test_tuple_array_dumps(self): - t = (1, 2, 3) - expect = json.dumps(list(t)) - # Default is True - self.assertEqual(expect, json.dumps(t)) - self.assertEqual(expect, json.dumps(t, tuple_as_array=True)) - self.assertRaises(TypeError, json.dumps, t, tuple_as_array=False) - # Ensure that the "default" does not get called - self.assertEqual(expect, json.dumps(t, default=repr)) - self.assertEqual(expect, json.dumps(t, tuple_as_array=True, - default=repr)) - # Ensure that the "default" gets called - self.assertEqual( - json.dumps(repr(t)), - json.dumps(t, tuple_as_array=False, default=repr)) - - def test_tuple_array_dump(self): - t = (1, 2, 3) - expect = json.dumps(list(t)) - # Default is True - sio = StringIO() - json.dump(t, sio) - self.assertEqual(expect, sio.getvalue()) - sio = StringIO() - json.dump(t, sio, tuple_as_array=True) - self.assertEqual(expect, sio.getvalue()) - self.assertRaises(TypeError, json.dump, t, StringIO(), - tuple_as_array=False) - # Ensure that the "default" does not get called - sio = StringIO() - json.dump(t, sio, default=repr) - self.assertEqual(expect, sio.getvalue()) - sio = StringIO() - json.dump(t, sio, tuple_as_array=True, default=repr) - self.assertEqual(expect, sio.getvalue()) - # Ensure that the "default" gets called - sio = StringIO() - json.dump(t, sio, tuple_as_array=False, default=repr) - self.assertEqual( - json.dumps(repr(t)), - sio.getvalue()) - -class TestNamedTuple(unittest.TestCase): - def test_namedtuple_dump(self): - pass diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_unicode.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_unicode.py deleted file mode 100644 index 3b37f65..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tests/test_unicode.py +++ /dev/null @@ -1,153 +0,0 @@ -import sys -import codecs -from unittest import TestCase - -import simplejson as json -from simplejson.compat import unichr, text_type, b, u, BytesIO - -class TestUnicode(TestCase): - def test_encoding1(self): - encoder = json.JSONEncoder(encoding='utf-8') - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - s = u.encode('utf-8') - ju = encoder.encode(u) - js = encoder.encode(s) - self.assertEqual(ju, js) - - def test_encoding2(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - s = u.encode('utf-8') - ju = json.dumps(u, encoding='utf-8') - js = json.dumps(s, encoding='utf-8') - self.assertEqual(ju, js) - - def test_encoding3(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps(u) - self.assertEqual(j, '"\\u03b1\\u03a9"') - - def test_encoding4(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps([u]) - self.assertEqual(j, '["\\u03b1\\u03a9"]') - - def test_encoding5(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps(u, ensure_ascii=False) - self.assertEqual(j, u'"' + u + u'"') - - def test_encoding6(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps([u], ensure_ascii=False) - self.assertEqual(j, u'["' + u + u'"]') - - def test_big_unicode_encode(self): - u = u'\U0001d120' - self.assertEqual(json.dumps(u), '"\\ud834\\udd20"') - self.assertEqual(json.dumps(u, ensure_ascii=False), u'"\U0001d120"') - - def test_big_unicode_decode(self): - u = u'z\U0001d120x' - self.assertEqual(json.loads('"' + u + '"'), u) - self.assertEqual(json.loads('"z\\ud834\\udd20x"'), u) - - def test_unicode_decode(self): - for i in range(0, 0xd7ff): - u = unichr(i) - #s = '"\\u{0:04x}"'.format(i) - s = '"\\u%04x"' % (i,) - self.assertEqual(json.loads(s), u) - - def test_object_pairs_hook_with_unicode(self): - s = u'{"xkd":1, "kcw":2, "art":3, "hxm":4, "qrt":5, "pad":6, "hoy":7}' - p = [(u"xkd", 1), (u"kcw", 2), (u"art", 3), (u"hxm", 4), - (u"qrt", 5), (u"pad", 6), (u"hoy", 7)] - self.assertEqual(json.loads(s), eval(s)) - self.assertEqual(json.loads(s, object_pairs_hook=lambda x: x), p) - od = json.loads(s, object_pairs_hook=json.OrderedDict) - self.assertEqual(od, json.OrderedDict(p)) - self.assertEqual(type(od), json.OrderedDict) - # the object_pairs_hook takes priority over the object_hook - self.assertEqual(json.loads(s, - object_pairs_hook=json.OrderedDict, - object_hook=lambda x: None), - json.OrderedDict(p)) - - - def test_default_encoding(self): - self.assertEqual(json.loads(u'{"a": "\xe9"}'.encode('utf-8')), - {'a': u'\xe9'}) - - def test_unicode_preservation(self): - self.assertEqual(type(json.loads(u'""')), text_type) - self.assertEqual(type(json.loads(u'"a"')), text_type) - self.assertEqual(type(json.loads(u'["a"]')[0]), text_type) - - def test_ensure_ascii_false_returns_unicode(self): - # http://code.google.com/p/simplejson/issues/detail?id=48 - self.assertEqual(type(json.dumps([], ensure_ascii=False)), text_type) - self.assertEqual(type(json.dumps(0, ensure_ascii=False)), text_type) - self.assertEqual(type(json.dumps({}, ensure_ascii=False)), text_type) - self.assertEqual(type(json.dumps("", ensure_ascii=False)), text_type) - - def test_ensure_ascii_false_bytestring_encoding(self): - # http://code.google.com/p/simplejson/issues/detail?id=48 - doc1 = {u'quux': b('Arr\xc3\xaat sur images')} - doc2 = {u'quux': u('Arr\xeat sur images')} - doc_ascii = '{"quux": "Arr\\u00eat sur images"}' - doc_unicode = u'{"quux": "Arr\xeat sur images"}' - self.assertEqual(json.dumps(doc1), doc_ascii) - self.assertEqual(json.dumps(doc2), doc_ascii) - self.assertEqual(json.dumps(doc1, ensure_ascii=False), doc_unicode) - self.assertEqual(json.dumps(doc2, ensure_ascii=False), doc_unicode) - - def test_ensure_ascii_linebreak_encoding(self): - # http://timelessrepo.com/json-isnt-a-javascript-subset - s1 = u'\u2029\u2028' - s2 = s1.encode('utf8') - expect = '"\\u2029\\u2028"' - self.assertEqual(json.dumps(s1), expect) - self.assertEqual(json.dumps(s2), expect) - self.assertEqual(json.dumps(s1, ensure_ascii=False), expect) - self.assertEqual(json.dumps(s2, ensure_ascii=False), expect) - - def test_invalid_escape_sequences(self): - # incomplete escape sequence - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u12') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u123') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1234') - # invalid escape sequence - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u123x"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u12x4"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1x34"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ux234"') - if sys.maxunicode > 65535: - # invalid escape sequence for low surrogate - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u0"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u00"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u000"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u000x"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u00x0"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u0x00"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\ux000"') - - def test_ensure_ascii_still_works(self): - # in the ascii range, ensure that everything is the same - for c in map(unichr, range(0, 127)): - self.assertEqual( - json.dumps(c, ensure_ascii=False), - json.dumps(c)) - snowman = u'\N{SNOWMAN}' - self.assertEqual( - json.dumps(c, ensure_ascii=False), - '"' + c + '"') - - def test_strip_bom(self): - content = u"\u3053\u3093\u306b\u3061\u308f" - json_doc = codecs.BOM_UTF8 + b(json.dumps(content)) - self.assertEqual(json.load(BytesIO(json_doc)), content) - for doc in json_doc, json_doc.decode('utf8'): - self.assertEqual(json.loads(doc), content) diff --git a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tool.py b/Linux_x86_64/lib/python3.4/site-packages/simplejson/tool.py deleted file mode 100644 index 062e8e2..0000000 --- a/Linux_x86_64/lib/python3.4/site-packages/simplejson/tool.py +++ /dev/null @@ -1,42 +0,0 @@ -r"""Command-line tool to validate and pretty-print JSON - -Usage:: - - $ echo '{"json":"obj"}' | python -m simplejson.tool - { - "json": "obj" - } - $ echo '{ 1.2:3.4}' | python -m simplejson.tool - Expecting property name: line 1 column 2 (char 2) - -""" -from __future__ import with_statement -import sys -import simplejson as json - -def main(): - if len(sys.argv) == 1: - infile = sys.stdin - outfile = sys.stdout - elif len(sys.argv) == 2: - infile = open(sys.argv[1], 'r') - outfile = sys.stdout - elif len(sys.argv) == 3: - infile = open(sys.argv[1], 'r') - outfile = open(sys.argv[2], 'w') - else: - raise SystemExit(sys.argv[0] + " [infile [outfile]]") - with infile: - try: - obj = json.load(infile, - object_pairs_hook=json.OrderedDict, - use_decimal=True) - except ValueError: - raise SystemExit(sys.exc_info()[1]) - with outfile: - json.dump(obj, outfile, sort_keys=True, indent=' ', use_decimal=True) - outfile.write('\n') - - -if __name__ == '__main__': - main() diff --git a/Linux_x86_64/update.sh b/Linux_x86_64/update.sh index da4657f..f628e3f 100755 --- a/Linux_x86_64/update.sh +++ b/Linux_x86_64/update.sh @@ -1,7 +1,7 @@ HOME=`pwd`/home mkdir $HOME export PIP_DOWNLOAD_CACHE=$HOME/../../../pip_cache -cat ../../openmedialibrary/requirements.txt | grep -v lxml > requirements.txt +cat ../../openmedialibrary/requirements.txt | grep -v lxml | grep -v simplejson > requirements.txt pip3 install -r requirements.txt -I --user mkdir old mv lib bin old