From: Gonzalo Odiard <godi...@sugarlabs.org> generates a preview image with a fixed size and proportions. if the original image is bigger scale down and center the image, if is smaller center the image the supported format files are checked with pixbuf_get_formats --- downloadmanager.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/downloadmanager.py b/downloadmanager.py index 3eec649..f4bb2a5 100644 --- a/downloadmanager.py +++ b/downloadmanager.py @@ -35,6 +35,7 @@ from sugar.datastore import datastore from sugar import profile from sugar import mime from sugar.graphics.alert import Alert, TimeoutAlert +from sugar.graphics import style from sugar.graphics.icon import Icon from sugar.activity import activity @@ -192,12 +193,56 @@ class Download: sniffed_mime_type = mime.get_for_file(self._target_file.path) self.dl_jobject.metadata['mime_type'] = sniffed_mime_type + if self._check_image_mime_type(): + self.dl_jobject.metadata['preview'] = self._get_preview_image() + datastore.write(self.dl_jobject, transfer_ownership=True, reply_handler=self._internal_save_cb, error_handler=self._internal_save_error_cb, timeout=360 * DBUS_PYTHON_TIMEOUT_UNITS_PER_SECOND) + def _check_image_mime_type(self): + for pixbuf_format in gtk.gdk.pixbuf_get_formats(): + if self._mime_type in pixbuf_format['mime_types']: + return True + return False + + def _get_preview_image(self): + preview_width, preview_height = style.zoom(300), style.zoom(225) + + pixbuf = gtk.gdk.pixbuf_new_from_file(self._target_file.path) + width, height = pixbuf.get_width(), pixbuf.get_height() + + scale = 1 + if (width > preview_width) or (height > preview_height): + scale_x = preview_width / float(width) + scale_y = preview_height / float(height) + scale = min(scale_x, scale_y) + + pixbuf2 = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, \ + pixbuf.get_has_alpha(), \ + pixbuf.get_bits_per_sample(), \ + preview_width, preview_height) + pixbuf2.fill(style.COLOR_WHITE.get_int()) + + margin_x = int((preview_width - (width * scale)) / 2) + margin_y = int((preview_height - (height * scale)) / 2) + + pixbuf.scale(pixbuf2, margin_x, margin_y, \ + preview_width - (margin_x * 2), \ + preview_height - (margin_y * 2), \ + margin_x, margin_y, scale, scale, \ + gtk.gdk.INTERP_BILINEAR) + + preview_data = [] + def save_func(buf, data): + data.append(buf) + + pixbuf2.save_to_callback(save_func, 'png', user_data=preview_data) + preview_data = ''.join(preview_data) + return dbus.ByteArray(preview_data) + def __start_response_cb(self, alert, response_id): global _active_downloads if response_id is gtk.RESPONSE_CANCEL: -- 1.7.2.3 _______________________________________________ Sugar-devel mailing list Sugar-devel@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/sugar-devel