#include "pixbufs.h" GdkPixbuf * scale_pixbuf_with_size( GdkPixbuf *original_pixbuf, int new_width, int new_height ) { GdkPixbuf *scaled_pixbuf; float scale_x, scale_y; gboolean pixbuf_has_alpha; scale_x = new_width / (float) gdk_pixbuf_get_width (original_pixbuf); scale_y = new_height / (float) gdk_pixbuf_get_height (original_pixbuf); pixbuf_has_alpha = gdk_pixbuf_get_has_alpha (original_pixbuf); /* create a new pixbuf with size adpated to scale */ scaled_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, pixbuf_has_alpha, gdk_pixbuf_get_bits_per_sample (original_pixbuf), new_width, new_height); /* copy the scaled loaded pixbuf into the new one */ gdk_pixbuf_scale (original_pixbuf, scaled_pixbuf, 0, 0, new_width, new_height, 0, 0, scale_x, scale_y, //GDK_INTERP_NEAREST); // <--- this crashes app??? //GDK_INTERP_TILES); //GDK_INTERP_BILINEAR); GDK_INTERP_HYPER); return scaled_pixbuf; } GtkWidget * drawing_area_from_pixbuf( GdkPixbuf *pixbuf ) { GtkWidget *drawing_area; int width = gdk_pixbuf_get_width (pixbuf); int height = gdk_pixbuf_get_height (pixbuf); /* create a drawing area */ drawing_area = gtk_drawing_area_new (); gtk_widget_set_size_request (drawing_area, width, height); /* add a pointer to pixbuf in the drawing area widget */ g_object_set_data (G_OBJECT (drawing_area), "pixbuf", pixbuf); return drawing_area; } void draw_pixbuf_on_area( GtkWidget *drawing_area, GdkPixbuf *pixbuf ) { int width = gdk_pixbuf_get_width (pixbuf); int height = gdk_pixbuf_get_height (pixbuf); gdk_window_clear (drawing_area->window); if (gdk_pixbuf_get_has_alpha (pixbuf)) gdk_pixbuf_render_to_drawable (pixbuf, drawing_area->window, drawing_area->style->black_gc, 0, 0, 0, 0, width, height, GDK_RGB_DITHER_NORMAL, 0, 0); else gdk_pixbuf_render_to_drawable_alpha (pixbuf, drawing_area->window, 0, 0, 0, 0, width, height, GDK_PIXBUF_ALPHA_FULL, 0, GDK_RGB_DITHER_NORMAL, 0, 0); }