diff options
author | Owen Taylor <otaylor@redhat.com> | 2000-01-05 21:33:58 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2000-01-05 21:33:58 +0000 |
commit | 33e963e7af498d2e91dd2cf607cbc93c880d055c (patch) | |
tree | 1f6d2a5bb0d137ec02a2728c9a3e11f3d9d7352f /demos | |
parent | 2bb20aee8bf9a8c8ed6a8c7fb9360559385c6fda (diff) | |
download | gtk+-33e963e7af498d2e91dd2cf607cbc93c880d055c.tar.gz |
Directory full of pixel data scaling code that will eventually migrate
2000-01-05 Owen Taylor <otaylor@redhat.com>
* gdk-pixbuf/pixops/: Directory full of pixel data scaling
code that will eventually migrate into libart.
* configure.in acconfig.h: Add checks for MMX compiler support
* gdk-pixbuf/gdk-pixbuf.h gdk-pixbuf/gdk-pixbuf-scale.c:
Nice wrapper routines for the code in pixops that operate
on pixbufs instead of raw data.
* gdk-pixbuf/testpixbuf-scale: Test program for scaling
routines.
Diffstat (limited to 'demos')
-rw-r--r-- | demos/testpixbuf-scale.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/demos/testpixbuf-scale.c b/demos/testpixbuf-scale.c new file mode 100644 index 0000000000..c2891bd07e --- /dev/null +++ b/demos/testpixbuf-scale.c @@ -0,0 +1,163 @@ +#include <gtk/gtk.h> +#include "gdk-pixbuf.h" + +#include <stdio.h> + +ArtFilterLevel filter_level = ART_FILTER_BILINEAR; +int overall_alpha = 255; +GdkPixbuf *pixbuf; +GtkWidget *darea; + +void +set_filter_level (GtkWidget *widget, gpointer data) +{ + filter_level = GPOINTER_TO_UINT (data); + gtk_widget_queue_draw (darea); +} + +void +overall_changed_cb (GtkAdjustment *adjustment, gpointer data) +{ + if (adjustment->value != overall_alpha) + { + overall_alpha = adjustment->value; + gtk_widget_queue_draw (darea); + } +} + +gboolean +expose_cb (GtkWidget *widget, GdkEventExpose *event, gpointer data) +{ + GdkPixbuf *dest; + + dest = gdk_pixbuf_new (ART_PIX_RGB, FALSE, 8, event->area.width, event->area.height); + + if (pixbuf->art_pixbuf->has_alpha || overall_alpha != 255) + gdk_pixbuf_composite_color (pixbuf, dest, + 0, 0, event->area.width, event->area.height, + -event->area.x, -event->area.y, + (double) widget->allocation.width / pixbuf->art_pixbuf->width, + (double) widget->allocation.height / pixbuf->art_pixbuf->height, + filter_level, overall_alpha, + event->area.x, event->area.y, 16, 0xaaaaaa, 0x555555); + else + gdk_pixbuf_scale (pixbuf, dest, + 0, 0, event->area.width, event->area.height, + -event->area.x, -event->area.y, + (double) widget->allocation.width / pixbuf->art_pixbuf->width, + (double) widget->allocation.height / pixbuf->art_pixbuf->height, + filter_level); + + + gdk_pixbuf_render_to_drawable (dest, widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], + 0, 0, event->area.x, event->area.y, + event->area.width, event->area.height, + GDK_RGB_DITHER_NORMAL, event->area.x, event->area.y); + + gdk_pixbuf_unref (dest); + + return TRUE; +} + +int +main(int argc, char **argv) +{ + GtkWidget *window, *vbox; + GtkWidget *menuitem, *optionmenu, *menu; + GtkWidget *alignment; + GtkWidget *hbox, *label, *hscale; + GtkAdjustment *adjustment; + GtkRequisition scratch_requisition; + + gtk_init (&argc, &argv); + gdk_rgb_init (); + + if (argc != 2) { + fprintf (stderr, "Usage: testpixbuf-scale FILE\n"); + exit (1); + } + + pixbuf = gdk_pixbuf_new_from_file (argv[1]); + if (!pixbuf) { + fprintf (stderr, "Cannot load %s\n", argv[1]); + exit(1); + } + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_signal_connect (GTK_OBJECT (window), "destroy", + GTK_SIGNAL_FUNC (gtk_main_quit), NULL); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (window), vbox); + + menu = gtk_menu_new (); + + menuitem = gtk_menu_item_new_with_label ("NEAREST"); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + GTK_SIGNAL_FUNC (set_filter_level), + GUINT_TO_POINTER (ART_FILTER_NEAREST)); + gtk_widget_show (menuitem); + gtk_container_add (GTK_CONTAINER (menu), menuitem); + + menuitem = gtk_menu_item_new_with_label ("BILINEAR"); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + GTK_SIGNAL_FUNC (set_filter_level), + GUINT_TO_POINTER (ART_FILTER_BILINEAR)); + gtk_widget_show (menuitem); + gtk_container_add (GTK_CONTAINER (menu), menuitem); + + menuitem = gtk_menu_item_new_with_label ("TILES"); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + GTK_SIGNAL_FUNC (set_filter_level), + GUINT_TO_POINTER (ART_FILTER_TILES)); + gtk_container_add (GTK_CONTAINER (menu), menuitem); + + menuitem = gtk_menu_item_new_with_label ("HYPER"); + gtk_signal_connect (GTK_OBJECT (menuitem), "activate", + GTK_SIGNAL_FUNC (set_filter_level), + GUINT_TO_POINTER (ART_FILTER_HYPER)); + gtk_container_add (GTK_CONTAINER (menu), menuitem); + + optionmenu = gtk_option_menu_new (); + gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu); + gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 1); + + alignment = gtk_alignment_new (0.0, 0.0, 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0); + + hbox = gtk_hbox_new (FALSE, 4); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + + label = gtk_label_new ("Overall Alpha:"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + + adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (overall_alpha, 0, 255, 1, 10, 0)); + gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", + GTK_SIGNAL_FUNC (overall_changed_cb), NULL); + + hscale = gtk_hscale_new (adjustment); + gtk_scale_set_digits (GTK_SCALE (hscale), 0); + gtk_box_pack_start (GTK_BOX (hbox), hscale, TRUE, TRUE, 0); + + gtk_container_add (GTK_CONTAINER (alignment), optionmenu); + gtk_widget_show_all (vbox); + + /* Compute the size without the drawing area, so we know how big to make the default size */ + gtk_widget_size_request (vbox, &scratch_requisition); + + darea = gtk_drawing_area_new (); + gtk_box_pack_start (GTK_BOX (vbox), darea, TRUE, TRUE, 0); + + gtk_signal_connect (GTK_OBJECT (darea), "expose_event", + GTK_SIGNAL_FUNC (expose_cb), NULL); + + gtk_window_set_default_size (GTK_WINDOW (window), + pixbuf->art_pixbuf->width, + scratch_requisition.height + pixbuf->art_pixbuf->height); + + gtk_widget_show_all (window); + + gtk_main (); + + return 0; +} |