Mercurial > geeqie
diff src/pixbuf_util.c @ 864:f40509d56fe3
added pixbuf_fallback function
fixed thumb loader for non-image files
author | nadvornik |
---|---|
date | Fri, 27 Jun 2008 21:09:15 +0000 |
parents | 14520c3a91f8 |
children | 4fe8f9656107 |
line wrap: on
line diff
--- a/src/pixbuf_util.c Fri Jun 27 18:43:05 2008 +0000 +++ b/src/pixbuf_util.c Fri Jun 27 21:09:15 2008 +0000 @@ -131,6 +131,53 @@ return NULL; } +gint pixbuf_scale_aspect(gint req_w, gint req_h, gint old_w, gint old_h, + gint *new_w, gint *new_h) +{ + if (((gdouble)req_w / old_w) < ((gdouble)req_h / old_h)) + { + *new_w = req_w; + *new_h = (gdouble)*new_w / old_w * old_h; + if (*new_h < 1) *new_h = 1; + } + else + { + *new_h = req_h; + *new_w = (gdouble)*new_h / old_h * old_w; + if (*new_w < 1) *new_w = 1; + } + + return (*new_w != old_w || *new_h != old_h); +} + +GdkPixbuf *pixbuf_fallback(FileData *fd, gint requested_width, gint requested_height) +{ + GdkPixbuf *pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN); /* FIXME use different images according to FORMAT_CLASS */ + + if (requested_width && requested_height) + { + gint w = gdk_pixbuf_get_width(pixbuf); + gint h = gdk_pixbuf_get_height(pixbuf); + + if (w > requested_width || h > requested_height) + { + gint nw, nh; + + if (pixbuf_scale_aspect(requested_width, requested_height, + w, h, &nw, &nh)) + { + GdkPixbuf *tmp; + + tmp = pixbuf; + pixbuf = gdk_pixbuf_scale_simple(tmp, nw, nh, GDK_INTERP_TILES); + g_object_unref(G_OBJECT(tmp)); + } + } + } + return pixbuf; +} + + /* *----------------------------------------------------------------------------- * misc utils