Hi Daniel,

thanks for the patch!

On 03/06/2012 10:08 PM, Daniel Drake wrote:
We currently use some strange code inside hippo to paint a pixbuf onto
a cairo surface. This can be more effectively done within GDK.

Agreed.

This solves a Sugar crash-on-startup on Fedora 17, where this hippo
code is crashing, and uses the same underlying mechanism as
sugar-toolkit-gtk3.

Yes, your patch does fix the breakage in F17. The breakage has been introduced between the alpha release day and today, I wonder what package exactly caused it. Out of curiosity, Do you know that?

Also use cairo.Context.set_source_rgb() for setting the background
colour, which avoids the requirement to encapsulate the cairo context
at an early stage (which would make the rest of this patch a little
more complicated).

Can't we do the same than in toolkit-gtk3? Or do I misinterpret your words. The code from below works for me.

diff --git a/src/sugar/graphics/icon.py b/src/sugar/graphics/icon.py
index 3f540d7..1736c27 100644
--- a/src/sugar/graphics/icon.py
+++ b/src/sugar/graphics/icon.py
@@ -280,10 +280,9 @@ class _IconBuffer(object):
             surface = cairo.ImageSurface(cairo.FORMAT_RGB24, int(width),
                                          int(height))
             context = cairo.Context(surface)
-            context.set_source_rgb(self.background_color.red,
-                                   self.background_color.blue,
-                                   self.background_color.green)
-            context.paint()
+            gdkcontext = gtk.gdk.CairoContext(context)
+            gdkcontext.set_source_color(self.background_color)
+            gdkcontext.paint()

         context.scale(float(width) / (icon_width + padding * 2),
                       float(height) / (icon_height + padding * 2))

Regards,
   Simon

Signed-off-by: Daniel Drake<d...@laptop.org>
---
  src/sugar/graphics/icon.py |   24 ++++++++++++------------
  1 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/sugar/graphics/icon.py b/src/sugar/graphics/icon.py
index 62a79f6..3f540d7 100644
--- a/src/sugar/graphics/icon.py
+++ b/src/sugar/graphics/icon.py
@@ -182,9 +182,9 @@ class _IconBuffer(object):

              if not sensitive:
                  pixbuf = self._get_insensitive_pixbuf(pixbuf, widget)
-            surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf)
-            context.set_source_surface(surface, 0, 0)
-            context.paint()
+            gdkcontext = gtk.gdk.CairoContext(context)
+            gdkcontext.set_source_pixbuf(pixbuf, 0, 0)
+            gdkcontext.paint()

      def _get_size(self, icon_width, icon_height, padding):
          if self.width is not None and self.height is not None:
@@ -280,8 +280,9 @@ class _IconBuffer(object):
              surface = cairo.ImageSurface(cairo.FORMAT_RGB24, int(width),
                                           int(height))
              context = cairo.Context(surface)
-            context = gtk.gdk.CairoContext(context)
-            context.set_source_color(self.background_color)
+            context.set_source_rgb(self.background_color.red,
+                                   self.background_color.blue,
+                                   self.background_color.green)
              context.paint()

          context.scale(float(width) / (icon_width + padding * 2),
@@ -295,16 +296,15 @@ class _IconBuffer(object):
              else:
                  pixbuf = handle.get_pixbuf()
                  pixbuf = self._get_insensitive_pixbuf(pixbuf, widget)
-
-                pixbuf_surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf)
-                context.set_source_surface(pixbuf_surface, 0, 0)
-                context.paint()
+                gdkcontext = gtk.gdk.CairoContext(context)
+                gdkcontext.set_source_pixbuf(pixbuf, 0, 0)
+                gdkcontext.paint()
          else:
              if not sensitive:
                  pixbuf = self._get_insensitive_pixbuf(pixbuf, widget)
-            pixbuf_surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf)
-            context.set_source_surface(pixbuf_surface, 0, 0)
-            context.paint()
+            gdkcontext = gtk.gdk.CairoContext(context)
+            gdkcontext.set_source_pixbuf(pixbuf, 0, 0)
+            gdkcontext.paint()

          if self.badge_name:
              context.restore()

_______________________________________________
Sugar-devel mailing list
Sugar-devel@lists.sugarlabs.org
http://lists.sugarlabs.org/listinfo/sugar-devel

Reply via email to