Re: trouble with Cairo text in OpenGL
"Henry (Yu) Song - SISA" <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <3955FA337689574EB32F94B12A7E6E9E0B49B78C@ex10mail> |
Hi, Victor You use RGBA as format in glTexImage2D(), make sure your image data is RGBA format. Henry From: Henry (Yu) Song - SISA Sent: Wednesday, January 04, 2012 9:57 AM To: 'Victor henri'; [email protected] Subject: RE: [cairo] trouble with Cairo text in OpenGL 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