aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/css.hh18
-rw-r--r--src/cssparser.cc18
-rw-r--r--src/styleengine.cc26
3 files changed, 62 insertions, 0 deletions
diff --git a/src/css.hh b/src/css.hh
index 1f670c35..e77d91e7 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -78,6 +78,12 @@ typedef enum {
millimeters. */
CSS_LENGTH_TYPE_EM,
CSS_LENGTH_TYPE_EX,
+ CSS_LENGTH_TYPE_CH,
+ CSS_LENGTH_TYPE_REM,
+ CSS_LENGTH_TYPE_VW,
+ CSS_LENGTH_TYPE_VH,
+ CSS_LENGTH_TYPE_VMIN,
+ CSS_LENGTH_TYPE_VMAX,
CSS_LENGTH_TYPE_PERCENTAGE,
CSS_LENGTH_TYPE_RELATIVE, /**< This does not exist in CSS but
is used in HTML */
@@ -104,6 +110,12 @@ inline CssLength CSS_CREATE_LENGTH (float v, CssLengthType t) {
case CSS_LENGTH_TYPE_MM:
case CSS_LENGTH_TYPE_EM:
case CSS_LENGTH_TYPE_EX:
+ case CSS_LENGTH_TYPE_CH:
+ case CSS_LENGTH_TYPE_REM:
+ case CSS_LENGTH_TYPE_VW:
+ case CSS_LENGTH_TYPE_VH:
+ case CSS_LENGTH_TYPE_VMIN:
+ case CSS_LENGTH_TYPE_VMAX:
case CSS_LENGTH_TYPE_PERCENTAGE:
case CSS_LENGTH_TYPE_RELATIVE:
l.f = v;
@@ -131,6 +143,12 @@ inline float CSS_LENGTH_VALUE (CssLength l) {
case CSS_LENGTH_TYPE_MM:
case CSS_LENGTH_TYPE_EM:
case CSS_LENGTH_TYPE_EX:
+ case CSS_LENGTH_TYPE_CH:
+ case CSS_LENGTH_TYPE_REM:
+ case CSS_LENGTH_TYPE_VW:
+ case CSS_LENGTH_TYPE_VH:
+ case CSS_LENGTH_TYPE_VMIN:
+ case CSS_LENGTH_TYPE_VMAX:
case CSS_LENGTH_TYPE_PERCENTAGE:
case CSS_LENGTH_TYPE_RELATIVE:
return l.f;
diff --git a/src/cssparser.cc b/src/cssparser.cc
index 0fb240f2..83bc3f10 100644
--- a/src/cssparser.cc
+++ b/src/cssparser.cc
@@ -968,6 +968,24 @@ bool CssParser::parseValue(CssPropertyName prop,
} else if (dStrAsciiCasecmp(tval, "ex") == 0) {
lentype = CSS_LENGTH_TYPE_EX;
nextToken();
+ } else if (dStrAsciiCasecmp(tval, "ch") == 0) {
+ lentype = CSS_LENGTH_TYPE_CH;
+ nextToken();
+ } else if (dStrAsciiCasecmp(tval, "rem") == 0) {
+ lentype = CSS_LENGTH_TYPE_REM;
+ nextToken();
+ } else if (dStrAsciiCasecmp(tval, "vw") == 0) {
+ lentype = CSS_LENGTH_TYPE_VW;
+ nextToken();
+ } else if (dStrAsciiCasecmp(tval, "vh") == 0) {
+ lentype = CSS_LENGTH_TYPE_VH;
+ nextToken();
+ } else if (dStrAsciiCasecmp(tval, "vmin") == 0) {
+ lentype = CSS_LENGTH_TYPE_VMIN;
+ nextToken();
+ } else if (dStrAsciiCasecmp(tval, "vmax") == 0) {
+ lentype = CSS_LENGTH_TYPE_VMAX;
+ nextToken();
} else {
ret = false;
}
diff --git a/src/styleengine.cc b/src/styleengine.cc
index ea818f85..14411da8 100644
--- a/src/styleengine.cc
+++ b/src/styleengine.cc
@@ -804,6 +804,32 @@ bool StyleEngine::computeValue (int *dest, CssLength value, Font *font) {
/* Doesn't need zoom as it is already applied to font->xHeight */
*dest = roundInt (CSS_LENGTH_VALUE(value) * font->xHeight);
return true;
+ case CSS_LENGTH_TYPE_CH:
+ *dest = roundInt (CSS_LENGTH_VALUE(value) * font->zeroWidth);
+ return true;
+ case CSS_LENGTH_TYPE_REM:
+ if (stack->size() < 2) {
+ *dest = 0;
+ } else {
+ dw::core::style::Style *root_style = stack->getRef (1)->style;
+ if (root_style)
+ *dest = roundInt (CSS_LENGTH_VALUE(value) * root_style->font->size);
+ else
+ *dest = 0;
+ }
+ return true;
+ case CSS_LENGTH_TYPE_VW:
+ *dest = roundInt (CSS_LENGTH_VALUE(value) * layout->getWidthViewport() / 100);
+ return true;
+ case CSS_LENGTH_TYPE_VH:
+ *dest = roundInt (CSS_LENGTH_VALUE(value) * layout->getHeightViewport() / 100);
+ return true;
+ case CSS_LENGTH_TYPE_VMIN:
+ *dest = roundInt (CSS_LENGTH_VALUE(value) * MIN(layout->getWidthViewport(), layout->getHeightViewport()) / 100);
+ return true;
+ case CSS_LENGTH_TYPE_VMAX:
+ *dest = roundInt (CSS_LENGTH_VALUE(value) * MAX(layout->getWidthViewport(), layout->getHeightViewport()) / 100);
+ return true;
case CSS_LENGTH_TYPE_NONE:
// length values other than 0 without unit are only allowed
// in special cases (line-height) and have to be handled