diff options
-rw-r--r-- | generic/Text.c | 251 |
1 files changed, 130 insertions, 121 deletions
diff --git a/generic/Text.c b/generic/Text.c index e7e1c47..804670c 100644 --- a/generic/Text.c +++ b/generic/Text.c @@ -866,141 +866,150 @@ Render(Item item) return; } - lines = (TextLineInfo) ZnListArray(text->text_info); - num_lines = ZnListSize(text->text_info); - Tk_GetFontMetrics(text->font, &fm); - font_height = fm.ascent+fm.descent; - - /* - * These 3 values should be fetched from the font. - * Currently I don't know how without diving into - * Tk internals. - */ - underline_thickness = 2; - underline_pos = fm.descent/2; - overstrike_pos = fm.ascent*3/10; - - /* - * Compute the selection and the cursor geometry. - */ - ComputeCursorAndSel(item, lines, num_lines, - &sel_first_line, &sel_last_line, - &cursor_line, &sel_start_offset, - &sel_stop_offset, &cursor_offset); - - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - - /* - * Render the selection. - */ - if ((ti->sel_item == item) && (sel_first_line >= 0)) { - ZnReal xo, yo, xc, yc; - - color = ZnGetGradientColor(ti->sel_color, 0, &alpha); - alpha = ZnComposeAlpha(alpha, wi->alpha); - glColor4us(color->red, color->green, color->blue, alpha); - glBegin(GL_QUADS); - if (sel_first_line == sel_last_line) { - xo = text->pos_dev.x + lines[sel_first_line].text_origin.x + sel_start_offset; - yo = text->pos_dev.y + lines[sel_first_line].text_origin.y - fm.ascent; - xc = xo + sel_stop_offset - sel_start_offset; - yc = yo + font_height; - glVertex2f(xo, yo); - glVertex2f(xc, yo); - glVertex2f(xc, yc); - glVertex2f(xo, yc); - } - else { - xo = text->pos_dev.x + lines[sel_first_line].text_origin.x + sel_start_offset; - yo = text->pos_dev.y + lines[sel_first_line].text_origin.y - fm.ascent; - xc = xo + text->max_width-lines[sel_first_line].text_origin.x-sel_start_offset; - yc = yo + font_height; - glVertex2f(xo, yo); - glVertex2f(xc, yo); - glVertex2f(xc, yc); - glVertex2f(xo, yc); - for (i = sel_first_line+1, lines_ptr = &lines[sel_first_line+1]; - i < sel_last_line; i++, lines_ptr++) { + if (!item->gl_list) { + item->gl_list = glGenLists(1); + glNewList(item->gl_list, GL_COMPILE); + + lines = (TextLineInfo) ZnListArray(text->text_info); + num_lines = ZnListSize(text->text_info); + Tk_GetFontMetrics(text->font, &fm); + font_height = fm.ascent+fm.descent; + + /* + * These 3 values should be fetched from the font. + * Currently I don't know how without diving into + * Tk internals. + */ + underline_thickness = 2; + underline_pos = fm.descent/2; + overstrike_pos = fm.ascent*3/10; + + /* + * Compute the selection and the cursor geometry. + */ + ComputeCursorAndSel(item, lines, num_lines, + &sel_first_line, &sel_last_line, + &cursor_line, &sel_start_offset, + &sel_stop_offset, &cursor_offset); + + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + /* + * Render the selection. + */ + if ((ti->sel_item == item) && (sel_first_line >= 0)) { + ZnReal xo, yo, xc, yc; + + color = ZnGetGradientColor(ti->sel_color, 0, &alpha); + alpha = ZnComposeAlpha(alpha, wi->alpha); + glColor4us(color->red, color->green, color->blue, alpha); + glBegin(GL_QUADS); + if (sel_first_line == sel_last_line) { + xo = text->pos_dev.x + lines[sel_first_line].text_origin.x + sel_start_offset; + yo = text->pos_dev.y + lines[sel_first_line].text_origin.y - fm.ascent; + xc = xo + sel_stop_offset - sel_start_offset; + yc = yo + font_height; + glVertex2f(xo, yo); + glVertex2f(xc, yo); + glVertex2f(xc, yc); + glVertex2f(xo, yc); + } + else { + xo = text->pos_dev.x + lines[sel_first_line].text_origin.x + sel_start_offset; + yo = text->pos_dev.y + lines[sel_first_line].text_origin.y - fm.ascent; + xc = xo + text->max_width-lines[sel_first_line].text_origin.x-sel_start_offset; + yc = yo + font_height; + glVertex2f(xo, yo); + glVertex2f(xc, yo); + glVertex2f(xc, yc); + glVertex2f(xo, yc); + for (i = sel_first_line+1, lines_ptr = &lines[sel_first_line+1]; + i < sel_last_line; i++, lines_ptr++) { + xo = text->pos_dev.x; + yo = text->pos_dev.y + lines_ptr->text_origin.y - fm.ascent; + xc = xo + text->max_width; + yc = yo + font_height; + glVertex2f(xo, yo); + glVertex2f(xc, yo); + glVertex2f(xc, yc); + glVertex2f(xo, yc); + } xo = text->pos_dev.x; - yo = text->pos_dev.y + lines_ptr->text_origin.y - fm.ascent; - xc = xo + text->max_width; + yo = text->pos_dev.y + lines[sel_last_line].text_origin.y - fm.ascent; + xc = xo + lines[sel_last_line].text_origin.x+sel_stop_offset; yc = yo + font_height; glVertex2f(xo, yo); glVertex2f(xc, yo); glVertex2f(xc, yc); glVertex2f(xo, yc); } - xo = text->pos_dev.x; - yo = text->pos_dev.y + lines[sel_last_line].text_origin.y - fm.ascent; - xc = xo + lines[sel_last_line].text_origin.x+sel_stop_offset; - yc = yo + font_height; - glVertex2f(xo, yo); - glVertex2f(xc, yo); - glVertex2f(xc, yc); - glVertex2f(xo, yc); + glEnd(); } - glEnd(); - } - /* - * Render the cursor. - */ - if ((cursor_line >= 0) && - (wi->focus_item == item) && ti->cursor_on) { - int xs, ys; - - color = ZnGetGradientColor(ti->insert_color, 0, &alpha); + /* + * Render the cursor. + */ + if ((cursor_line >= 0) && + (wi->focus_item == item) && ti->cursor_on) { + int xs, ys; + + color = ZnGetGradientColor(ti->insert_color, 0, &alpha); + alpha = ZnComposeAlpha(alpha, wi->alpha); + glColor4us(color->red, color->green, color->blue, alpha); + glLineWidth(ti->insert_width); + xs = text->pos_dev.x + lines[cursor_line].text_origin.x + cursor_offset; + ys = text->pos_dev.y + lines[cursor_line].text_origin.y - fm.ascent + 1; + glBegin(GL_LINES); + glVertex2f(xs, ys); + glVertex2f(xs, ys + font_height - 1); + glEnd(); + } + + /* + * Render the text. + */ + glEnable(GL_TEXTURE_2D); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glBindTexture(GL_TEXTURE_2D, ZnTexFontTex(text->tfi)); + color = ZnGetGradientColor(text->color, 0, &alpha); alpha = ZnComposeAlpha(alpha, wi->alpha); glColor4us(color->red, color->green, color->blue, alpha); - glLineWidth(ti->insert_width); - xs = text->pos_dev.x + lines[cursor_line].text_origin.x + cursor_offset; - ys = text->pos_dev.y + lines[cursor_line].text_origin.y - fm.ascent + 1; - glBegin(GL_LINES); - glVertex2f(xs, ys); - glVertex2f(xs, ys + font_height - 1); - glEnd(); - } - - /* - * Render the text. - */ - glEnable(GL_TEXTURE_2D); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glBindTexture(GL_TEXTURE_2D, ZnTexFontTex(text->tfi)); - color = ZnGetGradientColor(text->color, 0, &alpha); - alpha = ZnComposeAlpha(alpha, wi->alpha); - glColor4us(color->red, color->green, color->blue, alpha); - - for (i = 0, lines_ptr = lines; i < num_lines; i++, lines_ptr++) { - ZnReal xs, ys; - - xs = text->pos_dev.x + lines_ptr->text_origin.x; - ys = text->pos_dev.y + lines_ptr->text_origin.y; - - glPushMatrix(); - glTranslatef(xs, ys, 0.0); - ZnRenderString(text->tfi, lines_ptr->start, lines_ptr->num_chars); - glPopMatrix(); - - if (ISSET(text->flags, UNDERLINED) || ISSET(text->flags, OVERSTRIKED)) { - glLineWidth(underline_thickness); - glDisable(GL_TEXTURE_2D); - if (ISSET(text->flags, UNDERLINED)) { - glBegin(GL_LINES); - glVertex2f(xs, ys+underline_pos); - glVertex2f(xs+lines_ptr->width, ys+underline_pos); - glEnd(); - } - if (ISSET(text->flags, OVERSTRIKED)) { - glBegin(GL_LINES); - glVertex2f(xs, ys-overstrike_pos); - glVertex2f(xs+lines_ptr->width, ys-overstrike_pos); - glEnd(); + + for (i = 0, lines_ptr = lines; i < num_lines; i++, lines_ptr++) { + ZnReal xs, ys; + + xs = text->pos_dev.x + lines_ptr->text_origin.x; + ys = text->pos_dev.y + lines_ptr->text_origin.y; + + glPushMatrix(); + glTranslatef(xs, ys, 0.0); + ZnRenderString(text->tfi, lines_ptr->start, lines_ptr->num_chars); + glPopMatrix(); + + if (ISSET(text->flags, UNDERLINED) || ISSET(text->flags, OVERSTRIKED)) { + glLineWidth(underline_thickness); + glDisable(GL_TEXTURE_2D); + if (ISSET(text->flags, UNDERLINED)) { + glBegin(GL_LINES); + glVertex2f(xs, ys+underline_pos); + glVertex2f(xs+lines_ptr->width, ys+underline_pos); + glEnd(); + } + if (ISSET(text->flags, OVERSTRIKED)) { + glBegin(GL_LINES); + glVertex2f(xs, ys-overstrike_pos); + glVertex2f(xs+lines_ptr->width, ys-overstrike_pos); + glEnd(); + } + glEnable(GL_TEXTURE_2D); } - glEnable(GL_TEXTURE_2D); } + glDisable(GL_TEXTURE_2D); + + glEndList(); } - glDisable(GL_TEXTURE_2D); + + glCallList(item->gl_list); #endif } |