Thanks Manuel.

On 09/18/2012 06:38 AM, Manuel Quiñones wrote:
1. API fix, Gdk.Window now has get_width() and get_height(), not
    get_size().

Yes.

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.

Yes, as you say, same as in the toolkit. Is the right thing to do.

And it even works!

Please push,
   Simon

Signed-off-by: Manuel Quiñones <ma...@laptop.org>
---
  extensions/globalkey/screenshot.py | 53 ++++++++++++++++++++++++++------------
  1 file 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())


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

Reply via email to