[cairo] Cairo, Glitz, etc. again...

Jeremy L. Moles jeremy at emperorlinux.com
Wed Jun 21 09:58:15 PDT 2006


I wrote a small cairo_example.c file a while back thinking I had a good
grasp on how glitz and cairo work but I've realized these last few days
upon revisiting it that this simply isn't the case. It works in that
very contrived, very unrealistic example, but it does not intuitively
fall into other uses. I'm going to delete that stuff for now since it's
practically useless.

I just had a few questions I hoped Reveman or someone else familiar w/
Glitz (MacSlow/Behdad?) could answer...

If possible, I want to use Glitz "texture objects" as a kind of "canvas"
in an OpenGL game. More specifically, texture object will represent a UI
element in the game which I will draw on (irregularly, and certainly not
every frame) using Cairo.

I have some code that does this to some degree, but I'm not entirely
sure I'm following the right procedure. For one, no matter how hard I
try, I can't get alpha transparency to work like it should at all. Take
the following:

void render_cairo(cairo_t* cr, int w, int h) {
	// Fill the surface with transparency...
	// This acts as a kind of "clearing" mechanism, right???
        cairo_set_source_rgba(cr, 0.0f, 0.0f, 0.0f, 0.0f);
        cairo_rectangle(cr, 0.0f, 0.0f, 1.0f, 1.0f);
        cairo_fill(cr);

	// Draw a 1/2 transparent "X".
        cairo_set_source_rgba(cr, red, green, blue, 0.5f);
        cairo_set_line_width(cr, 0.05f);
        cairo_move_to(cr, 0.0f, 0.0f);
        cairo_line_to(cr, 1.0f, 1.0f);
        cairo_move_to(cr, 1.0f, 0.0f);
        cairo_line_to(cr, 0.0f, 1.0f);

        cairo_stroke(cr);
}

If I call this function only once, before the game's "main loop", the
texture is okay and seems to honor the alpha values I give it. (That is,
you can see the rest of the OpenGL scene underneath the Glitz texture).
However, if I add calls to render_cairo() in the game's main loop, the
texture does update itself but the alpha values in the "path" aren't
honored, although the places I haven't "pathed" yet still seem to be
okay (until I draw something on them). I'm assuming that's just
indicative of a bigger misunderstanding on my part, but any help (or
example working code of something similar) would be immensely
appreciated. I've include some screenshots below...

http://cherustone.com/good.png <-- The result of only calling
render_cairo() once, BEFORE the mainloop.

http://cherustone.com/bad.png <-- The result of calling render_cairo()
during every frame.



More information about the cairo mailing list