aboutsummaryrefslogtreecommitdiff
path: root/src/styleengine.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/styleengine.cc')
-rw-r--r--src/styleengine.cc158
1 files changed, 104 insertions, 54 deletions
diff --git a/src/styleengine.cc b/src/styleengine.cc
index 369058df..a4d5003a 100644
--- a/src/styleengine.cc
+++ b/src/styleengine.cc
@@ -32,7 +32,7 @@ StyleEngine::StyleEngine (dw::core::Layout *layout) {
/* Create a dummy font, attribute, and tag for the bottom of the stack. */
font_attrs.name = prefs.font_sans_serif;
font_attrs.size = (int) (14 * prefs.font_factor + 0.5);
- font_attrs.weight = CssProperty::CSS_FONT_WEIGHT_NORMAL;
+ font_attrs.weight = 400;
font_attrs.style = FONT_STYLE_NORMAL;
style_attrs.initValues ();
@@ -169,7 +169,7 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) {
CssProperty *p = props->getRef (i);
switch (p->name) {
- case CssProperty::CSS_PROPERTY_FONT_FAMILY:
+ case CSS_PROPERTY_FONT_FAMILY:
// \todo handle comma separated lists of font names
if (strcmp (p->value.strVal, "serif") == 0)
fontAttrs.name = prefs.font_serif;
@@ -184,30 +184,80 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) {
else
fontAttrs.name = p->value.strVal;
break;
- case CssProperty::CSS_PROPERTY_FONT_SIZE:
+ case CSS_PROPERTY_FONT_SIZE:
parentFont = stack->get (stack->size () - 2).style->font;
- computeValue (&fontAttrs.size, p->value.intVal, parentFont,
- parentFont->size);
+ if (p->type == CSS_TYPE_ENUM) {
+ switch (p->value.intVal) {
+ case CSS_FONT_SIZE_XX_SMALL:
+ fontAttrs.size = (int) (11.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_X_SMALL:
+ fontAttrs.size = (int) (12.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_SMALL:
+ fontAttrs.size = (int) (13.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_MEDIUM:
+ fontAttrs.size = (int) (14.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_LARGE:
+ fontAttrs.size = (int) (15.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_X_LARGE:
+ fontAttrs.size = (int) (16.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_XX_LARGE:
+ fontAttrs.size = (int) (17.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_SMALLER:
+ fontAttrs.size -= (int) (1.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_LARGER:
+ fontAttrs.size += (int) (1.0 * prefs.font_factor + 0.5);
+ break;
+ default:
+ assert(false); // invalid font-size enum
+ }
+ } else {
+ computeValue (&fontAttrs.size, p->value.intVal, parentFont,
+ parentFont->size);
+ }
break;
- case CssProperty::CSS_PROPERTY_FONT_STYLE:
+ case 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;
+ case CSS_PROPERTY_FONT_WEIGHT:
+
+ if (p->type == CSS_TYPE_ENUM) {
+ switch (p->value.intVal) {
+ case CSS_FONT_WEIGHT_BOLD:
+ fontAttrs.weight = 700;
+ break;
+ case CSS_FONT_WEIGHT_BOLDER:
+ fontAttrs.weight += 300;
+ break;
+ case CSS_FONT_WEIGHT_LIGHT:
+ fontAttrs.weight = 100;
+ break;
+ case CSS_FONT_WEIGHT_LIGHTER:
+ fontAttrs.weight -= 300;
+ break;
+ case CSS_FONT_WEIGHT_NORMAL:
+ fontAttrs.weight = 400;
+ break;
+ default:
+ assert(false); // invalid font weight value
+ break;
+ }
+ } else {
+ fontAttrs.weight = p->value.intVal;
}
- 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;
+
+ if (fontAttrs.weight < 100)
+ fontAttrs.weight = 100;
+ if (fontAttrs.weight > 900)
+ fontAttrs.weight = 900;
+
break;
default:
break;
@@ -221,109 +271,109 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) {
switch (p->name) {
/* \todo missing cases */
- case CssProperty::CSS_PROPERTY_BACKGROUND_COLOR:
+ case CSS_PROPERTY_BACKGROUND_COLOR:
attrs->backgroundColor =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_TOP_COLOR:
+ case CSS_PROPERTY_BORDER_TOP_COLOR:
attrs->borderColor.top =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_BOTTOM_COLOR:
+ case CSS_PROPERTY_BORDER_BOTTOM_COLOR:
attrs->borderColor.bottom =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_LEFT_COLOR:
+ case CSS_PROPERTY_BORDER_LEFT_COLOR:
attrs->borderColor.left =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_RIGHT_COLOR:
+ case CSS_PROPERTY_BORDER_RIGHT_COLOR:
attrs->borderColor.right =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_BOTTOM_STYLE:
+ case CSS_PROPERTY_BORDER_BOTTOM_STYLE:
attrs->borderStyle.bottom = (BorderStyle) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_BORDER_LEFT_STYLE:
+ case CSS_PROPERTY_BORDER_LEFT_STYLE:
attrs->borderStyle.left = (BorderStyle) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_BORDER_RIGHT_STYLE:
+ case CSS_PROPERTY_BORDER_RIGHT_STYLE:
attrs->borderStyle.right = (BorderStyle) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_BORDER_TOP_STYLE:
+ case CSS_PROPERTY_BORDER_TOP_STYLE:
attrs->borderStyle.top = (BorderStyle) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_BORDER_BOTTOM_WIDTH:
+ case CSS_PROPERTY_BORDER_BOTTOM_WIDTH:
computeValue (&attrs->borderWidth.bottom, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_BORDER_LEFT_WIDTH:
+ case CSS_PROPERTY_BORDER_LEFT_WIDTH:
computeValue (&attrs->borderWidth.left, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_BORDER_RIGHT_WIDTH:
+ case CSS_PROPERTY_BORDER_RIGHT_WIDTH:
computeValue (&attrs->borderWidth.right, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_BORDER_TOP_WIDTH:
+ case CSS_PROPERTY_BORDER_TOP_WIDTH:
computeValue (&attrs->borderWidth.top, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_BORDER_SPACING:
+ case CSS_PROPERTY_BORDER_SPACING:
computeValue (&attrs->hBorderSpacing, p->value.intVal, attrs->font);
computeValue (&attrs->vBorderSpacing, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_COLOR:
+ case CSS_PROPERTY_COLOR:
attrs->color = Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_CURSOR:
+ case CSS_PROPERTY_CURSOR:
attrs->cursor = (Cursor) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE:
+ case CSS_PROPERTY_LIST_STYLE_TYPE:
attrs->listStyleType = (ListStyleType) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_MARGIN_BOTTOM:
+ case CSS_PROPERTY_MARGIN_BOTTOM:
computeValue (&attrs->margin.bottom, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_MARGIN_LEFT:
+ case CSS_PROPERTY_MARGIN_LEFT:
computeValue (&attrs->margin.left, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_MARGIN_RIGHT:
+ case CSS_PROPERTY_MARGIN_RIGHT:
computeValue (&attrs->margin.right, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_MARGIN_TOP:
+ case CSS_PROPERTY_MARGIN_TOP:
computeValue (&attrs->margin.top, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_PADDING_TOP:
+ case CSS_PROPERTY_PADDING_TOP:
computeValue (&attrs->padding.top, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_PADDING_BOTTOM:
+ case CSS_PROPERTY_PADDING_BOTTOM:
computeValue (&attrs->padding.bottom, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_PADDING_LEFT:
+ case CSS_PROPERTY_PADDING_LEFT:
computeValue (&attrs->padding.left, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_PADDING_RIGHT:
+ case CSS_PROPERTY_PADDING_RIGHT:
computeValue (&attrs->padding.right, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_TEXT_ALIGN:
+ case CSS_PROPERTY_TEXT_ALIGN:
attrs->textAlign = (TextAlignType) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_TEXT_DECORATION:
+ case CSS_PROPERTY_TEXT_DECORATION:
attrs->textDecoration |= p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_VERTICAL_ALIGN:
+ case CSS_PROPERTY_VERTICAL_ALIGN:
attrs->valign = (VAlignType) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_WHITE_SPACE:
+ case CSS_PROPERTY_WHITE_SPACE:
attrs->whiteSpace = (WhiteSpace) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_WIDTH:
+ case CSS_PROPERTY_WIDTH:
computeLength (&attrs->width, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_HEIGHT:
+ case CSS_PROPERTY_HEIGHT:
computeLength (&attrs->height, p->value.intVal, attrs->font);
break;
- case CssProperty::PROPERTY_X_LINK:
+ case PROPERTY_X_LINK:
attrs->x_link = p->value.intVal;
break;
- case CssProperty::PROPERTY_X_IMG:
+ case PROPERTY_X_IMG:
attrs->x_img = p->value.intVal;
break;