From 0c5718ff8b5e94c8dcc175a1126eec8f3b598161 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Thu, 18 Mar 2021 09:16:30 +0000 Subject: Selection: Remove client callback for unit conversion. Now clients provide a unit conversion context and libcss provides code to perform unit conversion. This reduces the amount of common code that clients have to write. --- Makefile | 1 + examples/example1.c | 79 +++----------- include/libcss/computed.h | 6 +- include/libcss/select.h | 5 +- include/libcss/unit.h | 156 ++++++++++++++++++++++++++++ src/select/computed.c | 34 +++--- src/select/computed.h | 6 +- src/select/select.c | 5 +- src/select/unit.c | 67 +++++++----- src/select/unit.h | 143 ++----------------------- test/data/select/tests1.dat | 246 ++++++++++++++++++++++---------------------- test/select.c | 85 +++------------ 12 files changed, 390 insertions(+), 443 deletions(-) create mode 100644 include/libcss/unit.h diff --git a/Makefile b/Makefile index 0835c8f..86d6641 100644 --- a/Makefile +++ b/Makefile @@ -65,5 +65,6 @@ INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libcss/properties.h INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libcss/select.h INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libcss/stylesheet.h INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libcss/types.h +INSTALL_ITEMS := $(INSTALL_ITEMS) $(I):include/libcss/unit.h INSTALL_ITEMS := $(INSTALL_ITEMS) /$(LIBDIR)/pkgconfig:lib$(COMPONENT).pc.in INSTALL_ITEMS := $(INSTALL_ITEMS) /$(LIBDIR):$(OUTPUT) diff --git a/examples/example1.c b/examples/example1.c index c36a94d..6135793 100644 --- a/examples/example1.c +++ b/examples/example1.c @@ -98,13 +98,22 @@ static css_error node_presentational_hint(void *pw, void *node, uint32_t *nhints, css_hint **hints); static css_error ua_default_for_property(void *pw, uint32_t property, css_hint *hint); -static css_error compute_font_size(void *pw, const css_hint *parent, - css_hint *size); static css_error set_libcss_node_data(void *pw, void *n, void *libcss_node_data); static css_error get_libcss_node_data(void *pw, void *n, void **libcss_node_data); +static css_unit_len_ctx uint_len_ctx = { + .viewport_width = 800 * (1 << CSS_RADIX_POINT), + .viewport_height = 600 * (1 << CSS_RADIX_POINT), + .font_size_default = 16 * (1 << CSS_RADIX_POINT), + .font_size_minimum = 6 * (1 << CSS_RADIX_POINT), + .device_dpi = 96 * (1 << CSS_RADIX_POINT), + .root_style = NULL, /* We don't have a root node yet. */ + .pw = NULL, /* We're not implementing measure callback */ + .measure = NULL, /* We're not implementing measure callback */ +}; + /* Table of function pointers for the LibCSS Select API. */ static css_select_handler select_handler = { CSS_SELECT_HANDLER_VERSION_1, @@ -143,9 +152,8 @@ static css_select_handler select_handler = { node_is_lang, node_presentational_hint, ua_default_for_property, - compute_font_size, set_libcss_node_data, - get_libcss_node_data + get_libcss_node_data, }; @@ -237,6 +245,7 @@ int main(int argc, char **argv) lwc_intern_string(element, strlen(element), &element_name); code = css_select_style(select_ctx, element_name, + &uint_len_ctx, &media, NULL, &select_handler, 0, &style); @@ -662,68 +671,6 @@ css_error ua_default_for_property(void *pw, uint32_t property, css_hint *hint) return CSS_OK; } -css_error compute_font_size(void *pw, const css_hint *parent, css_hint *size) -{ - static css_hint_length sizes[] = { - { FLTTOFIX(6.75), CSS_UNIT_PT }, - { FLTTOFIX(7.50), CSS_UNIT_PT }, - { FLTTOFIX(9.75), CSS_UNIT_PT }, - { FLTTOFIX(12.0), CSS_UNIT_PT }, - { FLTTOFIX(13.5), CSS_UNIT_PT }, - { FLTTOFIX(18.0), CSS_UNIT_PT }, - { FLTTOFIX(24.0), CSS_UNIT_PT } - }; - const css_hint_length *parent_size; - - UNUSED(pw); - - /* Grab parent size, defaulting to medium if none */ - if (parent == NULL) { - parent_size = &sizes[CSS_FONT_SIZE_MEDIUM - 1]; - } else { - assert(parent->status == CSS_FONT_SIZE_DIMENSION); - assert(parent->data.length.unit != CSS_UNIT_EM); - assert(parent->data.length.unit != CSS_UNIT_EX); - parent_size = &parent->data.length; - } - - assert(size->status != CSS_FONT_SIZE_INHERIT); - - if (size->status < CSS_FONT_SIZE_LARGER) { - /* Keyword -- simple */ - size->data.length = sizes[size->status - 1]; - } else if (size->status == CSS_FONT_SIZE_LARGER) { - /** \todo Step within table, if appropriate */ - size->data.length.value = - FMUL(parent_size->value, FLTTOFIX(1.2)); - size->data.length.unit = parent_size->unit; - } else if (size->status == CSS_FONT_SIZE_SMALLER) { - /** \todo Step within table, if appropriate */ - size->data.length.value = - FMUL(parent_size->value, FLTTOFIX(1.2)); - size->data.length.unit = parent_size->unit; - } else if (size->data.length.unit == CSS_UNIT_EM || - size->data.length.unit == CSS_UNIT_EX) { - size->data.length.value = - FMUL(size->data.length.value, parent_size->value); - - if (size->data.length.unit == CSS_UNIT_EX) { - size->data.length.value = FMUL(size->data.length.value, - FLTTOFIX(0.6)); - } - - size->data.length.unit = parent_size->unit; - } else if (size->data.length.unit == CSS_UNIT_PCT) { - size->data.length.value = FDIV(FMUL(size->data.length.value, - parent_size->value), FLTTOFIX(100)); - size->data.length.unit = parent_size->unit; - } - - size->status = CSS_FONT_SIZE_DIMENSION; - - return CSS_OK; -} - static css_error set_libcss_node_data(void *pw, void *n, void *libcss_node_data) { diff --git a/include/libcss/computed.h b/include/libcss/computed.h index f4b3e21..1587d78 100644 --- a/include/libcss/computed.h +++ b/include/libcss/computed.h @@ -19,6 +19,7 @@ extern "C" #include #include #include +#include struct css_hint; struct css_select_handler; @@ -81,10 +82,7 @@ css_error css_computed_style_destroy(css_computed_style *style); css_error css_computed_style_compose( const css_computed_style *restrict parent, const css_computed_style *restrict child, - css_error (*compute_font_size)(void *pw, - const struct css_hint *parent, - struct css_hint *size), - void *pw, + const css_unit_len_ctx *unit_len_ctx, css_computed_style **restrict result); /****************************************************************************** diff --git a/include/libcss/select.h b/include/libcss/select.h index ca57456..bfaf531 100644 --- a/include/libcss/select.h +++ b/include/libcss/select.h @@ -18,6 +18,7 @@ extern "C" #include #include #include +#include typedef enum css_pseudo_element { CSS_PSEUDO_ELEMENT_NONE = 0, @@ -123,9 +124,6 @@ typedef struct css_select_handler { css_error (*ua_default_for_property)(void *pw, uint32_t property, css_hint *hint); - css_error (*compute_font_size)(void *pw, const css_hint *parent, - css_hint *size); - /** * Set libcss_node_data on a DOM node. * @@ -221,6 +219,7 @@ css_error css_select_default_style(css_select_ctx *ctx, css_select_handler *handler, void *pw, css_computed_style **style); css_error css_select_style(css_select_ctx *ctx, void *node, + const css_unit_len_ctx *unit_len_ctx, const css_media *media, const css_stylesheet *inline_style, css_select_handler *handler, void *pw, css_select_results **result); diff --git a/include/libcss/unit.h b/include/libcss/unit.h new file mode 100644 index 0000000..a847077 --- /dev/null +++ b/include/libcss/unit.h @@ -0,0 +1,156 @@ +/* + * This file is part of LibCSS. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2008 John-Mark Bell + */ + +#ifndef libcss_unit_h_ +#define libcss_unit_h_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +/** + * Client callback for font measuring. + * + * \param[in] pw Client data. + * \param[in] style Style to measure font for, or NULL. + * \param[in] unit Either CSS_UNIT_EX, or CSS_UNIT_CH. + * \return length in CSS pixels. + */ +typedef css_fixed (*css_unit_len_measure)( + void *pw, + const css_computed_style *style, + const css_unit unit); + +/** + * LibCSS unit conversion context. + * + * The client callback is optional. It is used for measuring "ch" + * (glyph '0' advance) and "ex" (height of the letter 'x') units. + * If a NULL pointer is given, LibCSS will use a fixed scaling of + * the "em" unit. + */ +typedef struct css_unit_len_ctx { + /** + * Viewport width in CSS pixels. + * Used if unit is vh, vw, vi, vb, vmin, or vmax. + */ + css_fixed viewport_width; + /** + * Viewport height in CSS pixels. + * Used if unit is vh, vw, vi, vb, vmin, or vmax. + */ + css_fixed viewport_height; + /** + * Client default font size in CSS pixels. + */ + css_fixed font_size_default; + /** + * Client minimum font size in CSS pixels. May be zero. + */ + css_fixed font_size_minimum; + /** + * DPI of the device the style is selected for. + */ + css_fixed device_dpi; + /** + * Computed style for the document root element, needed for rem units. + * May be NULL, in which case font_size_default is used instead, as + * would be the case if rem unit is used on the root element. + */ + const css_computed_style *root_style; + /** + * Optional client private word for measure callback. + */ + void *pw; + /** + * Optional client callback for font measuring. + */ + const css_unit_len_measure measure; +} css_unit_len_ctx; + +/** + * Convert css pixels to physical pixels. + * + * \param[in] css_pixels Length in css pixels. + * \param[in] device_dpi Device dots per inch. + * \return Length in device pixels. + */ +static inline css_fixed css_unit_css2device_px( + const css_fixed css_pixels, + const css_fixed device_dpi) +{ + return FDIV(FMUL(css_pixels, device_dpi), F_96); +} + +/** + * Convert device pixels to css pixels. + * + * \param[in] device_pixels Length in physical pixels. + * \param[in] device_dpi Device dots per inch. + * \return Length in css pixels. + */ +static inline css_fixed css_unit_device2css_px( + const css_fixed device_pixels, + const css_fixed device_dpi) +{ + return FDIV(FMUL(device_pixels, F_96), device_dpi); +} + +/** + * Convert a length to points (pt). + * + * \param[in] style Style to perform conversion for or NULL. + * \param[in] ctx Length unit conversion context. + * \param[in] length Length to convert. + * \param[in] unit Current unit of length. + * \return A length in points. + */ +css_fixed css_unit_font_size_len2pt( + const css_computed_style *style, + const css_unit_len_ctx *ctx, + const css_fixed length, + const css_unit unit); + +/** + * Convert a length to CSS pixels. + * + * \param[in] style Style to perform conversion for or NULL. + * \param[in] ctx Length unit conversion context. + * \param[in] length Length to convert. + * \param[in] unit Current unit of length. + * \return A length in CSS pixels. + */ +css_fixed css_unit_len2css_px( + const css_computed_style *style, + const css_unit_len_ctx *ctx, + const css_fixed length, + const css_unit unit); + +/** + * Convert a length to device pixels. + * + * \param[in] style Style to perform conversion for or NULL. + * \param[in] ctx Length unit conversion context. + * \param[in] length Length to convert. + * \param[in] unit Current unit of length. + * \return A length in device pixels. + */ +css_fixed css_unit_len2device_px( + const css_computed_style *style, + const css_unit_len_ctx *ctx, + const css_fixed length, + const css_unit unit); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/select/computed.c b/src/select/computed.c index a1b345b..d075af9 100644 --- a/src/select/computed.c +++ b/src/select/computed.c @@ -12,6 +12,7 @@ #include "select/dispatch.h" #include "select/propget.h" #include "select/propset.h" +#include "select/unit.h" #include "utils/utils.h" static css_error compute_absolute_color(css_computed_style *style, @@ -247,9 +248,7 @@ css_error css__computed_style_initialise(css_computed_style *style, css_error css_computed_style_compose( const css_computed_style *restrict parent, const css_computed_style *restrict child, - css_error (*compute_font_size)(void *pw, - const css_hint *parent, css_hint *size), - void *pw, + const css_unit_len_ctx *unit_len_ctx, css_computed_style **restrict result) { css_computed_style *composed; @@ -275,8 +274,7 @@ css_error css_computed_style_compose( } /* Finally, compute absolute values for everything */ - error = css__compute_absolute_values(parent, composed, - compute_font_size, pw); + error = css__compute_absolute_values(parent, composed, unit_len_ctx); if (error != CSS_OK) { return error; } @@ -1087,31 +1085,36 @@ uint8_t css_computed_order(const css_computed_style *style, * * \param parent Parent style, or NULL for tree root * \param style Computed style to process - * \param compute_font_size Callback to calculate an absolute font-size - * \param pw Private word for callback + * \param unit_len_ctx Client length conversion context. * \return CSS_OK on success. */ css_error css__compute_absolute_values(const css_computed_style *parent, css_computed_style *style, - css_error (*compute_font_size)(void *pw, - const css_hint *parent, css_hint *size), - void *pw) + const css_unit_len_ctx *unit_len_ctx) { + css_hint_length *ref_length = NULL; css_hint psize, size, ex_size; css_error error; - /* Ensure font-size is absolute */ + /* Get reference font-size for relative sizes. */ if (parent != NULL) { psize.status = get_font_size(parent, &psize.data.length.value, &psize.data.length.unit); + if (psize.status != CSS_FONT_SIZE_DIMENSION) { + return CSS_BADPARM; + } + ref_length = &psize.data.length; } size.status = get_font_size(style, &size.data.length.value, &size.data.length.unit); - error = compute_font_size(pw, parent != NULL ? &psize : NULL, &size); + error = css_unit_compute_absolute_font_size(ref_length, + unit_len_ctx->root_style, + unit_len_ctx->font_size_default, + &size); if (error != CSS_OK) return error; @@ -1125,7 +1128,12 @@ css_error css__compute_absolute_values(const css_computed_style *parent, ex_size.status = CSS_FONT_SIZE_DIMENSION; ex_size.data.length.value = INTTOFIX(1); ex_size.data.length.unit = CSS_UNIT_EX; - error = compute_font_size(pw, &size, &ex_size); + + error = css_unit_compute_absolute_font_size( + &size.data.length, + unit_len_ctx->root_style, + unit_len_ctx->font_size_default, + &ex_size); if (error != CSS_OK) return error; diff --git a/src/select/computed.h b/src/select/computed.h index c926cec..8b33405 100644 --- a/src/select/computed.h +++ b/src/select/computed.h @@ -10,6 +10,8 @@ #include #include +#include + #include "autogenerated_computed.h" /** @@ -35,8 +37,6 @@ css_error css__computed_style_initialise(css_computed_style *style, css_error css__compute_absolute_values(const css_computed_style *parent, css_computed_style *style, - css_error (*compute_font_size)(void *pw, - const css_hint *parent, css_hint *size), - void *pw); + const css_unit_len_ctx *unit_len_ctx); #endif diff --git a/src/select/select.c b/src/select/select.c index f6efbfe..03a45fe 100644 --- a/src/select/select.c +++ b/src/select/select.c @@ -23,6 +23,7 @@ #include "select/propset.h" #include "select/font_face.h" #include "select/select.h" +#include "select/unit.h" #include "utils/parserutilserror.h" #include "utils/utils.h" @@ -1164,6 +1165,7 @@ failed: * * \param ctx Selection context to use * \param node Node to select style for + * \param unit_len_ctx Context for length unit conversions. * \param media Currently active media specification * \param inline_style Corresponding inline style for node, or NULL * \param handler Dispatch table of handler functions @@ -1181,6 +1183,7 @@ failed: * update the fully computed style for a node when layout changes. */ css_error css_select_style(css_select_ctx *ctx, void *node, + const css_unit_len_ctx *unit_len_ctx, const css_media *media, const css_stylesheet *inline_style, css_select_handler *handler, void *pw, css_select_results **result) @@ -1353,7 +1356,7 @@ css_error css_select_style(css_select_ctx *ctx, void *node, /* Only compute absolute values for the base element */ error = css__compute_absolute_values(NULL, state.results->styles[CSS_PSEUDO_ELEMENT_NONE], - handler->compute_font_size, pw); + unit_len_ctx); if (error != CSS_OK) goto cleanup; } diff --git a/src/select/unit.c b/src/select/unit.c index f9ecf83..a279ec7 100644 --- a/src/select/unit.c +++ b/src/select/unit.c @@ -115,14 +115,15 @@ static inline css_fixed css_unit__absolute_len2pt( } } -/* Exported function, documented in unit.h. */ +/* Exported function, documented in libcss/unit.h. */ css_fixed css_unit_font_size_len2pt( + const css_computed_style *style, const css_unit_len_ctx *ctx, const css_fixed length, const css_unit unit) { return css_unit__absolute_len2pt( - ctx->ref_style, + style, ctx->viewport_height, ctx->viewport_width, length, @@ -303,15 +304,16 @@ css_fixed css_unit_len2px_mq( return FMUL(length, TRUNCATEFIX(px_per_unit)); } -/* Exported function, documented in unit.h. */ +/* Exported function, documented in libcss/unit.h. */ css_fixed css_unit_len2css_px( + const css_computed_style *style, const css_unit_len_ctx *ctx, const css_fixed length, const css_unit unit) { css_fixed px_per_unit = css_unit__px_per_unit( ctx->measure, - ctx->ref_style, + style, ctx->root_style, ctx->font_size_default, ctx->font_size_minimum, @@ -328,15 +330,16 @@ css_fixed css_unit_len2css_px( return FMUL(length, TRUNCATEFIX(px_per_unit)); } -/* Exported function, documented in unit.h. */ +/* Exported function, documented in libcss/unit.h. */ css_fixed css_unit_len2device_px( + const css_computed_style *style, const css_unit_len_ctx *ctx, const css_fixed length, const css_unit unit) { css_fixed px_per_unit = css_unit__px_per_unit( ctx->measure, - ctx->ref_style, + style, ctx->root_style, ctx->font_size_default, ctx->font_size_minimum, @@ -361,18 +364,18 @@ css_fixed css_unit_len2device_px( * The computed style will have font-size with an absolute unit. * If no computed style is given, the client default font-size will be returned. * - * \param[in] ctx Length unit conversion context. - * \param[in] style The style to get the font-size for, or NULL. + * \param[in] style Reference style. (Element or parent, or NULL). + * \param[in] font_size_default Client default font size in CSS pixels. * \return The font size in absolute units. */ static inline css_hint_length css_unit__get_font_size( - const css_unit_len_ctx *ctx, - const css_computed_style *style) + const css_computed_style *style, + css_fixed font_size_default) { css_hint_length size; if (style == NULL) { - size.value = ctx->font_size_default; + size.value = font_size_default; size.unit = CSS_UNIT_PX; } else { enum css_font_size_e status = get_font_size( @@ -391,10 +394,24 @@ static inline css_hint_length css_unit__get_font_size( /* Exported function, documented in unit.h. */ css_error css_unit_compute_absolute_font_size( - const css_unit_len_ctx *ctx, + const css_hint_length *ref_length, + const css_computed_style *root_style, + css_fixed font_size_default, css_hint *size) { - css_hint_length ref_len; + css_hint_length ref_len = { + .value = font_size_default, + .unit = CSS_UNIT_PX, + }; + + if (ref_length != NULL) { + /* Must be absolute. */ + assert(ref_length->unit != CSS_UNIT_EM); + assert(ref_length->unit != CSS_UNIT_EX); + assert(ref_length->unit != CSS_UNIT_PCT); + + ref_len = *ref_length; + } assert(size->status != CSS_FONT_SIZE_INHERIT); @@ -420,20 +437,18 @@ css_error css_unit_compute_absolute_font_size( assert(CSS_FONT_SIZE_XX_SMALL == 1); size->data.length.value = FMUL(factors[size->status - 1], - ctx->font_size_default); + font_size_default); size->data.length.unit = CSS_UNIT_PX; size->status = CSS_FONT_SIZE_DIMENSION; break; } case CSS_FONT_SIZE_LARGER: - ref_len = css_unit__get_font_size(ctx, ctx->ref_style); size->data.length.value = FMUL(ref_len.value, FLTTOFIX(1.2)); size->data.length.unit = ref_len.unit; size->status = CSS_FONT_SIZE_DIMENSION; break; case CSS_FONT_SIZE_SMALLER: - ref_len = css_unit__get_font_size(ctx, ctx->ref_style); size->data.length.value = FDIV(ref_len.value, FLTTOFIX(1.2)); size->data.length.unit = ref_len.unit; size->status = CSS_FONT_SIZE_DIMENSION; @@ -443,9 +458,8 @@ css_error css_unit_compute_absolute_font_size( /* Convert any relative units to absolute. */ switch (size->data.length.unit) { case CSS_UNIT_PCT: - ref_len = css_unit__get_font_size(ctx, ctx->ref_style); - size->data.length.value = FDIV( - FMUL(size->data.length.value, + size->data.length.value = FDIV(FMUL( + size->data.length.value, ref_len.value), INTTOFIX(100)); size->data.length.unit = ref_len.unit; break; @@ -454,11 +468,8 @@ css_error css_unit_compute_absolute_font_size( case CSS_UNIT_EX: /* Fall-through */ case CSS_UNIT_CH: /* Parent relative units. */ - ref_len = css_unit__get_font_size(ctx, ctx->ref_style); - - size->data.length.unit = ref_len.unit; - size->data.length.value = FMUL(size->data.length.value, - ref_len.value); + size->data.length.value = FMUL( + size->data.length.value, ref_len.value); switch (size->data.length.unit) { case CSS_UNIT_EX: @@ -476,15 +487,17 @@ css_error css_unit_compute_absolute_font_size( default: break; } + size->data.length.unit = ref_len.unit; break; case CSS_UNIT_REM: /* Root element relative units. */ - ref_len = css_unit__get_font_size(ctx, ctx->root_style); + ref_len = css_unit__get_font_size(root_style, + font_size_default); size->data.length.unit = ref_len.unit; - size->data.length.value = FMUL(size->data.length.value, - ref_len.value); + size->data.length.value = FMUL( + size->data.length.value, ref_len.value); break; default: diff --git a/src/select/unit.h b/src/select/unit.h index 738c181..e4d21da 100644 --- a/src/select/unit.h +++ b/src/select/unit.h @@ -9,138 +9,7 @@ #ifndef css_select_unit_h_ #define css_select_unit_h_ -/** - * Client callback for font measuring. - * - * \param[in] pw Client data. - * \param[in] style Style to measure font for, or NULL. - * \param[in] unit Either CSS_UNIT_EX, or CSS_UNIT_CH. - * \return length in CSS pixels. - */ -typedef css_fixed (*css_unit_len_measure)( - void *pw, - const css_computed_style *style, - const css_unit unit); - -/** - * LibCSS unit conversion context. - * - * The client callback is optional. It is used for measuring "ch" - * (glyph '0' advance) and "ex" (height of the letter 'x') units. - * If a NULL pointer is given, LibCSS will use a fixed scaling of - * the "em" unit. - */ -typedef struct css_unit_len_ctx { - /** - * Viewport width in CSS pixels. - * Used if unit is vh, vw, vi, vb, vmin, or vmax. - */ - css_fixed viewport_width; - /** - * Viewport height in CSS pixels. - * Used if unit is vh, vw, vi, vb, vmin, or vmax. - */ - css_fixed viewport_height; - /** - * Client default font size in CSS pixels. - */ - css_fixed font_size_default; - /** - * Client minimum font size in CSS pixels. May be zero. - */ - css_fixed font_size_minimum; - /** - * DPI of the device the style is selected for. - */ - css_fixed device_dpi; - /** - * Reference style. Most of the time, this is the element's style. - * When converting a length for a typographical property, such as - * font-size, then this should be the parent node. If the node has - * no parent then this may be NULL. - */ - const css_computed_style *ref_style; - /** - * Computed style for the document root element. - * May be NULL if unit is not rem. - */ - const css_computed_style *root_style; - /** - * Client private word for measure callback. - */ - void *pw; - /** - * Client callback for font measuring. - */ - const css_unit_len_measure measure; -} css_unit_len_ctx; - -/** - * Convert css pixels to physical pixels. - * - * \param[in] css_pixels Length in css pixels. - * \param[in] device_dpi Device dots per inch. - * \return Length in device pixels. - */ -static inline css_fixed css_unit_css2device_px( - const css_fixed css_pixels, - const css_fixed device_dpi) -{ - return FDIV(FMUL(css_pixels, device_dpi), F_96); -} - -/** - * Convert device pixels to css pixels. - * - * \param[in] device_pixels Length in physical pixels. - * \param[in] device_dpi Device dots per inch. - * \return Length in css pixels. - */ -static inline css_fixed css_unit_device2css_px( - const css_fixed device_pixels, - const css_fixed device_dpi) -{ - return FDIV(FMUL(device_pixels, F_96), device_dpi); -} - -/** - * Convert a length to points (pt). - * - * \param[in] ctx Length unit conversion context. - * \param[in] length Length to convert. - * \param[in] unit Current unit of length. - * \return A length in points. - */ -css_fixed css_unit_font_size_len2pt( - const css_unit_len_ctx *ctx, - const css_fixed length, - const css_unit unit); - -/** - * Convert a length to CSS pixels. - * - * \param[in] ctx Length unit conversion context. - * \param[in] length Length to convert. - * \param[in] unit Current unit of length. - * \return A length in CSS pixels. - */ -css_fixed css_unit_len2css_px( - const css_unit_len_ctx *ctx, - const css_fixed length, - const css_unit unit); - -/** - * Convert a length to device pixels. - * - * \param[in] ctx Length unit conversion context. - * \param[in] length Length to convert. - * \param[in] unit Current unit of length. - * \return A length in device pixels. - */ -css_fixed css_unit_len2device_px( - const css_unit_len_ctx *ctx, - const css_fixed length, - const css_unit unit); +#include /** * Convert a length to CSS pixels for a media query context. @@ -158,12 +27,16 @@ css_fixed css_unit_len2px_mq( /** * Convert relative font size units to absolute units. * - * \param[in] ctx Length unit conversion context. - * \param[in,out] size The length to convert. + * \param[in] ref_length Reference font-size length or NULL. + * \param[in] root_style Root element style or NULL. + * \param[in] font_size_default Client default font size in CSS pixels. + * \param[in,out] size The length to convert. * \return CSS_OK on success, or appropriate error otherwise. */ css_error css_unit_compute_absolute_font_size( - const css_unit_len_ctx *ctx, + const css_hint_length *ref_length, + const css_computed_style *root_style, + css_fixed font_size_default, css_hint *size); #endif diff --git a/test/data/select/tests1.dat b/test/data/select/tests1.dat index ccce94d..919ca88 100644 --- a/test/data/select/tests1.dat +++ b/test/data/select/tests1.dat @@ -59,7 +59,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -173,7 +173,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -291,7 +291,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -410,7 +410,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -529,7 +529,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -648,7 +648,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -757,7 +757,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -867,7 +867,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -977,7 +977,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -1086,7 +1086,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -1200,7 +1200,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -1314,7 +1314,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -1429,7 +1429,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -1547,7 +1547,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -1664,7 +1664,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -1787,7 +1787,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -1910,7 +1910,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -2033,7 +2033,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -2160,7 +2160,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -2286,7 +2286,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -2410,7 +2410,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -2533,7 +2533,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -2656,7 +2656,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -2779,7 +2779,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -2902,7 +2902,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -3025,7 +3025,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -3148,7 +3148,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -3271,7 +3271,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -3394,7 +3394,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -3517,7 +3517,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -3640,7 +3640,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 10.600pt +font-size: 13.342px font-style: normal font-variant: normal font-weight: normal @@ -3763,7 +3763,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 14.391pt +font-size: 19.187px font-style: normal font-variant: normal font-weight: normal @@ -3886,7 +3886,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 24pt +font-size: 32px font-style: normal font-variant: normal font-weight: normal @@ -4009,7 +4009,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 18pt +font-size: 24px font-style: normal font-variant: normal font-weight: normal @@ -4132,7 +4132,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 13.500pt +font-size: 18px font-style: normal font-variant: normal font-weight: normal @@ -4255,7 +4255,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -4378,7 +4378,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 9.750pt +font-size: 13px font-style: normal font-variant: normal font-weight: normal @@ -4501,7 +4501,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 7.500pt +font-size: 10px font-style: normal font-variant: normal font-weight: normal @@ -4624,7 +4624,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 6.750pt +font-size: 9px font-style: normal font-variant: normal font-weight: normal @@ -4870,7 +4870,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -4986,7 +4986,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -5102,7 +5102,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -5218,7 +5218,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -5331,7 +5331,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -5445,7 +5445,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -5559,7 +5559,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -5673,7 +5673,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -5783,7 +5783,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -5894,7 +5894,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6004,7 +6004,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6114,7 +6114,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6224,7 +6224,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6334,7 +6334,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6444,7 +6444,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6556,7 +6556,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6666,7 +6666,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6776,7 +6776,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6887,7 +6887,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -6997,7 +6997,7 @@ flex-shrink: 3.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -7107,7 +7107,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -7217,7 +7217,7 @@ flex-shrink: 0.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -7327,7 +7327,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -7437,7 +7437,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -7547,7 +7547,7 @@ flex-shrink: 0.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -7657,7 +7657,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -7766,7 +7766,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -7875,7 +7875,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -7984,7 +7984,7 @@ flex-shrink: 30.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -8095,7 +8095,7 @@ flex-shrink: 3.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -8206,7 +8206,7 @@ flex-shrink: 3.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -8315,7 +8315,7 @@ flex-shrink: 0.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -8426,7 +8426,7 @@ flex-shrink: 0.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -8537,7 +8537,7 @@ flex-shrink: 3.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -8648,7 +8648,7 @@ flex-shrink: 3.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -8757,7 +8757,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -8866,7 +8866,7 @@ flex-shrink: 1.000 flex-wrap: wrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -8975,7 +8975,7 @@ flex-shrink: 1.000 flex-wrap: wrap-reverse float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -9084,7 +9084,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -9193,7 +9193,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -9302,7 +9302,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -9411,7 +9411,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -9520,7 +9520,7 @@ flex-shrink: 1.000 flex-wrap: wrap-reverse float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -9631,7 +9631,7 @@ flex-shrink: 1.000 flex-wrap: wrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -9742,7 +9742,7 @@ flex-shrink: 1.000 flex-wrap: wrap-reverse float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -9851,7 +9851,7 @@ flex-shrink: 0.899 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -9960,7 +9960,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -10069,7 +10069,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -10178,7 +10178,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -10287,7 +10287,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -10396,7 +10396,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -10505,7 +10505,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -10616,7 +10616,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -10727,7 +10727,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -10836,7 +10836,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -10945,7 +10945,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -11054,7 +11054,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -11165,7 +11165,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -11274,7 +11274,7 @@ flex-shrink: 3.780 flex-wrap: wrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -11385,7 +11385,7 @@ flex-shrink: 3.780 flex-wrap: wrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -11494,7 +11494,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -11603,7 +11603,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -11712,7 +11712,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -11821,7 +11821,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -11930,7 +11930,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -12039,7 +12039,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -12148,7 +12148,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -12257,7 +12257,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -12366,7 +12366,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -12475,7 +12475,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -12584,7 +12584,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -12693,7 +12693,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -12802,7 +12802,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -12911,7 +12911,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -13020,7 +13020,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -13129,7 +13129,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -13238,7 +13238,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -13347,7 +13347,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -13456,7 +13456,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -13565,7 +13565,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -13674,7 +13674,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -13783,7 +13783,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -13892,7 +13892,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal @@ -14020,7 +14020,7 @@ flex-shrink: 1.000 flex-wrap: nowrap float: none font-family: sans-serif -font-size: 12pt +font-size: 16px font-style: normal font-variant: normal font-weight: normal diff --git a/test/select.c b/test/select.c index 664994e..8226a8b 100644 --- a/test/select.c +++ b/test/select.c @@ -159,13 +159,15 @@ static css_error node_presentational_hint(void *pw, void *node, uint32_t *nhints, css_hint **hints); static css_error ua_default_for_property(void *pw, uint32_t property, css_hint *hints); -static css_error compute_font_size(void *pw, const css_hint *parent, - css_hint *size); static css_error set_libcss_node_data(void *pw, void *n, void *libcss_node_data); static css_error get_libcss_node_data(void *pw, void *n, void **libcss_node_data); +static css_unit_len_ctx unit_len_ctx = { + .font_size_default = 16 * (1 << CSS_RADIX_POINT), +}; + static css_select_handler select_handler = { CSS_SELECT_HANDLER_VERSION_1, @@ -203,9 +205,9 @@ static css_select_handler select_handler = { node_is_lang, node_presentational_hint, ua_default_for_property, - compute_font_size, + set_libcss_node_data, - get_libcss_node_data + get_libcss_node_data, }; static css_error resolve_url(void *pw, @@ -765,7 +767,12 @@ static void run_test_select_tree(css_select_ctx *select, css_select_results *sr; struct node *n = NULL; - assert(css_select_style(select, node, &ctx->media, NULL, + if (node->parent == NULL) { + unit_len_ctx.root_style = NULL; + } + + + assert(css_select_style(select, node, &unit_len_ctx, &ctx->media, NULL, &select_handler, ctx, &sr) == CSS_OK); if (node->parent != NULL) { @@ -773,7 +780,7 @@ static void run_test_select_tree(css_select_ctx *select, assert(css_computed_style_compose( node->parent->sr->styles[ctx->pseudo_element], sr->styles[ctx->pseudo_element], - compute_font_size, NULL, + &unit_len_ctx, &composed) == CSS_OK); css_computed_style_destroy(sr->styles[ctx->pseudo_element]); sr->styles[ctx->pseudo_element] = composed; @@ -786,6 +793,10 @@ static void run_test_select_tree(css_select_ctx *select, buf, buflen); } + if (node->parent == NULL) { + unit_len_ctx.root_style = node->sr->styles[ctx->pseudo_element]; + } + for (n = node->children; n != NULL; n = n->next) { run_test_select_tree(select, n, ctx, buf, buflen); } @@ -1606,68 +1617,6 @@ css_error ua_default_for_property(void *pw, uint32_t property, css_hint *hint) return CSS_OK; } -css_error compute_font_size(void *pw, const css_hint *parent, css_hint *size) -{ - static css_hint_length sizes[] = { - { FLTTOFIX(6.75), CSS_UNIT_PT }, - { FLTTOFIX(7.50), CSS_UNIT_PT }, - { FLTTOFIX(9.75), CSS_UNIT_PT }, - { FLTTOFIX(12.0), CSS_UNIT_PT }, - { FLTTOFIX(13.5), CSS_UNIT_PT }, - { FLTTOFIX(18.0), CSS_UNIT_PT }, - { FLTTOFIX(24.0), CSS_UNIT_PT } - }; - const css_hint_length *parent_size; - - UNUSED(pw); - - /* Grab parent size, defaulting to medium if none */ - if (parent == NULL) { - parent_size = &sizes[CSS_FONT_SIZE_MEDIUM - 1]; - } else { - assert(parent->status == CSS_FONT_SIZE_DIMENSION); - assert(parent->data.length.unit != CSS_UNIT_EM); - assert(parent->data.length.unit != CSS_UNIT_EX); - parent_size = &parent->data.length; - } - - assert(size->status != CSS_FONT_SIZE_INHERIT); - - if (size->status < CSS_FONT_SIZE_LARGER) { - /* Keyword -- simple */ - size->data.length = sizes[size->status - 1]; - } else if (size->status == CSS_FONT_SIZE_LARGER) { - /** \todo Step within table, if appropriate */ - size->data.length.value = - FMUL(parent_size->value, FLTTOFIX(1.2)); - size->data.length.unit = parent_size->unit; - } else if (size->status == CSS_FONT_SIZE_SMALLER) { - /** \todo Step within table, if appropriate */ - size->data.length.value = - FDIV(parent_size->value, FLTTOFIX(1.2)); - size->data.length.unit = parent_size->unit; - } else if (size->data.length.unit == CSS_UNIT_EM || - size->data.length.unit == CSS_UNIT_EX) { - size->data.length.value = - FMUL(size->data.length.value, parent_size->value); - - if (size->data.length.unit == CSS_UNIT_EX) { - size->data.length.value = FMUL(size->data.length.value, - FLTTOFIX(0.6)); - } - - size->data.length.unit = parent_size->unit; - } else if (size->data.length.unit == CSS_UNIT_PCT) { - size->data.length.value = FDIV(FMUL(size->data.length.value, - parent_size->value), FLTTOFIX(100)); - size->data.length.unit = parent_size->unit; - } - - size->status = CSS_FONT_SIZE_DIMENSION; - - return CSS_OK; -} - static css_error set_libcss_node_data(void *pw, void *n, void *libcss_node_data) { -- cgit v1.2.3