Re: Progessive zooming and some other small problem.



Hello all,

I "fixed" the problem with the image, I found the gtk_image_get_pixbuf function. This however blurs the image with each pass, after about 25 passes the image is gone, short of like applying over and over an Antialias filter to it. Anyone knows of a better way of handeling images?


On Wed, 2003-08-13 at 13:06, Roberto Moral wrote:
Hello all,

I am trying to get a panel with progressive zomming working, like OS X
dock but with gtk (I bet I am not the first one) I have a function that
populates the panel and assign the event.

Basically I create an event box (docklet), create an image (image) out
of a pixmap and put it inside the container (docklet) then I connect the
signals:

	g_signal_connect(G_OBJECT(docklet),
"enter_notify_event",(GCallback)zoomin, image);
	g_signal_connect(G_OBJECT(docklet),
"leave_notify_event",(GCallback)zoomout, image);
	g_signal_connect(G_OBJECT(docklet), "button_press_event",
(GCallback)launchapp, application);

my zoomin callback looks like this:

static void zoomin(GtkWidget *widget, GdkEventButton *event, gpointer
data) {
	int steps, step_size, i, zoom_width, zoom_height;
/* 	GdkImage *image = data; */
	GdkPixbuf *zoomer;

	if (debug) {
	g_print("We are zooming in\n");
}
	steps = 8;
	step_size = 8;
	zoom_width = 64;
	zoom_height = 64;
	
	
	for ( i = 0; i < steps ; i++ ) {
		zoomer = gdk_pixbuf_new_from_data ((gpointer)data, GDK_COLORSPACE_RGB,
TRUE, 8, 64,64, 0, NULL, NULL);
	/*	zoomer = gdk_pixbuf_get_from_image(NULL, image, NULL, -1, -1, 0, 0,
64, 64); */

		zoom_width = zoom_width + step_size;
		zoom_height = zoom_height + step_size;
		usleep(100000);
		gtk_image_set_from_pixbuf(data, gdk_pixbuf_scale_simple(zoomer,
zoom_width, zoom_height, GDK_INTERP_BILINEAR));
		if (debug) {
			g_print("zoom_width = %d , zoom_height = %d\n", zoom_width,
zoom_height);
		}
	}
}

now to my 2 problems.

first, the zoom works, however it doesn't do the smooth zoom I was
hoping for, it goes from the minimun size to the maximun size altho I
see from the debug that zoom_height and zoom_width are set to the right
values but the image is not being updated. I put the usleep there to
actually see if it was going so fast that I was not able to see the
magnification because of that.

second, I though that gpointer data was a pointer to my GdkImage but
	GdkImage *image = data;
zoomer = gdk_pixbuf_get_from_image(NULL, image, NULL, -1, -1, 0, 0, 64,
64);

result in errors at run time:

(gDock:772): GdkPixbuf-CRITICAL **: file gdk-pixbuf-scale.c: line 235
(gdk_pixbu f_scale_simple): assertion `src != NULL' failed
 
(gDock:772): Gdk-CRITICAL **: file gdkpixbuf-drawable.c: line 1346
(gdk_pixbuf_g et_from_image): assertion `GDK_IS_IMAGE (src)' failed
zoom_width = 72 , zoom_height = 72


and if I try to use the zoomer = gdk_pixbuf_new_from_data
((gpointer)data, GDK_COLORSPACE_RGB, TRUE, 8, 64,64, 0, NULL, NULL);
when the zoom actually occurs I get a corrupted image, grey background
with vertical color lines.


for the first problem I could write the function so it only magnifies
one step at the time, but that would take a toll in the CPU that I am
trying to avoid.
for the second problerm I am sure it is something that I am doing wrong
in both cases.

Could someone give me a pointer as to what I am doing wrong.

Thank you.

Roberto Moral
SR. UNIX Systems Administrator
-------------------------------------
roberto quantiva com
Tel: 609-514-8513 | cell: 609-346-5601
Quantiva, inc.
100 Village Blvd. 3rd Floor
Princeton, NJ 08540

Attachment: signature.asc
Description: This is a digitally signed message part



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]