On 24.06.2010 21:42, Till Hartmann wrote:
> Hi again,
> 
> thumbnails should not be regenerated every time they need to be
> displayed in the open-dialog (quote maxy: "the point is that we don't
> recompute the thumbnail of a 2000x2000 .png every time the user clicks
> on it in the file browser"). I have taken care of that by searching
> "~/.thumbnails". (Note, however, that I haven't looked into the windows
> side of things, yet. It should be sufficient to extract a thumbnail from
> the correct Thumbs.db [I think it is generated and saved folder wise,
> right?] which, if I remember correctly, is sqlite)
> 
> I also changed the preview size to 128x128px² as that's the default
> freedesktop thumbnail size and added to the pixbuf_thumbnail method in
> helpers.py to allow an alpha channel (failed for some images, e.g.
> screenshots made with the compiz screenshot plugin).
> 
> Also I have to admit that I didn't look into learning git, yet, so I
> simply attached the git diff patch again.
> 
> Till
> 
> 
> 
> _______________________________________________
> Mypaint-discuss mailing list
> [email protected]
> https://mail.gna.org/listinfo/mypaint-discuss

Update: attached the hopefully correctly formatted patch
>From 1cab4688609a31d1568b059938ca61daf07e1b9d Mon Sep 17 00:00:00 2001
From: Till Hartmann <[email protected]>
Date: Sat, 3 Jul 2010 12:50:54 +0200
Subject: [PATCH] improve file preview
 ~/.thumbnails is now searched for cached thumbnails.
 preview size is now 128x128px (freedesktop.org default size)

---
 gui/filehandling.py |   11 +++++++++--
 lib/helpers.py      |   30 ++++++++++++++++++++++++++----
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/gui/filehandling.py b/gui/filehandling.py
index 871f071..14b5da8 100644
--- a/gui/filehandling.py
+++ b/gui/filehandling.py
@@ -269,11 +269,18 @@ class FileHandler(object):
                 loader.write(data)
                 loader.close()
                 pixbuf = loader.get_pixbuf()
+                pixbuf = helpers.scale_proportionally(pixbuf, 128, 128)
                 return pixbuf
             else:
                 try:
-                    #TODO do not scale images smaller than 256x256 up.
-                    pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(filename, 256, 256)
+                    #TODO find out how to use windows' "Thumbs.db" (sqlite?)
+                    thumb_filename = helpers.get_freedesktop_thumbnail_file(filename)
+                    if thumb_filename:
+                        pixbuf = gtk.gdk.pixbuf_new_from_file(thumb_filename)
+                        pixbuf = helpers.pixbuf_thumbnail(pixbuf, 128, 128, True) # width should always be 128px
+                    else:
+                        pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
+                        pixbuf = helpers.pixbuf_thumbnail(pixbuf, 128, 128, True)
                     return pixbuf
                 except:
                     pass
diff --git a/lib/helpers.py b/lib/helpers.py
index f6ca5af..5e58358 100644
--- a/lib/helpers.py
+++ b/lib/helpers.py
@@ -12,6 +12,9 @@ import colorsys, urllib, gc
 from gtk import gdk # for gdk_pixbuf stuff
 import mypaintlib
 
+import hashlib
+import os
+
 try:
     from json import dumps as json_dumps, loads as json_loads
     print "builtin python 2.6 json support"
@@ -111,7 +114,24 @@ def gdkpixbuf2numpy(pixbuf):
     arr = pixbuf.get_pixels_array()
     return mypaintlib.gdkpixbuf_numeric2numpy(arr)
 
-def pixbuf_thumbnail(src, w, h):
+def get_freedesktop_thumbnail_file(filename):
+    file_hash = hashlib.md5('file://'+filename).hexdigest()
+    tb_filename = os.path.join(os.path.expanduser('~/.thumbnails/normal'), file_hash) + '.png'
+    if os.path.exists(tb_filename):
+        return tb_filename
+    else:
+        return None
+
+def scale_proportionally(pixbuf, w, h):
+    width = pixbuf.get_width()
+    height = pixbuf.get_height()
+    scale = min(w / float(width), h / float(height))
+    new_width = int((width * scale))
+    new_height = int((height * scale))
+    pixbuf = pixbuf.scale_simple(new_width, new_height, gdk.INTERP_BILINEAR)
+    return pixbuf
+
+def pixbuf_thumbnail(src, w, h, alpha=False):
     """
     Creates a centered thumbnail of a gdk.pixbuf.
     """
@@ -128,9 +148,11 @@ def pixbuf_thumbnail(src, w, h):
     assert w2 <= w and h2 <= h
     src2 = src.scale_simple(w2, h2, gdk.INTERP_BILINEAR)
     
-    dst = gdk.Pixbuf(gdk.COLORSPACE_RGB, False, 8, w, h)
-    dst.fill(0xffffffff) # white background
-
+    dst = gdk.Pixbuf(gdk.COLORSPACE_RGB, alpha, 8, w, h)
+    if alpha:
+        dst.fill(0xffffff00) # transparent background
+    else:
+        dst.fill(0xffffffff) # white background
     src2.copy_area(0, 0, w2, h2, dst, (w-w2)/2, (h-h2)/2)
     return dst
 
-- 
1.7.0.4

_______________________________________________
Mypaint-discuss mailing list
[email protected]
https://mail.gna.org/listinfo/mypaint-discuss

Reply via email to