aboutsummaryrefslogtreecommitdiff
path: root/generic/Text.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/Text.c')
-rw-r--r--generic/Text.c85
1 files changed, 51 insertions, 34 deletions
diff --git a/generic/Text.c b/generic/Text.c
index b8e7336..dd220d5 100644
--- a/generic/Text.c
+++ b/generic/Text.c
@@ -98,8 +98,8 @@ typedef struct _TextItemStruct {
int insert_index;
ZnList text_info;
int max_width;
-#ifdef LIBART
- FontBitmap *fb;
+#ifdef GLX
+ TexFont *txf;
#endif
} TextItemStruct, *TextItem;
@@ -108,7 +108,7 @@ static ZnAttrConfig text_attrs[] = {
{ ZN_CONFIG_JUSTIFY, "-alignment", NULL,
Tk_Offset(TextItemStruct, alignment), 0,
ZN_COORDS_FLAG|ZN_LAYOUT_FLAG, False },
- { ZN_CONFIG_UINT, "-alpha", NULL,
+ { ZN_CONFIG_ALPHA, "-alpha", NULL,
Tk_Offset(TextItemStruct, alpha), 0, ZN_DRAW_FLAG, False },
{ ZN_CONFIG_ANCHOR, "-anchor", NULL,
Tk_Offset(TextItemStruct, anchor), 0, ZN_COORDS_FLAG, False },
@@ -192,15 +192,14 @@ Init(Item item,
text->anchor = ZnAnchorNW;
text->connection_anchor = ZnAnchorSW;
text->color = ZnGetColorByValue(wi->win, wi->fore_color);
- text->alpha = 255;
+ text->alpha = 100;
text->alignment = ZnJustifyLeft;
text->font = Tk_GetFont(wi->interp, wi->win, Tk_NameOfFont(wi->font));
text->width = 0;
text->spacing = 0;
-#ifdef LIBART
- text->fb = NULL;
+#ifdef GLX
+ text->txf = NULL;
#endif
-
text->insert_index = 0;
CLEAR(text->flags, UNDERLINED);
CLEAR(text->flags, OVERSTRIKED);
@@ -313,11 +312,6 @@ Configure(Item item,
item->connected_item = old_connected;
}
}
-#ifdef LIBART
- if (old_font != text->font) {
- text->fb = NULL;
- }
-#endif
return ZN_OK;
}
@@ -382,7 +376,6 @@ ComputeCoordinates(Item item,
char *scan;
int wrap, line_index, prev_num_lines;
- /*printf("layout\n");*/
text->max_width = 0;
if (text->text_info != NULL) {
prev_num_lines = ZnListSize(text->text_info);
@@ -540,6 +533,10 @@ ToArea(Item item,
ZnBBox line_bbox;
ZnPoint o;
+ if (!text->text_info) {
+ return -1;
+ }
+
lines = (TextLineInfo) ZnListArray(text->text_info);
num_lines = ZnListSize(text->text_info);
Tk_GetFontMetrics(text->font, &fm);
@@ -594,7 +591,10 @@ Draw(Item item)
int underline_thickness, underline_pos=0, overstrike_pos=0;
int sel_first_line=-1, sel_last_line=-1, cursor_line=-1;
int sel_start_offset=0, sel_stop_offset=0, cursor_offset=0;
-
+
+ if (!text->text_info) {
+ return;
+ }
lines = (TextLineInfo) ZnListArray(text->text_info);
num_lines = ZnListSize(text->text_info);
Tk_GetFontMetrics(text->font, &fm);
@@ -766,32 +766,41 @@ Draw(Item item)
static void
Render(Item item)
{
-#ifdef LIBART
+#ifdef GLX
WidgetInfo *wi = item->wi;
TextItem text = (TextItem) item;
TextLineInfo lines, lines_ptr;
- int i, num_lines;
- int tmp_x, tmp_y;
- int color;
-
- color = (((text->color->red & 0xff00) << 16) |
- ((text->color->green & 0xff00) << 8) |
- (text->color->blue & 0xff00) |
- (text->alpha & 0xff));
- lines = (TextLineInfo) ZnListArray(text->text_info);
- num_lines = ZnListSize(text->text_info);
- if (!text->fb) {
- text->fb = GetFontBitmap(wi->win, text->font);
+ int i, num_lines, num_chars;
+
+ if (!text->text_info) {
+ return;
}
+ if (!text->txf) {
+ text->txf = GetTexFont(wi->win, text->font);
+ }
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glEnable(GL_TEXTURE_2D);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glColor4us(text->color->red, text->color->green,
+ text->color->blue, text->alpha*65535/100);
+ glBindTexture(GL_TEXTURE_2D, text->txf->texobj);
+
+ lines = (TextLineInfo) ZnListArray(text->text_info);
+ num_lines = ZnListSize(text->text_info);
for (i = 0, lines_ptr = lines; i < num_lines; i++, lines_ptr++) {
- tmp_x = (int)(text->pos_dev.x + lines_ptr->text_origin.x);
- tmp_y = (int)(text->pos_dev.y + lines_ptr->text_origin.y) - text->fb->ascent;
- rgb_text(wi->buf.buf, wi->buf.ox, wi->buf.oy,
- wi->buf.cx, wi->buf.cy, wi->buf.rowstride,
- lines_ptr->start, lines_ptr->num_chars,
- tmp_x, tmp_y, text->fb, color);
+ num_chars = lines_ptr->num_chars;
+ while (lines_ptr->start[num_chars-1] == '\n') {
+ num_chars--;
+ }
+ glPushMatrix();
+ glTranslatef(text->pos_dev.x + lines_ptr->text_origin.x,
+ text->pos_dev.y + lines_ptr->text_origin.y,
+ 0.0);
+ txfRenderString(text->txf, lines_ptr->start, num_chars);
+ glPopMatrix();
}
+ glDisable(GL_TEXTURE_2D);
#endif
}
@@ -991,6 +1000,10 @@ PointToChar(Item item,
TextLineInfo lines, p;
Tk_FontMetrics fm;
+ if (!text->text_info) {
+ return 0;
+ }
+
x -= text->pos_dev.x;
y -= text->pos_dev.y;
@@ -1186,6 +1199,10 @@ DeleteChars(Item item,
int count;
char *new;
+ if (!text->text_info) {
+ return;
+ }
+
if (first < 0) {
first = 0;
}
@@ -1293,7 +1310,7 @@ Selection(Item item,
return 0;
}
strncpy(chars, text->text + wi->text_info.sel_first + offset, (size_t) count);
- chars[count] = '\0';
+ chars[count] = 0;
return count;
}