Re: GtkImageViewer

Regarding the gtk-list subscription, see:

for details.

About the strange colors, it is most likely that your pixbuf has an alpha channel, which is different from my tutorial example where I hardcoded the assumption that GtkImageViewer always passes a 24-bit pixbuf in the annotate signal. If you use alpha channel, then you should use cairo_image_surface_create_for_data with CAIRO_FORMAT_ARGB32 instead. I'm not sure whether it is enough for to switch R and B in such a case though. Check the documentation or just check if it works.


2009/4/12 Eduardo J. Andres <eduardoj andres gmail com>
Hello Dov,

Thanks fo the answer.
I am trying to know how to reply you by the gtk-list, but even I have done my suscription to it, I do not know yet how to do it, therefore, I write you again to same "gmail". Would you be able to explain me how to reply you there.

I shall look to the giv code, but in the meantime, I have seen that it is not an issue with your software/widget, it is the same with GtkImageView, for example. I would like to note you at that point that I am doing all my testing under XP.

So, if you have a pixbuf on a widget (whatever the widget may be), and you make a cairo_surfacet_t from that pixbuf, when you draw with cairo to the surface, you alway lose the color and get a line or arc with strange effects.

That´s what I would like to know, why??

Best regards

2009/4/12 Dov Grobgeld <dov grobgeld gmail com>

Hello Eduardo,

Thanks for the feedback.

Regarding the drawing of polygons, I have had the same problem and the solution I made is outside the GtkImageViewer. Please download my program giv at and have a look at the the pair of files giv_backstore.[ch] that provide a way of quickly storing all the information under a line and then restoring it. By tieing it to the button press and motion events it is possible to get a rubberband effect with only minimal flicker. (I'm considering a rewrite that eliminates flicker all together). See giv's use of it for details. (I agree it is also worthy of a tutorial. We'll see if I'll get around to it.)

Once you have a fixed line of the polygon, I add it to the lines drawn by the annotate callback, since update time is no longer an issue.

Regarding why your example doesn't work, I don't know, but it might have to do with the fact that you fix the pixbuf format to RGB24 without checking whether your pixbuf has an alpha channel.

Good luck!

Also, next time, please send the questions to the gtk-list. I take the freedom of CC:ing it.


2009/4/10 Eduardo J. Andres <eduardoj andres gmail com>

Dear Dov

I have been working with the widget during last days and have had  not success to get my requirement.

It is to draw with cairo and the mouse  poligons and lines as overlay of the image pixbuf. Poligons will have a lot of points so the best aproach I have seen is to draw them on the pixbuf an draw the new pixbuf to the image. But it is so slow doing it on the "image_annotate" handler.

 I have seen a number of issues at that point, for example the idea to get the cairo surface from your tutorial

int img_width = gdk_pixbuf_get_width(pixbuf);
int img_height = gdk_pixbuf_get_height(pixbuf);

cairo_surface_t *surface
= cairo_image_surface_create_for_data(gdk_pixbuf_get_pixels(pixbuf),
cairo_t *cr = cairo_create (surface);
cairo_translate(cr, -shift_x, -shift_y);
cairo_scale(cr, scale_x, scale_y);

// Now do any cairo commands you want, but you have to swap
// R and B in set_source_rgba() commands because of cairo and
// pixbuf incompabilitities.
cairo_set_source_rgba (cr, 0,0,1.0,0.5);
-1, 0,
3, 0.0, 2*G_PI);

cairo_set_source_rgba (cr, 1.0,0,0,0.5);
only works when you do inside the image annotate. In any other situation, the cairo drawing does not get the color. I have got, for example, the cairo surface from the pixbuf inside the gtk_image_viewer_new() function and draw directly there , but it gets a wrong color. It doesn´t matter the swapping in betweem the R and B colors. On the attached image, the rect line is has been drawn direcly with the code above, inside the the new() function. The symbol, drawnd on the GtkImageViewer->window, inside gtk_image_viever_expose().

Would you be kind to indicate me any sugesstion how to do it.


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