2 #include "gdk-pixbuf.h"
6 ArtFilterLevel filter_level = ART_FILTER_BILINEAR;
7 int overall_alpha = 255;
12 set_filter_level (GtkWidget *widget, gpointer data)
14 filter_level = GPOINTER_TO_UINT (data);
15 gtk_widget_queue_draw (darea);
19 overall_changed_cb (GtkAdjustment *adjustment, gpointer data)
21 if (adjustment->value != overall_alpha)
23 overall_alpha = adjustment->value;
24 gtk_widget_queue_draw (darea);
29 expose_cb (GtkWidget *widget, GdkEventExpose *event, gpointer data)
33 gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
35 dest = gdk_pixbuf_new (ART_PIX_RGB, FALSE, 8, event->area.width, event->area.height);
37 if (pixbuf->art_pixbuf->has_alpha || overall_alpha != 255)
38 gdk_pixbuf_composite_color (pixbuf, dest,
39 0, 0, event->area.width, event->area.height,
40 -event->area.x, -event->area.y,
41 (double) widget->allocation.width / pixbuf->art_pixbuf->width,
42 (double) widget->allocation.height / pixbuf->art_pixbuf->height,
43 filter_level, overall_alpha,
44 event->area.x, event->area.y, 16, 0xaaaaaa, 0x555555);
46 gdk_pixbuf_scale (pixbuf, dest,
47 0, 0, event->area.width, event->area.height,
48 -event->area.x, -event->area.y,
49 (double) widget->allocation.width / pixbuf->art_pixbuf->width,
50 (double) widget->allocation.height / pixbuf->art_pixbuf->height,
54 gdk_pixbuf_render_to_drawable (dest, widget->window, widget->style->fg_gc[GTK_STATE_NORMAL],
55 0, 0, event->area.x, event->area.y,
56 event->area.width, event->area.height,
57 GDK_RGB_DITHER_NORMAL, event->area.x, event->area.y);
59 gdk_pixbuf_unref (dest);
65 main(int argc, char **argv)
67 GtkWidget *window, *vbox;
68 GtkWidget *menuitem, *optionmenu, *menu;
70 GtkWidget *hbox, *label, *hscale;
71 GtkAdjustment *adjustment;
72 GtkRequisition scratch_requisition;
74 gtk_init (&argc, &argv);
78 fprintf (stderr, "Usage: testpixbuf-scale FILE\n");
82 pixbuf = gdk_pixbuf_new_from_file (argv[1]);
84 fprintf (stderr, "Cannot load %s\n", argv[1]);
88 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
89 gtk_signal_connect (GTK_OBJECT (window), "destroy",
90 GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
92 vbox = gtk_vbox_new (FALSE, 0);
93 gtk_container_add (GTK_CONTAINER (window), vbox);
95 menu = gtk_menu_new ();
97 menuitem = gtk_menu_item_new_with_label ("NEAREST");
98 gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
99 GTK_SIGNAL_FUNC (set_filter_level),
100 GUINT_TO_POINTER (ART_FILTER_NEAREST));
101 gtk_widget_show (menuitem);
102 gtk_container_add (GTK_CONTAINER (menu), menuitem);
104 menuitem = gtk_menu_item_new_with_label ("BILINEAR");
105 gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
106 GTK_SIGNAL_FUNC (set_filter_level),
107 GUINT_TO_POINTER (ART_FILTER_BILINEAR));
108 gtk_widget_show (menuitem);
109 gtk_container_add (GTK_CONTAINER (menu), menuitem);
111 menuitem = gtk_menu_item_new_with_label ("TILES");
112 gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
113 GTK_SIGNAL_FUNC (set_filter_level),
114 GUINT_TO_POINTER (ART_FILTER_TILES));
115 gtk_container_add (GTK_CONTAINER (menu), menuitem);
117 menuitem = gtk_menu_item_new_with_label ("HYPER");
118 gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
119 GTK_SIGNAL_FUNC (set_filter_level),
120 GUINT_TO_POINTER (ART_FILTER_HYPER));
121 gtk_container_add (GTK_CONTAINER (menu), menuitem);
123 optionmenu = gtk_option_menu_new ();
124 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
125 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 1);
127 alignment = gtk_alignment_new (0.0, 0.0, 0.0, 0.5);
128 gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0);
130 hbox = gtk_hbox_new (FALSE, 4);
131 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
133 label = gtk_label_new ("Overall Alpha:");
134 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
136 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (overall_alpha, 0, 255, 1, 10, 0));
137 gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
138 GTK_SIGNAL_FUNC (overall_changed_cb), NULL);
140 hscale = gtk_hscale_new (adjustment);
141 gtk_scale_set_digits (GTK_SCALE (hscale), 0);
142 gtk_box_pack_start (GTK_BOX (hbox), hscale, TRUE, TRUE, 0);
144 gtk_container_add (GTK_CONTAINER (alignment), optionmenu);
145 gtk_widget_show_all (vbox);
147 /* Compute the size without the drawing area, so we know how big to make the default size */
148 gtk_widget_size_request (vbox, &scratch_requisition);
150 darea = gtk_drawing_area_new ();
151 gtk_box_pack_start (GTK_BOX (vbox), darea, TRUE, TRUE, 0);
153 gtk_signal_connect (GTK_OBJECT (darea), "expose_event",
154 GTK_SIGNAL_FUNC (expose_cb), NULL);
156 gtk_window_set_default_size (GTK_WINDOW (window),
157 pixbuf->art_pixbuf->width,
158 scratch_requisition.height + pixbuf->art_pixbuf->height);
160 gtk_widget_show_all (window);