Add Python 2.6 compatibility, disabled one API method in evas.Image

Image.image_data_memoryview_get was disabled.

This method can be added back once we figure out how to do conditional
compilation using Python version.

Using an evas.Image instance as a memoryview object should do the same
thing as the disabled method.
This commit is contained in:
Kai Huuhko 2013-12-28 18:26:52 +02:00
parent cacde3e38a
commit a9a944b17b
4 changed files with 105 additions and 85 deletions

View File

@ -2,8 +2,8 @@
1. REQUIREMENTS:
----------------
* Python 2.7 or higher (http://www.python.org/)
- Tested with Python 2.7 / 3.2
* Python 2.6 or higher (http://www.python.org/)
- Tested with Python 2.6 / 2.7 / 3.2 / 3.3
* Cython 0.17.0 or higher (http://cython.org/)
- Tested with Cython 0.17.1
@ -89,6 +89,8 @@
tests or use the 00_run_all_tests.py in each folder or even in the tests/ base
dir to run all the tests at once.
Python 2.7 is required for running the tests.
The scripts in examples/ folder must be run by the user as they require
user interaction.

View File

@ -497,99 +497,99 @@ cdef class Image(Object):
PyBuffer_Release(&view)
def image_data_memoryview_get(self, bint for_writing=False, bint simple=True):
"""image_data_memoryview_get(bool for_writing) -> MemoryView
# def image_data_memoryview_get(self, bint for_writing=False, bint simple=True):
# """image_data_memoryview_get(bool for_writing) -> MemoryView
Get a MemoryView object to the raw image data of the given image object.
# Get a MemoryView object to the raw image data of the given image object.
:param bool for_writing: Whether the data being retrieved will be
modified or not.
:param bool simple: Whether the MemoryView is 1D or 2D
:return MemoryView: The raw image data.
# :param bool for_writing: Whether the data being retrieved will be
# modified or not.
# :param bool simple: Whether the MemoryView is 1D or 2D
# :return MemoryView: The raw image data.
This method returns a MemoryView object to an image object's internal pixel
buffer, for reading only or read/write. If you request it for
writing, the image will be marked dirty so that it gets redrawn at
the next update.
# This method returns a MemoryView object to an image object's internal pixel
# buffer, for reading only or read/write. If you request it for
# writing, the image will be marked dirty so that it gets redrawn at
# the next update.
Each time you call this method on an image object, its data
buffer will have an internal reference counter
incremented. Decrement it back by using
:py:func:`image_data_set`.
# Each time you call this method on an image object, its data
# buffer will have an internal reference counter
# incremented. Decrement it back by using
# :py:func:`image_data_set`.
This is best suited for when you want to modify an existing image,
without changing its dimensions.
# This is best suited for when you want to modify an existing image,
# without changing its dimensions.
.. note::
The contents' format returned by it depend on the color
space of the given image object.
# .. note::
# The contents' format returned by it depend on the color
# space of the given image object.
.. note::
You may want to use :py:func:`image_data_update_add` to
inform data changes, if you did any.
# .. note::
# You may want to use :py:func:`image_data_update_add` to
# inform data changes, if you did any.
"""
cdef int stride, h, bpp, cspace, have_alpha, img_size
# """
# cdef int stride, h, bpp, cspace, have_alpha, img_size
stride = evas_object_image_stride_get(self.obj)
evas_object_image_size_get(self.obj, NULL, &h)
cspace = evas_object_image_colorspace_get(self.obj)
have_alpha = evas_object_image_alpha_get(self.obj)
# stride = evas_object_image_stride_get(self.obj)
# evas_object_image_size_get(self.obj, NULL, &h)
# cspace = evas_object_image_colorspace_get(self.obj)
# have_alpha = evas_object_image_alpha_get(self.obj)
bpp = 0
if cspace == EVAS_COLORSPACE_ARGB8888:
bpp = 4
format = "L"
elif cspace == EVAS_COLORSPACE_RGB565_A5P:
if have_alpha == 0:
bpp = 2
format = "H"
else:
pass #bpp = 3
# XXX: There's no type that has three bytes.
# Is the format string actually used?
if bpp == 0:
raise ValueError("Unsupported colorspace")
# bpp = 0
# if cspace == EVAS_COLORSPACE_ARGB8888:
# bpp = 4
# format = "L"
# elif cspace == EVAS_COLORSPACE_RGB565_A5P:
# if have_alpha == 0:
# bpp = 2
# format = "H"
# else:
# pass #bpp = 3
# # XXX: There's no type that has three bytes.
# # Is the format string actually used?
# if bpp == 0:
# raise ValueError("Unsupported colorspace")
img_size = stride * h * bpp
# img_size = stride * h * bpp
cdef Py_buffer *img_buf = <Py_buffer *>PyMem_Malloc(sizeof(Py_buffer))
if img_buf == NULL:
raise MemoryError
# cdef Py_buffer *img_buf = <Py_buffer *>PyMem_Malloc(sizeof(Py_buffer))
# if img_buf == NULL:
# raise MemoryError
cdef:
Py_ssize_t simple_shape[1]
Py_ssize_t shape[2]
Py_ssize_t strides[2]
Py_ssize_t suboffsets[2]
# cdef:
# Py_ssize_t simple_shape[1]
# Py_ssize_t shape[2]
# Py_ssize_t strides[2]
# Py_ssize_t suboffsets[2]
if simple:
simple_shape[0] = img_size
else:
shape[0] = stride / bpp
shape[1] = h
strides[0] = stride
strides[1] = h * bpp
suboffsets[0] = -1
suboffsets[1] = -1
# if simple:
# simple_shape[0] = img_size
# else:
# shape[0] = stride / bpp
# shape[1] = h
# strides[0] = stride
# strides[1] = h * bpp
# suboffsets[0] = -1
# suboffsets[1] = -1
img_buf.buf = evas_object_image_data_get(self.obj, for_writing)
img_buf.len = img_size
img_buf.readonly = not for_writing
img_buf.format = format
if simple:
img_buf.ndim = 1
img_buf.shape = simple_shape
img_buf.strides = NULL
img_buf.suboffsets = NULL
else:
img_buf.ndim = 2
img_buf.shape = shape
img_buf.strides = strides
img_buf.suboffsets = suboffsets
img_buf.itemsize = bpp
# img_buf.buf = evas_object_image_data_get(self.obj, for_writing)
# img_buf.len = img_size
# img_buf.readonly = not for_writing
# img_buf.format = format
# if simple:
# img_buf.ndim = 1
# img_buf.shape = simple_shape
# img_buf.strides = NULL
# img_buf.suboffsets = NULL
# else:
# img_buf.ndim = 2
# img_buf.shape = shape
# img_buf.strides = strides
# img_buf.suboffsets = suboffsets
# img_buf.itemsize = bpp
return <object>PyMemoryView_FromBuffer(img_buf)
# return <object>PyMemoryView_FromBuffer(img_buf)
# TODO:

View File

@ -110,7 +110,9 @@ cdef object add_logger(object name):
else:
log.propagate = True
log.setLevel(logging.WARNING)
log.addHandler(logging.NullHandler())
if PY_VERSION_HEX >= 0x02070000:
log.addHandler(logging.NullHandler())
logging.setLoggerClass(logging.Logger)

View File

@ -37,18 +37,34 @@ except ImportError:
def pkg_config(name, require, min_vers=None):
try:
sys.stdout.write("Checking for " + name + ": ")
ver = subprocess.check_output(["pkg-config", "--modversion", require]).decode("utf-8").strip()
call = subprocess.Popen(
["pkg-config", "--modversion", require], stdout=subprocess.PIPE)
out, err = call.communicate()
ver = out.decode("utf-8").strip()
if min_vers is not None:
assert 0 == subprocess.call(["pkg-config", "--atleast-version", min_vers, require])
cflags = subprocess.check_output(["pkg-config", "--cflags", require]).decode("utf-8").split()
libs = subprocess.check_output(["pkg-config", "--libs", require]).decode("utf-8").split()
assert 0 == subprocess.call(
["pkg-config", "--atleast-version", min_vers, require])
call = subprocess.Popen(
["pkg-config", "--cflags", require], stdout=subprocess.PIPE)
out, err = call.communicate()
cflags = out.decode("utf-8").split()
call = subprocess.Popen(
["pkg-config", "--libs", require], stdout=subprocess.PIPE)
out, err = call.communicate()
libs = out.decode("utf-8").split()
sys.stdout.write("OK, found " + ver + "\n")
return (cflags, libs)
except (OSError, subprocess.CalledProcessError):
print("Did not find " + name + " with 'pkg-config'.")
return None
except (AssertionError):
print(name + " version mismatch. Found: " + ver + " Needed: " + min_vers)
print(name+" version mismatch. Found: "+ver+" Needed: "+min_vers)
return None