summaryrefslogtreecommitdiff
path: root/source/html/css-apply.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2015-04-27 15:27:22 +0200
committerTor Andersson <tor.andersson@artifex.com>2015-04-27 15:27:22 +0200
commite2b0aed8d52d8a011d8bf4cc6c501057dfa05f0d (patch)
treec7d8bb489df030d8fb3927cc1a5097c57afee019 /source/html/css-apply.c
parent317a3d0271b21813e50d7c9e8288e26d21c62d4f (diff)
downloadmupdf-e2b0aed8d52d8a011d8bf4cc6c501057dfa05f0d.tar.xz
epub: Support individual T,B,L,R border styles and colors.
Diffstat (limited to 'source/html/css-apply.c')
-rw-r--r--source/html/css-apply.c117
1 files changed, 92 insertions, 25 deletions
diff --git a/source/html/css-apply.c b/source/html/css-apply.c
index 40cae696..052888db 100644
--- a/source/html/css-apply.c
+++ b/source/html/css-apply.c
@@ -404,38 +404,61 @@ add_shorthand_border_width(fz_css_match *match, fz_css_value *value, int spec)
}
static void
-add_shorthand_border(fz_css_match *match, fz_css_value *value, int spec)
+add_shorthand_border_color(fz_css_match *match, fz_css_value *value, int spec)
+{
+ add_shorthand_trbl(match, value, spec,
+ "border-color-top", "border-color-right", "border-color-bottom", "border-color-left");
+}
+
+static void
+add_shorthand_border_style(fz_css_match *match, fz_css_value *value, int spec)
+{
+ add_shorthand_trbl(match, value, spec,
+ "border-style-top", "border-style-right", "border-style-bottom", "border-style-left");
+}
+
+static void
+add_shorthand_border(fz_css_match *match, fz_css_value *value, int spec, int T, int R, int B, int L)
{
while (value)
{
if (value->type == CSS_COLOR)
{
- add_property(match, "border-color", value, spec);
+ if (T) add_property(match, "border-color-top", value, spec);
+ if (R) add_property(match, "border-color-right", value, spec);
+ if (B) add_property(match, "border-color-bottom", value, spec);
+ if (L) add_property(match, "border-color-left", value, spec);
}
else if (value->type == CSS_KEYWORD)
{
if (keyword_in_list(value->data, border_width_kw, nelem(border_width_kw)))
{
- add_property(match, "border-width-top", value, spec);
- add_property(match, "border-width-right", value, spec);
- add_property(match, "border-width-bottom", value, spec);
- add_property(match, "border-width-left", value, spec);
+ if (T) add_property(match, "border-width-top", value, spec);
+ if (R) add_property(match, "border-width-right", value, spec);
+ if (B) add_property(match, "border-width-bottom", value, spec);
+ if (L) add_property(match, "border-width-left", value, spec);
}
else if (keyword_in_list(value->data, border_style_kw, nelem(border_style_kw)))
{
- add_property(match, "border-style", value, spec);
+ if (T) add_property(match, "border-style-top", value, spec);
+ if (R) add_property(match, "border-style-right", value, spec);
+ if (B) add_property(match, "border-style-bottom", value, spec);
+ if (L) add_property(match, "border-style-left", value, spec);
}
else if (keyword_in_list(value->data, color_kw, nelem(color_kw)))
{
- add_property(match, "border-color", value, spec);
+ if (T) add_property(match, "border-color-top", value, spec);
+ if (R) add_property(match, "border-color-right", value, spec);
+ if (B) add_property(match, "border-color-bottom", value, spec);
+ if (L) add_property(match, "border-color-left", value, spec);
}
}
else
{
- add_property(match, "border-width-top", value, spec);
- add_property(match, "border-width-right", value, spec);
- add_property(match, "border-width-bottom", value, spec);
- add_property(match, "border-width-left", value, spec);
+ if (T) add_property(match, "border-width-top", value, spec);
+ if (R) add_property(match, "border-width-right", value, spec);
+ if (B) add_property(match, "border-width-bottom", value, spec);
+ if (L) add_property(match, "border-width-left", value, spec);
}
value = value->next;
}
@@ -481,9 +504,39 @@ add_property(fz_css_match *match, const char *name, fz_css_value *value, int spe
add_shorthand_border_width(match, value, spec);
return;
}
+ if (!strcmp(name, "border-color"))
+ {
+ add_shorthand_border_color(match, value, spec);
+ return;
+ }
+ if (!strcmp(name, "border-style"))
+ {
+ add_shorthand_border_style(match, value, spec);
+ return;
+ }
if (!strcmp(name, "border"))
{
- add_shorthand_border(match, value, spec);
+ add_shorthand_border(match, value, spec, 1, 1, 1, 1);
+ return;
+ }
+ if (!strcmp(name, "border-top"))
+ {
+ add_shorthand_border(match, value, spec, 1, 0, 0, 0);
+ return;
+ }
+ if (!strcmp(name, "border-right"))
+ {
+ add_shorthand_border(match, value, spec, 0, 1, 0, 0);
+ return;
+ }
+ if (!strcmp(name, "border-bottom"))
+ {
+ add_shorthand_border(match, value, spec, 0, 0, 1, 0);
+ return;
+ }
+ if (!strcmp(name, "border-left"))
+ {
+ add_shorthand_border(match, value, spec, 0, 0, 0, 1);
return;
}
if (!strcmp(name, "list-style"))
@@ -674,6 +727,19 @@ border_width_from_property(fz_css_match *match, const char *property)
return make_number(2, N_NUMBER); /* initial: 'medium' */
}
+static int
+border_style_from_property(fz_css_match *match, const char *property)
+{
+ fz_css_value *value = value_from_property(match, property);
+ if (value)
+ {
+ if (!strcmp(value->data, "none")) return BS_NONE;
+ else if (!strcmp(value->data, "hidden")) return BS_NONE;
+ else if (!strcmp(value->data, "solid")) return BS_SOLID;
+ }
+ return BS_NONE;
+}
+
float
fz_from_css_number(fz_css_number number, float em, float width)
{
@@ -869,14 +935,6 @@ fz_apply_css_style(fz_context *ctx, fz_html_font_set *set, fz_css_style *style,
style->font_size = make_number(1, N_SCALE);
}
- value = value_from_property(match, "border-style");
- if (value)
- {
- if (!strcmp(value->data, "none")) style->border_style = BS_NONE;
- else if (!strcmp(value->data, "hidden")) style->border_style = BS_NONE;
- else if (!strcmp(value->data, "solid")) style->border_style = BS_SOLID;
- }
-
value = value_from_property(match, "list-style-type");
if (value)
{
@@ -912,15 +970,24 @@ fz_apply_css_style(fz_context *ctx, fz_html_font_set *set, fz_css_style *style,
style->padding[2] = number_from_property(match, "padding-bottom", 0, N_NUMBER);
style->padding[3] = number_from_property(match, "padding-left", 0, N_NUMBER);
+ style->color = color_from_property(match, "color", black);
+ style->background_color = color_from_property(match, "background-color", transparent);
+
+ style->border_style[0] = border_style_from_property(match, "border-style-top");
+ style->border_style[1] = border_style_from_property(match, "border-style-right");
+ style->border_style[2] = border_style_from_property(match, "border-style-bottom");
+ style->border_style[3] = border_style_from_property(match, "border-style-left");
+
+ style->border_color[0] = color_from_property(match, "border-color-top", transparent);
+ style->border_color[1] = color_from_property(match, "border-color-right", transparent);
+ style->border_color[2] = color_from_property(match, "border-color-bottom", transparent);
+ style->border_color[3] = color_from_property(match, "border-color-left", transparent);
+
style->border_width[0] = border_width_from_property(match, "border-width-top");
style->border_width[1] = border_width_from_property(match, "border-width-right");
style->border_width[2] = border_width_from_property(match, "border-width-bottom");
style->border_width[3] = border_width_from_property(match, "border-width-left");
- style->color = color_from_property(match, "color", black);
- style->background_color = color_from_property(match, "background-color", transparent);
- style->border_color = color_from_property(match, "border-color", style->color);
-
{
const char *font_family = string_from_property(match, "font-family", "serif");
const char *font_variant = string_from_property(match, "font-variant", "normal");