]> Pileus Git - ~andy/gtk/blob - demos/testpixbuf-scale.c
It was cold and rainy this Saturday morning, so I needed something to warm
[~andy/gtk] / demos / testpixbuf-scale.c
1 #include <gtk/gtk.h>
2 #include "gdk-pixbuf.h"
3
4 #include <stdio.h>
5
6 GdkInterpType interp_type = GDK_INTERP_BILINEAR;
7 int overall_alpha = 255;
8 GdkPixbuf *pixbuf;
9 GtkWidget *darea;
10   
11 void
12 set_interp_type (GtkWidget *widget, gpointer data)
13 {
14   interp_type = GPOINTER_TO_UINT (data);
15   gtk_widget_queue_draw (darea);
16 }
17
18 void
19 overall_changed_cb (GtkAdjustment *adjustment, gpointer data)
20 {
21   if (adjustment->value != overall_alpha)
22     {
23       overall_alpha = adjustment->value;
24       gtk_widget_queue_draw (darea);
25     }
26 }
27
28 gboolean
29 expose_cb (GtkWidget *widget, GdkEventExpose *event, gpointer data)
30 {
31   GdkPixbuf *dest;
32   GdkGC *gc;
33   GdkColormap *colormap;
34   GdkColor color;
35
36   color.red = 0xffff;
37   color.green = 0xffff;
38   color.blue = 0xffff;
39   
40   gc = gdk_gc_new (widget->window);
41   colormap = gdk_window_get_colormap (widget->window);
42   gdk_colormap_alloc_color (colormap, &color, TRUE, TRUE);
43   gdk_gc_set_foreground (gc, &color);
44   gdk_draw_rectangle (widget->window, gc,       
45                       TRUE,
46                       event->area.x, 
47                       event->area.y, 
48                       event->area.width, event->area.height);
49
50   gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
51
52
53   dest = gdk_pixbuf_get_from_drawable(NULL,
54                                       widget->window,
55                                       gdk_window_get_colormap (widget->window),
56                                       event->area.x, 
57                                       event->area.y, 
58                                       0, 0, event->area.width, event->area.height);
59
60   gdk_pixbuf_composite (pixbuf, dest,
61                         0, 0, event->area.width, event->area.height,
62                         -event->area.x, -event->area.y,
63                         (double) widget->allocation.width / gdk_pixbuf_get_width (pixbuf),
64                         (double) widget->allocation.height / gdk_pixbuf_get_height (pixbuf),
65                         interp_type, overall_alpha);
66   
67   gdk_pixbuf_render_to_drawable (dest, widget->window, widget->style->fg_gc[GTK_STATE_NORMAL],
68                                  0, 0, event->area.x, event->area.y,
69                                  event->area.width, event->area.height,
70                                  GDK_RGB_DITHER_NORMAL, event->area.x, event->area.y);
71   
72   gdk_pixbuf_unref (dest);
73   
74   return TRUE;
75 }
76
77 int
78 main(int argc, char **argv)
79 {
80         GtkWidget *window, *vbox;
81         GtkWidget *menuitem, *optionmenu, *menu;
82         GtkWidget *alignment;
83         GtkWidget *hbox, *label, *hscale;
84         GtkAdjustment *adjustment;
85         GtkRequisition scratch_requisition;
86
87         gtk_init (&argc, &argv);
88         gdk_rgb_init ();
89
90         if (argc != 2) {
91                 fprintf (stderr, "Usage: testpixbuf-scale FILE\n");
92                 exit (1);
93         }
94
95         pixbuf = gdk_pixbuf_new_from_file (argv[1]);
96         if (!pixbuf) {
97                 fprintf (stderr, "Cannot load %s\n", argv[1]);
98                 exit(1);
99         }
100
101         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
102         gtk_signal_connect (GTK_OBJECT (window), "destroy",
103                             GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
104         
105         vbox = gtk_vbox_new (FALSE, 0);
106         gtk_container_add (GTK_CONTAINER (window), vbox);
107
108         menu = gtk_menu_new ();
109         
110         menuitem = gtk_menu_item_new_with_label ("NEAREST");
111         gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
112                             GTK_SIGNAL_FUNC (set_interp_type),
113                             GUINT_TO_POINTER (GDK_INTERP_NEAREST));
114         gtk_widget_show (menuitem);
115         gtk_container_add (GTK_CONTAINER (menu), menuitem);
116         
117         menuitem = gtk_menu_item_new_with_label ("BILINEAR");
118         gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
119                             GTK_SIGNAL_FUNC (set_interp_type),
120                             GUINT_TO_POINTER (GDK_INTERP_BILINEAR));
121         gtk_widget_show (menuitem);
122         gtk_container_add (GTK_CONTAINER (menu), menuitem);
123         
124         menuitem = gtk_menu_item_new_with_label ("TILES");
125         gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
126                             GTK_SIGNAL_FUNC (set_interp_type),
127                             GUINT_TO_POINTER (GDK_INTERP_TILES));
128         gtk_container_add (GTK_CONTAINER (menu), menuitem);
129
130         menuitem = gtk_menu_item_new_with_label ("HYPER");
131         gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
132                             GTK_SIGNAL_FUNC (set_interp_type),
133                             GUINT_TO_POINTER (GDK_INTERP_HYPER));
134         gtk_container_add (GTK_CONTAINER (menu), menuitem);
135
136         optionmenu = gtk_option_menu_new ();
137         gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
138         gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 1);
139         
140         alignment = gtk_alignment_new (0.0, 0.0, 0.0, 0.5);
141         gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0);
142
143         hbox = gtk_hbox_new (FALSE, 4);
144         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
145
146         label = gtk_label_new ("Overall Alpha:");
147         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
148
149         adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (overall_alpha, 0, 255, 1, 10, 0));
150         gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
151                             GTK_SIGNAL_FUNC (overall_changed_cb), NULL);
152         
153         hscale = gtk_hscale_new (adjustment);
154         gtk_scale_set_digits (GTK_SCALE (hscale), 0);
155         gtk_box_pack_start (GTK_BOX (hbox), hscale, TRUE, TRUE, 0);
156
157         gtk_container_add (GTK_CONTAINER (alignment), optionmenu);
158         gtk_widget_show_all (vbox);
159
160         /* Compute the size without the drawing area, so we know how big to make the default size */
161         gtk_widget_size_request (vbox, &scratch_requisition);
162
163         darea = gtk_drawing_area_new ();
164         gtk_box_pack_start (GTK_BOX (vbox), darea, TRUE, TRUE, 0);
165
166         gtk_signal_connect (GTK_OBJECT (darea), "expose_event",
167                             GTK_SIGNAL_FUNC (expose_cb), NULL);
168
169         gtk_window_set_default_size (GTK_WINDOW (window),
170                                      gdk_pixbuf_get_width (pixbuf),
171                                      scratch_requisition.height + gdk_pixbuf_get_height (pixbuf));
172         
173         gtk_widget_show_all (window);
174
175         gtk_main ();
176
177         return 0;
178 }