]> Pileus Git - ~andy/gtk/blob - demos/testpixbuf-drawable.c
gdk/win32/gdkdrawable-win32.c Use correct casts in debugging output.
[~andy/gtk] / demos / testpixbuf-drawable.c
1 #include <config.h>
2 #include <gtk/gtk.h>
3 #ifdef GDK_WINDOWING_X11
4 #include <gdk/x11/gdkx.h>
5 #elif defined (GDK_WINDOWING_WIN32)
6 #include <gdk/win32/gdkwin32.h>
7 #endif
8
9 int close_app(GtkWidget *widget, gpointer data)
10 {
11    gtk_main_quit();
12    return TRUE;
13 }
14
15 int expose_cb(GtkWidget *drawing_area, GdkEventExpose *evt, gpointer data)
16 {
17    GdkPixbuf *pixbuf;
18          
19    pixbuf = (GdkPixbuf *) gtk_object_get_data(GTK_OBJECT(drawing_area),
20                                               "pixbuf");
21    if(gdk_pixbuf_get_has_alpha (pixbuf))
22    {
23       gdk_draw_rgb_32_image(drawing_area->window,
24                             drawing_area->style->black_gc,
25                             evt->area.x, evt->area.y,
26                             evt->area.width,
27                             evt->area.height,
28                             GDK_RGB_DITHER_MAX,
29                             gdk_pixbuf_get_pixels (pixbuf) +
30                             (evt->area.y * gdk_pixbuf_get_rowstride (pixbuf)) +
31                             (evt->area.x * gdk_pixbuf_get_n_channels (pixbuf)),
32                             gdk_pixbuf_get_rowstride (pixbuf));
33    }
34    else
35    {
36       gdk_draw_rgb_image(drawing_area->window, 
37                          drawing_area->style->black_gc, 
38                          evt->area.x, evt->area.y,
39                          evt->area.width,
40                          evt->area.height,  
41                          GDK_RGB_DITHER_NORMAL,
42                          gdk_pixbuf_get_pixels (pixbuf) +
43                          (evt->area.y * gdk_pixbuf_get_rowstride (pixbuf)) +
44                          (evt->area.x * gdk_pixbuf_get_n_channels (pixbuf)),
45                          gdk_pixbuf_get_rowstride (pixbuf));
46    }
47    return FALSE;
48 }
49
50 int configure_cb(GtkWidget *drawing_area, GdkEventConfigure *evt, gpointer data)
51 {
52    GdkPixbuf *pixbuf;
53                            
54    pixbuf = (GdkPixbuf *) gtk_object_get_data(GTK_OBJECT(drawing_area),   
55                                               "pixbuf");
56     
57    g_print("X:%d Y:%d\n", evt->width, evt->height);
58    if(evt->width != gdk_pixbuf_get_width (pixbuf) || evt->height != gdk_pixbuf_get_height (pixbuf))
59    {
60       GdkWindow *root;
61       GdkPixbuf *new_pixbuf;
62
63       root = GDK_ROOT_PARENT();
64       new_pixbuf = gdk_pixbuf_get_from_drawable(NULL, root, NULL,
65                                                 0, 0, 0, 0, evt->width, evt->height);
66       gtk_object_set_data(GTK_OBJECT(drawing_area), "pixbuf", new_pixbuf);
67       gdk_pixbuf_unref(pixbuf);
68    }
69
70    return FALSE;
71 }
72
73 extern void pixbuf_init();
74
75 int main(int argc, char **argv)
76 {   
77    GdkWindow     *root;
78    GtkWidget     *window;
79    GtkWidget     *vbox;
80    GtkWidget     *drawing_area;
81    GdkPixbuf     *pixbuf;    
82    
83    pixbuf_init ();
84
85    gtk_init(&argc, &argv);   
86    gdk_rgb_set_verbose(TRUE);
87    gdk_rgb_init();
88
89    gtk_widget_set_default_colormap(gdk_rgb_get_cmap());
90
91    root = GDK_ROOT_PARENT();
92    pixbuf = gdk_pixbuf_get_from_drawable(NULL, root, NULL,
93                                          0, 0, 0, 0, 150, 160);
94    
95    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
96    gtk_signal_connect(GTK_OBJECT(window), "delete_event",
97                       GTK_SIGNAL_FUNC(close_app), NULL);
98    gtk_signal_connect(GTK_OBJECT(window), "destroy",   
99                       GTK_SIGNAL_FUNC(close_app), NULL);
100    
101    vbox = gtk_vbox_new(FALSE, 0);
102    gtk_container_add(GTK_CONTAINER(window), vbox);  
103    
104    drawing_area = gtk_drawing_area_new();
105    gtk_widget_set_usize(GTK_WIDGET(drawing_area),
106                         gdk_pixbuf_get_width (pixbuf),
107                         gdk_pixbuf_get_height (pixbuf));
108    gtk_signal_connect(GTK_OBJECT(drawing_area), "expose_event",
109                       GTK_SIGNAL_FUNC(expose_cb), NULL);
110
111    gtk_signal_connect(GTK_OBJECT(drawing_area), "configure_event",
112                       GTK_SIGNAL_FUNC(configure_cb), NULL);
113    gtk_object_set_data(GTK_OBJECT(drawing_area), "pixbuf", pixbuf);
114    gtk_box_pack_start(GTK_BOX(vbox), drawing_area, TRUE, TRUE, 0);
115    
116    gtk_widget_show_all(window);
117    gtk_main();
118    return 0;
119 }