]> Pileus Git - ~andy/gtk/blob - tests/testpixbuf-scale.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / tests / testpixbuf-scale.c
1 #include "config.h"
2 #include <gtk/gtk.h>
3
4 #include <stdio.h>
5 #include <stdlib.h>
6
7 GdkInterpType interp_type = GDK_INTERP_BILINEAR;
8 int overall_alpha = 255;
9 GdkPixbuf *pixbuf;
10 GtkWidget *darea;
11   
12 void
13 set_interp_type (GtkWidget *widget, gpointer data)
14 {
15   guint types[] = { GDK_INTERP_NEAREST,
16                     GDK_INTERP_BILINEAR,
17                     GDK_INTERP_TILES,
18                     GDK_INTERP_HYPER };
19
20   interp_type = types[gtk_combo_box_get_active (GTK_COMBO_BOX (widget))];
21   gtk_widget_queue_draw (darea);
22 }
23
24 void
25 overall_changed_cb (GtkAdjustment *adjustment, gpointer data)
26 {
27   if (gtk_adjustment_get_value (adjustment) != overall_alpha)
28     {
29       overall_alpha = gtk_adjustment_get_value (adjustment);
30       gtk_widget_queue_draw (darea);
31     }
32 }
33
34 gboolean
35 draw_cb (GtkWidget *widget, cairo_t *cr, gpointer data)
36 {
37   GdkPixbuf *dest;
38   int width, height;
39
40   width = gtk_widget_get_allocated_width (widget);
41   height = gtk_widget_get_allocated_height (widget);
42
43   dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height);
44
45   gdk_pixbuf_composite_color (pixbuf, dest,
46                               0, 0, width, height,
47                               0, 0,
48                               (double) width / gdk_pixbuf_get_width (pixbuf),
49                               (double) height / gdk_pixbuf_get_height (pixbuf),
50                               interp_type, overall_alpha,
51                               0, 0, 16, 0xaaaaaa, 0x555555);
52
53   gdk_cairo_set_source_pixbuf (cr, dest, 0, 0);
54   cairo_paint (cr);
55
56   g_object_unref (dest);
57   
58   return TRUE;
59 }
60
61 int
62 main(int argc, char **argv)
63 {
64         GtkWidget *window, *vbox;
65         GtkWidget *combo_box;
66         GtkWidget *alignment;
67         GtkWidget *hbox, *label, *hscale;
68         GtkAdjustment *adjustment;
69         GtkRequisition scratch_requisition;
70         const gchar *creator;
71         GError *error;
72
73         gtk_init (&argc, &argv);
74
75         if (argc != 2) {
76                 fprintf (stderr, "Usage: testpixbuf-scale FILE\n");
77                 exit (1);
78         }
79
80         error = NULL;
81         pixbuf = gdk_pixbuf_new_from_file (argv[1], &error);
82         if (!pixbuf) {
83                 fprintf (stderr, "Cannot load image: %s\n",
84                          error->message);
85                 g_error_free (error);
86                 exit(1);
87         }
88
89         creator = gdk_pixbuf_get_option (pixbuf, "tEXt::Software");
90         if (creator)
91                 g_print ("%s was created by '%s'\n", argv[1], creator);
92
93         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
94         g_signal_connect (window, "destroy",
95                           G_CALLBACK (gtk_main_quit), NULL);
96         
97         vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
98         gtk_container_add (GTK_CONTAINER (window), vbox);
99
100         combo_box = gtk_combo_box_text_new ();
101
102         gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), "NEAREST");
103         gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), "BILINEAR");
104         gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), "TILES");
105         gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_box), "HYPER");
106
107         gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), 1);
108
109         g_signal_connect (combo_box, "changed",
110                           G_CALLBACK (set_interp_type),
111                           NULL);
112         
113         alignment = gtk_alignment_new (0.0, 0.0, 0.0, 0.5);
114         gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0);
115
116         hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
117         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
118
119         label = gtk_label_new ("Overall Alpha:");
120         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
121
122         adjustment = gtk_adjustment_new (overall_alpha, 0, 255, 1, 10, 0);
123         g_signal_connect (adjustment, "value_changed",
124                           G_CALLBACK (overall_changed_cb), NULL);
125         
126         hscale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adjustment);
127         gtk_scale_set_digits (GTK_SCALE (hscale), 0);
128         gtk_box_pack_start (GTK_BOX (hbox), hscale, TRUE, TRUE, 0);
129
130         gtk_container_add (GTK_CONTAINER (alignment), combo_box);
131         gtk_widget_show_all (vbox);
132
133         /* Compute the size without the drawing area, so we know how big to make the default size */
134         gtk_widget_get_preferred_size ( (vbox),
135                                    &scratch_requisition, NULL);
136
137         darea = gtk_drawing_area_new ();
138         gtk_box_pack_start (GTK_BOX (vbox), darea, TRUE, TRUE, 0);
139
140         g_signal_connect (darea, "draw",
141                           G_CALLBACK (draw_cb), NULL);
142
143         gtk_window_set_default_size (GTK_WINDOW (window),
144                                      gdk_pixbuf_get_width (pixbuf),
145                                      scratch_requisition.height + gdk_pixbuf_get_height (pixbuf));
146         
147         gtk_widget_show_all (window);
148
149         gtk_main ();
150
151         return 0;
152 }