diff options
author | Manuel Quiñones <manuq@laptop.org> | 2012-09-18 04:29:08 (GMT) |
---|---|---|
committer | Manuel Quiñones <manuq@laptop.org> | 2012-09-18 16:37:19 (GMT) |
commit | 898827d8502ba84f51fea2ad05b3efff42eeb3f5 (patch) | |
tree | b180f301c4934f1857e1c5836f865c0b2d2b3643 /extensions | |
parent | 8c661997e6c54139cf98dc7149749388c91d757f (diff) |
Fix screenshot extension, port to cairo - SL #3906
1. API fix, Gdk.Window now has get_width() and get_height(), not
get_size().
2. Use cairo to make the screenshot: paint the window surface in a new
surface and then save it as png to the path that will be provided
to the datastore.
3. Use the same cairo code as in the toolkit-gtk3 to make a preview of
the screenshot surface, store it as an array of bytes.
Signed-off-by: Manuel Quiñones <manuq@laptop.org>
Acked-by: Simon Schampijer <simon@laptop.org>
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/globalkey/screenshot.py | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/extensions/globalkey/screenshot.py b/extensions/globalkey/screenshot.py index d5b88ea..5abf15b 100644 --- a/extensions/globalkey/screenshot.py +++ b/extensions/globalkey/screenshot.py @@ -18,6 +18,8 @@ import os import tempfile from gettext import gettext as _ +import StringIO +import cairo from gi.repository import Gtk from gi.repository import Gdk @@ -38,15 +40,15 @@ def handle_key_press(key): os.close(fd) window = Gdk.get_default_root_window() - width, height = window.get_size() - x_orig, y_orig = window.get_origin() + width, height = window.get_width(), window.get_height() - screenshot = GdkPixbuf.Pixbuf(GdkPixbuf.Colorspace.RGB, has_alpha=False, - bits_per_sample=8, width=width, - height=height) - screenshot.get_from_drawable(window, window.get_colormap(), x_orig, - y_orig, 0, 0, width, height) - screenshot.save(file_path, 'png') + window_cr = Gdk.cairo_create(window) + window_surface = window_cr.get_target() + screenshot_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) + cr = cairo.Context(screenshot_surface) + cr.set_source_surface(window_surface) + cr.paint() + screenshot_surface.write_to_png(file_path) client = GConf.Client.get_default() color = client.get_string('/desktop/sugar/user/color') @@ -79,7 +81,7 @@ def handle_key_press(key): jobject.metadata['title'] = title jobject.metadata['keep'] = '0' jobject.metadata['buddies'] = '' - jobject.metadata['preview'] = _get_preview_data(screenshot) + jobject.metadata['preview'] = _get_preview_data(screenshot_surface) jobject.metadata['icon-color'] = color jobject.metadata['mime_type'] = 'image/png' jobject.file_path = file_path @@ -89,14 +91,31 @@ def handle_key_press(key): del jobject -def _get_preview_data(screenshot): - preview = screenshot.scale_simple(style.zoom(300), style.zoom(225), - GdkPixbuf.InterpType.BILINEAR) - preview_data = [] +def _get_preview_data(screenshot_surface): + screenshot_width = screenshot_surface.get_width() + screenshot_height = screenshot_surface.get_height() - def save_func(buf, data): - data.append(buf) + preview_width, preview_height = style.zoom(300), style.zoom(225) + preview_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, + preview_width, preview_height) + cr = cairo.Context(preview_surface) - preview.save_to_callback(save_func, 'png', user_data=preview_data) + scale_w = preview_width * 1.0 / screenshot_width + scale_h = preview_height * 1.0 / screenshot_height + scale = min(scale_w, scale_h) - return dbus.ByteArray(''.join(preview_data)) + translate_x = int((preview_width - (screenshot_width * scale)) / 2) + translate_y = int((preview_height - (screenshot_height * scale)) / 2) + + cr.translate(translate_x, translate_y) + cr.scale(scale, scale) + + cr.set_source_rgba(1, 1, 1, 0) + cr.set_operator(cairo.OPERATOR_SOURCE) + cr.paint() + cr.set_source_surface(screenshot_surface) + cr.paint() + + preview_str = StringIO.StringIO() + preview_surface.write_to_png(preview_str) + return dbus.ByteArray(preview_str.getvalue()) |