]> Pileus Git - ~andy/gtk/blob - demos/testpixbuf-save.c
include target-specific headers as done in testpixbuf-drawable.c
[~andy/gtk] / demos / testpixbuf-save.c
1
2 #include "config.h"
3 #include <stdio.h>
4
5 #include <gtk/gtk.h>
6
7 #ifdef GDK_WINDOWING_X11
8 #include <gdk/x11/gdkx.h>
9 #elif defined (GDK_WINDOWING_WIN32)
10 #include <gdk/win32/gdkwin32.h>
11 #endif
12
13
14 void
15 keypress_check (GtkWidget *widget, GdkEventKey *evt, gpointer data)
16 {
17         GdkPixbuf *pixbuf;
18         GtkDrawingArea *da = (GtkDrawingArea*)data;
19         GError *err = NULL;
20         
21         pixbuf = (GdkPixbuf *) gtk_object_get_data (GTK_OBJECT (da), "pixbuf");
22
23         if (evt->keyval == 'q')
24                 gtk_main_quit ();
25         if (evt->keyval == 's') {
26                 if (pixbuf == NULL) {
27                         fprintf (stderr, "PIXBUF NULL\n");
28                         return;
29                 }       
30
31                 if (!gdk_pixbuf_save (pixbuf, "foo.jpg", "jpeg",
32                                       &err,
33                                       "quality", "100",
34                                       NULL)) {
35                         fprintf (stderr, "%s", err->message);
36                         g_error_free (err);
37                 }
38                 
39         } else if (evt->keyval == 'p') {
40                 if (pixbuf == NULL) {
41                         fprintf (stderr, "PIXBUF NULL\n");
42                         return;
43                 }
44
45                 if (!gdk_pixbuf_save (pixbuf, "foo.png", "png", &err, NULL)) {
46                         fprintf (stderr, "%s", err->message);
47                         g_error_free (err);
48                 }
49         }
50 }
51
52
53 int
54 close_app (GtkWidget *widget, gpointer data)
55 {
56         gtk_main_quit ();
57         return TRUE;
58 }
59
60 int
61 expose_cb (GtkWidget *drawing_area, GdkEventExpose *evt, gpointer data)
62 {
63         GdkPixbuf *pixbuf;
64          
65         pixbuf = (GdkPixbuf *) gtk_object_get_data (GTK_OBJECT (drawing_area),
66                                                     "pixbuf");
67         if (gdk_pixbuf_get_has_alpha (pixbuf)) {
68                 gdk_draw_rgb_32_image (drawing_area->window,
69                                        drawing_area->style->black_gc,
70                                        evt->area.x, evt->area.y,
71                                        evt->area.width,
72                                        evt->area.height,
73                                        GDK_RGB_DITHER_MAX,
74                                        gdk_pixbuf_get_pixels (pixbuf) +
75                                        (evt->area.y * gdk_pixbuf_get_rowstride (pixbuf)) +
76                                        (evt->area.x * gdk_pixbuf_get_n_channels (pixbuf)),
77                                        gdk_pixbuf_get_rowstride (pixbuf));
78         } else {
79                 gdk_draw_rgb_image (drawing_area->window, 
80                                     drawing_area->style->black_gc, 
81                                     evt->area.x, evt->area.y,
82                                     evt->area.width,
83                                     evt->area.height,  
84                                     GDK_RGB_DITHER_NORMAL,
85                                     gdk_pixbuf_get_pixels (pixbuf) +
86                                     (evt->area.y * gdk_pixbuf_get_rowstride (pixbuf)) +
87                                     (evt->area.x * gdk_pixbuf_get_n_channels (pixbuf)),
88                                     gdk_pixbuf_get_rowstride (pixbuf));
89         }
90         return FALSE;
91 }
92
93 int
94 configure_cb (GtkWidget *drawing_area, GdkEventConfigure *evt, gpointer data)
95 {
96         GdkPixbuf *pixbuf;
97                            
98         pixbuf = (GdkPixbuf *) gtk_object_get_data (GTK_OBJECT (drawing_area),   
99                                                     "pixbuf");
100     
101         g_print ("X:%d Y:%d\n", evt->width, evt->height);
102         if (evt->width != gdk_pixbuf_get_width (pixbuf) || evt->height != gdk_pixbuf_get_height (pixbuf)) {
103                 GdkWindow *root;
104                 GdkPixbuf *new_pixbuf;
105
106                 root = GDK_ROOT_PARENT ();
107                 new_pixbuf = gdk_pixbuf_get_from_drawable (NULL, root, NULL,
108                                                            0, 0, 0, 0, evt->width, evt->height);
109                 gtk_object_set_data (GTK_OBJECT (drawing_area), "pixbuf", new_pixbuf);
110                 gdk_pixbuf_unref (pixbuf);
111         }
112
113         return FALSE;
114 }
115
116 int
117 main (int argc, char **argv)
118 {   
119         GdkWindow     *root;
120         GtkWidget     *window;
121         GtkWidget     *vbox;
122         GtkWidget     *drawing_area;
123         GdkPixbuf     *pixbuf;    
124    
125         gtk_init (&argc, &argv);   
126
127         gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
128
129         root = GDK_ROOT_PARENT ();
130         pixbuf = gdk_pixbuf_get_from_drawable (NULL, root, NULL,
131                                                0, 0, 0, 0, 150, 160);
132    
133         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
134         gtk_signal_connect (GTK_OBJECT (window), "delete_event",
135                             GTK_SIGNAL_FUNC (close_app), NULL);
136         gtk_signal_connect (GTK_OBJECT (window), "destroy",   
137                             GTK_SIGNAL_FUNC (close_app), NULL);
138    
139         vbox = gtk_vbox_new (FALSE, 0);
140         gtk_container_add (GTK_CONTAINER (window), vbox);  
141    
142         drawing_area = gtk_drawing_area_new ();
143         gtk_widget_set_usize (GTK_WIDGET (drawing_area),
144                               gdk_pixbuf_get_width (pixbuf),
145                               gdk_pixbuf_get_height (pixbuf));
146         gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
147                             GTK_SIGNAL_FUNC (expose_cb), NULL);
148
149         gtk_signal_connect (GTK_OBJECT (drawing_area), "configure_event",
150                             GTK_SIGNAL_FUNC (configure_cb), NULL);
151         gtk_signal_connect (GTK_OBJECT (window), "key_press_event", 
152                             GTK_SIGNAL_FUNC (keypress_check), drawing_area);    
153         gtk_object_set_data (GTK_OBJECT (drawing_area), "pixbuf", pixbuf);
154         gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0);
155    
156         gtk_widget_show_all (window);
157         gtk_main ();
158         return 0;
159 }