Re: Gnome2::Canvas surprising behaviour

On Aug 17, 2005, at 8:31 PM, James Muir wrote:

I discovered something surprising with the "aliased" version of the Gnome2::Canvas.

If you place a Gnome2::Canvas::Text item on an "anti-aliased" canvas and forget to set the 'fill-color' you see nothing. This seems reasonable. If you place a Gnome2::Canvas::Text item on an "aliased" canvas, the text will be displayed even without setting the 'fill-color'. Nice, I suppose, but is this a bug in Gnome2::Canvas?

Has nothing to do with Gnome2::Canvas --- it's just an implementation detail of libgnomecanvas-2.0.

The classic gdk canvas uses gdk to do its drawing, and canvas items are drawn with the draw() vfunc. gnome_canvas_text_draw() (a private function) calls gdk_draw_layout() to draw the text with the item's gc, which was created in realize() with all the defaults. The defaults, of course, include a text drawing color of black. When you do a set_property on the canvas text item in gdk mode, the rgb value you set gets placed directly into the gc.

The antialiased canvas does everything with client-side rendering. To achieve this, the canvas items are drawn with the render() vfunc rather than the draw() vfunc. The canvas text item keeps a current rgba foreground value, and uses this as the foreground color and alpha for blitting the image drawn by pango_ft2_render_layout() into the temporary pixel buffer passed in to gnome_canvas_text_render(). It just so happens that there is no initial value explicitly set in the instance initializer, so it takes the value given to the entire block by memset() at allocation time -- 0. Since the rgba value is an unsigned 32 bit int, that means the RGB is all zero, or black... but the alpha is also 0, and alpha of 0 means "completely transparent".

So, you may want to file a bug against libgnomecanvas in, pointing out that the gnome_canvas_item_text() needs to set text->rgba = 0x000000ff.... but now that gtk+ 2.8 is out with cairo support, and havoc and company are talking about a new canvas widget, don't be surprised if you get a lukewarm response.

(keep in mind, however, that it will still be many months before any Gnome2::Canvas replacement is viable.)

In the meantime, it's best just to be explicit and always set a fill color on your Gnome2::Canvas::Text items. ;-)

"the ternary operator makes it a bit less ugly."
    -- kaffee

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