summaryrefslogtreecommitdiff
path: root/demos/testpixbuf-save.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2000-10-06 18:19:18 +0000
committerHavoc Pennington <hp@src.gnome.org>2000-10-06 18:19:18 +0000
commit6b9f9072708e6f1b41f9f75acd8d70191ad245ea (patch)
tree2a46c20b581be14650eb258c30ded238359a3c15 /demos/testpixbuf-save.c
parenta7e20093e9d6623433e764bb2aac9e40693c783d (diff)
downloadgdk-pixbuf-6b9f9072708e6f1b41f9f75acd8d70191ad245ea.tar.gz
Pixbuf saving, patch from David Welton.
2000-10-05 Havoc Pennington <hp@redhat.com> Pixbuf saving, patch from David Welton. * Makefile.am (GDK_PIXBUF_LIBS): add INTLLIBS (libgdk_pixbuf_1_3_la_SOURCES): add gdk-pixbuf-i18n.h * gdk-pixbuf-i18n.h: Add _() to gdk-pixbuf * io-png.c (gdk_pixbuf__png_image_save): PNG save routine. * io-jpeg.c (gdk_pixbuf__jpeg_image_save): JPEG save routine. * gdk-pixbuf-io.c (gdk_pixbuf_save): (gdk_pixbuf_savev): Implement pixbuf saving routines * gdk-pixbuf.c (gdk_pixbuf_error_quark): pixbuf error quark function * gdk-pixbuf.h: Add public save routines; add pixbuf error types * gdk-pixbuf-io.h: Add save function to GdkPixbufModule 2000-10-05 Havoc Pennington <hp@redhat.com> * demos/testpixbuf-save.c: add pixbuf save test * demos/Makefile.am: add testpixbuf-save.c
Diffstat (limited to 'demos/testpixbuf-save.c')
-rw-r--r--demos/testpixbuf-save.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/demos/testpixbuf-save.c b/demos/testpixbuf-save.c
new file mode 100644
index 000000000..802f98494
--- /dev/null
+++ b/demos/testpixbuf-save.c
@@ -0,0 +1,154 @@
+
+#include <config.h>
+/* if building outside GTK, remove /x11 part */
+#include <gdk/x11/gdkx.h>
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+
+void
+keypress_check (GtkWidget *widget, GdkEventKey *evt, gpointer data)
+{
+ GdkPixbuf *pixbuf;
+ GtkDrawingArea *da = (GtkDrawingArea*)data;
+ GError *err = NULL;
+
+ pixbuf = (GdkPixbuf *) gtk_object_get_data (GTK_OBJECT (da), "pixbuf");
+
+ if (evt->keyval == 'q')
+ gtk_main_quit ();
+ if (evt->keyval == 's') {
+ if (pixbuf == NULL) {
+ fprintf (stderr, "PIXBUF NULL\n");
+ return;
+ }
+
+ if (!gdk_pixbuf_save (pixbuf, "foo.jpg", "jpeg",
+ &err,
+ "quality", "100",
+ NULL)) {
+ fprintf (stderr, "%s", err->message);
+ g_error_free (err);
+ }
+
+ } else if (evt->keyval == 'p') {
+ if (pixbuf == NULL) {
+ fprintf (stderr, "PIXBUF NULL\n");
+ return;
+ }
+
+ if (!gdk_pixbuf_save (pixbuf, "foo.png", "png", &err, NULL)) {
+ fprintf (stderr, "%s", err->message);
+ g_error_free (err);
+ }
+ }
+}
+
+
+int
+close_app (GtkWidget *widget, gpointer data)
+{
+ gtk_main_quit ();
+ return TRUE;
+}
+
+int
+expose_cb (GtkWidget *drawing_area, GdkEventExpose *evt, gpointer data)
+{
+ GdkPixbuf *pixbuf;
+
+ pixbuf = (GdkPixbuf *) gtk_object_get_data (GTK_OBJECT (drawing_area),
+ "pixbuf");
+ if (gdk_pixbuf_get_has_alpha (pixbuf)) {
+ gdk_draw_rgb_32_image (drawing_area->window,
+ drawing_area->style->black_gc,
+ evt->area.x, evt->area.y,
+ evt->area.width,
+ evt->area.height,
+ GDK_RGB_DITHER_MAX,
+ gdk_pixbuf_get_pixels (pixbuf) +
+ (evt->area.y * gdk_pixbuf_get_rowstride (pixbuf)) +
+ (evt->area.x * gdk_pixbuf_get_n_channels (pixbuf)),
+ gdk_pixbuf_get_rowstride (pixbuf));
+ } else {
+ gdk_draw_rgb_image (drawing_area->window,
+ drawing_area->style->black_gc,
+ evt->area.x, evt->area.y,
+ evt->area.width,
+ evt->area.height,
+ GDK_RGB_DITHER_NORMAL,
+ gdk_pixbuf_get_pixels (pixbuf) +
+ (evt->area.y * gdk_pixbuf_get_rowstride (pixbuf)) +
+ (evt->area.x * gdk_pixbuf_get_n_channels (pixbuf)),
+ gdk_pixbuf_get_rowstride (pixbuf));
+ }
+ return FALSE;
+}
+
+int
+configure_cb (GtkWidget *drawing_area, GdkEventConfigure *evt, gpointer data)
+{
+ GdkPixbuf *pixbuf;
+
+ pixbuf = (GdkPixbuf *) gtk_object_get_data (GTK_OBJECT (drawing_area),
+ "pixbuf");
+
+ g_print ("X:%d Y:%d\n", evt->width, evt->height);
+ if (evt->width != gdk_pixbuf_get_width (pixbuf) || evt->height != gdk_pixbuf_get_height (pixbuf)) {
+ GdkWindow *root;
+ GdkPixbuf *new_pixbuf;
+
+ root = GDK_ROOT_PARENT ();
+ new_pixbuf = gdk_pixbuf_get_from_drawable (NULL, root, NULL,
+ 0, 0, 0, 0, evt->width, evt->height);
+ gtk_object_set_data (GTK_OBJECT (drawing_area), "pixbuf", new_pixbuf);
+ gdk_pixbuf_unref (pixbuf);
+ }
+
+ return FALSE;
+}
+
+int
+main (int argc, char **argv)
+{
+ GdkWindow *root;
+ GtkWidget *window;
+ GtkWidget *vbox;
+ GtkWidget *drawing_area;
+ GdkPixbuf *pixbuf;
+
+ gtk_init (&argc, &argv);
+
+ gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
+
+ root = GDK_ROOT_PARENT ();
+ pixbuf = gdk_pixbuf_get_from_drawable (NULL, root, NULL,
+ 0, 0, 0, 0, 150, 160);
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (window), "delete_event",
+ GTK_SIGNAL_FUNC (close_app), NULL);
+ gtk_signal_connect (GTK_OBJECT (window), "destroy",
+ GTK_SIGNAL_FUNC (close_app), NULL);
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (window), vbox);
+
+ drawing_area = gtk_drawing_area_new ();
+ gtk_drawing_area_size (GTK_DRAWING_AREA (drawing_area),
+ gdk_pixbuf_get_width (pixbuf),
+ gdk_pixbuf_get_height (pixbuf));
+ gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
+ GTK_SIGNAL_FUNC (expose_cb), NULL);
+
+ gtk_signal_connect (GTK_OBJECT (drawing_area), "configure_event",
+ GTK_SIGNAL_FUNC (configure_cb), NULL);
+ gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
+ GTK_SIGNAL_FUNC (keypress_check), drawing_area);
+ gtk_object_set_data (GTK_OBJECT (drawing_area), "pixbuf", pixbuf);
+ gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0);
+
+ gtk_widget_show_all (window);
+ gtk_main ();
+ return 0;
+}