--- deliantra/Deliantra-Client/pango-render.c 2006/08/13 15:14:17 1.6 +++ deliantra/Deliantra-Client/pango-render.c 2007/08/11 11:28:03 1.7 @@ -38,7 +38,9 @@ PangoRenderer parent_instance; float r, g, b, a; // modulate int flags; - GLuint curtex; // current texture + rc_t *rc; // rendercache + rc_key_t key; // current render key + rc_array_t *arr; }; G_DEFINE_TYPE (PangoOpenGLRenderer, pango_opengl_renderer, PANGO_TYPE_RENDERER) @@ -191,9 +193,6 @@ _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; @@ -205,9 +204,6 @@ glTexSubImage2D (GL_TEXTURE_2D, 0, g->tex.x, g->tex.y, bm.width, bm.height, GL_ALPHA, GL_UNSIGNED_BYTE, bm.bitmap); glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); glPixelStorei (GL_UNPACK_ALIGNMENT, 4); - - renderer->curtex = g->tex.name; - glBegin (GL_QUADS); } x += g->left; @@ -218,21 +214,16 @@ x2 = g->tex.w * (1. / TC_WIDTH ) + x1; y2 = g->tex.h * (1. / TC_HEIGHT) + y1; - if (g->tex.name != renderer->curtex) + if (g->tex.name != renderer->key.texname) { - if (renderer->curtex) - glEnd (); - - glBindTexture (GL_TEXTURE_2D, g->tex.name); - renderer->curtex = g->tex.name; - - glBegin (GL_QUADS); + renderer->key.texname = g->tex.name; + renderer->arr = rc_array (renderer->rc, &renderer->key); } - glTexCoord2f (x1, y1); glVertex2i (x , y ); - glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y ); - glTexCoord2f (x2, y2); glVertex2i (x + g->tex.w, y + g->tex.h); - glTexCoord2f (x1, y2); glVertex2i (x , y + g->tex.h); + rc_t2f_v3f (x1, y1, x , y , 0); + rc_t2f_v3f (x2, y1, x + g->tex.w, y , 0); + rc_t2f_v3f (x2, y2, x + g->tex.w, y + g->tex.h, 0); + rc_t2f_v3f (x1, y2, x , y + g->tex.h, 0); } static void @@ -246,23 +237,19 @@ double x22) { PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; + rc_key_t key = renderer->key; + rc_array_t *arr; - if (renderer->curtex) - { - glEnd (); - renderer->curtex = 0; - } - - glDisable (GL_TEXTURE_2D); - - glBegin (GL_QUADS); - glVertex2d (x11, y1); - glVertex2d (x21, y1); - glVertex2d (x22, y2); - glVertex2d (x12, y2); - glEnd (); - - glEnable (GL_TEXTURE_2D); + key.mode = GL_QUADS; + key.format = GL_V2F; + key.texname = 0; + + arr = rc_array (renderer->rc, &key); + + rc_v2f (x11, y1); + rc_v2f (x21, y1); + rc_v2f (x22, y2); + rc_v2f (x12, y2); } void @@ -300,6 +287,8 @@ static void pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) { + memset (&renderer->key, 0, sizeof (rc_key_t)); + renderer->r = 1.; renderer->g = 1.; renderer->b = 1.; @@ -317,6 +306,10 @@ renderer->underline = PANGO_UNDERLINE_NONE; renderer->strikethrough = FALSE; + renderer->key.mode = GL_QUADS; + renderer->key.format = GL_T2F_V2F; + renderer->key.texname = 0; + for (l = run->item->analysis.extra_attrs; l; l = l->next) { PangoAttribute *attr = l->data; @@ -362,7 +355,10 @@ b ^= 0xffU; } - glColor4ub (r, g, b, a); + renderer->key.r = r; + renderer->key.g = g; + renderer->key.b = b; + renderer->key.a = a; } static void @@ -370,8 +366,6 @@ { PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; - renderer->curtex = 0; - glEnable (GL_TEXTURE_2D); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable (GL_BLEND); @@ -386,8 +380,7 @@ { PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; - if (renderer->curtex) - glEnd (); + rc_draw (renderer->rc); glDisable (GL_ALPHA_TEST); glDisable (GL_BLEND);