Hello community, here is the log from the commit of package python-pyglet for openSUSE:Factory checked in at 2015-11-11 10:31:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pyglet (Old) and /work/SRC/openSUSE:Factory/.python-pyglet.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pyglet" Changes: -------- --- /work/SRC/openSUSE:Factory/python-pyglet/python-pyglet.changes 2015-11-10 10:01:50.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.python-pyglet.new/python-pyglet.changes 2015-11-11 10:35:48.000000000 +0100 @@ -1,0 +2,10 @@ +Thu Sep 3 08:47:16 UTC 2015 - [email protected] + +- Update to 1.2.4, announce message: + + Bugfixes: + - X11: Fix ContextException due to negative return value (#51) + - X11: Fix segmentation fault in GdkPixBuf (#50) + - OpenAL: Fix incompatibility with Python 3 (#57) + +------------------------------------------------------------------- Old: ---- pyglet-1.2.3.tar.gz New: ---- pyglet-1.2.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pyglet.spec ++++++ --- /var/tmp/diff_new_pack.rI4Z6k/_old 2015-11-11 10:35:49.000000000 +0100 +++ /var/tmp/diff_new_pack.rI4Z6k/_new 2015-11-11 10:35:49.000000000 +0100 @@ -19,7 +19,7 @@ %define oname pyglet Name: python-pyglet -Version: 1.2.3 +Version: 1.2.4 Release: 0 Summary: Cross-platform windowing and multimedia library License: BSD-3-Clause ++++++ pyglet-1.2.3.tar.gz -> pyglet-1.2.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyglet-1.2.3/PKG-INFO new/pyglet-1.2.4/PKG-INFO --- old/pyglet-1.2.3/PKG-INFO 2015-06-20 11:09:11.000000000 +0200 +++ new/pyglet-1.2.4/PKG-INFO 2015-09-02 11:21:26.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: pyglet -Version: 1.2.3 +Version: 1.2.4 Summary: Cross-platform windowing and multimedia library Home-page: http://pyglet.readthedocs.org/en/pyglet-1.2-maintenance/ Author: Alex Holkner diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyglet-1.2.3/RELEASE_NOTES new/pyglet-1.2.4/RELEASE_NOTES --- old/pyglet-1.2.3/RELEASE_NOTES 2015-05-30 15:33:02.000000000 +0200 +++ new/pyglet-1.2.4/RELEASE_NOTES 2015-08-17 21:12:32.000000000 +0200 @@ -1,3 +1,12 @@ +Pyglet 1.2.4 +============ +Minor bugfix release. + +Bugfixes: +- X11: Fix ContextException due to negative return value (#51) +- X11: Fix segmentation fault in GdkPixBuf (#50) +- OpenAL: Fix incompatibility with Python 3 (#57) + Pyglet 1.2.3 ============ Minor bugfix release. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyglet-1.2.3/pyglet/__init__.py new/pyglet-1.2.4/pyglet/__init__.py --- old/pyglet-1.2.3/pyglet/__init__.py 2015-06-20 11:03:40.000000000 +0200 +++ new/pyglet-1.2.4/pyglet/__init__.py 2015-09-02 11:18:45.000000000 +0200 @@ -57,7 +57,7 @@ #: >>> parse_version(pyglet.version) >= parse_version('1.1') #: True #: -version = '1.2.3' +version = '1.2.4' # Pyglet platform treats *BSD systems as Linux compat_platform = sys.platform diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyglet-1.2.3/pyglet/gl/xlib.py new/pyglet-1.2.4/pyglet/gl/xlib.py --- old/pyglet-1.2.3/pyglet/gl/xlib.py 2015-03-07 10:18:19.000000000 +0100 +++ new/pyglet-1.2.4/pyglet/gl/xlib.py 2015-08-17 20:59:00.000000000 +0200 @@ -194,13 +194,9 @@ self.x_display = config.canvas.display._display self.glx_context = self._create_glx_context(share) - glx_context_id = self.glx_context.contents._opaque_struct - if glx_context_id == glx.GLX_BAD_CONTEXT: - raise gl.ContextException('Invalid context share') - elif glx_context_id == glx.GLXBadFBConfig: - raise gl.ContextException('Invalid GL configuration') - elif glx_context_id < 0: - raise gl.ContextException('Could not create GL context') + if not self.glx_context: + # TODO: Check Xlib error generated + raise gl.ContextException('Could not create GL context') self._have_SGI_video_sync = \ config.glx_info.have_extension('GLX_SGI_video_sync') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyglet-1.2.3/pyglet/image/codecs/gdkpixbuf2.py new/pyglet-1.2.4/pyglet/image/codecs/gdkpixbuf2.py --- old/pyglet-1.2.3/pyglet/image/codecs/gdkpixbuf2.py 2015-05-30 12:51:01.000000000 +0200 +++ new/pyglet-1.2.4/pyglet/image/codecs/gdkpixbuf2.py 2015-08-17 20:59:00.000000000 +0200 @@ -32,12 +32,6 @@ # POSSIBILITY OF SUCH DAMAGE. # ---------------------------------------------------------------------------- -''' -''' - -__docformat__ = 'restructuredtext' -__version__ = '$Id$' - from ctypes import * from pyglet.gl import * @@ -61,119 +55,272 @@ gdkpixbuf.gdk_pixbuf_animation_get_iter.restype = POINTER(c_void_p) gdkpixbuf.gdk_pixbuf_animation_iter_get_pixbuf.restype = POINTER(GdkPixbuf) + class GTimeVal(Structure): _fields_ = [ ('tv_sec', c_long), ('tv_usec', c_long) ] -class GdkPixbuf2ImageDecoder(ImageDecoder): - def get_file_extensions(self): - return ['.png', '.xpm', '.jpg', '.jpeg', '.tif', '.tiff', '.pnm', - '.ras', '.bmp', '.gif'] - def get_animation_file_extensions(self): - return ['.gif', '.ani'] +GQuark = c_uint32 +gint = c_int +gchar = c_char - def _load(self, file, filename, load_func): - data = file.read() - loader = gdkpixbuf.gdk_pixbuf_loader_new() - gdkpixbuf.gdk_pixbuf_loader_write(loader, data, len(data), None) - if not gdkpixbuf.gdk_pixbuf_loader_close(loader, None): - raise ImageDecodeException(filename) - result = load_func(loader) - if not result: - raise ImageDecodeException('Unable to load: %s' % filename) - return result - - def _pixbuf_to_image(self, pixbuf): - # Get format and dimensions - width = gdkpixbuf.gdk_pixbuf_get_width(pixbuf) - height = gdkpixbuf.gdk_pixbuf_get_height(pixbuf) - channels = gdkpixbuf.gdk_pixbuf_get_n_channels(pixbuf) - rowstride = gdkpixbuf.gdk_pixbuf_get_rowstride(pixbuf) - #has_alpha = gdkpixbuf.gdk_pixbuf_get_has_alpha(pixbuf) - pixels = gdkpixbuf.gdk_pixbuf_get_pixels(pixbuf) - - # Copy pixel data. - buffer = (c_ubyte * (rowstride * height))() - memmove(buffer, pixels, rowstride * (height - 1) + width * channels) - # Release pixbuf - gdk.g_object_unref(pixbuf) +class GError(Structure): + _fields_ = [ + ('domain', GQuark), + ('code', gint), + ('message', POINTER(gchar)) + ] + +gerror_ptr = POINTER(GError) + +def _gerror_to_string(error): + """ + Convert a GError to a string. + `error` should be a valid pointer to a GError struct. + """ + return 'GdkPixBuf Error: domain[{}], code[{}]: {}'.format(error.contents.domain, + error.contents.code, + error.contents.message) + + +class GdkPixBufLoader(object): + """ + Wrapper around GdkPixBufLoader object. + """ + def __init__(self, file_, filename): + self.closed = False + self._file = file_ + self._filename = filename + self._loader = gdkpixbuf.gdk_pixbuf_loader_new() + if self._loader is None: + raise ImageDecodeException('Unable to instantiate gdk pixbuf loader') + self._load_file() + + def __del__(self): + if self._loader is not None: + if not self.closed: + self._cancel_load() + gdk.g_object_unref(self._loader) + + def _load_file(self): + assert self._file is not None + self._file.seek(0) + data = self._file.read() + self.write(data) + + def _finish_load(self): + assert not self.closed + error = gerror_ptr() + all_data_passed = gdkpixbuf.gdk_pixbuf_loader_close(self._loader, byref(error)) + self.closed = True + if not all_data_passed: + raise ImageDecodeException(_gerror_to_string(error)) + + def _cancel_load(self): + assert not self.closed + gdkpixbuf.gdk_pixbuf_loader_close(self._loader, None) + self.closed = True + + def write(self, data): + assert not self.closed, 'Cannot write after closing loader' + error = gerror_ptr() + if not gdkpixbuf.gdk_pixbuf_loader_write(self._loader, data, len(data), byref(error)): + raise ImageDecodeException(_gerror_to_string(error)) + + def get_pixbuf(self): + self._finish_load() + pixbuf = gdkpixbuf.gdk_pixbuf_loader_get_pixbuf(self._loader) + if pixbuf is None: + raise ImageDecodeException('Failed to get pixbuf from loader') + return GdkPixBuf(self, pixbuf) + + def get_animation(self): + self._finish_load() + anim = gdkpixbuf.gdk_pixbuf_loader_get_animation(self._loader) + if anim is None: + raise ImageDecodeException('Failed to get animation from loader') + gif_delays = self._get_gif_delays() + return GdkPixBufAnimation(self, anim, gif_delays) + + def _get_gif_delays(self): + # GDK pixbuf animations will loop indefinitely if looping is enabled for the + # gif, so get number of frames and delays from gif metadata + assert self._file is not None + self._file.seek(0) + gif_stream = gif.read(self._file) + return [image.delay for image in gif_stream.images] + + +class GdkPixBuf(object): + """ + Wrapper around GdkPixBuf object. + """ + def __init__(self, loader, pixbuf): + # Keep reference to loader alive + self._loader = loader + self._pixbuf = pixbuf + gdk.g_object_ref(pixbuf) + + def __del__(self): + if self._pixbuf is not None: + gdk.g_object_unref(self._pixbuf) + + def load_next(self): + return self._pixbuf is not None + + @property + def width(self): + assert self._pixbuf is not None + return gdkpixbuf.gdk_pixbuf_get_width(self._pixbuf) + + @property + def height(self): + assert self._pixbuf is not None + return gdkpixbuf.gdk_pixbuf_get_height(self._pixbuf) + + @property + def channels(self): + assert self._pixbuf is not None + return gdkpixbuf.gdk_pixbuf_get_n_channels(self._pixbuf) + + @property + def rowstride(self): + assert self._pixbuf is not None + return gdkpixbuf.gdk_pixbuf_get_rowstride(self._pixbuf) + + @property + def has_alpha(self): + assert self._pixbuf is not None + return gdkpixbuf.gdk_pixbuf_get_has_alpha(self._pixbuf) == 1 + + def get_pixels(self): + pixels = gdkpixbuf.gdk_pixbuf_get_pixels(self._pixbuf) + assert pixels is not None + buf = (c_ubyte * (self.rowstride * self.height))() + memmove(buf, pixels, self.rowstride * (self.height - 1) + self.width * self.channels) + return buf + + def to_image(self): + if self.width < 1 or self.height < 1 or self.channels < 1 or self.rowstride < 1: + return None + + pixels = self.get_pixels() # Determine appropriate GL type - if channels == 3: + if self.channels == 3: format = 'RGB' else: format = 'RGBA' - return ImageData(width, height, format, buffer, -rowstride) + return ImageData(self.width, self.height, format, pixels, -self.rowstride) - def decode(self, file, filename): - pixbuf = self._load(file, filename, - gdkpixbuf.gdk_pixbuf_loader_get_pixbuf) - - return self._pixbuf_to_image(pixbuf) - def decode_animation(self, file, filename): - # Extract GIF control data. If it's not a GIF, this method will - # raise. - gif_stream = gif.read(file) - delays = [image.delay for image in gif_stream.images] - - # Get GDK animation iterator - file.seek(0) - anim = self._load(file, filename, - gdkpixbuf.gdk_pixbuf_loader_get_animation) +class GdkPixBufAnimation(object): + """ + Wrapper for a GdkPixBufIter for an animation. + """ + def __init__(self, loader, anim, gif_delays): + self._loader = loader + self._anim = anim + self._gif_delays = gif_delays + gdk.g_object_ref(anim) + + def __del__(self): + if self._anim is not None: + gdk.g_object_unref(self._anim) + + def __iter__(self): time = GTimeVal(0, 0) - iter = gdkpixbuf.gdk_pixbuf_animation_get_iter(anim, byref(time)) + anim_iter = gdkpixbuf.gdk_pixbuf_animation_get_iter(self._anim, byref(time)) + return GdkPixBufAnimationIterator(self._loader, anim_iter, time, self._gif_delays) - frames = [] + def to_animation(self): + return Animation(list(self)) - # Extract each image - for control_delay in delays: - pixbuf = gdkpixbuf.gdk_pixbuf_animation_iter_get_pixbuf(iter) - # When attempting to load animated gifs with an alpha channel on - # linux gdkpixbuf will normally return a null pixbuf for the final - # frame resulting in a segfault: - # http://code.google.com/p/pyglet/issues/detail?id=411 - # Since it is unclear why exactly this happens, the workaround - # below is to start again and extract that frame on its own. - if pixbuf == None: - file.seek(0) - anim = self._load(file, filename, - gdkpixbuf.gdk_pixbuf_loader_get_animation) - temptime = GTimeVal(0, 0) - iter = gdkpixbuf.gdk_pixbuf_animation_get_iter(anim, byref(temptime)) - gdkpixbuf.gdk_pixbuf_animation_iter_advance(iter, byref(time)) - pixbuf = gdkpixbuf.gdk_pixbuf_animation_iter_get_pixbuf(iter) - image = self._pixbuf_to_image(pixbuf) - frames.append(AnimationFrame(image, control_delay)) - - gdk_delay = gdkpixbuf.gdk_pixbuf_animation_iter_get_delay_time(iter) - - if gdk_delay == -1: - break - - gdk_delay = gdkpixbuf.gdk_pixbuf_animation_iter_get_delay_time(iter) - gdk_delay *= 1000 # milliseconds to microseconds - # Compare gdk_delay to control_delay for interest only. - #print control_delay, gdk_delay / 1000000. - - us = time.tv_usec + gdk_delay - time.tv_sec += us // 1000000 - time.tv_usec = us % 1000000 - gdkpixbuf.gdk_pixbuf_animation_iter_advance(iter, byref(time)) - return Animation(frames) +class GdkPixBufAnimationIterator(object): + def __init__(self, loader, anim_iter, start_time, gif_delays): + self._iter = anim_iter + self._first = True + self._time = start_time + self._loader = loader + self._gif_delays = gif_delays + self.delay_time = None + + def __del__(self): + if self._iter is not None: + gdk.g_object_unref(self._iter) + # The pixbuf returned by the iter is owned by the iter, so no need to destroy that one + + def __iter__(self): + return self + + def next(self): + self._advance() + frame = self.get_frame() + if frame is None: + raise StopIteration + return frame + + def _advance(self): + if not self._gif_delays: + raise StopIteration + self.delay_time = self._gif_delays.pop(0) + + if self._first: + self._first = False + else: + if self.gdk_delay_time == -1: + raise StopIteration + else: + gdk_delay = self.gdk_delay_time * 1000 # milliseconds to microseconds + us = self._time.tv_usec + gdk_delay + self._time.tv_sec += us // 1000000 + self._time.tv_usec = us % 1000000 + gdkpixbuf.gdk_pixbuf_animation_iter_advance(self._iter, byref(self._time)) + + def get_frame(self): + pixbuf = gdkpixbuf.gdk_pixbuf_animation_iter_get_pixbuf(self._iter) + if pixbuf is None: + return None + image = GdkPixBuf(self._loader, pixbuf).to_image() + return AnimationFrame(image, self.delay_time) + + @property + def gdk_delay_time(self): + assert self._iter is not None + return gdkpixbuf.gdk_pixbuf_animation_iter_get_delay_time(self._iter) + + +class GdkPixbuf2ImageDecoder(ImageDecoder): + def get_file_extensions(self): + return ['.png', '.xpm', '.jpg', '.jpeg', '.tif', '.tiff', '.pnm', + '.ras', '.bmp', '.gif'] + + def get_animation_file_extensions(self): + return ['.gif', '.ani'] + + def decode(self, file, filename): + loader = GdkPixBufLoader(file, filename) + return loader.get_pixbuf().to_image() + + def decode_animation(self, file, filename): + loader = GdkPixBufLoader(file, filename) + return loader.get_animation().to_animation() + def get_decoders(): return [GdkPixbuf2ImageDecoder()] + def get_encoders(): return [] + def init(): gdk.g_type_init() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyglet-1.2.3/pyglet/media/drivers/openal/__init__.py new/pyglet-1.2.4/pyglet/media/drivers/openal/__init__.py --- old/pyglet-1.2.3/pyglet/media/drivers/openal/__init__.py 2015-06-20 11:01:55.000000000 +0200 +++ new/pyglet-1.2.4/pyglet/media/drivers/openal/__init__.py 2015-08-17 21:12:32.000000000 +0200 @@ -609,7 +609,7 @@ def get_extensions(self): extensions = alc.alcGetString(self._device, alc.ALC_EXTENSIONS) if pyglet.compat_platform == 'darwin' or pyglet.compat_platform.startswith('linux'): - return ctypes.cast(extensions, ctypes.c_char_p).value.split(' ') + return ctypes.cast(extensions, ctypes.c_char_p).value.split(b' ') else: return _split_nul_strings(extensions) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyglet-1.2.3/pyglet.egg-info/PKG-INFO new/pyglet-1.2.4/pyglet.egg-info/PKG-INFO --- old/pyglet-1.2.3/pyglet.egg-info/PKG-INFO 2015-06-20 11:09:11.000000000 +0200 +++ new/pyglet-1.2.4/pyglet.egg-info/PKG-INFO 2015-09-02 11:21:26.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: pyglet -Version: 1.2.3 +Version: 1.2.4 Summary: Cross-platform windowing and multimedia library Home-page: http://pyglet.readthedocs.org/en/pyglet-1.2-maintenance/ Author: Alex Holkner diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyglet-1.2.3/setup.py new/pyglet-1.2.4/setup.py --- old/pyglet-1.2.3/setup.py 2015-06-20 11:03:25.000000000 +0200 +++ new/pyglet-1.2.4/setup.py 2015-09-02 11:18:45.000000000 +0200 @@ -6,7 +6,7 @@ from setuptools import setup, find_packages # Bump pyglet/__init__.py version as well. -VERSION = '1.2.3' +VERSION = '1.2.4' long_description = '''pyglet provides an object-oriented programming interface for developing games and other visually-rich applications
