forked from enlightenment/efl
fixing up textblock. does horiozntal and vertical (line) alignment
SVN revision: 13138
This commit is contained in:
parent
6a4061ae7c
commit
170a5cd97d
|
@ -27,9 +27,9 @@ struct _Layout
|
||||||
unsigned char r, g, b, a;
|
unsigned char r, g, b, a;
|
||||||
} color, underline_color, outline_color, shadow_color;
|
} color, underline_color, outline_color, shadow_color;
|
||||||
struct {
|
struct {
|
||||||
int x, y, ascent, descent, mascent, mdescent;
|
int inset, x, y, ascent, descent, mascent, mdescent;
|
||||||
} line;
|
} line;
|
||||||
double align;
|
double align, valign;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* a node of formatting data */
|
/* a node of formatting data */
|
||||||
|
@ -97,6 +97,7 @@ evas_object_textblock_layout_init(Layout *layout)
|
||||||
layout->shadow_color.g = 255;
|
layout->shadow_color.g = 255;
|
||||||
layout->shadow_color.b = 255;
|
layout->shadow_color.b = 255;
|
||||||
layout->shadow_color.a = 255;
|
layout->shadow_color.a = 255;
|
||||||
|
layout->line.inset = 0;
|
||||||
layout->line.x = 0;
|
layout->line.x = 0;
|
||||||
layout->line.y = 0;
|
layout->line.y = 0;
|
||||||
layout->line.ascent = 0;
|
layout->line.ascent = 0;
|
||||||
|
@ -104,6 +105,7 @@ evas_object_textblock_layout_init(Layout *layout)
|
||||||
layout->line.mascent = 0;
|
layout->line.mascent = 0;
|
||||||
layout->line.mdescent = 0;
|
layout->line.mdescent = 0;
|
||||||
layout->align = 0.0;
|
layout->align = 0.0;
|
||||||
|
layout->valign = -1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
|
@ -138,6 +140,34 @@ evas_object_textblock_layout_format_apply(Layout *layout, char *key, char *data)
|
||||||
{
|
{
|
||||||
layout->font.size = atoi(data);
|
layout->font.size = atoi(data);
|
||||||
}
|
}
|
||||||
|
else if (!strcmp(key, "align"))
|
||||||
|
{
|
||||||
|
if (!strcmp(data, "left")) layout->align = 0.0;
|
||||||
|
else if (!strcmp(data, "middle")) layout->align = 0.5;
|
||||||
|
else if (!strcmp(data, "center")) layout->align = 0.5;
|
||||||
|
else if (!strcmp(data, "right")) layout->align = 1.0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layout->align = atof(data);
|
||||||
|
if (layout->align < 0.0) layout->align = 0.0;
|
||||||
|
else if (layout->align > 1.0) layout->align = 1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strcmp(key, "valign"))
|
||||||
|
{
|
||||||
|
if (!strcmp(data, "top")) layout->valign = 0.0;
|
||||||
|
else if (!strcmp(data, "middle")) layout->valign = 0.5;
|
||||||
|
else if (!strcmp(data, "center")) layout->valign = 0.5;
|
||||||
|
else if (!strcmp(data, "bottom")) layout->valign = 1.0;
|
||||||
|
else if (!strcmp(data, "baseline")) layout->valign = -1.0;
|
||||||
|
else if (!strcmp(data, "base")) layout->valign = -1.0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layout->valign = atof(data);
|
||||||
|
if (layout->valign < 0.0) layout->valign = 0.0;
|
||||||
|
else if (layout->valign > 1.0) layout->valign = 1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (!strcmp(key, "color"))
|
else if (!strcmp(key, "color"))
|
||||||
{
|
{
|
||||||
/* #RRGGBB[AA] or #RGB[A] */
|
/* #RRGGBB[AA] or #RGB[A] */
|
||||||
|
@ -347,12 +377,14 @@ evas_object_textblock_layout(Evas_Object *obj)
|
||||||
Layout_Node *line_start = NULL;
|
Layout_Node *line_start = NULL;
|
||||||
|
|
||||||
o = (Evas_Object_Textblock *)(obj->object_data);
|
o = (Evas_Object_Textblock *)(obj->object_data);
|
||||||
/* FIXME: takes nodes and produce layotu nodes */
|
|
||||||
evas_object_textblock_layout_init(&layout);
|
evas_object_textblock_layout_init(&layout);
|
||||||
w = obj->cur.geometry.w;
|
w = obj->cur.geometry.w;
|
||||||
h = obj->cur.geometry.h;
|
h = obj->cur.geometry.h;
|
||||||
o->last_w = w;
|
o->last_w = w;
|
||||||
o->last_h = h;
|
o->last_h = h;
|
||||||
|
/* FIXME: this is a hack - seems the lowe level font stuff is off in its */
|
||||||
|
/* size estimates of a text line */
|
||||||
|
// w -= 2;
|
||||||
// printf("RE-LAYOUT %ix%i!\n", w, h);
|
// printf("RE-LAYOUT %ix%i!\n", w, h);
|
||||||
for (l = (Evas_Object_List *)o->nodes; l; l = l->next)
|
for (l = (Evas_Object_List *)o->nodes; l; l = l->next)
|
||||||
{
|
{
|
||||||
|
@ -383,6 +415,7 @@ evas_object_textblock_layout(Evas_Object *obj)
|
||||||
int chrpos = -1, x, y, cx, cy, cw, ch;
|
int chrpos = -1, x, y, cx, cy, cw, ch;
|
||||||
void *font = NULL;
|
void *font = NULL;
|
||||||
char *text;
|
char *text;
|
||||||
|
int adj, lastnode;
|
||||||
|
|
||||||
text = strdup(node->text);
|
text = strdup(node->text);
|
||||||
new_node:
|
new_node:
|
||||||
|
@ -393,6 +426,8 @@ evas_object_textblock_layout(Evas_Object *obj)
|
||||||
lnode->layout.font.font = font;
|
lnode->layout.font.font = font;
|
||||||
if (font) ascent = ENFN->font_max_ascent_get(ENDT, font);
|
if (font) ascent = ENFN->font_max_ascent_get(ENDT, font);
|
||||||
if (font) descent = ENFN->font_max_descent_get(ENDT, font);
|
if (font) descent = ENFN->font_max_descent_get(ENDT, font);
|
||||||
|
lnode->layout.line.ascent = ascent;
|
||||||
|
lnode->layout.line.descent = descent;
|
||||||
layout.line.ascent = ascent;
|
layout.line.ascent = ascent;
|
||||||
layout.line.descent = descent;
|
layout.line.descent = descent;
|
||||||
if (layout.line.mascent < ascent) layout.line.mascent = ascent;
|
if (layout.line.mascent < ascent) layout.line.mascent = ascent;
|
||||||
|
@ -400,7 +435,8 @@ evas_object_textblock_layout(Evas_Object *obj)
|
||||||
/* if this is at the start of the line... */
|
/* if this is at the start of the line... */
|
||||||
if (layout.line.x == 0)
|
if (layout.line.x == 0)
|
||||||
{
|
{
|
||||||
if (font) inset = ENFN->font_inset_get(ENDT, font, node->text);
|
if (font) inset = ENFN->font_inset_get(ENDT, font, text);
|
||||||
|
layout.line.inset = inset;
|
||||||
layout.line.x = -inset;
|
layout.line.x = -inset;
|
||||||
line_start = lnode;
|
line_start = lnode;
|
||||||
}
|
}
|
||||||
|
@ -420,14 +456,37 @@ evas_object_textblock_layout(Evas_Object *obj)
|
||||||
layout.line.x += hadvance;
|
layout.line.x += hadvance;
|
||||||
/* fix up max ascent/descent for the line */
|
/* fix up max ascent/descent for the line */
|
||||||
/* FIXME: fixup align */
|
/* FIXME: fixup align */
|
||||||
for (ll = (Evas_Object_List *)lnode; ll; ll = ll->prev)
|
/*
|
||||||
|
lastnode = 1;
|
||||||
|
for (ll = l; ll; ll = ll->next)
|
||||||
{
|
{
|
||||||
Layout_Node *lnode2;
|
Node *tnode;
|
||||||
|
|
||||||
lnode2 = (Layout_Node *)ll;
|
tnode = (Node *)ll;
|
||||||
lnode2->layout.line.mascent = layout.line.mascent;
|
if ((tnode->format) &&
|
||||||
lnode2->layout.line.mdescent = layout.line.mdescent;
|
(!strcmp(tnode->format, "\n")))
|
||||||
if (ll == (Evas_Object_List *)line_start) break;
|
break;
|
||||||
|
if (tnode->text)
|
||||||
|
{
|
||||||
|
lastnode = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lastnode)
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
adj = (double)(w - (lnode->layout.line.x + tw + layout.line.inset)) * layout.align;
|
||||||
|
adj -= line_start->layout.line.x;
|
||||||
|
for (ll = (Evas_Object_List *)lnode; ll; ll = ll->prev)
|
||||||
|
{
|
||||||
|
Layout_Node *lnode2;
|
||||||
|
|
||||||
|
lnode2 = (Layout_Node *)ll;
|
||||||
|
lnode2->layout.line.x += adj;
|
||||||
|
lnode2->layout.line.mascent = layout.line.mascent;
|
||||||
|
lnode2->layout.line.mdescent = layout.line.mdescent;
|
||||||
|
if (ll == (Evas_Object_List *)line_start) break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* text doesnt fit */
|
/* text doesnt fit */
|
||||||
|
@ -461,15 +520,22 @@ evas_object_textblock_layout(Evas_Object *obj)
|
||||||
o->layout_nodes = evas_object_list_append(o->layout_nodes, lnode);
|
o->layout_nodes = evas_object_list_append(o->layout_nodes, lnode);
|
||||||
/* fix up max ascent/descent for the line */
|
/* fix up max ascent/descent for the line */
|
||||||
/* FIXME: fixup align */
|
/* FIXME: fixup align */
|
||||||
|
adj = (double)(w - (lnode->layout.line.x + tw + layout.line.inset)) * layout.align;
|
||||||
|
adj -= line_start->layout.line.x;
|
||||||
|
// printf("\"%s\" -> %i, %i %i ++ %i\n",
|
||||||
|
// lnode->text, layout.line.inset,
|
||||||
|
// w, tw, adj);
|
||||||
for (ll = (Evas_Object_List *)lnode; ll; ll = ll->prev)
|
for (ll = (Evas_Object_List *)lnode; ll; ll = ll->prev)
|
||||||
{
|
{
|
||||||
Layout_Node *lnode2;
|
Layout_Node *lnode2;
|
||||||
|
|
||||||
lnode2 = (Layout_Node *)ll;
|
lnode2 = (Layout_Node *)ll;
|
||||||
|
lnode2->layout.line.x += adj;
|
||||||
lnode2->layout.line.mascent = layout.line.mascent;
|
lnode2->layout.line.mascent = layout.line.mascent;
|
||||||
lnode2->layout.line.mdescent = layout.line.mdescent;
|
lnode2->layout.line.mdescent = layout.line.mdescent;
|
||||||
if (ll == (Evas_Object_List *)line_start) break;
|
if (ll == (Evas_Object_List *)line_start) break;
|
||||||
}
|
}
|
||||||
|
layout.line.inset = 0;
|
||||||
layout.line.x = 0;
|
layout.line.x = 0;
|
||||||
layout.line.y += lnode->layout.line.mascent + lnode->layout.line.mdescent;
|
layout.line.y += lnode->layout.line.mascent + lnode->layout.line.mdescent;
|
||||||
layout.line.mascent = 0;
|
layout.line.mascent = 0;
|
||||||
|
@ -1003,6 +1069,18 @@ evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void
|
||||||
evas_object_textblock_layout(obj);
|
evas_object_textblock_layout(obj);
|
||||||
o->changed = 0;
|
o->changed = 0;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
obj->layer->evas->engine.func->context_color_set(output,
|
||||||
|
context,
|
||||||
|
230, 160, 30, 100);
|
||||||
|
obj->layer->evas->engine.func->rectangle_draw(output,
|
||||||
|
context,
|
||||||
|
surface,
|
||||||
|
obj->cur.cache.geometry.x + x,
|
||||||
|
obj->cur.cache.geometry.y + y,
|
||||||
|
obj->cur.cache.geometry.w,
|
||||||
|
obj->cur.cache.geometry.h);
|
||||||
|
*/
|
||||||
for (l = (Evas_Object_List *)o->layout_nodes; l; l = l->next)
|
for (l = (Evas_Object_List *)o->layout_nodes; l; l = l->next)
|
||||||
{
|
{
|
||||||
Layout_Node *lnode;
|
Layout_Node *lnode;
|
||||||
|
@ -1015,17 +1093,39 @@ evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void
|
||||||
(obj->cur.cache.clip.b * lnode->layout.color.b) / 255,
|
(obj->cur.cache.clip.b * lnode->layout.color.b) / 255,
|
||||||
(obj->cur.cache.clip.a * lnode->layout.color.a) / 255);
|
(obj->cur.cache.clip.a * lnode->layout.color.a) / 255);
|
||||||
if ((lnode->layout.font.font) && (lnode->text))
|
if ((lnode->layout.font.font) && (lnode->text))
|
||||||
ENFN->font_draw(output,
|
{
|
||||||
context,
|
if (lnode->layout.valign < 0.0)
|
||||||
surface,
|
ENFN->font_draw(output,
|
||||||
lnode->layout.font.font,
|
context,
|
||||||
obj->cur.cache.geometry.x + lnode->layout.line.x + x,
|
surface,
|
||||||
obj->cur.cache.geometry.y + lnode->layout.line.y + y + lnode->layout.line.mascent,
|
lnode->layout.font.font,
|
||||||
lnode->w,
|
obj->cur.cache.geometry.x +
|
||||||
lnode->h,
|
lnode->layout.line.x + x,
|
||||||
lnode->w,
|
obj->cur.cache.geometry.y +
|
||||||
lnode->h,
|
lnode->layout.line.y + y + lnode->layout.line.mascent,
|
||||||
lnode->text);
|
lnode->w,
|
||||||
|
lnode->h,
|
||||||
|
lnode->w,
|
||||||
|
lnode->h,
|
||||||
|
lnode->text);
|
||||||
|
else
|
||||||
|
ENFN->font_draw(output,
|
||||||
|
context,
|
||||||
|
surface,
|
||||||
|
lnode->layout.font.font,
|
||||||
|
obj->cur.cache.geometry.x +
|
||||||
|
lnode->layout.line.x + x,
|
||||||
|
obj->cur.cache.geometry.y +
|
||||||
|
lnode->layout.line.y + y +
|
||||||
|
((double)(((lnode->layout.line.mascent + lnode->layout.line.mdescent) -
|
||||||
|
(lnode->layout.line.ascent + lnode->layout.line.descent)) * lnode->layout.valign)) +
|
||||||
|
lnode->layout.line.ascent,
|
||||||
|
lnode->w,
|
||||||
|
lnode->h,
|
||||||
|
lnode->w,
|
||||||
|
lnode->h,
|
||||||
|
lnode->text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
if (o->engine_data)
|
if (o->engine_data)
|
||||||
|
|
Loading…
Reference in New Issue