gtk-utils.c revision 6ba797d6
16ba797d6Smrg#include <gtk/gtk.h> 26ba797d6Smrg#include <config.h> 36ba797d6Smrg#include "pixman-private.h" /* For image->bits.format 46ba797d6Smrg * FIXME: there should probably be public API for this 56ba797d6Smrg */ 66ba797d6Smrg#include "gtk-utils.h" 76ba797d6Smrg 86ba797d6SmrgGdkPixbuf * 96ba797d6Smrgpixbuf_from_argb32 (uint32_t *bits, 106ba797d6Smrg gboolean has_alpha, 116ba797d6Smrg int width, 126ba797d6Smrg int height, 136ba797d6Smrg int stride) 146ba797d6Smrg{ 156ba797d6Smrg GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 166ba797d6Smrg 8, width, height); 176ba797d6Smrg int p_stride = gdk_pixbuf_get_rowstride (pixbuf); 186ba797d6Smrg guint32 *p_bits = (guint32 *)gdk_pixbuf_get_pixels (pixbuf); 196ba797d6Smrg int w, h; 206ba797d6Smrg 216ba797d6Smrg for (h = 0; h < height; ++h) 226ba797d6Smrg { 236ba797d6Smrg for (w = 0; w < width; ++w) 246ba797d6Smrg { 256ba797d6Smrg uint32_t argb = bits[h * (stride / 4) + w]; 266ba797d6Smrg guint r, g, b, a; 276ba797d6Smrg char *pb = (char *)p_bits; 286ba797d6Smrg 296ba797d6Smrg pb += h * p_stride + w * 4; 306ba797d6Smrg 316ba797d6Smrg r = (argb & 0x00ff0000) >> 16; 326ba797d6Smrg g = (argb & 0x0000ff00) >> 8; 336ba797d6Smrg b = (argb & 0x000000ff) >> 0; 346ba797d6Smrg a = has_alpha? (argb & 0xff000000) >> 24 : 0xff; 356ba797d6Smrg 366ba797d6Smrg if (a) 376ba797d6Smrg { 386ba797d6Smrg r = (r * 255) / a; 396ba797d6Smrg g = (g * 255) / a; 406ba797d6Smrg b = (b * 255) / a; 416ba797d6Smrg } 426ba797d6Smrg 436ba797d6Smrg if (r > 255) r = 255; 446ba797d6Smrg if (g > 255) g = 255; 456ba797d6Smrg if (b > 255) b = 255; 466ba797d6Smrg 476ba797d6Smrg pb[0] = r; 486ba797d6Smrg pb[1] = g; 496ba797d6Smrg pb[2] = b; 506ba797d6Smrg pb[3] = a; 516ba797d6Smrg } 526ba797d6Smrg } 536ba797d6Smrg 546ba797d6Smrg return pixbuf; 556ba797d6Smrg} 566ba797d6Smrg 576ba797d6Smrg 586ba797d6Smrgstatic gboolean 596ba797d6Smrgon_expose (GtkWidget *widget, GdkEventExpose *expose, gpointer data) 606ba797d6Smrg{ 616ba797d6Smrg GdkPixbuf *pixbuf = data; 626ba797d6Smrg 636ba797d6Smrg gdk_draw_pixbuf (widget->window, NULL, 646ba797d6Smrg pixbuf, 0, 0, 0, 0, 656ba797d6Smrg gdk_pixbuf_get_width (pixbuf), 666ba797d6Smrg gdk_pixbuf_get_height (pixbuf), 676ba797d6Smrg GDK_RGB_DITHER_NONE, 686ba797d6Smrg 0, 0); 696ba797d6Smrg 706ba797d6Smrg return TRUE; 716ba797d6Smrg} 726ba797d6Smrg 736ba797d6Smrgvoid 746ba797d6Smrgshow_image (pixman_image_t *image) 756ba797d6Smrg{ 766ba797d6Smrg GtkWidget *window; 776ba797d6Smrg GdkPixbuf *pixbuf; 786ba797d6Smrg int width, height, stride; 796ba797d6Smrg int argc; 806ba797d6Smrg char **argv; 816ba797d6Smrg char *arg0 = g_strdup ("pixman-test-program"); 826ba797d6Smrg gboolean has_alpha; 836ba797d6Smrg pixman_format_code_t format; 846ba797d6Smrg 856ba797d6Smrg argc = 1; 866ba797d6Smrg argv = (char **)&arg0; 876ba797d6Smrg 886ba797d6Smrg gtk_init (&argc, &argv); 896ba797d6Smrg 906ba797d6Smrg window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 916ba797d6Smrg width = pixman_image_get_width (image); 926ba797d6Smrg height = pixman_image_get_height (image); 936ba797d6Smrg stride = pixman_image_get_stride (image); 946ba797d6Smrg 956ba797d6Smrg gtk_window_set_default_size (GTK_WINDOW (window), width, height); 966ba797d6Smrg 976ba797d6Smrg format = image->bits.format; 986ba797d6Smrg 996ba797d6Smrg if (format == PIXMAN_a8r8g8b8) 1006ba797d6Smrg has_alpha = TRUE; 1016ba797d6Smrg else if (format == PIXMAN_x8r8g8b8) 1026ba797d6Smrg has_alpha = FALSE; 1036ba797d6Smrg else 1046ba797d6Smrg g_error ("Can't deal with this format: %x\n", format); 1056ba797d6Smrg 1066ba797d6Smrg pixbuf = pixbuf_from_argb32 (pixman_image_get_data (image), has_alpha, 1076ba797d6Smrg width, height, stride); 1086ba797d6Smrg 1096ba797d6Smrg g_signal_connect (window, "expose_event", G_CALLBACK (on_expose), pixbuf); 1106ba797d6Smrg g_signal_connect (window, "delete_event", G_CALLBACK (gtk_main_quit), NULL); 1116ba797d6Smrg 1126ba797d6Smrg gtk_widget_show (window); 1136ba797d6Smrg 1146ba797d6Smrg gtk_main (); 1156ba797d6Smrg} 116