static html_attr_t body_attrs[] =
{
- {font_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW},
- {font_style_keys, "", ABC_HTML_ATTR_FONT_STYLE, 0},
-
- {bg_keys, "", ABC_HTML_ATTR_BG, ABC_HTML_FLAG_SHOW},
- {bg_color_keys, "white", ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW},
- {bg_image_keys, "", ABC_HTML_ATTR_BG_IMAGE, ABC_HTML_FLAG_SHOW},
- {bg_repeat_keys, "", ABC_HTML_ATTR_BG_REPEAT, ABC_HTML_FLAG_SHOW},
+#define ABC_CSS_BOX(margin, border, padding) \
+ {margin_keys, #margin, ABC_HTML_ATTR_MARGIN, ABC_HTML_FLAG_SHOW}, \
+ {border_keys, #border, ABC_HTML_ATTR_BORDER, ABC_HTML_FLAG_SHOW}, \
+ {padding_keys, #padding, 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},
+
+#define ABC_CSS_SELECTOR() \
+ {style_keys, "", ABC_HTML_ATTR_STYLE, ABC_HTML_FLAG_SHOW}, \
+ {class_keys, "", ABC_HTML_ATTR_CLASS, ABC_HTML_FLAG_SHOW}, \
+ {id_keys, "", ABC_HTML_ATTR_ID, ABC_HTML_FLAG_SHOW},
+
+#define ABC_CSS_BACK_GROUND(color) \
+ {bg_keys, "", ABC_HTML_ATTR_BG, ABC_HTML_FLAG_SHOW}, \
+ {bg_color_keys, #color, ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW}, \
+ {bg_image_keys, "", ABC_HTML_ATTR_BG_IMAGE, ABC_HTML_FLAG_SHOW}, \
+ {bg_repeat_keys, "", ABC_HTML_ATTR_BG_REPEAT, ABC_HTML_FLAG_SHOW}, \
{bg_position_keys, "", ABC_HTML_ATTR_BG_POSITION, ABC_HTML_FLAG_SHOW},
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+#define ABC_CSS_FONT(font, size, color, style) \
+ {font_keys, #font, ABC_HTML_ATTR_FONT, 0}, \
+ {font_size_keys, #size, ABC_HTML_ATTR_FONT_SIZE, 0}, \
+ {font_color_keys, #color, ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW}, \
+ {font_style_keys, #style, ABC_HTML_ATTR_FONT_STYLE, 0},
+
+#define ABC_CSS_TEXT(align, underline) \
+ {text_align_keys, #align, ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW}, \
+ {text_decoration_keys, #underline, ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW}, \
+ {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW}, \
+ {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+
+ ABC_CSS_BOX(4px, , 4px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND(white)
+
+ ABC_CSS_FONT(SimSong, 16, black, )
+ ABC_CSS_TEXT(left, )
};
static html_attr_t h1_attrs[] =
{
- {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_keys, "SimHei", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "40", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW},
- {font_style_keys, "", ABC_HTML_ATTR_FONT_STYLE, 0},
+ ABC_CSS_BOX(2px, , 2px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {bg_color_keys, "", ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW},
-
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimHei, 40, black, )
+ ABC_CSS_TEXT(left, )
};
static html_attr_t h2_attrs[] =
{
- {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_keys, "SimHei", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "32", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW},
- {font_style_keys, "", ABC_HTML_ATTR_FONT_STYLE, 0},
+ ABC_CSS_BOX(2px, , 2px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {bg_color_keys, "", ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW},
-
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimHei, 32, black, )
+ ABC_CSS_TEXT(left, )
};
static html_attr_t h3_attrs[] =
{
- {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_keys, "SimHei", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "28", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, 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},
+ ABC_CSS_BOX(2px, , 2px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimHei, 28, black, )
+ ABC_CSS_TEXT(left, )
};
static html_attr_t h4_attrs[] =
{
- {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_keys, "SimHei", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "24", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, 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},
+ ABC_CSS_BOX(2px, , 2px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimHei, 24, black, )
+ ABC_CSS_TEXT(left, )
};
static html_attr_t h5_attrs[] =
{
- {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_keys, "SimHei", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "20", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, 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},
+ ABC_CSS_BOX(2px, , 2px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimHei, 20, black, )
+ ABC_CSS_TEXT(left, )
};
static html_attr_t h6_attrs[] =
{
- {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_keys, "SimHei", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, 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},
+ ABC_CSS_BOX(2px, , 2px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimHei, 16, black, )
+ ABC_CSS_TEXT(left, )
};
static html_attr_t p_attrs[] =
{
- {margin_keys, "", ABC_HTML_ATTR_MARGIN, ABC_HTML_FLAG_SHOW},
- {border_keys, "", ABC_HTML_ATTR_BORDER, ABC_HTML_FLAG_SHOW},
- {padding_keys, "", ABC_HTML_ATTR_PADDING, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_BOX(2px, , 2px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {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_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, 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, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimSong, 16, black, )
+ ABC_CSS_TEXT(left, )
};
static html_attr_t css_id_attrs[] =
{
- {margin_keys, "2", ABC_HTML_ATTR_MARGIN, 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},
-
- {font_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, 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},
+#define ABC_CSS_LIST() \
+ {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}, \
+ {list_style_pos_keys, "", ABC_CSS_LIST_STYLE_POSITION, ABC_HTML_FLAG_SHOW},
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_BOX(2px, , 2px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimSong, 16, black, )
+ ABC_CSS_TEXT(left, )
+ ABC_CSS_LIST()
- {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},
- {list_style_pos_keys, "", ABC_CSS_LIST_STYLE_POSITION, ABC_HTML_FLAG_SHOW},
+ {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW},
};
static html_attr_t b_attrs[] =
{
- {font_keys, "SimHei", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "", ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW},
- {font_style_keys, "bold", ABC_HTML_ATTR_FONT_STYLE, 0},
+ ABC_CSS_BOX( , , )
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {bg_color_keys, "", ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW},
-
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimHei, 16, , bold)
+ ABC_CSS_TEXT(left, )
};
static html_attr_t i_attrs[] =
{
- {font_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "", ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW},
- {font_style_keys, "italic", ABC_HTML_ATTR_FONT_STYLE, 0},
-
- {bg_color_keys, "", ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_BOX( , , )
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimSong, 16, , italic)
+ ABC_CSS_TEXT(left, )
};
static html_attr_t a_attrs[] =
{
- {href_keys, "", ABC_HTML_ATTR_HREF, 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_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "blue", ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW},
- {font_style_keys, "", ABC_HTML_ATTR_FONT_STYLE, 0},
+ ABC_CSS_BOX( , , )
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {bg_color_keys, "", ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimSong, 16, blue, )
+ ABC_CSS_TEXT(left, underline)
- {text_align_keys, "left", ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW},
- {text_decoration_keys, "underline", ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW},
- {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW},
- {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW},
+ {href_keys, "", ABC_HTML_ATTR_HREF, ABC_HTML_FLAG_SHOW},
};
static html_attr_t link_attrs[] =
{
- {rel_keys, "", ABC_HTML_ATTR_REL, ABC_HTML_FLAG_SHOW},
- {type_keys, "", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW},
- {href_keys, "", ABC_HTML_ATTR_HREF, ABC_HTML_FLAG_SHOW},
+ {rel_keys, "", ABC_HTML_ATTR_REL, ABC_HTML_FLAG_SHOW},
+ {type_keys, "", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW},
+ {href_keys, "", ABC_HTML_ATTR_HREF, ABC_HTML_FLAG_SHOW},
};
static html_attr_t img_attrs[] =
{
- {margin_keys, "", ABC_HTML_ATTR_MARGIN, ABC_HTML_FLAG_SHOW},
- {border_keys, "", ABC_HTML_ATTR_BORDER, ABC_HTML_FLAG_SHOW},
- {padding_keys, "", ABC_HTML_ATTR_PADDING, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_BOX( , , )
+ ABC_CSS_SELECTOR()
- {src_keys, "", ABC_HTML_ATTR_SRC, ABC_HTML_FLAG_SHOW},
- {width_keys, "100", ABC_HTML_ATTR_WIDTH, ABC_HTML_FLAG_SHOW},
- {height_keys, "100", ABC_HTML_ATTR_HEIGHT, ABC_HTML_FLAG_SHOW},
+ {src_keys, "", ABC_HTML_ATTR_SRC, ABC_HTML_FLAG_SHOW},
};
static html_attr_t video_attrs[] =
{
- {margin_keys, "", ABC_HTML_ATTR_MARGIN, ABC_HTML_FLAG_SHOW},
- {border_keys, "", ABC_HTML_ATTR_BORDER, ABC_HTML_FLAG_SHOW},
- {padding_keys, "", ABC_HTML_ATTR_PADDING, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_BOX( , , )
+ ABC_CSS_SELECTOR()
- {width_keys, "100", ABC_HTML_ATTR_WIDTH, ABC_HTML_FLAG_SHOW},
- {height_keys, "100", ABC_HTML_ATTR_HEIGHT, ABC_HTML_FLAG_SHOW},
- {control_keys, "", ABC_HTML_ATTR_CONTROLS, 0},
+ {control_keys, "", ABC_HTML_ATTR_CONTROLS, 0},
};
static html_attr_t audio_attrs[] =
{
- {control_keys, "", ABC_HTML_ATTR_CONTROLS, 0},
+ {control_keys, "", ABC_HTML_ATTR_CONTROLS, 0},
};
static html_attr_t source_attrs[] =
{
- {src_keys, "", ABC_HTML_ATTR_SRC, ABC_HTML_FLAG_SHOW},
- {type_keys, "", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW},
+ {src_keys, "", ABC_HTML_ATTR_SRC, ABC_HTML_FLAG_SHOW},
+ {type_keys, "", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW},
};
static html_attr_t input_attrs[] =
{
- {type_keys, "text", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW},
- {id_keys, "", ABC_HTML_ATTR_ID, ABC_HTML_FLAG_SHOW},
- {name_keys, "", ABC_HTML_ATTR_NAME, ABC_HTML_FLAG_SHOW},
- {value_keys, "", ABC_HTML_ATTR_VALUE, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_BOX(1px, 1px, 1px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {font_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
+ ABC_CSS_FONT(SimSong, 16, black, )
+ ABC_CSS_TEXT(left, )
+
+ {type_keys, "text", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW},
+ {name_keys, "", ABC_HTML_ATTR_NAME, ABC_HTML_FLAG_SHOW},
+ {value_keys, "", ABC_HTML_ATTR_VALUE, ABC_HTML_FLAG_SHOW},
};
static html_attr_t label_attrs[] =
{
- {for_keys, "", ABC_HTML_ATTR_FOR, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_BOX(1px, 1px, 1px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
+
+ ABC_CSS_FONT(SimSong, 16, black, )
+ ABC_CSS_TEXT(left, )
- {font_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
+ {for_keys, "", ABC_HTML_ATTR_FOR, ABC_HTML_FLAG_SHOW},
};
static html_attr_t form_attrs[] =
{
- {action_keys, "/", ABC_HTML_ATTR_ACTION, ABC_HTML_FLAG_SHOW},
- {method_keys, "post", ABC_HTML_ATTR_METHOD, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_BOX(1px, 1px, 1px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {font_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
+ ABC_CSS_FONT(SimSong, 16, black, )
+ ABC_CSS_TEXT(left, )
- {enctype_keys, "", ABC_HTML_ATTR_ENCTYPE, 0},
+ {action_keys, "/", ABC_HTML_ATTR_ACTION, ABC_HTML_FLAG_SHOW},
+ {method_keys, "post", ABC_HTML_ATTR_METHOD, ABC_HTML_FLAG_SHOW},
+ {enctype_keys, "", ABC_HTML_ATTR_ENCTYPE, 0},
};
static html_attr_t ol_attrs[] =
{
- {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_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, 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},
+ ABC_CSS_BOX(2px, , 2px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {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},
- {list_style_pos_keys, "", ABC_CSS_LIST_STYLE_POSITION, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimSong, 16, black, )
+ ABC_CSS_TEXT(left, )
+ ABC_CSS_LIST()
};
static html_attr_t table_attrs[] =
{
- {margin_keys, "2", ABC_HTML_ATTR_MARGIN, 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},
+ ABC_CSS_BOX(2px, 2px, 4px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {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_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW},
- {font_style_keys, "", ABC_HTML_ATTR_FONT_STYLE, 0},
+ ABC_CSS_FONT(SimSong, 16, black, )
+ ABC_CSS_TEXT(left, )
- {bg_color_keys, "", ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW},
-
- {border_collapse_keys, "", ABC_CSS_BORDER_COLLAPSE, ABC_HTML_FLAG_SHOW},
+ {border_collapse_keys, "", ABC_CSS_BORDER_COLLAPSE, ABC_HTML_FLAG_SHOW},
};
static html_attr_t th_attrs[] =
{
- {margin_keys, "2", ABC_HTML_ATTR_MARGIN, 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},
+ ABC_CSS_BOX(2px, 2px, 4px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {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_keys, "SimHei", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "18", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW},
- {font_style_keys, "", ABC_HTML_ATTR_FONT_STYLE, 0},
+ ABC_CSS_FONT(SimHei, 24, black, )
+ ABC_CSS_TEXT( , )
- {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},
+ {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW},
};
static html_attr_t td_attrs[] =
{
- {margin_keys, "2", ABC_HTML_ATTR_MARGIN, 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},
+ ABC_CSS_BOX(2px, 2px, 4px)
+ ABC_CSS_SELECTOR()
+ ABC_CSS_BACK_GROUND()
- {width_keys, "", ABC_HTML_ATTR_WIDTH, ABC_HTML_FLAG_SHOW},
- {height_keys, "", ABC_HTML_ATTR_HEIGHT, ABC_HTML_FLAG_SHOW},
+ ABC_CSS_FONT(SimSong, 16, black, )
+ ABC_CSS_TEXT( , )
- {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_keys, "SimSong", ABC_HTML_ATTR_FONT, 0},
- {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0},
- {font_color_keys, "black", ABC_HTML_ATTR_FONT_COLOR, 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},
+ {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW},
};
static html_attr_t script_attrs[] =
{
{html_keys, ABC_HTML, abc_number_of(html_attrs), html_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
{meta_keys, ABC_HTML_META, abc_number_of(meta_attrs), meta_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SINGLE},
- {body_keys, ABC_HTML_BODY, abc_number_of(body_attrs), body_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
- {title_keys, ABC_HTML_TITLE, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
{head_keys, ABC_HTML_HEAD, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
- {div_keys, ABC_HTML_DIV, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
+ {title_keys, ABC_HTML_TITLE, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
+ {body_keys, ABC_HTML_BODY, abc_number_of(body_attrs), body_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
+ {div_keys, ABC_HTML_DIV, abc_number_of(body_attrs), body_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
{h1_keys, ABC_HTML_H1, abc_number_of(h1_attrs), h1_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
{h2_keys, ABC_HTML_H2, abc_number_of(h2_attrs), h2_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW},
--- /dev/null
+#include"abc.h"
+
+static const char* vert_shader =
+ "#version 330 core\n"
+ "layout(location = 0) in vec4 position; \n"
+ "layout(location = 1) in vec2 a_texCoord; \n"
+ "out vec2 v_texCoord; \n"
+ "uniform mat4 mvp; \n"
+ "void main() { \n"
+ "gl_Position = mvp * position; \n"
+ "v_texCoord = a_texCoord; \n"
+ "} \n";
+
+static const char* frag_shader =
+ "#version 330 core\n"
+ "in vec2 v_texCoord; \n"
+ "out vec4 outputColor; \n"
+ "uniform sampler2D tex_rgba; \n"
+ "void main() { \n"
+ " vec2 xy = v_texCoord; \n"
+ " vec4 v = texture2D(tex_rgba, xy).rgba; \n"
+ " outputColor = vec4(v.b, v.g, v.r, v.a); \n"
+ "} \n";
+
+
+static GLuint program = 0;
+
+static GLuint vao = 0;
+static GLuint buffers[2] = {0};
+static GLuint texture_rgba = 0;
+
+static GLuint uniform_mvp;
+static GLuint uniform_rgba;
+
+
+static int __render_fini_text(abc_render_t* render)
+{
+ return 0;
+}
+
+void __draw_text(cairo_text_extents_t* extents, cairo_t* cr, const char* text, double x, double y, int line_type, int line_width)
+{
+ cairo_text_extents(cr, text, extents);
+ double w = extents->width;
+
+ x += extents->x_bearing;
+ y -= extents->y_bearing;
+
+ cairo_set_line_width(cr, 1);
+ cairo_move_to(cr, x, y);
+ cairo_show_text(cr, text);
+ cairo_stroke(cr);
+
+ cairo_set_line_width(cr, line_width);
+ switch (line_type)
+ {
+ case ABC_LINE_UNDER:
+ cairo_move_to(cr, x, y + line_width + 1.0);
+ cairo_line_to(cr, w, y + line_width + 1.0);
+ break;
+
+ case ABC_LINE_OVER:
+ cairo_move_to(cr, x, 1.0);
+ cairo_line_to(cr, w, 1.0);
+ break;
+
+ case ABC_LINE_THROUGH:
+ cairo_move_to(cr, x, y + extents->y_bearing / 2.0 + line_width);
+ cairo_line_to(cr, w, y + extents->y_bearing / 2.0 + line_width);
+ break;
+ default:
+ break;
+ };
+ cairo_stroke(cr);
+}
+
+int __init_text(cairo_t* cr, abc_obj_t* obj, int num_flag)
+{
+ abc_obj_t* attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT);
+ if (attr) {
+ int bold = CAIRO_FONT_WEIGHT_NORMAL;
+ int italic = CAIRO_FONT_SLANT_NORMAL;
+
+ abc_obj_t* style = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT_STYLE);
+ if (style) {
+ if (!__html_strcmp(style->value->data, "bold"))
+ bold = CAIRO_FONT_WEIGHT_BOLD;
+
+ else if (!__html_strcmp(style->value->data, "italic") || !__html_strcmp(style->value->data, "oblique"))
+ italic = CAIRO_FONT_SLANT_OBLIQUE;
+ }
+
+ cairo_select_font_face(cr, attr->value->data, italic, bold);
+ }
+
+ cairo_text_extents_t extents;
+ double r = 0.0;
+ double g = 0.0;
+ double b = 0.0;
+ double size = 16.0;
+
+ attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT_SIZE);
+ if (attr)
+ size = atoi(attr->value->data);
+
+ attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT_COLOR);
+ if (attr)
+ abc_css_color(&r, &g, &b, attr->value->data);
+
+ cairo_set_font_size (cr, size);
+ cairo_set_source_rgba(cr, r, g, b, 1.0);
+
+ if (ABC_HTML_OL == obj->parent->type && num_flag)
+ {
+ cairo_text_extents(cr, obj->text->data, &extents);
+
+ cairo_move_to (cr, obj->parent->padding - (extents.x_bearing + extents.width + size / 2), -obj->y_bearing);
+ cairo_show_text(cr, obj->text->data);
+ cairo_stroke(cr);
+ return 0;
+ }
+
+ double line_width = 0.5 + size / 16.0;
+ int line_type = ABC_LINE_NONE;
+
+ attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_TEXT_DECORATION);
+ if (attr) {
+ if (!__html_strcmp(attr->value->data, "underline"))
+ line_type = ABC_LINE_UNDER;
+
+ else if (!__html_strcmp(attr->value->data, "overline"))
+ line_type = ABC_LINE_OVER;
+
+ else if (!__html_strcmp(attr->value->data, "line-through"))
+ line_type = ABC_LINE_THROUGH;
+ }
+
+ if (!obj->text_splits) {
+ __draw_text(&extents, cr, obj->text->data, obj->parent->padding, 0.0, line_type, line_width);
+ return 0;
+ }
+
+ scf_string_t* s;
+ abc_text_t* t;
+
+ double x = obj->parent->padding;
+ double y = 0.0;
+
+ while (obj->text_splits) {
+ t = obj->text_splits;
+
+ s = scf_string_cstr_len(obj->text->data + t->start, t->len);
+ if (!s) {
+ scf_slist_clear(obj->text_splits, abc_text_t, next, free);
+ return -ENOMEM;
+ }
+
+ __draw_text(&extents, cr, s->data, x, y, line_type, line_width);
+ y += extents.height;
+
+ obj->text_splits = t->next;
+
+ scf_string_free(s);
+ free(t);
+ }
+
+ return 0;
+}
+
+static int __render_draw_text(abc_render_t* render, abc_obj_t* obj, int width, int height)
+{
+ if (obj->w <= 0 || obj->h <= 0)
+ return 0;
+
+ int d = abc_css_margin(obj);
+ int x = obj->x + d;
+ int y = obj->y + d;
+ int w = obj->w - d * 2;
+ int h = obj->h - d * 2;
+
+ scf_logd("obj->type: %d, obj->w: %d, obj->h: %d, w: %d, h: %d, d: %d\n", obj->type, obj->w, obj->h, w, h, d);
+
+ if (0 == program)
+ __init_program(&program, vert_shader, frag_shader);
+
+ if (0 == vao)
+ __init_buffers(&vao, buffers);
+
+ if (0 == texture_rgba)
+ __init_texture(&texture_rgba, GL_RGBA, w, h, NULL);
+
+ abc_obj_t* attr;
+ cairo_surface_t* surface;
+ cairo_t* cr;
+
+ uint8_t* bgra = calloc(1, w * h * 4);
+ if (!bgra)
+ return -ENOMEM;
+
+ double r = 0.0;
+ double g = 0.0;
+ double b = 0.0;
+ attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_BG_COLOR);
+ if (attr)
+ abc_css_color(&r, &g, &b, attr->value->data);
+
+ surface = cairo_image_surface_create_for_data(bgra, CAIRO_FORMAT_ARGB32, w, h, w * 4);
+ cr = cairo_create(surface);
+
+ cairo_set_line_width(cr, 1);
+ cairo_set_source_rgba(cr, r, g, b, 0.0);
+ cairo_rectangle(cr, 0, 0, w, h);
+ cairo_fill(cr);
+ cairo_stroke(cr);
+
+ if (obj->text)
+ __init_text(cr, obj, 0);
+// cairo_surface_write_to_png(surface, "tmp.png");
+
+ cairo_destroy(cr);
+ cairo_surface_destroy(surface);
+ surface = NULL;
+ cr = NULL;
+
+ float mvp[16];
+ __compute_mvp(mvp, 0, 0, 0);
+
+ scf_logd("%s, x: %d, y: %d, w: %d, h: %d\n", obj->text->data, obj->x, obj->y, obj->w, obj->h);
+
+ GLfloat vert_update[] =
+ {
+ 2.0 * x / (float)width - 1.0,
+ -2.0 * (y + h) / (float)height + 1.0,
+
+ 2.0 * (x + w) / (float)width - 1.0,
+ -2.0 * (y + h) / (float)height + 1.0,
+
+ 2.0 * x / (float)width - 1.0,
+ -2.0 * y / (float)height + 1.0,
+
+ 2.0 * (x + w) / (float)width - 1.0,
+ -2.0 * y / (float)height + 1.0,
+ };
+
+ glUseProgram(program);
+ uniform_rgba = glGetUniformLocation(program, "tex_rgba");
+ uniform_mvp = glGetUniformLocation(program, "mvp");
+
+ glUniformMatrix4fv(uniform_mvp, 1, GL_FALSE, mvp);
+
+ // board
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture (GL_TEXTURE_2D, texture_rgba);
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, bgra);
+ glUniform1i(uniform_rgba, 0);
+
+ // draw
+ glBindBuffer (GL_ARRAY_BUFFER, buffers[0]);
+ glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vert_update), vert_update);
+
+ glBindVertexArray(vao);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+ glDisable(GL_BLEND);
+
+ glBindVertexArray(0);
+ glUseProgram(0);
+
+ free(bgra);
+ return 0;
+}
+
+abc_render_t __render_text =
+{
+ .type = ABC_HTML_ATTR_TEXT,
+
+ .draw = __render_draw_text,
+ .fini = __render_fini_text,
+};
#include"abc.h"
-extern abc_render_t abc_render_table;
-
-static const char* vert_shader =
- "#version 330 core\n"
- "layout(location = 0) in vec4 position; \n"
- "layout(location = 1) in vec2 a_texCoord; \n"
- "out vec2 v_texCoord; \n"
- "uniform mat4 mvp; \n"
- "void main() { \n"
- "gl_Position = mvp * position; \n"
- "v_texCoord = a_texCoord; \n"
- "} \n";
-
-static const char* frag_shader =
- "#version 330 core\n"
- "in vec2 v_texCoord; \n"
- "out vec4 outputColor; \n"
- "uniform sampler2D tex_rgba; \n"
- "void main() { \n"
- " vec2 xy = v_texCoord; \n"
- " vec4 v = texture2D(tex_rgba, xy).rgba; \n"
- " outputColor = vec4(v.b, v.g, v.r, 1.0); \n"
- "} \n";
-
-
-static GLuint program = 0;
-
-static GLuint vao = 0;
-static GLuint buffers[2] = {0};
-static GLuint texture_rgba = 0;
-
-static GLuint uniform_mvp;
-static GLuint uniform_rgba;
-
-
static int _render_fini_h1(abc_render_t* render)
{
return 0;
}
-void __draw_text(cairo_text_extents_t* extents, cairo_t* cr, const char* text, double x, double y, int line_type, int line_width)
-{
- cairo_text_extents(cr, text, extents);
- double w = extents->width;
-
- x += extents->x_bearing;
- y -= extents->y_bearing;
-
- cairo_set_line_width(cr, 1);
- cairo_move_to(cr, x, y);
- cairo_show_text(cr, text);
- cairo_stroke(cr);
-
- cairo_set_line_width(cr, line_width);
- switch (line_type)
- {
- case ABC_LINE_UNDER:
- cairo_move_to(cr, x, y + line_width + 1.0);
- cairo_line_to(cr, w, y + line_width + 1.0);
- break;
-
- case ABC_LINE_OVER:
- cairo_move_to(cr, x, 1.0);
- cairo_line_to(cr, w, 1.0);
- break;
-
- case ABC_LINE_THROUGH:
- cairo_move_to(cr, x, y + extents->y_bearing / 2.0 + line_width);
- cairo_line_to(cr, w, y + extents->y_bearing / 2.0 + line_width);
- break;
- default:
- break;
- };
- cairo_stroke(cr);
-}
-
-int __init_text(cairo_t* cr, abc_obj_t* obj, int num_flag)
-{
- abc_obj_t* attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT);
- if (attr) {
- int bold = CAIRO_FONT_WEIGHT_NORMAL;
- int italic = CAIRO_FONT_SLANT_NORMAL;
-
- abc_obj_t* style = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT_STYLE);
- if (style) {
- if (!__html_strcmp(style->value->data, "bold"))
- bold = CAIRO_FONT_WEIGHT_BOLD;
-
- else if (!__html_strcmp(style->value->data, "italic") || !__html_strcmp(style->value->data, "oblique"))
- italic = CAIRO_FONT_SLANT_OBLIQUE;
- }
-
- cairo_select_font_face(cr, attr->value->data, italic, bold);
- }
-
- cairo_text_extents_t extents;
- double r = 0.0;
- double g = 0.0;
- double b = 0.0;
- double size = 16.0;
-
- attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT_SIZE);
- if (attr)
- size = atoi(attr->value->data);
-
- attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT_COLOR);
- if (attr)
- abc_css_color(&r, &g, &b, attr->value->data);
-
- cairo_set_font_size (cr, size);
- cairo_set_source_rgba(cr, r, g, b, 1.0);
-
- if (ABC_HTML_OL == obj->parent->type && num_flag)
- {
- cairo_text_extents(cr, obj->text->data, &extents);
-
- cairo_move_to (cr, obj->parent->padding - (extents.x_bearing + extents.width + size / 2), -obj->y_bearing);
- cairo_show_text(cr, obj->text->data);
- cairo_stroke(cr);
- return 0;
- }
-
- double line_width = 0.5 + size / 16.0;
- int line_type = ABC_LINE_NONE;
-
- attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_TEXT_DECORATION);
- if (attr) {
- if (!__html_strcmp(attr->value->data, "underline"))
- line_type = ABC_LINE_UNDER;
-
- else if (!__html_strcmp(attr->value->data, "overline"))
- line_type = ABC_LINE_OVER;
-
- else if (!__html_strcmp(attr->value->data, "line-through"))
- line_type = ABC_LINE_THROUGH;
- }
-
- if (!obj->text_splits) {
- __draw_text(&extents, cr, obj->text->data, obj->parent->padding, 0.0, line_type, line_width);
- return 0;
- }
-
- scf_string_t* s;
- abc_text_t* t;
-
- double x = obj->parent->padding;
- double y = 0.0;
-
- while (obj->text_splits) {
- t = obj->text_splits;
-
- s = scf_string_cstr_len(obj->text->data + t->start, t->len);
- if (!s) {
- scf_slist_clear(obj->text_splits, abc_text_t, next, free);
- return -ENOMEM;
- }
-
- __draw_text(&extents, cr, s->data, x, y, line_type, line_width);
- y += extents.height;
-
- obj->text_splits = t->next;
-
- scf_string_free(s);
- free(t);
- }
-
- return 0;
-}
-
static int _render_draw_h1(abc_render_t* render, abc_obj_t* obj, int width, int height)
{
if (obj->w <= 0 || obj->h <= 0)
return 0;
- abc_render_table.draw(&abc_render_table, obj, width, height);
-
- int d = abc_css_margin(obj);
- int x = obj->x + d;
- int y = obj->y + d;
- int w = obj->w - d * 2;
- int h = obj->h - d * 2;
-
- scf_logd("obj->type: %d, obj->w: %d, obj->h: %d, w: %d, h: %d, d: %d\n", obj->type, obj->w, obj->h, w, h, d);
-
- if (0 == program)
- __init_program(&program, vert_shader, frag_shader);
-
- if (0 == vao)
- __init_buffers(&vao, buffers);
-
- if (0 == texture_rgba)
- __init_texture(&texture_rgba, GL_RGBA, w, h, NULL);
-
- abc_obj_t* attr;
- cairo_surface_t* surface;
- cairo_t* cr;
-
- uint8_t* bgra = calloc(1, w * h * 4);
- if (!bgra)
- return -ENOMEM;
-
- double r = 0.0;
- double g = 0.0;
- double b = 0.0;
- attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_BG_COLOR);
- if (attr)
- abc_css_color(&r, &g, &b, attr->value->data);
-
- surface = cairo_image_surface_create_for_data(bgra, CAIRO_FORMAT_ARGB32, w, h, w * 4);
- cr = cairo_create(surface);
-
- cairo_set_line_width(cr, 1);
- cairo_set_source_rgb(cr, r, g, b);
- cairo_rectangle(cr, 0, 0, w, h);
- cairo_fill(cr);
- cairo_stroke(cr);
+ __render_border.draw(&__render_border, obj, width, height);
if (obj->text)
- __init_text(cr, obj, 0);
-// cairo_surface_write_to_png(surface, "tmp.png");
-
- cairo_destroy(cr);
- cairo_surface_destroy(surface);
- surface = NULL;
- cr = NULL;
-
- float mvp[16];
- __compute_mvp(mvp, 0, 0, 0);
-
- scf_logd("%s, x: %d, y: %d, w: %d, h: %d\n", obj->text->data, obj->x, obj->y, obj->w, obj->h);
-
- GLfloat vert_update[] =
- {
- 2.0 * x / (float)width - 1.0,
- -2.0 * (y + h) / (float)height + 1.0,
-
- 2.0 * (x + w) / (float)width - 1.0,
- -2.0 * (y + h) / (float)height + 1.0,
-
- 2.0 * x / (float)width - 1.0,
- -2.0 * y / (float)height + 1.0,
-
- 2.0 * (x + w) / (float)width - 1.0,
- -2.0 * y / (float)height + 1.0,
- };
-
- glUseProgram(program);
- uniform_rgba = glGetUniformLocation(program, "tex_rgba");
- uniform_mvp = glGetUniformLocation(program, "mvp");
-
- glUniformMatrix4fv(uniform_mvp, 1, GL_FALSE, mvp);
-
- // board
- glActiveTexture(GL_TEXTURE0);
- glBindTexture (GL_TEXTURE_2D, texture_rgba);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, bgra);
- glUniform1i(uniform_rgba, 0);
-
- // draw
- glBindBuffer (GL_ARRAY_BUFFER, buffers[0]);
- glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vert_update), vert_update);
-
- glBindVertexArray(vao);
-
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
- glBindVertexArray(0);
- glUseProgram(0);
+ __render_text.draw(&__render_text, obj, width, height);
- free(bgra);
return 0;
}