diff --git a/Tests/bench_get.py b/Tests/bench_get.py index 51f3a6aa2..e9afe1af5 100644 --- a/Tests/bench_get.py +++ b/Tests/bench_get.py @@ -14,6 +14,7 @@ def bench(mode): get(xy) print(mode, timeit.default_timer() - t0, "us") + bench("L") bench("I") bench("I;16") diff --git a/Tests/check_imaging_leaks.py b/Tests/check_imaging_leaks.py index a31cd2180..00a0245e4 100755 --- a/Tests/check_imaging_leaks.py +++ b/Tests/check_imaging_leaks.py @@ -40,5 +40,6 @@ class TestImagingLeaks(PillowTestCase): # Pass a new list at each iteration. lambda: im.point(range(256))) + if __name__ == '__main__': unittest.main() diff --git a/Tests/check_j2k_overflow.py b/Tests/check_j2k_overflow.py index bec4ea694..1dd8db69f 100644 --- a/Tests/check_j2k_overflow.py +++ b/Tests/check_j2k_overflow.py @@ -10,5 +10,6 @@ class TestJ2kEncodeOverflow(PillowTestCase): with self.assertRaises(IOError): im.save(target) + if __name__ == '__main__': unittest.main() diff --git a/Tests/check_png_dos.py b/Tests/check_png_dos.py index 8998f8c0f..0bbaf6a4d 100644 --- a/Tests/check_png_dos.py +++ b/Tests/check_png_dos.py @@ -60,5 +60,6 @@ class TestPngDos(PillowTestCase): self.assertLess(total_len, 64*1024*1024, "Total text chunks greater than 64M") + if __name__ == '__main__': unittest.main() diff --git a/Tests/helper.py b/Tests/helper.py index 607330122..aac5295df 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -18,6 +18,7 @@ HAS_UPLOADER = False if os.environ.get('SHOW_ERRORS', None): # local img.show for errors. HAS_UPLOADER=True + class test_image_results: @classmethod def upload(self, a, b): @@ -31,7 +32,6 @@ else: pass - def convert_to_comparable(a, b): new_a, new_b = a, b if a.mode == 'P': diff --git a/Tests/make_hash.py b/Tests/make_hash.py index 4412f65be..c5e32d606 100644 --- a/Tests/make_hash.py +++ b/Tests/make_hash.py @@ -32,6 +32,7 @@ def check(size, i0): h[i] = m return h + min_start = 0 # 1) find the smallest table size with no collisions diff --git a/Tests/test_binary.py b/Tests/test_binary.py index 2fac9b3d5..7e22e0f59 100644 --- a/Tests/test_binary.py +++ b/Tests/test_binary.py @@ -23,5 +23,6 @@ class TestBinary(PillowTestCase): self.assertEqual(_binary.o16be(65535), b'\xff\xff') self.assertEqual(_binary.o32be(65535), b'\x00\x00\xff\xff') + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index 4da8760cd..ce27cea96 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -44,6 +44,7 @@ class TestDecompressionBomb(PillowTestCase): self.assertRaises(Image.DecompressionBombError, lambda: Image.open(TEST_FILE)) + class TestDecompressionCrop(PillowTestCase): def setUp(self): diff --git a/Tests/test_file_dds.py b/Tests/test_file_dds.py index 89d265ec2..ec975f7ec 100644 --- a/Tests/test_file_dds.py +++ b/Tests/test_file_dds.py @@ -111,5 +111,6 @@ class TestFileDds(PillowTestCase): self.assertRaises(IOError, short_file) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_ftex.py b/Tests/test_file_ftex.py index ed1116ad5..6b43244c9 100644 --- a/Tests/test_file_ftex.py +++ b/Tests/test_file_ftex.py @@ -15,5 +15,6 @@ class TestFileFtex(PillowTestCase): target = Image.open('Tests/images/ftex_dxt1.png') self.assert_image_similar(im, target.convert('RGBA'), 15) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_gbr.py b/Tests/test_file_gbr.py index aacc193f4..346605bd4 100644 --- a/Tests/test_file_gbr.py +++ b/Tests/test_file_gbr.py @@ -18,5 +18,6 @@ class TestFileGbr(PillowTestCase): self.assert_image_equal(target, im) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index 9d671561d..f8e3918b4 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -278,7 +278,6 @@ class TestFileGif(PillowTestCase): img.seek(img.tell() + 1) self.assertEqual(img.disposal_method, method) - # check per frame disposal im_list[0].save( out, @@ -586,5 +585,6 @@ class TestFileGif(PillowTestCase): # codec error prepatch im.load() + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 753b50598..0766f5b07 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -176,5 +176,6 @@ class TestFileJpeg2k(PillowTestCase): with self.assertRaises(IOError): Image.open('Tests/images/unbound_variable.jp2') + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index ce2b3e608..d64f9b7d9 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -22,6 +22,7 @@ def chunk(cid, *data): PngImagePlugin.putchunk(*(test_file, cid) + data) return test_file.getvalue() + o32 = PngImagePlugin.o32 IHDR = chunk(b"IHDR", o32(1), o32(1), b'\x08\x02', b'\0\0\0') diff --git a/Tests/test_file_sun.py b/Tests/test_file_sun.py index 6bb6b98d4..61cfdf367 100644 --- a/Tests/test_file_sun.py +++ b/Tests/test_file_sun.py @@ -46,5 +46,6 @@ class TestFileSun(PillowTestCase): with Image.open(target_path) as target: self.assert_image_equal(im, target) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 393f4a7a4..62c1c3392 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -398,7 +398,6 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.tag_v2[X_RESOLUTION], 72) self.assertEqual(im.tag_v2[Y_RESOLUTION], 36) - def test_roundtrip_tiff_uint16(self): # Test an image of all '0' values pixel_value = 0x1234 @@ -447,7 +446,6 @@ class TestFileTiff(PillowTestCase): reread = Image.open(mp) self.assertEqual(reread.n_frames, 3) - def test_saving_icc_profile(self): # Tests saving TIFF with icc_profile set. # At the time of writing this will only work for non-compressed tiffs @@ -489,6 +487,7 @@ class TestFileTiff(PillowTestCase): im.load() self.assertFalse(fp.closed) + @unittest.skipUnless(sys.platform.startswith('win32'), "Windows only") class TestFileTiffW32(PillowTestCase): def test_fd_leak(self): diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index 0f0031f7d..8cc5a7882 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -78,7 +78,6 @@ class TestFileTiffMetadata(PillowTestCase): self.assertEqual(loaded.tag[ImageJMetaDataByteCounts], (8, len(bindata) - 8)) self.assertEqual(loaded.tag_v2[ImageJMetaDataByteCounts], (8, len(bindata) - 8)) - def test_read_metadata(self): img = Image.open('Tests/images/hopper_g4.tif') diff --git a/Tests/test_font_leaks.py b/Tests/test_font_leaks.py index 009211aec..d3261a9e2 100644 --- a/Tests/test_font_leaks.py +++ b/Tests/test_font_leaks.py @@ -3,6 +3,7 @@ from helper import unittest, PillowLeakTestCase import sys from PIL import Image, features, ImageDraw, ImageFont + @unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS") class TestTTypeFontLeak(PillowLeakTestCase): # fails at iteration 3 in master @@ -20,6 +21,7 @@ class TestTTypeFontLeak(PillowLeakTestCase): ttype = ImageFont.truetype('Tests/fonts/FreeMono.ttf', 20) self._test_font(ttype) + class TestDefaultFontLeak(TestTTypeFontLeak): # fails at iteration 37 in master iterations = 100 diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 75ff364f9..875a20b20 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -72,7 +72,6 @@ class TestFontPcf(PillowTestCase): with Image.open('Tests/images/high_ascii_chars.png') as target: self.assert_image_similar(im, target, 0) - def test_high_characters(self): message = "".join(chr(i+1) for i in range(140, 232)) self._test_high_characters(message) diff --git a/Tests/test_image_access.py b/Tests/test_image_access.py index 464e0a208..155fa5c2e 100644 --- a/Tests/test_image_access.py +++ b/Tests/test_image_access.py @@ -10,6 +10,7 @@ from PIL import Image import sys import os + class AccessTest(PillowTestCase): # initial value _init_cffi_access = Image.USE_CFFI_ACCESS @@ -309,5 +310,6 @@ int main(int argc, char* argv[]) process.communicate() self.assertEqual(process.returncode, 0) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index de88ff519..c7c381382 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -90,7 +90,6 @@ class TestImageConvert(PillowTestCase): # https://github.com/python-pillow/Pillow/issues/2702 self.assertEqual(rgba.palette, None) - def test_trns_l(self): im = hopper('L') im.info['transparency'] = 128 diff --git a/Tests/test_image_draft.py b/Tests/test_image_draft.py index 12f5e0e9f..18982fc99 100644 --- a/Tests/test_image_draft.py +++ b/Tests/test_image_draft.py @@ -70,5 +70,6 @@ class TestImageDraft(PillowTestCase): im.draft(None, (64, 64)) im.load() + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_load.py b/Tests/test_image_load.py index 15a92e339..88b6e9b5c 100644 --- a/Tests/test_image_load.py +++ b/Tests/test_image_load.py @@ -29,5 +29,6 @@ class TestImageLoad(PillowTestCase): self.assertRaises(OSError, os.fstat, fn) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_putdata.py b/Tests/test_image_putdata.py index 1a7a6e7c7..2008c1307 100644 --- a/Tests/test_image_putdata.py +++ b/Tests/test_image_putdata.py @@ -84,5 +84,6 @@ class TestImagePutData(PillowTestCase): self.assertEqual(len(im.getdata()), len(arr)) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_tobytes.py b/Tests/test_image_tobytes.py index 2cae05e66..f5a738695 100644 --- a/Tests/test_image_tobytes.py +++ b/Tests/test_image_tobytes.py @@ -7,5 +7,6 @@ class TestImageToBytes(PillowTestCase): data = hopper().tobytes() self.assertIsInstance(data, bytes) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index df8fc83e8..5369ed198 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -267,5 +267,6 @@ class TestImageTransformPerspective(TestImageTransformAffine): # Repeat all tests for AFFINE transformations with PERSPECTIVE transform = Image.PERSPECTIVE + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py index 9e304ae01..31417564f 100644 --- a/Tests/test_imagecms.py +++ b/Tests/test_imagecms.py @@ -437,5 +437,6 @@ class TestImageCms(PillowTestCase): self.assert_image_equal(test_image.convert(dst_format[2]), reference_image) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index b50dcc943..32e44a0e1 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -146,6 +146,7 @@ class MockPyDecoder(ImageFile.PyDecoder): # eof return (-1, 0) + xoff, yoff, xsize, ysize = 10, 20, 100, 100 @@ -222,5 +223,6 @@ class TestPyDecoder(PillowTestCase): im.tile = [("MOCK", (xoff, yoff, xoff+xsize, yoff+ysize + 100), 32, None)] self.assertRaises(ValueError, im.load) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index fb7987275..e120f8482 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -420,7 +420,6 @@ class TestImageFont(PillowTestCase): with self.assertRaises(UnicodeEncodeError): font.getsize(u"’") - def _test_fake_loading_font(self, path_to_fake, fontname): # Make a copy of FreeTypeFont so we can patch the original free_type_font = copy.deepcopy(ImageFont.FreeTypeFont) diff --git a/Tests/test_imagefont_bitmap.py b/Tests/test_imagefont_bitmap.py index 7ee5f8a2b..bee415fd7 100644 --- a/Tests/test_imagefont_bitmap.py +++ b/Tests/test_imagefont_bitmap.py @@ -34,5 +34,6 @@ class TestImageFontBitmap(PillowTestCase): text, fill=(0, 0, 0), font=font_outline) self.assert_image_similar(im_bitmap, im_outline, 20) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index ee20014e1..ac5f9c225 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -6,6 +6,7 @@ from PIL import Image, ImageDraw, ImageFont, features FONT_SIZE = 20 FONT_PATH = "Tests/fonts/DejaVuSans.ttf" + @unittest.skipUnless(features.check('raqm'), "Raqm Library is not installed.") class TestImagecomplextext(PillowTestCase): @@ -16,7 +17,6 @@ class TestImagecomplextext(PillowTestCase): draw = ImageDraw.Draw(im) draw.text((0, 0), 'TEST', font=ttf, fill=500, direction='ltr') - def test_complex_text(self): ttf = ImageFont.truetype(FONT_PATH, FONT_SIZE) @@ -127,6 +127,7 @@ class TestImagecomplextext(PillowTestCase): self.assert_image_similar(im, target_img, .5) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagemath.py b/Tests/test_imagemath.py index 4f99eda93..2329b747e 100644 --- a/Tests/test_imagemath.py +++ b/Tests/test_imagemath.py @@ -13,6 +13,7 @@ def pixel(im): return int(im) # hack to deal with booleans print(im) + A = Image.new("L", (1, 1), 1) B = Image.new("L", (1, 1), 2) Z = Image.new("L", (1, 1), 0) # Z for zero diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index cd7dcae5f..3fb021fe7 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -97,5 +97,6 @@ class TestImageOpsUsm(PillowTestCase): self.assertTrue(236 <= gp(8, 6)[2] <= 239) self.assertTrue(236 <= gp(8, 7)[1] <= 239) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index 2a4a358ba..500a2e60a 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -70,5 +70,6 @@ class TestImageSequence(PillowTestCase): color2 = im.getpalette()[0:3] self.assertEqual(color1, color2) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py index 0155c4bb4..a06578460 100644 --- a/Tests/test_lib_pack.py +++ b/Tests/test_lib_pack.py @@ -226,7 +226,6 @@ class TestLibUnpack(PillowTestCase): self.assert_unpack("L", "L;16", b'\x00\xc6\x00\xaf', 198, 175) self.assert_unpack("L", "L;16B", b'\xc6\x00\xaf\x00', 198, 175) - def test_LA(self): self.assert_unpack("LA", "LA", 2, (1, 2), (3, 4), (5, 6)) self.assert_unpack("LA", "LA;L", 2, (1, 4), (2, 5), (3, 6)) diff --git a/Tests/test_pickle.py b/Tests/test_pickle.py index 69eb60949..bdfd3582d 100644 --- a/Tests/test_pickle.py +++ b/Tests/test_pickle.py @@ -92,5 +92,6 @@ class TestPickle(PillowTestCase): self.helper_pickle_string(cPickle, protocol, mode="L") self.helper_pickle_file(cPickle, protocol, mode="L") + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_tiff_ifdrational.py b/Tests/test_tiff_ifdrational.py index 0bf4503c4..bd767b931 100644 --- a/Tests/test_tiff_ifdrational.py +++ b/Tests/test_tiff_ifdrational.py @@ -59,5 +59,6 @@ class Test_IFDRational(PillowTestCase): self.assertEqual(float(IFDRational(301, 1)), float(reloaded.tag_v2[282])) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_uploader.py b/Tests/test_uploader.py index 9d1f164c2..e157867cb 100644 --- a/Tests/test_uploader.py +++ b/Tests/test_uploader.py @@ -12,5 +12,6 @@ class TestUploader(PillowTestCase): target = hopper('RGB') self.assert_image_similar(result, target, 0) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_util.py b/Tests/test_util.py index 9901de357..2316d3d65 100644 --- a/Tests/test_util.py +++ b/Tests/test_util.py @@ -75,5 +75,6 @@ class TestUtil(PillowTestCase): # Assert self.assertRaises(ValueError, lambda: thing.some_attr) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_webp_leaks.py b/Tests/test_webp_leaks.py index 82599bbbb..6feee0be6 100644 --- a/Tests/test_webp_leaks.py +++ b/Tests/test_webp_leaks.py @@ -4,6 +4,7 @@ from io import BytesIO test_file = "Tests/images/hopper.webp" + @unittest.skipUnless(features.check('webp'), "WebP is not installed") class TestWebPLeaks(PillowLeakTestCase): diff --git a/Tests/threaded_save.py b/Tests/threaded_save.py index ba8b17dbc..d8faffa0c 100644 --- a/Tests/threaded_save.py +++ b/Tests/threaded_save.py @@ -34,6 +34,7 @@ class Worker(threading.Thread): sys.stdout.write(".") queue.task_done() + t0 = time.time() threads = 20 diff --git a/Tests/versions.py b/Tests/versions.py index 89be1d7c8..abc1a3be9 100644 --- a/Tests/versions.py +++ b/Tests/versions.py @@ -7,6 +7,7 @@ def version(module, version): if v: print(version, v) + version(Image, "jpeglib") version(Image, "zlib") diff --git a/docs/example/DdsImagePlugin.py b/docs/example/DdsImagePlugin.py index 077590f22..71a5b50ea 100644 --- a/docs/example/DdsImagePlugin.py +++ b/docs/example/DdsImagePlugin.py @@ -271,6 +271,7 @@ class DXT5Decoder(ImageFile.PyDecoder): raise IOError("Truncated DDS file") return 0, 0 + Image.register_decoder('DXT1', DXT1Decoder) Image.register_decoder('DXT5', DXT5Decoder) diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 04c76cea5..f9e5ee5c8 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -216,6 +216,7 @@ class DibImageFile(BmpImageFile): # -------------------------------------------------------------------- # Write BMP file + SAVE = { "1": ("1", 1, 2), "L": ("L", 8, 256), @@ -279,6 +280,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # Registry + Image.register_open(BmpImageFile.format, BmpImageFile, _accept) Image.register_save(BmpImageFile.format, _save) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index 044d089bf..6013e2722 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -418,6 +418,7 @@ def _save(im, fp, filename, eps=1): # # -------------------------------------------------------------------- + Image.register_open(EpsImageFile.format, EpsImageFile, _accept) Image.register_save(EpsImageFile.format, _save) diff --git a/src/PIL/FpxImagePlugin.py b/src/PIL/FpxImagePlugin.py index 23f15f459..d7bba42eb 100644 --- a/src/PIL/FpxImagePlugin.py +++ b/src/PIL/FpxImagePlugin.py @@ -223,6 +223,7 @@ class FpxImageFile(ImageFile.ImageFile): # # -------------------------------------------------------------------- + Image.register_open(FpxImageFile.format, FpxImageFile, _accept) Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/src/PIL/GbrImagePlugin.py b/src/PIL/GbrImagePlugin.py index b8b9f1a3c..bd4c12f21 100644 --- a/src/PIL/GbrImagePlugin.py +++ b/src/PIL/GbrImagePlugin.py @@ -89,5 +89,6 @@ class GbrImageFile(ImageFile.ImageFile): # # registry + Image.register_open(GbrImageFile.format, GbrImageFile, _accept) Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 71d8ce59a..a425e8b62 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -292,6 +292,7 @@ class GifImageFile(ImageFile.ImageFile): # -------------------------------------------------------------------- # Write GIF files + RAWMODE = { "1": "L", "L": "L", diff --git a/src/PIL/GimpGradientFile.py b/src/PIL/GimpGradientFile.py index 43cd72649..10593da24 100644 --- a/src/PIL/GimpGradientFile.py +++ b/src/PIL/GimpGradientFile.py @@ -55,6 +55,7 @@ def sphere_increasing(middle, pos): def sphere_decreasing(middle, pos): return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) + SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 7c1bd5882..6f9686aa5 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -342,6 +342,7 @@ def _save(im, fp, filename): if retcode: raise CalledProcessError(retcode, convert_cmd) + Image.register_open(IcnsImageFile.format, IcnsImageFile, lambda x: x[:4] == b'icns') Image.register_extension(IcnsImageFile.format, '.icns') diff --git a/src/PIL/ImImagePlugin.py b/src/PIL/ImImagePlugin.py index 81b1d7b6c..b87fa9083 100644 --- a/src/PIL/ImImagePlugin.py +++ b/src/PIL/ImImagePlugin.py @@ -294,6 +294,7 @@ class ImImageFile(ImageFile.ImageFile): # -------------------------------------------------------------------- # Save IM files + SAVE = { # mode: (im type, raw mode) "1": ("0 1", "1"), @@ -339,6 +340,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # Registry + Image.register_open(ImImageFile.format, ImImageFile) Image.register_save(ImImageFile.format, _save) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 1a763b653..fd47a0c1c 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -36,9 +36,11 @@ logger = logging.getLogger(__name__) class DecompressionBombWarning(RuntimeWarning): pass + class DecompressionBombError(Exception): pass + class _imaging_not_installed(object): # module placeholder def __getattr__(self, id): @@ -2745,6 +2747,7 @@ def register_extension(id, extension): """ EXTENSION[extension.lower()] = id.upper() + def register_extensions(id, extensions): """ Registers image extensions. This function should not be @@ -2756,6 +2759,7 @@ def register_extensions(id, extensions): for extension in extensions: register_extension(id, extension) + def registered_extensions(): """ Returns a dictionary containing all file extensions belonging @@ -2886,5 +2890,6 @@ def _apply_env_variables(env=None): except ValueError as e: warnings.warn("{0}: {1}".format(var_name, e)) + _apply_env_variables() atexit.register(core.clear_cache) diff --git a/src/PIL/ImageCms.py b/src/PIL/ImageCms.py index 85cdf6daa..d82e30efc 100644 --- a/src/PIL/ImageCms.py +++ b/src/PIL/ImageCms.py @@ -554,6 +554,7 @@ def buildProofTransform( except (IOError, TypeError, ValueError) as v: raise PyCMSError(v) + buildTransformFromOpenProfiles = buildTransform buildProofTransformFromOpenProfiles = buildProofTransform diff --git a/src/PIL/ImageColor.py b/src/PIL/ImageColor.py index 1c7bc31d5..4a1c90b27 100644 --- a/src/PIL/ImageColor.py +++ b/src/PIL/ImageColor.py @@ -139,6 +139,7 @@ def getcolor(color, mode): return color + (alpha,) return color + colormap = { # X11 colour table from https://drafts.csswg.org/css-color-4/, with # gray/grey spelling issues fixed. This is a superset of HTML 4.0 diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index a162b8ba6..f3b55e0c4 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -33,6 +33,7 @@ import sys LAYOUT_BASIC = 0 LAYOUT_RAQM = 1 + class _imagingft_not_installed(object): # module placeholder def __getattr__(self, id): diff --git a/src/PIL/ImageMath.py b/src/PIL/ImageMath.py index 2ccd1891b..c5bea708a 100644 --- a/src/PIL/ImageMath.py +++ b/src/PIL/ImageMath.py @@ -235,6 +235,7 @@ def imagemath_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_": diff --git a/src/PIL/ImageQt.py b/src/PIL/ImageQt.py index 36b4e1ebc..280cbc6fc 100644 --- a/src/PIL/ImageQt.py +++ b/src/PIL/ImageQt.py @@ -162,6 +162,7 @@ def _toqclass_helper(im): 'data': __data, 'im': im, 'format': format, 'colortable': colortable } + if qt_is_installed: class ImageQt(QImage): diff --git a/src/PIL/ImageStat.py b/src/PIL/ImageStat.py index f3c138b3a..cd58fc8ff 100644 --- a/src/PIL/ImageStat.py +++ b/src/PIL/ImageStat.py @@ -144,4 +144,5 @@ class Stat(object): v.append(math.sqrt(self.var[i])) return v + Global = Stat # compatibility diff --git a/src/PIL/Jpeg2KImagePlugin.py b/src/PIL/Jpeg2KImagePlugin.py index c67cc14bf..4619cc523 100644 --- a/src/PIL/Jpeg2KImagePlugin.py +++ b/src/PIL/Jpeg2KImagePlugin.py @@ -266,6 +266,7 @@ def _save(im, fp, filename): # ------------------------------------------------------------ # Registry stuff + Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) Image.register_save(Jpeg2KImageFile.format, _save) diff --git a/src/PIL/PSDraw.py b/src/PIL/PSDraw.py index fe0823860..de34713ea 100644 --- a/src/PIL/PSDraw.py +++ b/src/PIL/PSDraw.py @@ -153,6 +153,7 @@ class PSDraw(object): # Copyright (c) Fredrik Lundh 1994. # + EDROFF_PS = """\ /S { show } bind def /P { moveto show } bind def diff --git a/src/PIL/PalmImagePlugin.py b/src/PIL/PalmImagePlugin.py index e2b9d15ec..7d7b16579 100644 --- a/src/PIL/PalmImagePlugin.py +++ b/src/PIL/PalmImagePlugin.py @@ -90,6 +90,7 @@ def build_prototype_image(): image.putpalette(palettedata) return image + Palm8BitColormapImage = build_prototype_image() # OK, we now have in Palm8BitColormapImage, diff --git a/src/PIL/PcxImagePlugin.py b/src/PIL/PcxImagePlugin.py index b847c9e7c..564713a98 100644 --- a/src/PIL/PcxImagePlugin.py +++ b/src/PIL/PcxImagePlugin.py @@ -110,6 +110,7 @@ class PcxImageFile(ImageFile.ImageFile): # -------------------------------------------------------------------- # save PCX files + SAVE = { # mode: (version, bits, planes, raw mode) "1": (2, 1, 1, "1"), @@ -171,6 +172,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # registry + Image.register_open(PcxImageFile.format, PcxImageFile, _accept) Image.register_save(PcxImageFile.format, _save) diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py index 86bc9c8e9..fd48c7297 100644 --- a/src/PIL/PdfImagePlugin.py +++ b/src/PIL/PdfImagePlugin.py @@ -263,6 +263,7 @@ def _save(im, fp, filename, save_all=False): # # -------------------------------------------------------------------- + Image.register_save("PDF", _save) Image.register_save_all("PDF", _save_all) diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py index 4b9f5da5e..621e19b9a 100644 --- a/src/PIL/PngImagePlugin.py +++ b/src/PIL/PngImagePlugin.py @@ -85,6 +85,7 @@ def _safe_zlib_decompress(s): raise ValueError("Decompressed Data Too Large") return plaintext + def _crc32(data, seed=0): return zlib.crc32(data, seed) & 0xffffffff diff --git a/src/PIL/PpmImagePlugin.py b/src/PIL/PpmImagePlugin.py index 7e6995b81..c599ba8d5 100644 --- a/src/PIL/PpmImagePlugin.py +++ b/src/PIL/PpmImagePlugin.py @@ -150,6 +150,7 @@ def _save(im, fp, filename): # # -------------------------------------------------------------------- + Image.register_open(PpmImageFile.format, PpmImageFile, _accept) Image.register_save(PpmImageFile.format, _save) diff --git a/src/PIL/PsdImagePlugin.py b/src/PIL/PsdImagePlugin.py index ee8032717..f6e04f78b 100644 --- a/src/PIL/PsdImagePlugin.py +++ b/src/PIL/PsdImagePlugin.py @@ -301,6 +301,7 @@ def _maketile(file, mode, bbox, channels): # -------------------------------------------------------------------- # registry + Image.register_open(PsdImageFile.format, PsdImageFile, _accept) Image.register_extension(PsdImageFile.format, ".psd") diff --git a/src/PIL/SgiImagePlugin.py b/src/PIL/SgiImagePlugin.py index 7966491d2..8b34561e5 100644 --- a/src/PIL/SgiImagePlugin.py +++ b/src/PIL/SgiImagePlugin.py @@ -193,6 +193,7 @@ def _save(im, fp, filename): fp.close() + class SGI16Decoder(ImageFile.PyDecoder): _pulls_fd = True diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index b65f181d8..d89a3e1b3 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -51,6 +51,7 @@ def isInt(f): except (ValueError, OverflowError): return 0 + iforms = [1, 3, -11, -12, -21, -22] @@ -279,6 +280,7 @@ def _save_spider(im, fp, filename): # -------------------------------------------------------------------- + Image.register_open(SpiderImageFile.format, SpiderImageFile) Image.register_save(SpiderImageFile.format, _save_spider) diff --git a/src/PIL/SunImagePlugin.py b/src/PIL/SunImagePlugin.py index afee7d1a7..fd5e82724 100644 --- a/src/PIL/SunImagePlugin.py +++ b/src/PIL/SunImagePlugin.py @@ -130,6 +130,7 @@ class SunImageFile(ImageFile.ImageFile): # # registry + Image.register_open(SunImageFile.format, SunImageFile, _accept) Image.register_extension(SunImageFile.format, ".ras") diff --git a/src/PIL/TgaImagePlugin.py b/src/PIL/TgaImagePlugin.py index a9596bd5f..76d9ba8de 100644 --- a/src/PIL/TgaImagePlugin.py +++ b/src/PIL/TgaImagePlugin.py @@ -130,6 +130,7 @@ class TgaImageFile(ImageFile.ImageFile): # -------------------------------------------------------------------- # Write TGA file + SAVE = { "1": ("1", 1, 0, 3), "L": ("L", 8, 0, 3), @@ -186,6 +187,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # Registry + Image.register_open(TgaImageFile.format, TgaImageFile) Image.register_save(TgaImageFile.format, _save) diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 17f456930..8387cac14 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -1286,7 +1286,6 @@ class TiffImageFile(ImageFile.ImageFile): if ';16L' in rawmode: rawmode = rawmode.replace(';16L', ';16N') - # Offset in the tile tuple is 0, we go from 0,0 to # w,h, and we only do this once -- eds a = (rawmode, self._compression, False) diff --git a/src/PIL/TiffTags.py b/src/PIL/TiffTags.py index d3150775c..8700b62bf 100644 --- a/src/PIL/TiffTags.py +++ b/src/PIL/TiffTags.py @@ -355,6 +355,7 @@ def _populate(): TAGS_V2[k] = TagInfo(k, *v) + _populate() ## # Map type numbers to type names -- defined in ImageFileDirectory. diff --git a/src/PIL/WalImageFile.py b/src/PIL/WalImageFile.py index 69964f7be..6602cc86b 100644 --- a/src/PIL/WalImageFile.py +++ b/src/PIL/WalImageFile.py @@ -74,6 +74,7 @@ def open(filename): with builtins.open(filename, "rb") as fp: return imopen(fp) + quake2palette = ( # default palette taken from piffo 0.93 by Hans Häggström b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" diff --git a/src/PIL/WmfImagePlugin.py b/src/PIL/WmfImagePlugin.py index fea436b3a..173ddb25b 100644 --- a/src/PIL/WmfImagePlugin.py +++ b/src/PIL/WmfImagePlugin.py @@ -42,6 +42,7 @@ def register_handler(handler): global _handler _handler = handler + if hasattr(Image.core, "drawwmf"): # install default handler (windows only) @@ -161,6 +162,7 @@ def _save(im, fp, filename): # -------------------------------------------------------------------- # Registry stuff + Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) Image.register_save(WmfStubImageFile.format, _save) diff --git a/src/PIL/XpmImagePlugin.py b/src/PIL/XpmImagePlugin.py index b6e69802d..a5cca0e27 100644 --- a/src/PIL/XpmImagePlugin.py +++ b/src/PIL/XpmImagePlugin.py @@ -121,6 +121,7 @@ class XpmImageFile(ImageFile.ImageFile): # # Registry + Image.register_open(XpmImageFile.format, XpmImageFile, _accept) Image.register_extension(XpmImageFile.format, ".xpm") diff --git a/src/PIL/features.py b/src/PIL/features.py index a234b8098..d96bf385f 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -8,6 +8,7 @@ modules = { "webp": "PIL._webp", } + def check_module(feature): if not (feature in modules): raise ValueError("Unknown module %s" % feature) @@ -20,9 +21,11 @@ def check_module(feature): except ImportError: return False + def get_supported_modules(): return [f for f in modules if check_module(f)] + codecs = { "jpg": "jpeg", "jpg_2000": "jpeg2k", @@ -30,6 +33,7 @@ codecs = { "libtiff": "libtiff" } + def check_codec(feature): if feature not in codecs: raise ValueError("Unknown codec %s" % feature) @@ -42,6 +46,7 @@ def check_codec(feature): def get_supported_codecs(): return [f for f in codecs if check_codec(f)] + features = { "webp_anim": ("PIL._webp", 'HAVE_WEBPANIM'), "webp_mux": ("PIL._webp", 'HAVE_WEBPMUX'), @@ -49,6 +54,7 @@ features = { "raqm": ("PIL._imagingft", "HAVE_RAQM") } + def check_feature(feature): if feature not in features: raise ValueError("Unknown feature %s" % feature) @@ -71,9 +77,9 @@ def check(feature): feature in codecs and check_codec(feature) or \ feature in features and check_feature(feature)) + def get_supported(): ret = get_supported_modules() ret.extend(get_supported_features()) ret.extend(get_supported_codecs()) return ret - diff --git a/winbuild/fetch.py b/winbuild/fetch.py index 7d140fd35..b7acb63ac 100644 --- a/winbuild/fetch.py +++ b/winbuild/fetch.py @@ -14,5 +14,6 @@ def fetch(url): fd.write(content) return name + if __name__ == '__main__': fetch(sys.argv[1]) diff --git a/winbuild/untar.py b/winbuild/untar.py index 95b1c2254..d85be384c 100644 --- a/winbuild/untar.py +++ b/winbuild/untar.py @@ -6,5 +6,6 @@ def untar(src, dest): with tarfile.open(src, 'r:gz') as tgz: tgz.extractall(dest) + if __name__ == '__main__': untar(sys.argv[1], sys.argv[2]) diff --git a/winbuild/unzip.py b/winbuild/unzip.py index 92d385fa6..5a464757c 100644 --- a/winbuild/unzip.py +++ b/winbuild/unzip.py @@ -6,5 +6,6 @@ def unzip(src, dest): with zipfile.ZipFile(src) as zf: zf.extractall(dest) + if __name__ == '__main__': unzip(sys.argv[1], sys.argv[2])