summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRodrigo Arias Mallo <rodarima@gmail.com>2024-10-02 19:32:44 +0200
committerRodrigo Arias Mallo <rodarima@gmail.com>2024-10-05 09:47:01 +0200
commit08371f8d8532fd82cb59d9eae85cb2e5a835376f (patch)
tree1586944bfee51ee68cb47e64d630c46f25b44abe /src
parentac56aa678cfe1666b60821f342ccb7b3d3fa7a0d (diff)
Add support for more CSS units
Implements support for ch, rem, vw, vh, vmin and vmax units of CSS lengths. For now the units relative to the viewport are only computed once, and they won't change when the window is resized, but only when the page is reloaded. See: https://www.toomanyatoms.com/software/mobilized_dillo.html Authored-By: dogma
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