static char* text_transform_keys[] = {"text-transform", "大小写", NULL};
static char* text_indent_keys[] = {"text-transform", "缩进", NULL};
+static char* vertical_align_keys[] = {"vertical-align", "垂直对齐", NULL};
+
static char* bg_keys[] = {"background", "背景", NULL};
static char* bg_color_keys[] = {"background-color", "背景颜色", NULL};
static char* bg_image_keys[] = {"background-image", "背景图片", NULL};
{text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
{text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW},
+
{list_style_keys, "", ABC_CSS_LIST_STYLE, ABC_HTML_FLAG_SHOW},
{list_style_type_keys, "", ABC_CSS_LIST_STYLE_TYPE, ABC_HTML_FLAG_SHOW},
{list_style_image_keys, "", ABC_CSS_LIST_STYLE_IMAGE, ABC_HTML_FLAG_SHOW},
{border_keys, "1", ABC_HTML_ATTR_BORDER, ABC_HTML_FLAG_SHOW},
{padding_keys, "4", ABC_HTML_ATTR_PADDING, ABC_HTML_FLAG_SHOW},
+ {width_keys, "", ABC_HTML_ATTR_WIDTH, ABC_HTML_FLAG_SHOW},
+ {height_keys, "", ABC_HTML_ATTR_HEIGHT, ABC_HTML_FLAG_SHOW},
+
{class_keys, "", ABC_HTML_ATTR_CLASS, ABC_HTML_FLAG_SHOW},
{style_keys, "", ABC_HTML_ATTR_STYLE, ABC_HTML_FLAG_SHOW},
{id_keys, "", ABC_HTML_ATTR_ID, ABC_HTML_FLAG_SHOW},
{border_keys, "1", ABC_HTML_ATTR_BORDER, ABC_HTML_FLAG_SHOW},
{padding_keys, "4", ABC_HTML_ATTR_PADDING, ABC_HTML_FLAG_SHOW},
+ {width_keys, "", ABC_HTML_ATTR_WIDTH, ABC_HTML_FLAG_SHOW},
+ {height_keys, "", ABC_HTML_ATTR_HEIGHT, ABC_HTML_FLAG_SHOW},
+
{class_keys, "", ABC_HTML_ATTR_CLASS, ABC_HTML_FLAG_SHOW},
{style_keys, "", ABC_HTML_ATTR_STYLE, ABC_HTML_FLAG_SHOW},
{id_keys, "", ABC_HTML_ATTR_ID, ABC_HTML_FLAG_SHOW},
{font_style_keys, "", ABC_HTML_ATTR_FONT_STYLE, 0},
{bg_color_keys, "", ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW},
+
+ {text_align_keys, "", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
+ {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW},
};
static html_attr_t td_attrs[] =
{border_keys, "1", ABC_HTML_ATTR_BORDER, ABC_HTML_FLAG_SHOW},
{padding_keys, "4", ABC_HTML_ATTR_PADDING, ABC_HTML_FLAG_SHOW},
+ {width_keys, "", ABC_HTML_ATTR_WIDTH, ABC_HTML_FLAG_SHOW},
+ {height_keys, "", ABC_HTML_ATTR_HEIGHT, ABC_HTML_FLAG_SHOW},
+
{class_keys, "", ABC_HTML_ATTR_CLASS, ABC_HTML_FLAG_SHOW},
{style_keys, "", ABC_HTML_ATTR_STYLE, ABC_HTML_FLAG_SHOW},
{id_keys, "", ABC_HTML_ATTR_ID, ABC_HTML_FLAG_SHOW},
{font_style_keys, "", ABC_HTML_ATTR_FONT_STYLE, 0},
{bg_color_keys, "", ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW},
+
+ {text_align_keys, "", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
+ {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW},
};
static html_attr_t script_attrs[] =
}
}
- int d = abc_css_margin(obj);
+ int w_set = 0;
+ int h_set = 0;
+ int d = abc_css_margin(obj);
+
+ attr = abc_obj_get_attr(obj, ABC_HTML_ATTR_WIDTH);
+ if (attr && attr->value && attr->value->len > 0)
+ {
+ obj->w = abc_css_length(obj, attr->value->data, width);
+ obj->w += d * 2;
+
+ if (obj->w > width - obj->x)
+ obj->w = width - obj->x;
+
+ w_set = 1;
+ }
+
+ attr = abc_obj_get_attr(obj, ABC_HTML_ATTR_HEIGHT);
+ if (attr && attr->value && attr->value->len > 0)
+ {
+ obj->h = abc_css_length(obj, attr->value->data, height);
+ obj->h += d * 2;
+
+ if (obj->h > height - obj->y)
+ obj->h = height - obj->y;
+
+ h_set = 1;
+ }
+
int x = obj->x + d;
int y = obj->y + d;
for (l = scf_list_head(&obj->childs); l != scf_list_sentinel(&obj->childs); l = scf_list_next(l)) {
tr = scf_list_data(l, abc_obj_t, list);
+ int w = obj->td_width;
+ int h = obj->td_height;
int d2 = d;
for (l2 = scf_list_head(&tr->childs); l2 != scf_list_sentinel(&tr->childs); l2 = scf_list_next(l2)) {
d2 = abc_css_margin(td);
+ if (w_set) {
+ w_set = 0;
+ obj->td_width = (obj->w - d * 2) / tr->n_childs - d2 * 2;
+ }
+
+ if (h_set) {
+ h_set = 0;
+ obj->td_height = (obj->h - d * 2) / obj->n_childs - d2 * 2;
+ }
+
+ w = obj->td_width;
+ h = obj->td_height;
+
+ attr = abc_obj_get_attr(td, ABC_HTML_ATTR_WIDTH);
+ if (attr && attr->value && attr->value->len > 0)
+ w = abc_css_length(td, attr->value->data, obj->w);
+
+ attr = abc_obj_get_attr(td, ABC_HTML_ATTR_HEIGHT);
+ if (attr && attr->value && attr->value->len > 0)
+ h = abc_css_length(td, attr->value->data, obj->h);
+
td->x = x;
td->y = y;
- td->w = obj->td_width + d2 * 2;
- td->h = obj->td_height + d2 * 2;
+ td->w = w + d2 * 2;
+ td->h = h + d2 * 2;
x += td->w;
}
obj->w = x + d - obj->x;
- x = obj->x + d;
- y += obj->td_height + d2 * 2;
+ x = obj->x + d;
+ y += h + d2 * 2;
}
obj->h = y + d - obj->y;
if (attr)
cairo_set_font_size(cr, atoi(attr->value->data));
- cairo_text_extents(cr, obj->text->data, &extents);
- cairo_move_to (cr, extents.x_bearing, -extents.y_bearing);
- cairo_show_text (cr, obj->text->data);
+ cairo_text_extents(cr, obj->text->data, &extents);
+ double x_bearing = extents.x_bearing;
+ double y_bearing = -extents.y_bearing;
+
+ attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_TEXT_ALIGN);
+ if (attr) {
+ if (!__html_strcmp(attr->value->data, "right"))
+ x_bearing = w - extents.width - x_bearing;
+
+ else if (!__html_strcmp(attr->value->data, "center"))
+ x_bearing = (w - extents.width) / 2 - x_bearing;
+ }
+
+ attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_VERTICAL_ALIGN);
+ if (attr) {
+ if (!__html_strcmp(attr->value->data, "bottom"))
+ y_bearing += h - extents.height;
+
+ else if (!__html_strcmp(attr->value->data, "center"))
+ y_bearing += (h - extents.height) / 2;
+ }
+
+ cairo_move_to (cr, x_bearing, y_bearing);
+ cairo_show_text(cr, obj->text->data);
// cairo_surface_write_to_png(surface, "tmp.png");