--- deliantra/Deliantra-Client/pango-render.c 2006/07/04 23:44:23 1.2 +++ deliantra/Deliantra-Client/pango-render.c 2006/08/13 15:14:17 1.6 @@ -37,6 +37,7 @@ { PangoRenderer parent_instance; float r, g, b, a; // modulate + int flags; GLuint curtex; // current texture }; @@ -148,6 +149,7 @@ typedef struct glyph_info { tc_area tex; int left, top; + int generation; } glyph_info; static void @@ -174,24 +176,29 @@ g = _pango_opengl_font_get_cache_glyph_data (font, glyph); - if (!g) + if (!g || g->generation != tc_generation) { Glyph bm; font_render_glyph (&bm, font, glyph); - g = g_slice_new (glyph_info); + if (g) + g->generation = tc_generation; + else + { + g = g_slice_new (glyph_info); + + _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info); + _pango_opengl_font_set_cache_glyph_data (font, glyph, g); + } + + if (renderer->curtex) + glEnd (); tc_get (&g->tex, bm.width, bm.height); g->left = bm.left; g->top = bm.top; - if (renderer->curtex) - { - glEnd (); - renderer->curtex = 0; - } - glBindTexture (GL_TEXTURE_2D, g->tex.name); glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); @@ -199,8 +206,8 @@ glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); glPixelStorei (GL_UNPACK_ALIGNMENT, 4); - _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info); - _pango_opengl_font_set_cache_glyph_data (font, glyph, g); + renderer->curtex = g->tex.name; + glBegin (GL_QUADS); } x += g->left; @@ -218,6 +225,7 @@ glBindTexture (GL_TEXTURE_2D, g->tex.name); renderer->curtex = g->tex.name; + glBegin (GL_QUADS); } @@ -249,9 +257,9 @@ glBegin (GL_QUADS); glVertex2d (x11, y1); - glVertex2d (x12, y1); + glVertex2d (x21, y1); glVertex2d (x22, y2); - glVertex2d (x21, y2); + glVertex2d (x12, y2); glEnd (); glEnable (GL_TEXTURE_2D); @@ -260,7 +268,8 @@ void pango_opengl_render_layout_subpixel (PangoLayout *layout, int x, int y, - float r, float g, float b, float a) + float r, float g, float b, float a, + int flags) { PangoContext *context; PangoFontMap *fontmap; @@ -274,6 +283,7 @@ PANGO_OPENGL_RENDERER (renderer)->g = g; PANGO_OPENGL_RENDERER (renderer)->b = b; PANGO_OPENGL_RENDERER (renderer)->a = a; + PANGO_OPENGL_RENDERER (renderer)->flags = flags; pango_renderer_draw_layout (renderer, layout, x, y); } @@ -281,9 +291,10 @@ void pango_opengl_render_layout (PangoLayout *layout, int x, int y, - float r, float g, float b, float a) + float r, float g, float b, float a, + int flags) { - pango_opengl_render_layout_subpixel (layout, x * PANGO_SCALE, y * PANGO_SCALE, r, g, b, a); + pango_opengl_render_layout_subpixel (layout, x * PANGO_SCALE, y * PANGO_SCALE, r, g, b, a, flags); } static void @@ -301,6 +312,7 @@ PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer; PangoColor *fg = 0; GSList *l; + unsigned char r, g, b, a; renderer->underline = PANGO_UNDERLINE_NONE; renderer->strikethrough = FALSE; @@ -329,9 +341,28 @@ } if (fg) - glColor4f (fg->red / 65535., fg->green / 65535., fg->blue / 65535., glrenderer->a); + { + r = fg->red * (255.f / 65535.f); + g = fg->green * (255.f / 65535.f); + b = fg->blue * (255.f / 65535.f); + } else - glColor4f (glrenderer->r, glrenderer->g, glrenderer->b, glrenderer->a); + { + r = glrenderer->r * 255.f; + g = glrenderer->g * 255.f; + b = glrenderer->b * 255.f; + } + + a = glrenderer->a * 255.f; + + if (glrenderer->flags & FLAG_INVERSE) + { + r ^= 0xffU; + g ^= 0xffU; + b ^= 0xffU; + } + + glColor4ub (r, g, b, a); } static void