[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

pygtk2 and its numpy dependency



pygtk2 implements a function called gtk.gdk.get_pixels_array(), which
returns the pixel contents of a GDK pixbuf as a numpy array.  Fine and
dandy, but this means it links against numpy (7 megs) which is itself
linked against atlas (12 megs).  Kind of a lot for a single function,
especially on a live image.

Especially for a function that's basically unused!  gnome-applet-music
uses it to implement a poor-man's Porter-Duff blend, and that's the only
caller currently packaged in Fedora, at least according to package deps.
I have a patch (attached) that fixes that [1], which means we could
compile our pygtk2 without numpy support and not break anything in
Fedora proper.

However, google codesearch does turn up what look like a few other users
of that function, some of which we may actually want to ship someday.
So we've got options:

a) remove the explicit Requires: numpy from pygtk2, require apps that
actually want this function to Require it themselves

b) fake the numpy data type ABI in pygtk2 itself by cult-and-pasting it
from numpy

c) declare that get_pixels_array() just doesn't work in Fedora
(historically true, back in like FC3)

d) leave things as they are

I lean towards a).  I think b) is icky but doable, since that ABI is
effectively unbreakable anyway (inherited from the older python-numeric
module).  The other two are way lame.

Thoughts?

[1] - Readers are invited to count the wtf's in the code being replaced,
as well as in its callers.  Don't treat it as a drinking game though.

- ajax
diff -up ./music-applet-2.5.1/src/musicapplet/applet.py.jx ./music-applet-2.5.1/src/musicapplet/applet.py
--- ./music-applet-2.5.1/src/musicapplet/applet.py.jx	2009-08-10 15:03:29.000000000 -0400
+++ ./music-applet-2.5.1/src/musicapplet/applet.py	2009-08-10 15:03:36.000000000 -0400
@@ -831,22 +831,11 @@ class Rating (gtk.EventBox):
 
 
     def create_colorized_pixbuf (self, stock_pixbuf, color):
-        pixbuf = stock_pixbuf.copy ()
-        red_scale = color.red / 65535.0
-        green_scale = color.green / 65535.0
-        blue_scale = color.blue / 65535.0
-        for row in pixbuf.get_pixels_array ():
-            for pixel in row:
-                # Yay API changes!
-                if str (type (pixel[0])) == "<type 'array'>":
-                    pixel[0][0] *= red_scale
-                    pixel[1][0] *= green_scale
-                    pixel[2][0] *= blue_scale
-                else:
-                    pixel[0] *= red_scale
-                    pixel[1] *= green_scale
-                    pixel[2] *= blue_scale
-        return pixbuf
+	pixbuf = stock_pixbuf.composite_color_simple(stock_pixbuf.get_width(),
+						     stock_pixbuf.get_height(),
+						     gtk.gdk.INTERP_NEAREST,
+						     255, 1, color, color)
+	return pixbuf
 
 
 

Attachment: signature.asc
Description: This is a digitally signed message part


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]