[Sugar-devel] [PATCH sugar-toolkit-gtk3] Do the preview in the activity using cairo intead of GdkPixbufa -v2
godiard at sugarlabs.org
godiard at sugarlabs.org
Fri Feb 10 14:39:46 EST 2012
From: Gonzalo Odiard <godiard at gmail.com>
Signed-off-by: Gonzalo Odiard <gonzalo at laptop.org>
-------
v2: Create the image without the toolbar
---
src/sugar3/activity/activity.py | 39 ++++++++++++++++++++++++---------------
1 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/src/sugar3/activity/activity.py b/src/sugar3/activity/activity.py
index 19c1974..8c1200c 100644
--- a/src/sugar3/activity/activity.py
+++ b/src/sugar3/activity/activity.py
@@ -54,11 +54,12 @@ import os
import time
from hashlib import sha1
from functools import partial
+import StringIO
from gi.repository import GConf
from gi.repository import Gtk
from gi.repository import Gdk
-from gi.repository import GdkPixbuf
+import cairo
from gi.repository import GObject
import dbus
import dbus.service
@@ -642,26 +643,34 @@ class Activity(Window, Gtk.Container):
binary content of a png image with a width of 300 and a height of 225
pixels.
"""
- if self.canvas is None or not hasattr(self.canvas, 'get_snapshot'):
+ if self.canvas is None or not hasattr(self.canvas, 'get_window'):
return None
- pixmap = self.canvas.get_snapshot((-1, -1, 0, 0))
- width, height = pixmap.get_size()
- pixbuf = GdkPixbuf.Pixbuf(GdkPixbuf.Colorspace.RGB, 0, 8, width, height)
- pixbuf = pixbuf.get_from_drawable(pixmap, pixmap.get_colormap(),
- 0, 0, 0, 0, width, height)
- pixbuf = pixbuf.scale_simple(style.zoom(300), style.zoom(225),
- GdkPixbuf.InterpType.BILINEAR)
+ window = self.canvas.get_window()
- preview_data = []
+ x, y = 0, 0
+ width, height = window.get_width(), window.get_height()
- def save_func(buf, data):
- data.append(buf)
+ if not self.canvas.get_has_window():
+ alloc = self.canvas.get_allocation()
+ x, y = alloc.x, alloc.y
+ width, height = alloc.width, alloc.height
- pixbuf.save_to_callback(save_func, 'png', user_data=preview_data)
- preview_data = ''.join(preview_data)
+ preview_width, preview_height = style.zoom(300), style.zoom(225)
- return preview_data
+ preview_surface = Gdk.Window.create_similar_surface(window,
+ cairo.CONTENT_COLOR, preview_width, preview_height)
+
+ cairo_context = cairo.Context(preview_surface)
+ preview_scale_w = preview_width * 1.0 / width
+ preview_scale_h = preview_height * 1.0 / height
+ cairo_context.scale(preview_scale_w, preview_scale_h)
+ Gdk.cairo_set_source_window(cairo_context, window, -x, -y)
+ cairo_context.paint()
+
+ preview_str = StringIO.StringIO()
+ preview_surface.write_to_png(preview_str)
+ return preview_str.getvalue()
def _get_buddies(self):
if self.shared_activity is not None:
--
1.7.7.6
More information about the Sugar-devel
mailing list