[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: GdkPixmap and GdkPixbuf
- From: y g <odysseus lost gmail com>
- To: "David Necas (Yeti)" <yeti physics muni cz>
- Cc: gtk-app-devel-list gnome org
- Subject: Re: GdkPixmap and GdkPixbuf
- Date: Mon, 6 Jun 2005 22:03:01 +0100
>
> Well, I can't see why this variant crashes -- so I compiled
> it and run under valgrind, and it didn't crash and valgrind
> even didn't print any (relevant) error. If other image
> formats crash too for you, you probably have to use debugger
> to find out what's going on...
>
OK, lets start from the beginning.
I tried it running it in two computers. One running centrino processor
with 512MB of memory and the other is an AthlonXP with 512 MB too. I
am using in both gtk+-2.6.7 with the latest glib.
I compiled the c file (find the source code in the end of the message) with:
$ gcc -g -o canvas canvas2.c `pkg-config gtk+-2.0 --cflags --libs`
`pkg-config gdk-2.0 --cflags --libs` `pkg-config gdk-pixbuf-2.0
--cflags --libs` `pkg-config gdk-pixbuf-xlib-2.0 --cflags --libs`
`pkg-config gdk-x11-2.0 --cflags --libs` `pkg-config gtk+-x11-2.0
--cflags --libs`
with no complains. Although even the "simple"
$ gcc -g -o canvas canvas2.c `pkg-config gtk+-2.0 --cflags --libs`
compiles fine.
The output of
$ valgrind --tool=memcheck --leak-check=yes ./canvas
is:
==6451== Memcheck, a memory error detector for x86-linux.
==6451== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.
==6451== Using valgrind-2.2.0, a program supervision framework for x86-linux.
==6451== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.
==6451== For more details, rerun with: -v
==6451==
==6451== Syscall param write(buf) contains uninitialised or
unaddressable byte(s)
==6451== at 0x9BD2D3: __write_nocancel (in /lib/tls/libc-2.3.5.so)
==6451== by 0xAAE312: _X11TransWrite (in /usr/X11R6/lib/libX11.so.6.2)
==6451== by 0xA923F2: (within /usr/X11R6/lib/libX11.so.6.2)
==6451== by 0xA9247A: _XReply (in /usr/X11R6/lib/libX11.so.6.2)
==6451== Address 0x1BDCD0A8 is 128 bytes inside a block of size 16384 alloc'd
==6451== at 0x1B90640D: calloc (vg_replace_malloc.c:176)
==6451== by 0xA82835: XOpenDisplay (in /usr/X11R6/lib/libX11.so.6.2)
==6451== by 0x1BBC7213: IA__gdk_display_open (gdkdisplay-x11.c:165)
==6451== by 0x1BBAB548: IA__gdk_display_open_default_libgtk_only (gdk.c:272)
configure_event
==6451==
==6451== Syscall param write(buf) contains uninitialised or
unaddressable byte(s)
==6451== at 0x9BD2D3: __write_nocancel (in /lib/tls/libc-2.3.5.so)
==6451== by 0xAAE312: _X11TransWrite (in /usr/X11R6/lib/libX11.so.6.2)
==6451== by 0xA923F2: (within /usr/X11R6/lib/libX11.so.6.2)
==6451== by 0xA9366D: _XEventsQueued (in /usr/X11R6/lib/libX11.so.6.2)
==6451== Address 0x1BDCD678 is 1616 bytes inside a block of size 16384 alloc'd
==6451== at 0x1B90640D: calloc (vg_replace_malloc.c:176)
==6451== by 0xA82835: XOpenDisplay (in /usr/X11R6/lib/libX11.so.6.2)
==6451== by 0x1BBC7213: IA__gdk_display_open (gdkdisplay-x11.c:165)
==6451== by 0x1BBAB548: IA__gdk_display_open_default_libgtk_only (gdk.c:272)
expose_event
===========
Saving image...
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1BC2F701: collect_save_options (gdk-pixbuf-io.c:1318)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451== by 0x8048DE9: save_image (canvas2.c:19)
==6451== by 0x1BCB9F72: IA__g_cclosure_marshal_VOID__VOID (gmarshal.c:77)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1BD0E8B8: IA__g_strdup (gstrfuncs.c:88)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451== by 0x8048DE9: save_image (canvas2.c:19)
==6451==
==6451== Use of uninitialised value of size 4
==6451== at 0x1BD0E8C5: IA__g_strdup (gstrfuncs.c:90)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451== by 0x8048DE9: save_image (canvas2.c:19)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1B9056BE: memcpy (mac_replace_strmem.c:81)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1B905728: memcpy (mac_replace_strmem.c:84)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1B9056CA: memcpy (mac_replace_strmem.c:69)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1B9056D3: memcpy (mac_replace_strmem.c:281)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1B905730: memcpy (mac_replace_strmem.c:294)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Use of uninitialised value of size 4
==6451== at 0x1B90573C: memcpy (mac_replace_strmem.c:298)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1BD0E8B8: IA__g_strdup (gstrfuncs.c:88)
==6451== by 0x1BC2F763: collect_save_options (gdk-pixbuf-io.c:1313)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451== by 0x8048DE9: save_image (canvas2.c:19)
==6451==
==6451== Use of uninitialised value of size 4
==6451== at 0x1BD0E8C5: IA__g_strdup (gstrfuncs.c:90)
==6451== by 0x1BC2F763: collect_save_options (gdk-pixbuf-io.c:1313)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451== by 0x8048DE9: save_image (canvas2.c:19)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1B9056BE: memcpy (mac_replace_strmem.c:81)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F763: collect_save_options (gdk-pixbuf-io.c:1313)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1B9056CA: memcpy (mac_replace_strmem.c:69)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F763: collect_save_options (gdk-pixbuf-io.c:1313)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1B9056D3: memcpy (mac_replace_strmem.c:281)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F763: collect_save_options (gdk-pixbuf-io.c:1313)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Use of uninitialised value of size 4
==6451== at 0x1B905708: memcpy (mac_replace_strmem.c:292)
==6451== by 0x1BD0E8E2: IA__g_strdup (gstrfuncs.c:92)
==6451== by 0x1BC2F763: collect_save_options (gdk-pixbuf-io.c:1313)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1BC2F795: collect_save_options (gdk-pixbuf-io.c:1318)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451== by 0x8048DE9: save_image (canvas2.c:19)
==6451== by 0x1BCB9F72: IA__g_cclosure_marshal_VOID__VOID (gmarshal.c:77)
==6451==
==6451== Conditional jump or move depends on uninitialised value(s)
==6451== at 0x1BD0E8C5: IA__g_strdup (gstrfuncs.c:90)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451== by 0x8048DE9: save_image (canvas2.c:19)
==6451==
==6451== Invalid read of size 1
==6451== at 0x1BD0E8C5: IA__g_strdup (gstrfuncs.c:90)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451== by 0x8048DE9: save_image (canvas2.c:19)
==6451== Address 0x258 is not stack'd, malloc'd or (recently) free'd
==6451==
==6451== Process terminating with default action of signal 11 (SIGSEGV)
==6451== Access not within mapped region at address 0x258
==6451== at 0x1BD0E8C5: IA__g_strdup (gstrfuncs.c:90)
==6451== by 0x1BC2F74E: collect_save_options (gdk-pixbuf-io.c:1312)
==6451== by 0x1BC2FAE8: IA__gdk_pixbuf_save (gdk-pixbuf-io.c:1587)
==6451== by 0x8048DE9: save_image (canvas2.c:19)
==6451==
==6451== ERROR SUMMARY: 54 errors from 20 contexts (suppressed: 61 from 2)
==6451== malloc/free: in use at exit: 2320289 bytes in 37570 blocks.
==6451== malloc/free: 164136 allocs, 126566 frees, 9704888 bytes allocated.
==6451== For a detailed leak analysis, rerun with: --leak-check=yes
==6451== For counts of detected errors, rerun with: -v
Segmentation fault
and the source file once more is:
#include <gtk/gtk.h>
#include <gdk/gdk.h>
/* Backing pixmap for drawing area */
static GdkPixmap *pixmap = NULL;
static void
save_image(GtkWidget* widget, gpointer user_data)
{
GtkRequisition canvasSize;
GdkPixbuf* pixbuf=NULL;
g_print("Saving image...\n");
gtk_widget_size_request(GTK_WIDGET(user_data), &canvasSize);
pixbuf = gdk_pixbuf_get_from_drawable(NULL, GDK_DRAWABLE(pixmap),
GDK_COLORSPACE_RGB, 0, 0, 0, 0, canvasSize.width, canvasSize.height);
gdk_pixbuf_save(pixbuf, "tempo", "bmp", NULL);
g_object_unref(pixbuf);
}
/* Draw a rectangle on the screen */
static void
draw_brush (GtkWidget *widget, gdouble x, gdouble y)
{
g_print("draw_brush\n");
GdkRectangle update_rect;
update_rect.x = x - 5;
update_rect.y = y - 5;
update_rect.width = 10;
update_rect.height = 10;
gdk_draw_rectangle (pixmap,
widget->style->black_gc,
TRUE,
update_rect.x, update_rect.y,
update_rect.width, update_rect.height);
gtk_widget_queue_draw_area (widget,
update_rect.x, update_rect.y,
update_rect.width, update_rect.height);
}
/* Redraw the screen from the backing pixmap */
static gboolean
expose_event( GtkWidget *widget, GdkEventExpose *event )
{
g_print("expose_event\n");
gdk_draw_drawable(widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
pixmap,
event->area.x, event->area.y,
event->area.x, event->area.y,
event->area.width, event->area.height);
return FALSE;
}
/* Create a new backing pixmap of the appropriate size */
static gboolean
configure_event( GtkWidget *widget, GdkEventConfigure *event )
{
g_print("configure_event\n");
if (pixmap)
g_object_unref(pixmap);
pixmap = gdk_pixmap_new(widget->window,
widget->allocation.width,
widget->allocation.height,
-1);
gdk_draw_rectangle (pixmap,
widget->style->white_gc,
TRUE,
0, 0,
widget->allocation.width,
widget->allocation.height);
return TRUE;
}
static gboolean
button_press_event( GtkWidget *widget, GdkEventButton *event )
{
g_print("button_press_event\n");
if (event->button == 1 && pixmap != NULL)
draw_brush (widget, event->x, event->y);
return TRUE;
}
static gboolean
motion_notify_event( GtkWidget *widget, GdkEventMotion *event )
{
int x, y;
GdkModifierType state;
g_print("motion_notify_event\n");
if (event->is_hint)
gdk_window_get_pointer (event->window, &x, &y, &state);
else
{
x = event->x;
y = event->y;
state = event->state;
}
if (state & GDK_BUTTON1_MASK && pixmap != NULL)
draw_brush (widget, x, y);
return TRUE;
}
int
main(int argc, char *argv[])
{
GtkWidget* main;
GtkWidget* drawing_area;
GtkWidget* vbox1;
GtkWidget* buttonSave;
gtk_set_locale ();
gtk_init (&argc, &argv);
main = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(main), "Drawing area");
vbox1 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox1);
gtk_container_add (GTK_CONTAINER (main), vbox1);
drawing_area = gtk_drawing_area_new();
gtk_widget_set_size_request(GTK_WIDGET(drawing_area), 600, 400);
gtk_box_pack_start (GTK_BOX (vbox1), drawing_area, TRUE, TRUE, 0);
buttonSave = gtk_button_new_from_stock ("gtk-save");
gtk_box_pack_start (GTK_BOX (vbox1), buttonSave, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
(GtkSignalFunc) expose_event, NULL);
gtk_signal_connect (GTK_OBJECT(drawing_area),"configure_event",
(GtkSignalFunc) configure_event, NULL);
gtk_signal_connect (GTK_OBJECT (drawing_area), "motion_notify_event",
(GtkSignalFunc) motion_notify_event, NULL);
gtk_signal_connect (GTK_OBJECT (drawing_area), "button_press_event",
(GtkSignalFunc) button_press_event, NULL);
gtk_signal_connect (GTK_OBJECT (buttonSave), "clicked",
(GtkSignalFunc) save_image, drawing_area);
gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK
| GDK_LEAVE_NOTIFY_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK);
gtk_widget_show(vbox1);
gtk_widget_show(drawing_area);
gtk_widget_show(buttonSave);
gtk_widget_show(main);
gtk_main();
return 0;
}
Can someone please give me a hand, as I have no clue what is going on.
If more information is needed please ask me, but I am not familiar
with valgrind.
Cheers
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]