Enlightenment CVS committal
Author : raster
Project : e17
Module : libs/evas
Dir : e17/libs/evas/src/lib/canvas
Modified Files:
evas_object_textblock.c
Log Message:
fixing up textblock. does horiozntal and vertical (line) alignment
===================================================================
RCS file:
/cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_textblock.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- evas_object_textblock.c 30 Jan 2005 11:41:01 -0000 1.7
+++ evas_object_textblock.c 30 Jan 2005 14:19:06 -0000 1.8
@@ -27,9 +27,9 @@
unsigned char r, g, b, a;
} color, underline_color, outline_color, shadow_color;
struct {
- int x, y, ascent, descent, mascent, mdescent;
+ int inset, x, y, ascent, descent, mascent, mdescent;
} line;
- double align;
+ double align, valign;
};
/* a node of formatting data */
@@ -97,6 +97,7 @@
layout->shadow_color.g = 255;
layout->shadow_color.b = 255;
layout->shadow_color.a = 255;
+ layout->line.inset = 0;
layout->line.x = 0;
layout->line.y = 0;
layout->line.ascent = 0;
@@ -104,6 +105,7 @@
layout->line.mascent = 0;
layout->line.mdescent = 0;
layout->align = 0.0;
+ layout->valign = -1.0;
}
static char *
@@ -138,6 +140,34 @@
{
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"))
{
/* #RRGGBB[AA] or #RGB[A] */
@@ -347,12 +377,14 @@
Layout_Node *line_start = NULL;
o = (Evas_Object_Textblock *)(obj->object_data);
- /* FIXME: takes nodes and produce layotu nodes */
evas_object_textblock_layout_init(&layout);
w = obj->cur.geometry.w;
h = obj->cur.geometry.h;
o->last_w = w;
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);
for (l = (Evas_Object_List *)o->nodes; l; l = l->next)
{
@@ -383,6 +415,7 @@
int chrpos = -1, x, y, cx, cy, cw, ch;
void *font = NULL;
char *text;
+ int adj, lastnode;
text = strdup(node->text);
new_node:
@@ -393,6 +426,8 @@
lnode->layout.font.font = font;
if (font) ascent = ENFN->font_max_ascent_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.descent = descent;
if (layout.line.mascent < ascent) layout.line.mascent = ascent;
@@ -400,7 +435,8 @@
/* if this is at the start of the line... */
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;
line_start = lnode;
}
@@ -420,14 +456,37 @@
layout.line.x += hadvance;
/* fix up max ascent/descent for the line */
/* 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;
- lnode2->layout.line.mascent = layout.line.mascent;
- lnode2->layout.line.mdescent = layout.line.mdescent;
- if (ll == (Evas_Object_List *)line_start) break;
+ tnode = (Node *)ll;
+ if ((tnode->format) &&
+ (!strcmp(tnode->format, "\n")))
+ 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 */
@@ -461,15 +520,22 @@
o->layout_nodes =
evas_object_list_append(o->layout_nodes, lnode);
/* fix up max ascent/descent for the line */
/* 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)
{
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;
}
+ layout.line.inset = 0;
layout.line.x = 0;
layout.line.y += lnode->layout.line.mascent +
lnode->layout.line.mdescent;
layout.line.mascent = 0;
@@ -1003,6 +1069,18 @@
evas_object_textblock_layout(obj);
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)
{
Layout_Node *lnode;
@@ -1015,17 +1093,39 @@
(obj->cur.cache.clip.b * lnode->layout.color.b)
/ 255,
(obj->cur.cache.clip.a * lnode->layout.color.a)
/ 255);
if ((lnode->layout.font.font) && (lnode->text))
- 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
+ lnode->layout.line.mascent,
- lnode->w,
- lnode->h,
- lnode->w,
- lnode->h,
- lnode->text);
+ {
+ if (lnode->layout.valign < 0.0)
+ 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 +
lnode->layout.line.mascent,
+ 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)
-------------------------------------------------------
This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting
Tool for open source databases. Create drag-&-drop reports. Save time
by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc.
Download a FREE copy at http://www.intelliview.com/go/osdn_nl
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs