Scaling Scaling pixbufs and scaling and compositing pixbufs The &gdk-pixbuf; contains functions to scale pixbufs, to scale pixbufs and composite against an existing image, and to scale pixbufs and composite against a solid color or checkerboard. Compositing a checkerboard is a common way to show an image with an alpha channel in image-viewing and editing software. Since the full-featured functions (gdk_pixbuf_scale(), gdk_pixbuf_composite(), and gdk_pixbuf_composite_color()) are rather complex to use and have many arguments, two simple convenience functions are provided, gdk_pixbuf_scale_simple() and gdk_pixbuf_composite_color_simple() which create a new pixbuf of a given size, scale an original image to fit, and then return the new pixbuf. The following example demonstrates handling an expose event by rendering the appropriate area of a source image (which is scaled to fit the widget) onto the widget's window. The source image is rendered against a checkerboard, which provides a visual representation of the alpha channel if the image has one. If the image doesn't have an alpha channel, calling gdk_pixbuf_composite_color() function has exactly the same effect as calling gdk_pixbuf_scale(). Handling an expose event. gboolean expose_cb (GtkWidget *widget, GdkEventExpose *event, gpointer data) { GdkPixbuf *dest; gdk_window_set_back_pixmap (widget->window, NULL, FALSE); dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, event->area.width, event->area.height); gdk_pixbuf_composite_color (pixbuf, dest, 0, 0, event->area.width, event->area.height, -event->area.x, -event->area.y, (double) widget->allocation.width / gdk_pixbuf_get_width (pixbuf), (double) widget->allocation.height / gdk_pixbuf_get_height (pixbuf), GDK_INTERP_BILINEAR, 255, event->area.x, event->area.y, 16, 0xaaaaaa, 0x555555); gdk_pixbuf_render_to_drawable (dest, widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], 0, 0, event->area.x, event->area.y, event->area.width, event->area.height, GDK_RGB_DITHER_NORMAL, event->area.x, event->area.y); gdk_pixbuf_unref (dest); return TRUE; } GdkRGB. This enumeration describes the different interpolation modes that can be used with the scaling functions. @GDK_INTERP_NEAREST is the fastest scaling method, but has horrible quality when scaling down. @GDK_INTERP_BILINEAR is the best choice if you aren't sure what to choose, it has a good speed/quality balance. Cubic filtering is missing from the list; hyperbolic interpolation is just as fast and results in higher quality. @GDK_INTERP_NEAREST: Nearest neighbor sampling; this is the fastest and lowest quality mode. Quality is normally unacceptable when scaling down, but may be OK when scaling up. @GDK_INTERP_TILES: This is an accurate simulation of the PostScript image operator without any interpolation enabled. Each pixel is rendered as a tiny parallelogram of solid color, the edges of which are implemented with antialiasing. It resembles nearest neighbor for enlargement, and bilinear for reduction. @GDK_INTERP_BILINEAR: Best quality/speed balance; use this mode by default. Bilinear interpolation. For enlargement, it is equivalent to point-sampling the ideal bilinear-interpolated image. For reduction, it is equivalent to laying down small tiles and integrating over the coverage area. @GDK_INTERP_HYPER: This is the slowest and highest quality reconstruction function. It is derived from the hyperbolic filters in Wolberg's "Digital Image Warping", and is formally defined as the hyperbolic-filter sampling the ideal hyperbolic-filter interpolated image (the filter is designed to be idempotent for 1:1 pixel mapping). @src: @dest: @dest_x: @dest_y: @dest_width: @dest_height: @offset_x: @offset_y: @scale_x: @scale_y: @interp_type: @src: @dest: @dest_x: @dest_y: @dest_width: @dest_height: @offset_x: @offset_y: @scale_x: @scale_y: @interp_type: @overall_alpha: @src: @dest: @dest_x: @dest_y: @dest_width: @dest_height: @offset_x: @offset_y: @scale_x: @scale_y: @interp_type: @overall_alpha: @check_x: @check_y: @check_size: @color1: @color2: @src: @dest_width: @dest_height: @interp_type: @Returns: @src: @dest_width: @dest_height: @interp_type: @overall_alpha: @check_size: @color1: @color2: @Returns: