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


Reply via email to