summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2011-02-16 13:52:29 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2011-02-16 13:52:29 +0000
commit120005e04bd3c76ae063712811a2e648de2c631d (patch)
treec5326c0a806277601f808c2e3a0eb2a02ae2ff78
parentdaf23b0860dc10684ddef8a5d2f030b63481cb5c (diff)
downloadnetsurf-120005e04bd3c76ae063712811a2e648de2c631d.tar.gz
netsurf-120005e04bd3c76ae063712811a2e648de2c631d.tar.bz2
Various gtk thumbnailing fixes. Don't make intermediate buffer bigger than it needs to be. Don't pass clip rect that's larger than render area. Don't plot blank background before setting the clip rect. Scale initial content render appropriately. Simplify and fix scale calc for thumbnail resampling.
svn path=/trunk/netsurf/; revision=11697
-rw-r--r--gtk/thumbnail.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/gtk/thumbnail.c b/gtk/thumbnail.c
index de359535b..8131c60d7 100644
--- a/gtk/thumbnail.c
+++ b/gtk/thumbnail.c
@@ -57,28 +57,28 @@ bool thumbnail_create(hlcache_handle *content, struct bitmap *bitmap,
gint depth;
GdkPixmap *pixmap;
GdkPixbuf *big;
+ float plot_scale;
+ double scale;
assert(content);
assert(bitmap);
- clip.x0 = 0;
- clip.y0 = 0;
- clip.x1 = content_get_width(content);
- clip.y1 = content_get_width(content);
-
- cwidth = min(content_get_width(content), 1024);
- cheight = min(content_get_height(content), 768);
-
+ /* Get details of final thumbnail image */
pixbuf = gtk_bitmap_get_primary(bitmap);
width = gdk_pixbuf_get_width(pixbuf);
height = gdk_pixbuf_get_height(pixbuf);
depth = (gdk_screen_get_system_visual(gdk_screen_get_default()))->depth;
+ /* Calculate size of buffer to render the content into */
+ cwidth = min(content_get_width(content), 1024);
+ cheight = ((cwidth * height) + (width / 2)) / width;
+
LOG(("Trying to create a thumbnail pixmap for a content of %dx%d@%d",
content_get_width(content), content_get_height(content),
depth));
- pixmap = gdk_pixmap_new(NULL, cwidth, cwidth, depth);
+ /* Create buffer to render into */
+ pixmap = gdk_pixmap_new(NULL, cwidth, cheight, depth);
if (pixmap == NULL) {
/* the creation failed for some reason: most likely because
@@ -95,8 +95,8 @@ bool thumbnail_create(hlcache_handle *content, struct bitmap *bitmap,
/* set the plotting functions up */
plot = nsgtk_plotters;
- nsgtk_plot_set_scale((double) cwidth /
- (double) content_get_width(content));
+ plot_scale = (float)cwidth / (float)content_get_width(content);
+ nsgtk_plot_set_scale(plot_scale);
/* set to plot to pixmap */
current_drawable = pixmap;
@@ -104,23 +104,30 @@ bool thumbnail_create(hlcache_handle *content, struct bitmap *bitmap,
#ifdef CAIRO_VERSION
current_cr = gdk_cairo_create(current_drawable);
#endif
- plot.rectangle(0, 0, cwidth, cwidth, plot_style_fill_white);
+
+ /* Set up clip rect */
+ clip.x0 = 0;
+ clip.y0 = 0;
+ clip.x1 = cwidth;
+ clip.y1 = cheight;
plot.clip(&clip);
+ /* blank the background */
+ plot.rectangle(0, 0, cwidth, cheight, plot_style_fill_white);
+
/* render the content */
- content_redraw(content, 0, 0, content_get_width(content),
- content_get_width(content),
- &clip, 1.0, 0xFFFFFF);
+ content_redraw(content, 0, 0, cwidth, cheight,
+ &clip, plot_scale, 0xFFFFFF);
- /* resample the large plot down to the size of our thumbnail */
+ /* get the pixbuf we rendered the content into */
big = gdk_pixbuf_get_from_drawable(NULL, pixmap, NULL, 0, 0, 0, 0,
- cwidth, cwidth);
+ cwidth, cheight);
+ /* resample the large plot down to the size of our thumbnail */
+ scale = (double)width / (double)cwidth;
gdk_pixbuf_scale(big, pixbuf, 0, 0, width, height, 0, 0,
- (double)width / (double)cwidth,
- (double)height / (double)cwidth,
- GDK_INTERP_TILES);
+ scale, scale, GDK_INTERP_TILES);
/* As a debugging aid, try this to dump out a copy of the thumbnail as
* a PNG: gdk_pixbuf_save(pixbuf, "thumbnail.png", "png", NULL, NULL);