Re: trouble with Cairo text in OpenGL

"Henry (Yu) Song - SISA" <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <3955FA337689574EB32F94B12A7E6E9E0B49B766@ex10mail>
Hi, Victor

You can use gl backend by compiling cairo source by yourself.  Pull latest cairo source from git server, and compile with "./configure -enable-gl=yes" for GLX or "./configure -enable-egl=yes -enable-glesv2=yes" for gles 2.0.

Regarding to your question, how about add glActiveTexture()?  You can always glGetError() to get what error is after each gl calls.

Henry

From: [email protected] [mailto:[email protected]] On Behalf Of Victor henri
Sent: Wednesday, January 04, 2012 9:42 AM
To: [email protected]
Subject: Re: [cairo] trouble with Cairo text in OpenGL

Hello Henry

Thank you for your quick answer.
It seems that cairo-gl is not currently available on Ubuntu and I would like to stick with tools that are available from the repositories since some users prefer that way to work.
I will keep the suggestion for later anyway.

Do you have an idea how I could solve my "problem"? Do you think it could be related to the last argument passed to the the glTexImage2D function?

Thank you again

Victor

________________________________
From: [email protected]
To: [email protected]; [email protected]
Subject: RE: [cairo] trouble with Cairo text in OpenGL
Date: Wed, 4 Jan 2012 17:10:34 +0000
Hi, Vector,

If you use cairo/gl backend, there is no need to make GL calls directly.

For example

/* create a gl surface */
cairo_surface_t *surface = cairo_gl_surface_create_for_window (....);

cairo_t *cr = cairo_create (surface);

/* draw text on gl surface */
cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL,  CAIRO_FONT_WEIGHT_BOLD);
 cairo_set_font_size (cr, 32.0);
 cairo_set_source_rgb (cr, 1.0, 1.0, 0.0);
 cairo_show_text (cr, "HELLO");

/* stroke a rectangle on gl surface */
cairo_rectangle (cr, 10, 10, 100, 100);
cairo_set_source_rgba (cr, 1.0, 0.0, 0.0, 1.0);
cairo_stroke (cr);

/* display gl surface on screen */
cairo_gl_surface_swapbuffers (surface);

/* clean up */
cairo_surface_destroy (surface);
cairo_destroy (cr);


Hope this helps

Henry

From: [email protected] [mailto:[email protected]] On Behalf Of Victor henri
Sent: Wednesday, January 04, 2012 6:38 AM
To: [email protected]
Subject: [cairo] trouble with Cairo text in OpenGL

Hello

I have trouble drawing text in an OpenGL texture with Cairo

It works with SDL and SDL_ttf with :

    GLuint textureId;

        SDL_Color Color = {150, 0, 240};
        SDL_Surface *Message = TTF_RenderText_Blended(font, "Hello!", Color);
        unsigned Texture = 0;

        glGenTextures(1, &Texture);
        glBindTexture(GL_TEXTURE_2D, Texture);

        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Message->w, Message->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, Message->pixels);

        glBegin(GL_QUADS);
        glColor4f(1, 0, 0, 1);
        glTexCoord2d(0, 0); glVertex3d(0, 0, 0);
        glTexCoord2d(1, 0); glVertex3d(0.2, 0, 0);
        glTexCoord2d(1, 1); glVertex3d(0.2, -0.2, 0);
        glTexCoord2d(0, 1); glVertex3d(0,  -0.2, 0);
        glEnd();

        glDeleteTextures(1, &Texture);

        SDL_FreeSurface(Message);

Clearly, the Message->pixels argument in "glTexImage2D" seems important; if I replace it with NULL, I get random lines and points.

If I do this with Cairo :

        cairo_surface_t *surface;
        cairo_t *cr;
        GLuint textureId;
        unsigned char* surfaceData;

        surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 64, 64);
        cr = cairo_create (surface);
        cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL,  CAIRO_FONT_WEIGHT_BOLD);
        cairo_set_font_size (cr, 32.0);
        cairo_set_source_rgb (cr, 1.0, 1.0, 0.0);
        cairo_show_text (cr, "HELLO");

        surfaceData = cairo_image_surface_get_data (surface);

        unsigned Texture = 0;

        glGenTextures(1, &Texture);
        glBindTexture(GL_TEXTURE_2D, Texture);

        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cairo_image_surface_get_width (surface), cairo_image_surface_get_height (surface), 0, GL_BGRA, GL_UNSIGNED_BYTE, surfaceData);

        glBegin(GL_QUADS);
        glColor4f(1, 0, 0, 1);
       glTexCoord2d(0, 0); glVertex3d(0, 0, 0);
        glTexCoord2d(1, 0); glVertex3d(0.2, 0, 0);
        glTexCoord2d(1, 1); glVertex3d(0.2, -0.2, 0);
        glTexCoord2d(0, 1); glVertex3d(0,  -0.2, 0);
        glEnd();

        glDeleteTextures(1, &Texture);
        cairo_destroy (cr);
        cairo_surface_destroy (surface);



If I do that I get a few red points but not the text I want. I use the " cairo_image_surface_get_data (surface)" function to get the appropriate data and to give it to glTextImage2D but I suppose this is where it won't work.

In some examples I have come across the "create_cairo_context" through which surfaceData can be taken. But this function seems completely unknown on my system...
I am using Ubuntu Linux 11.10 (lateste version)

Please could give me some help about this?

Victor

--
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.