Pillow/Tests/test_cffi.py

149 lines
4.4 KiB
Python
Raw Normal View History

2014-09-05 13:36:24 +04:00
from helper import unittest, PillowTestCase, hopper
2014-01-05 22:41:25 +04:00
try:
import cffi
2014-06-10 13:10:47 +04:00
from PIL import PyAccess
2015-05-27 02:15:45 +03:00
except ImportError:
2014-06-10 13:10:47 +04:00
# Skip in setUp()
pass
2014-01-05 22:41:25 +04:00
2014-06-10 13:10:47 +04:00
from PIL import Image
2014-01-05 22:41:25 +04:00
2014-06-10 13:10:47 +04:00
from test_image_putpixel import TestImagePutPixel
from test_image_getpixel import TestImageGetPixel
2014-01-05 22:41:25 +04:00
Image.USE_CFFI_ACCESS = True
2014-06-10 13:10:47 +04:00
class TestCffiPutPixel(TestImagePutPixel):
def setUp(self):
try:
import cffi
2015-05-27 02:15:45 +03:00
except ImportError:
2014-06-10 13:10:47 +04:00
self.skipTest("No cffi")
def test_put(self):
self.test_sanity()
class TestCffiGetPixel(TestImageGetPixel):
def setUp(self):
try:
import cffi
2015-05-27 02:15:45 +03:00
except ImportError:
2014-06-10 13:10:47 +04:00
self.skipTest("No cffi")
def test_get(self):
self.test_basic()
self.test_signedness()
class TestCffi(PillowTestCase):
def setUp(self):
try:
import cffi
2015-05-27 02:15:45 +03:00
except ImportError:
2014-06-10 13:10:47 +04:00
self.skipTest("No cffi")
def _test_get_access(self, im):
2015-04-02 11:57:24 +03:00
"""Do we get the same thing as the old pixel access
2014-06-10 13:10:47 +04:00
2015-04-02 11:57:24 +03:00
Using private interfaces, forcing a capi access and
a pyaccess for the same image"""
2014-06-10 13:10:47 +04:00
caccess = im.im.pixel_access(False)
access = PyAccess.new(im, False)
w, h = im.size
for x in range(0, w, 10):
for y in range(0, h, 10):
self.assertEqual(access[(x, y)], caccess[(x, y)])
2015-07-03 08:03:25 +03:00
# Access an out-of-range pixel
self.assertRaises(ValueError,
lambda: access[(access.xsize+1, access.ysize+1)])
2014-06-10 13:10:47 +04:00
def test_get_vs_c(self):
2014-09-05 13:36:24 +04:00
rgb = hopper('RGB')
2014-06-10 13:10:47 +04:00
rgb.load()
self._test_get_access(rgb)
2014-09-05 13:36:24 +04:00
self._test_get_access(hopper('RGBA'))
self._test_get_access(hopper('L'))
self._test_get_access(hopper('LA'))
self._test_get_access(hopper('1'))
self._test_get_access(hopper('P'))
2015-07-03 09:22:56 +03:00
# self._test_get_access(hopper('PA')) # PA -- how do I make a PA image?
2014-09-05 13:36:24 +04:00
self._test_get_access(hopper('F'))
2014-06-10 13:10:47 +04:00
im = Image.new('I;16', (10, 10), 40000)
self._test_get_access(im)
im = Image.new('I;16L', (10, 10), 40000)
self._test_get_access(im)
im = Image.new('I;16B', (10, 10), 40000)
self._test_get_access(im)
im = Image.new('I', (10, 10), 40000)
self._test_get_access(im)
# These don't actually appear to be modes that I can actually make,
# as unpack sets them directly into the I mode.
# im = Image.new('I;32L', (10, 10), -2**10)
# self._test_get_access(im)
# im = Image.new('I;32B', (10, 10), 2**10)
# self._test_get_access(im)
def _test_set_access(self, im, color):
2015-04-02 11:57:24 +03:00
"""Are we writing the correct bits into the image?
2014-06-10 13:10:47 +04:00
2015-04-02 11:57:24 +03:00
Using private interfaces, forcing a capi access and
a pyaccess for the same image"""
2014-06-10 13:10:47 +04:00
caccess = im.im.pixel_access(False)
access = PyAccess.new(im, False)
w, h = im.size
for x in range(0, w, 10):
for y in range(0, h, 10):
access[(x, y)] = color
self.assertEqual(color, caccess[(x, y)])
2015-07-03 08:03:25 +03:00
# Attempt to set the value on a read-only image
access = PyAccess.new(im, True)
try:
access[(0, 0)] = color
except ValueError:
return
self.fail("Putpixel did not fail on a read-only image")
2014-06-10 13:10:47 +04:00
def test_set_vs_c(self):
2014-09-05 13:36:24 +04:00
rgb = hopper('RGB')
2014-06-10 13:10:47 +04:00
rgb.load()
self._test_set_access(rgb, (255, 128, 0))
2014-09-05 13:36:24 +04:00
self._test_set_access(hopper('RGBA'), (255, 192, 128, 0))
self._test_set_access(hopper('L'), 128)
self._test_set_access(hopper('LA'), (128, 128))
self._test_set_access(hopper('1'), 255)
self._test_set_access(hopper('P'), 128)
2014-06-10 13:10:47 +04:00
# self._test_set_access(i, (128, 128)) #PA -- undone how to make
2014-09-05 13:36:24 +04:00
self._test_set_access(hopper('F'), 1024.0)
2014-06-10 13:10:47 +04:00
im = Image.new('I;16', (10, 10), 40000)
self._test_set_access(im, 45000)
im = Image.new('I;16L', (10, 10), 40000)
self._test_set_access(im, 45000)
im = Image.new('I;16B', (10, 10), 40000)
self._test_set_access(im, 45000)
im = Image.new('I', (10, 10), 40000)
self._test_set_access(im, 45000)
# im = Image.new('I;32L', (10, 10), -(2**10))
# self._test_set_access(im, -(2**13)+1)
# im = Image.new('I;32B', (10, 10), 2**10)
# self._test_set_access(im, 2**13-1)
if __name__ == '__main__':
unittest.main()
# End of file