diff options
-rw-r--r-- | src/styleengine.cc | 117 | ||||
-rw-r--r-- | src/styleengine.hh | 1 | ||||
-rw-r--r-- | src/table.cc | 18 |
3 files changed, 72 insertions, 64 deletions
diff --git a/src/styleengine.cc b/src/styleengine.cc index 0d68a7b9..9570d21b 100644 --- a/src/styleengine.cc +++ b/src/styleengine.cc @@ -102,6 +102,48 @@ void StyleEngine::endElement (int element) { void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) { FontAttrs fontAttrs = *attrs->font; + /* determine font first so it can be used to resolve relative lenths + * \todo Things should be rearranged so that just one pass is necessary. + */ + for (int i = 0; i < props->size (); i++) { + CssProperty *p = props->getRef (i); + + switch (p->name) { + case CssProperty::CSS_PROPERTY_FONT_FAMILY: + fontAttrs.name = p->value.strVal; + break; + case CssProperty::CSS_PROPERTY_FONT_SIZE: + fontAttrs.size = p->value.intVal; + break; + case CssProperty::CSS_PROPERTY_FONT_STYLE: + fontAttrs.style = (FontStyle) p->value.intVal; + break; + case CssProperty::CSS_PROPERTY_FONT_WEIGHT: + switch (p->value.intVal) { + case CssProperty::CSS_FONT_WEIGHT_LIGHTER: + fontAttrs.weight -= CssProperty::CSS_FONT_WEIGHT_STEP; + break; + case CssProperty::CSS_FONT_WEIGHT_BOLDER: + fontAttrs.weight += CssProperty::CSS_FONT_WEIGHT_STEP; + break; + default: + fontAttrs.weight = p->value.intVal; + break; + } + if (fontAttrs.weight < CssProperty::CSS_FONT_WEIGHT_MIN) + fontAttrs.weight = CssProperty::CSS_FONT_WEIGHT_MIN; + if (fontAttrs.weight > CssProperty::CSS_FONT_WEIGHT_MAX) + fontAttrs.weight = CssProperty::CSS_FONT_WEIGHT_MAX; + break; + default: + break; + } + } + + fontAttrs.size = computeValue (fontAttrs.size, + stack->get (stack->size () - 2).style->font); + attrs->font = Font::create (layout, &fontAttrs); + for (int i = 0; i < props->size (); i++) { CssProperty *p = props->getRef (i); @@ -125,11 +167,11 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) { attrs->setBorderStyle ((BorderStyle) p->value.intVal); break; case CssProperty::CSS_PROPERTY_BORDER_WIDTH: - attrs->borderWidth.setVal (p->value.intVal); + attrs->borderWidth.setVal (computeValue (p->value.intVal, attrs->font)); break; case CssProperty::CSS_PROPERTY_BORDER_SPACING: - attrs->hBorderSpacing = p->value.intVal; - attrs->vBorderSpacing = p->value.intVal; + attrs->hBorderSpacing = computeValue (p->value.intVal, attrs->font); + attrs->vBorderSpacing = attrs->hBorderSpacing; break; case CssProperty::CSS_PROPERTY_COLOR: attrs->color = Color::createSimple (layout, p->value.intVal); @@ -137,52 +179,26 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) { case CssProperty::CSS_PROPERTY_CURSOR: attrs->cursor = (Cursor) p->value.intVal; break; - case CssProperty::CSS_PROPERTY_FONT_FAMILY: - fontAttrs.name = p->value.strVal; - break; - case CssProperty::CSS_PROPERTY_FONT_SIZE: - fontAttrs.size = p->value.intVal; - break; - case CssProperty::CSS_PROPERTY_FONT_STYLE: - fontAttrs.style = (FontStyle) p->value.intVal; - break; - case CssProperty::CSS_PROPERTY_FONT_WEIGHT: - switch (p->value.intVal) { - case CssProperty::CSS_FONT_WEIGHT_LIGHTER: - fontAttrs.weight -= CssProperty::CSS_FONT_WEIGHT_STEP; - break; - case CssProperty::CSS_FONT_WEIGHT_BOLDER: - fontAttrs.weight += CssProperty::CSS_FONT_WEIGHT_STEP; - break; - default: - fontAttrs.weight = p->value.intVal; - break; - } - if (fontAttrs.weight < CssProperty::CSS_FONT_WEIGHT_MIN) - fontAttrs.weight = CssProperty::CSS_FONT_WEIGHT_MIN; - if (fontAttrs.weight > CssProperty::CSS_FONT_WEIGHT_MAX) - fontAttrs.weight = CssProperty::CSS_FONT_WEIGHT_MAX; - break; case CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE: attrs->listStyleType = (ListStyleType) p->value.intVal; break; case CssProperty::CSS_PROPERTY_MARGIN: - attrs->margin.setVal (p->value.intVal); + attrs->margin.setVal (computeValue (p->value.intVal, attrs->font)); break; case CssProperty::CSS_PROPERTY_MARGIN_BOTTOM: - attrs->margin.bottom = p->value.intVal; + attrs->margin.bottom = computeValue (p->value.intVal, attrs->font); break; case CssProperty::CSS_PROPERTY_MARGIN_LEFT: - attrs->margin.left = p->value.intVal; + attrs->margin.left = computeValue (p->value.intVal, attrs->font); break; case CssProperty::CSS_PROPERTY_MARGIN_RIGHT: - attrs->margin.right = p->value.intVal; + attrs->margin.right = computeValue (p->value.intVal, attrs->font); break; case CssProperty::CSS_PROPERTY_MARGIN_TOP: - attrs->margin.top = p->value.intVal; + attrs->margin.top = computeValue (p->value.intVal, attrs->font); break; case CssProperty::CSS_PROPERTY_PADDING: - attrs->padding.setVal (p->value.intVal); + attrs->padding.setVal (computeValue (p->value.intVal, attrs->font)); break; case CssProperty::CSS_PROPERTY_TEXT_ALIGN: attrs->textAlign = (TextAlignType) p->value.intVal; @@ -193,8 +209,12 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) { case CssProperty::CSS_PROPERTY_VERTICAL_ALIGN: attrs->valign = (VAlignType) p->value.intVal; break; + /* \todo proper conversion from CssLength to dw::core::style::Length */ case CssProperty::CSS_PROPERTY_WIDTH: - attrs->width = p->value.intVal; + attrs->width = p->value.intVal; + break; + case CssProperty::CSS_PROPERTY_HEIGHT: + attrs->height = p->value.intVal; break; case CssProperty::PROPERTY_X_LINK: attrs->x_link = p->value.intVal; @@ -207,28 +227,11 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) { break; } } - - fontAttrs.size = computeValue (fontAttrs.size, - stack->get (stack->size () - 2).style->font); - attrs->font = Font::create (layout, &fontAttrs); - - computeValues (&attrs->borderWidth, attrs->font); - computeValues (&attrs->margin, attrs->font); - computeValues (&attrs->padding, attrs->font); - attrs->width = computeValue (attrs->width, attrs->font); - attrs->height = computeValue (attrs->height, attrs->font); } /** * \brief Resolve relative lengths to absolute values. - * The font must be set already. */ -void StyleEngine::computeValues (Box *box, Font *font) { - box->bottom = computeValue (box->bottom, font); - box->left = computeValue (box->left, font); - box->right = computeValue (box->right, font); - box->top = computeValue (box->top, font); -} int StyleEngine::computeValue (CssLength value, Font *font) { int ret; @@ -239,16 +242,16 @@ int StyleEngine::computeValue (CssLength value, Font *font) { switch (CSS_LENGTH_TYPE (value)) { case CSS_LENGTH_TYPE_PX: - ret = (int) rintf (CSS_LENGTH_VALUE(value)); + ret = (int) CSS_LENGTH_VALUE (value); break; case CSS_LENGTH_TYPE_MM: - ret = (int) rintf (CSS_LENGTH_VALUE(value) * dpmm); + ret = (int) (CSS_LENGTH_VALUE (value) * dpmm); break; case CSS_LENGTH_TYPE_EM: - ret = (int) rintf (CSS_LENGTH_VALUE(value) * font->size); + ret = (int) (CSS_LENGTH_VALUE (value) * font->size); break; case CSS_LENGTH_TYPE_EX: - ret = (int) rintf (CSS_LENGTH_VALUE(value) * font->xHeight); + ret = (int) (CSS_LENGTH_VALUE(value) * font->xHeight); break; default: ret = value; diff --git a/src/styleengine.hh b/src/styleengine.hh index 07b79a54..0706411c 100644 --- a/src/styleengine.hh +++ b/src/styleengine.hh @@ -20,7 +20,6 @@ class StyleEngine : public Doctree { dw::core::style::Style *style0 (CssPropertyList *nonCssProperties = NULL); void apply (dw::core::style::StyleAttrs *attrs, CssPropertyList *props); int computeValue (CssLength value, dw::core::style::Font *font); - void computeValues (dw::core::style::Box *box, dw::core::style::Font *font); public: StyleEngine (dw::core::Layout *layout); diff --git a/src/table.cc b/src/table.cc index 1db32793..bd57141a 100644 --- a/src/table.cc +++ b/src/table.cc @@ -60,14 +60,17 @@ void Html_tag_open_table(DilloHtml *html, const char *tag, int tagsize) cellpadding = strtol (attrbuf, NULL, 10); if (border != -1) - props.set (CssProperty::CSS_PROPERTY_BORDER_WIDTH, border); + props.set (CssProperty::CSS_PROPERTY_BORDER_WIDTH, + CSS_CREATE_LENGTH (border, CSS_LENGTH_TYPE_PX)); if (cellspacing != -1) - props.set (CssProperty::CSS_PROPERTY_BORDER_SPACING, cellspacing); + props.set (CssProperty::CSS_PROPERTY_BORDER_SPACING, + CSS_CREATE_LENGTH (cellspacing, CSS_LENGTH_TYPE_PX)); /* When dillo was started with the --debug-rendering option, there * is always a border around the table. */ if (dillo_dbg_rendering && border < 1) - props.set (CssProperty::CSS_PROPERTY_BORDER_WIDTH, 1); + props.set (CssProperty::CSS_PROPERTY_BORDER_WIDTH, + CSS_CREATE_LENGTH (1, CSS_LENGTH_TYPE_PX)); if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "width"))) props.set (CssProperty::CSS_PROPERTY_WIDTH, @@ -100,11 +103,14 @@ void Html_tag_open_table(DilloHtml *html, const char *tag, int tagsize) /* The style for the cells */ table_cell_props = new CssPropertyList (); if (border != -1) - table_cell_props->set (CssProperty::CSS_PROPERTY_BORDER_WIDTH, border); + table_cell_props->set (CssProperty::CSS_PROPERTY_BORDER_WIDTH, + CSS_CREATE_LENGTH (border, CSS_LENGTH_TYPE_PX)); if (dillo_dbg_rendering && border < 1) - table_cell_props->set (CssProperty::CSS_PROPERTY_BORDER_WIDTH, 1); + table_cell_props->set (CssProperty::CSS_PROPERTY_BORDER_WIDTH, + CSS_CREATE_LENGTH (1, CSS_LENGTH_TYPE_PX)); if (cellpadding != -1) - table_cell_props->set (CssProperty::CSS_PROPERTY_PADDING, cellpadding); + table_cell_props->set (CssProperty::CSS_PROPERTY_PADDING, + CSS_CREATE_LENGTH (cellpadding, CSS_LENGTH_TYPE_PX)); /** \todo figure out how to handle shaded colors with CSS */ table_cell_props->set (CssProperty::CSS_PROPERTY_BORDER_COLOR, 0x000000); |