diff options
Diffstat (limited to 'content/handlers/css')
-rw-r--r-- | content/handlers/css/css.c | 32 | ||||
-rw-r--r-- | content/handlers/css/dump.c | 46 | ||||
-rw-r--r-- | content/handlers/css/hints.c | 4 | ||||
-rw-r--r-- | content/handlers/css/select.c | 69 | ||||
-rw-r--r-- | content/handlers/css/select.h | 1 | ||||
-rw-r--r-- | content/handlers/css/utils.c | 144 | ||||
-rw-r--r-- | content/handlers/css/utils.h | 115 |
7 files changed, 362 insertions, 49 deletions
diff --git a/content/handlers/css/css.c b/content/handlers/css/css.c index 997eb5115..93efd6a1b 100644 --- a/content/handlers/css/css.c +++ b/content/handlers/css/css.c @@ -136,7 +136,6 @@ nscss_create(const content_handler *handler, const char *charset = NULL; const char *xnsbase = NULL; lwc_string *charset_value = NULL; - union content_msg_data msg_data; nserror error; result = calloc(1, sizeof(nscss_content)); @@ -171,8 +170,7 @@ nscss_create(const content_handler *handler, xnsbase, charset, result->base.quirks, nscss_content_done, result); if (error != NSERROR_OK) { - msg_data.error = messages_get("NoMemory"); - content_broadcast(&result->base, CONTENT_MSG_ERROR, msg_data); + content_broadcast_errorcode(&result->base, NSERROR_NOMEM); if (charset_value != NULL) lwc_string_unref(charset_value); free(result); @@ -250,13 +248,11 @@ static nserror nscss_create_css_data(struct content_css_data *c, bool nscss_process_data(struct content *c, const char *data, unsigned int size) { nscss_content *css = (nscss_content *) c; - union content_msg_data msg_data; css_error error; error = nscss_process_css_data(&css->data, data, size); if (error != CSS_OK && error != CSS_NEEDDATA) { - msg_data.error = "?"; - content_broadcast(c, CONTENT_MSG_ERROR, msg_data); + content_broadcast_errorcode(c, NSERROR_CSS); } return (error == CSS_OK || error == CSS_NEEDDATA); @@ -286,13 +282,11 @@ static css_error nscss_process_css_data(struct content_css_data *c, bool nscss_convert(struct content *c) { nscss_content *css = (nscss_content *) c; - union content_msg_data msg_data; css_error error; error = nscss_convert_css_data(&css->data); if (error != CSS_OK) { - msg_data.error = "?"; - content_broadcast(c, CONTENT_MSG_ERROR, msg_data); + content_broadcast_errorcode(c, NSERROR_CSS); return false; } @@ -327,9 +321,11 @@ static css_error nscss_convert_css_data(struct content_css_data *c) const char *url; if (css_stylesheet_get_url(c->sheet, &url) == CSS_OK) { - LOG("Failed converting %p %s (%d)", c, url, error); + NSLOG(netsurf, INFO, "Failed converting %p %s (%d)", + c, url, error); } else { - LOG("Failed converting %p (%d)", c, error); + NSLOG(netsurf, INFO, "Failed converting %p (%d)", c, + error); } } @@ -475,7 +471,6 @@ content_type nscss_content_type(void) */ void nscss_content_done(struct content_css_data *css, void *pw) { - union content_msg_data msg_data; struct content *c = pw; uint32_t i; size_t size; @@ -484,8 +479,7 @@ void nscss_content_done(struct content_css_data *css, void *pw) /* Retrieve the size of this sheet */ error = css_stylesheet_size(css->sheet, &size); if (error != CSS_OK) { - msg_data.error = "?"; - content_broadcast(c, CONTENT_MSG_ERROR, msg_data); + content_broadcast_errorcode(c, NSERROR_CSS); content_set_error(c); return; } @@ -606,7 +600,9 @@ css_error nscss_handle_import(void *pw, css_stylesheet *parent, nsurl_unref(ns_ref); #ifdef NSCSS_IMPORT_TRACE - LOG("Import %d '%s' -> (handle: %p ctx: %p)", c->import_count, lwc_string_data(url), c->imports[c->import_count].c, ctx); + NSLOG(netsurf, INFO, "Import %d '%s' -> (handle: %p ctx: %p)", + c->import_count, lwc_string_data(url), + c->imports[c->import_count].c, ctx); #endif c->import_count++; @@ -629,7 +625,7 @@ nserror nscss_import(hlcache_handle *handle, css_error error = CSS_OK; #ifdef NSCSS_IMPORT_TRACE - LOG("Event %d for %p (%p)", event->type, handle, ctx); + NSLOG(netsurf, INFO, "Event %d for %p (%p)", event->type, handle, ctx); #endif assert(ctx->css->imports[ctx->index].c == handle); @@ -639,6 +635,7 @@ nserror nscss_import(hlcache_handle *handle, error = nscss_import_complete(ctx); break; + case CONTENT_MSG_ERRORCODE: case CONTENT_MSG_ERROR: hlcache_handle_release(handle); ctx->css->imports[ctx->index].c = NULL; @@ -670,7 +667,8 @@ css_error nscss_import_complete(nscss_import_ctx *ctx) error = nscss_register_imports(ctx->css); #ifdef NSCSS_IMPORT_TRACE - LOG("Destroying import context %p for %d", ctx, ctx->index); + NSLOG(netsurf, INFO, "Destroying import context %p for %d", ctx, + ctx->index); #endif /* No longer need import context */ diff --git a/content/handlers/css/dump.c b/content/handlers/css/dump.c index 1ad188cb8..b12e1d9e8 100644 --- a/content/handlers/css/dump.c +++ b/content/handlers/css/dump.c @@ -20,6 +20,7 @@ #include <libcss/libcss.h> #include "css/dump.h" +#include "css/utils.h" /** * Dump a fixed point value to the stream in a textual form. @@ -112,6 +113,45 @@ static void dump_css_unit(FILE *stream, css_fixed val, css_unit unit) case CSS_UNIT_KHZ: fprintf(stream, "kHz"); break; + case CSS_UNIT_CAP: + fprintf(stream, "cap"); + break; + case CSS_UNIT_CH: + fprintf(stream, "ch"); + break; + case CSS_UNIT_IC: + fprintf(stream, "ic"); + break; + case CSS_UNIT_REM: + fprintf(stream, "rem"); + break; + case CSS_UNIT_LH: + fprintf(stream, "lh"); + break; + case CSS_UNIT_RLH: + fprintf(stream, "rlh"); + break; + case CSS_UNIT_VH: + fprintf(stream, "vh"); + break; + case CSS_UNIT_VW: + fprintf(stream, "vw"); + break; + case CSS_UNIT_VI: + fprintf(stream, "vi"); + break; + case CSS_UNIT_VB: + fprintf(stream, "vb"); + break; + case CSS_UNIT_VMIN: + fprintf(stream, "vmin"); + break; + case CSS_UNIT_VMAX: + fprintf(stream, "vmax"); + break; + case CSS_UNIT_Q: + fprintf(stream, "q"); + break; } } @@ -783,7 +823,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style) } /* display */ - val = css_computed_display_static(style); + val = ns_computed_display_static(style); switch (val) { case CSS_DISPLAY_INLINE: fprintf(stream, "display: inline "); @@ -1268,7 +1308,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style) } /* min-height */ - val = css_computed_min_height(style, &len1, &unit1); + val = ns_computed_min_height(style, &len1, &unit1); switch (val) { case CSS_MIN_HEIGHT_SET: fprintf(stream, "min-height: "); @@ -1282,7 +1322,7 @@ void nscss_dump_computed_style(FILE *stream, const css_computed_style *style) } /* min-width */ - val = css_computed_min_width(style, &len1, &unit1); + val = ns_computed_min_width(style, &len1, &unit1); switch (val) { case CSS_MIN_WIDTH_SET: fprintf(stream, "min-width: "); diff --git a/content/handlers/css/hints.c b/content/handlers/css/hints.c index 9dfcf402b..3a15f8e08 100644 --- a/content/handlers/css/hints.c +++ b/content/handlers/css/hints.c @@ -748,6 +748,8 @@ static void css_hint_vertical_align_table_cells( corestring_dom_valign, &attr); if (err == DOM_NO_ERR && attr != NULL) { + hint->data.length.value = 0; + hint->data.length.unit = CSS_UNIT_PX; if (dom_string_caseless_lwc_isequal(attr, corestring_lwc_top)) { hint->prop = CSS_PROP_VERTICAL_ALIGN; @@ -1615,7 +1617,7 @@ css_error node_presentational_hint(void *pw, void *node, } #ifdef LOG_STATS - LOG("Properties with hints: %i", hint_ctx.len); + NSLOG(netsurf, INFO, "Properties with hints: %i", hint_ctx.len); #endif css_hint_get_hints(hints, nhints); diff --git a/content/handlers/css/select.c b/content/handlers/css/select.c index daa3b4087..ee79eb394 100644 --- a/content/handlers/css/select.c +++ b/content/handlers/css/select.c @@ -175,20 +175,20 @@ css_stylesheet *nscss_create_inline_style(const uint8_t *data, size_t len, error = css_stylesheet_create(¶ms, &sheet); if (error != CSS_OK) { - LOG("Failed creating sheet: %d", error); + NSLOG(netsurf, INFO, "Failed creating sheet: %d", error); return NULL; } error = css_stylesheet_append_data(sheet, data, len); if (error != CSS_OK && error != CSS_NEEDDATA) { - LOG("failed appending data: %d", error); + NSLOG(netsurf, INFO, "failed appending data: %d", error); css_stylesheet_destroy(sheet); return NULL; } error = css_stylesheet_data_done(sheet); if (error != CSS_OK) { - LOG("failed completing parse: %d", error); + NSLOG(netsurf, INFO, "failed completing parse: %d", error); css_stylesheet_destroy(sheet); return NULL; } @@ -214,7 +214,8 @@ static void nscss_dom_user_data_handler(dom_node_operation operation, CSS_NODE_CLONED, NULL, src, dst, data); if (error != CSS_OK) - LOG("Failed to clone libcss_node_data."); + NSLOG(netsurf, INFO, + "Failed to clone libcss_node_data."); break; case DOM_NODE_RENAMED: @@ -222,7 +223,8 @@ static void nscss_dom_user_data_handler(dom_node_operation operation, CSS_NODE_MODIFIED, NULL, src, NULL, data); if (error != CSS_OK) - LOG("Failed to update libcss_node_data."); + NSLOG(netsurf, INFO, + "Failed to update libcss_node_data."); break; case DOM_NODE_IMPORTED: @@ -232,11 +234,12 @@ static void nscss_dom_user_data_handler(dom_node_operation operation, CSS_NODE_DELETED, NULL, src, NULL, data); if (error != CSS_OK) - LOG("Failed to delete libcss_node_data."); + NSLOG(netsurf, INFO, + "Failed to delete libcss_node_data."); break; default: - LOG("User data operation not handled."); + NSLOG(netsurf, INFO, "User data operation not handled."); assert(0); } } @@ -275,7 +278,7 @@ css_select_results *nscss_get_style(nscss_select_ctx *ctx, dom_node *n, * element's style */ error = css_computed_style_compose(ctx->parent_style, styles->styles[CSS_PSEUDO_ELEMENT_NONE], - nscss_compute_font_size, NULL, + nscss_compute_font_size, ctx, &composed); if (error != CSS_OK) { css_select_results_destroy(styles); @@ -307,7 +310,7 @@ css_select_results *nscss_get_style(nscss_select_ctx *ctx, dom_node *n, error = css_computed_style_compose( styles->styles[CSS_PSEUDO_ELEMENT_NONE], styles->styles[pseudo_element], - nscss_compute_font_size, NULL, + nscss_compute_font_size, ctx, &composed); if (error != CSS_OK) { /* TODO: perhaps this shouldn't be quite so @@ -346,7 +349,7 @@ css_computed_style *nscss_get_blank_style(nscss_select_ctx *ctx, /* TODO: Do we really need to compose? Initial style shouldn't * have any inherited properties. */ error = css_computed_style_compose(parent, partial, - nscss_compute_font_size, NULL, &composed); + nscss_compute_font_size, ctx, &composed); css_computed_style_destroy(partial); if (error != CSS_OK) { css_computed_style_destroy(composed); @@ -419,14 +422,37 @@ css_error nscss_compute_font_size(void *pw, const css_hint *parent, 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.unit == CSS_UNIT_EX || + size->data.length.unit == CSS_UNIT_CAP || + size->data.length.unit == CSS_UNIT_CH || + size->data.length.unit == CSS_UNIT_IC) { size->data.length.value = FMUL(size->data.length.value, parent_size.value); - if (size->data.length.unit == CSS_UNIT_EX) { + switch (size->data.length.unit) { + case CSS_UNIT_EX: /* 1ex = 0.6em in NetSurf */ size->data.length.value = FMUL(size->data.length.value, FLTTOFIX(0.6)); + break; + case CSS_UNIT_CAP: + /* Height of captals. 1cap = 0.9em in NetSurf. */ + size->data.length.value = FMUL(size->data.length.value, + FLTTOFIX(0.9)); + break; + case CSS_UNIT_CH: + /* Width of '0'. 1ch = 0.4em in NetSurf. */ + size->data.length.value = FMUL(size->data.length.value, + FLTTOFIX(0.4)); + break; + case CSS_UNIT_IC: + /* Width of U+6C43. 1ic = 1.1em in NetSurf. */ + size->data.length.value = FMUL(size->data.length.value, + FLTTOFIX(1.1)); + break; + default: + /* No scaling required for EM. */ + break; } size->data.length.unit = parent_size.unit; @@ -434,6 +460,25 @@ css_error nscss_compute_font_size(void *pw, const css_hint *parent, size->data.length.value = FDIV(FMUL(size->data.length.value, parent_size.value), INTTOFIX(100)); size->data.length.unit = parent_size.unit; + } else if (size->data.length.unit == CSS_UNIT_REM) { + nscss_select_ctx *ctx = pw; + if (parent == NULL) { + size->data.length.value = parent_size.value; + size->data.length.unit = parent_size.unit; + } else { + css_computed_font_size(ctx->root_style, + &parent_size.value, + &size->data.length.unit); + size->data.length.value = FMUL( + size->data.length.value, + parent_size.value); + } + } else if (size->data.length.unit == CSS_UNIT_RLH) { + /** TODO: Convert root element line-height to absolute value. */ + size->data.length.value = FMUL(size->data.length.value, FDIV( + INTTOFIX(nsoption_int(font_size)), + INTTOFIX(10))); + size->data.length.unit = CSS_UNIT_PT; } size->status = CSS_FONT_SIZE_DIMENSION; diff --git a/content/handlers/css/select.h b/content/handlers/css/select.h index abfb85814..9fa6d3a56 100644 --- a/content/handlers/css/select.h +++ b/content/handlers/css/select.h @@ -37,6 +37,7 @@ typedef struct nscss_select_ctx bool quirks; struct nsurl *base_url; lwc_string *universal; + const css_computed_style *root_style; const css_computed_style *parent_style; } nscss_select_ctx; diff --git a/content/handlers/css/utils.c b/content/handlers/css/utils.c index 5c7cbd9a7..8fe157bd2 100644 --- a/content/handlers/css/utils.c +++ b/content/handlers/css/utils.c @@ -27,11 +27,75 @@ /** Screen DPI in fixed point units: defaults to 90, which RISC OS uses */ css_fixed nscss_screen_dpi = F_90; + +/** + * Map viewport-relative length units to either vh or vw. + * + * Non-viewport-relative units are unchanged. + * + * \param[in] ctx Length conversion context. + * \param[in] unit Unit to map. + * \return the mapped unit. + */ +static inline css_unit css_utils__fudge_viewport_units( + const nscss_len_ctx *ctx, + css_unit unit) +{ + switch (unit) { + case CSS_UNIT_VI: + assert(ctx->root_style != NULL); + if (css_computed_writing_mode(ctx->root_style) == + CSS_WRITING_MODE_HORIZONTAL_TB) { + unit = CSS_UNIT_VW; + } else { + unit = CSS_UNIT_VH; + } + break; + case CSS_UNIT_VB: + assert(ctx->root_style != NULL); + if (css_computed_writing_mode(ctx->root_style) == + CSS_WRITING_MODE_HORIZONTAL_TB) { + unit = CSS_UNIT_VH; + } else { + unit = CSS_UNIT_VW; + } + break; + case CSS_UNIT_VMIN: + if (ctx->vh < ctx->vw) { + unit = CSS_UNIT_VH; + } else { + unit = CSS_UNIT_VW; + } + break; + case CSS_UNIT_VMAX: + if (ctx->vh > ctx->vw) { + unit = CSS_UNIT_VH; + } else { + unit = CSS_UNIT_VW; + } + break; + default: break; + } + + return unit; +} + /* exported interface documented in content/handlers/css/utils.h */ -css_fixed nscss_len2pt(css_fixed length, css_unit unit) +css_fixed nscss_len2pt( + const nscss_len_ctx *ctx, + css_fixed length, + css_unit unit) { /* Length must not be relative */ - assert(unit != CSS_UNIT_EM && unit != CSS_UNIT_EX); + assert(unit != CSS_UNIT_EM && + unit != CSS_UNIT_EX && + unit != CSS_UNIT_CAP && + unit != CSS_UNIT_CH && + unit != CSS_UNIT_IC && + unit != CSS_UNIT_REM && + unit != CSS_UNIT_RLH); + + unit = css_utils__fudge_viewport_units(ctx, unit); switch (unit) { /* We assume the screen and any other output has the same dpi */ @@ -45,36 +109,50 @@ css_fixed nscss_len2pt(css_fixed length, css_unit unit) /* 1in = 25.4mm => 1mm = (72/25.4)pt */ case CSS_UNIT_MM: return FMUL(length, FDIV(F_72, FLTTOFIX(25.4))); + /* 1in = 101.6q => 1mm = (72/101.6)pt */ + case CSS_UNIT_Q: return FMUL(length, + FDIV(F_72, FLTTOFIX(101.6))); case CSS_UNIT_PT: return length; /* 1pc = 12pt */ case CSS_UNIT_PC: return FMUL(length, INTTOFIX(12)); + case CSS_UNIT_VH: return FDIV(FMUL(FDIV((length * ctx->vh), F_100), + F_72), nscss_screen_dpi); + case CSS_UNIT_VW: return FDIV(FMUL(FDIV((length * ctx->vw), F_100), + F_72), nscss_screen_dpi); default: break; } return 0; } - /* exported interface documented in content/handlers/css/utils.h */ -css_fixed nscss_len2px(css_fixed length, css_unit unit, +css_fixed nscss_len2px( + const nscss_len_ctx *ctx, + css_fixed length, + css_unit unit, const css_computed_style *style) { /* We assume the screen and any other output has the same dpi */ css_fixed px_per_unit; - assert(style != NULL || (unit != CSS_UNIT_EM && unit != CSS_UNIT_EX)); + unit = css_utils__fudge_viewport_units(ctx, unit); switch (unit) { case CSS_UNIT_EM: case CSS_UNIT_EX: + case CSS_UNIT_CAP: + case CSS_UNIT_CH: + case CSS_UNIT_IC: { css_fixed font_size = 0; css_unit font_unit = CSS_UNIT_PT; + assert(style != NULL); + css_computed_font_size(style, &font_size, &font_unit); /* Convert to points */ - font_size = nscss_len2pt(font_size, font_unit); + font_size = nscss_len2pt(ctx, font_size, font_unit); /* Clamp to configured minimum */ if (font_size < FDIV(INTTOFIX(nsoption_int(font_min_size)), F_10)) { @@ -85,9 +163,22 @@ css_fixed nscss_len2px(css_fixed length, css_unit unit, * 1in = 72pt => 1pt = (DPI/72)px */ px_per_unit = FDIV(FMUL(font_size, nscss_screen_dpi), F_72); - /* Scale ex units: we use a fixed ratio of 1ex = 0.6em */ - if (unit == CSS_UNIT_EX) + /* Scale non-em units to em. We have fixed ratios. */ + switch (unit) { + case CSS_UNIT_EX: px_per_unit = FMUL(px_per_unit, FLTTOFIX(0.6)); + break; + case CSS_UNIT_CAP: + px_per_unit = FMUL(px_per_unit, FLTTOFIX(0.9)); + break; + case CSS_UNIT_CH: + px_per_unit = FMUL(px_per_unit, FLTTOFIX(0.4)); + break; + case CSS_UNIT_IC: + px_per_unit = FMUL(px_per_unit, FLTTOFIX(1.1)); + break; + default: break; + } } break; case CSS_UNIT_PX: @@ -105,6 +196,10 @@ css_fixed nscss_len2px(css_fixed length, css_unit unit, case CSS_UNIT_MM: px_per_unit = FDIV(nscss_screen_dpi, FLTTOFIX(25.4)); break; + /* 1in = 101.6q => 1q = (DPI/101.6)px */ + case CSS_UNIT_Q: + px_per_unit = FDIV(nscss_screen_dpi, FLTTOFIX(101.6)); + break; /* 1in = 72pt => 1pt = (DPI/72)px */ case CSS_UNIT_PT: px_per_unit = FDIV(nscss_screen_dpi, F_72); @@ -113,6 +208,39 @@ css_fixed nscss_len2px(css_fixed length, css_unit unit, case CSS_UNIT_PC: px_per_unit = FDIV(nscss_screen_dpi, INTTOFIX(6)); break; + case CSS_UNIT_REM: + { + css_fixed font_size = 0; + css_unit font_unit = CSS_UNIT_PT; + + assert(ctx->root_style != NULL); + + css_computed_font_size(ctx->root_style, + &font_size, &font_unit); + + /* Convert to points */ + font_size = nscss_len2pt(ctx, font_size, font_unit); + + /* Clamp to configured minimum */ + if (font_size < FDIV(INTTOFIX(nsoption_int(font_min_size)), F_10)) { + font_size = FDIV(INTTOFIX(nsoption_int(font_min_size)), F_10); + } + + /* Convert to pixels (manually, to maximise precision) + * 1in = 72pt => 1pt = (DPI/72)px */ + px_per_unit = FDIV(FMUL(font_size, nscss_screen_dpi), F_72); + break; + } + /* 1rlh = <user_font_size>pt => 1rlh = (DPI/user_font_size)px */ + case CSS_UNIT_RLH: + px_per_unit = FDIV(nscss_screen_dpi, FDIV( + INTTOFIX(nsoption_int(font_size)), + INTTOFIX(10))); + break; + case CSS_UNIT_VH: + return TRUNCATEFIX((FDIV((length * ctx->vh), F_100) + F_0_5)); + case CSS_UNIT_VW: + return TRUNCATEFIX((FDIV((length * ctx->vw), F_100) + F_0_5)); default: px_per_unit = 0; break; diff --git a/content/handlers/css/utils.h b/content/handlers/css/utils.h index 58a5ea6e6..c8f4c82f4 100644 --- a/content/handlers/css/utils.h +++ b/content/handlers/css/utils.h @@ -27,23 +27,122 @@ extern css_fixed nscss_screen_dpi; /** + * Length conversion context data. + */ +typedef struct nscss_len_ctx { + /** + * Viewport width in px. + * Only used if unit is vh, vw, vi, vb, vmin, or vmax. + */ + int vw; + /** + * Viewport height in px. + * Only used if unit is vh, vw, vi, vb, vmin, or vmax. + */ + int vh; + /** + * Computed style for the document root element. + * May be NULL if unit is not rem, or rlh. + */ + const css_computed_style *root_style; +} nscss_len_ctx; + +/** * Convert an absolute CSS length to points. * - * \param[in] length Absolute CSS length. - * \param[in] unit Unit of the length. + * \param[in] ctx Length conversion context. + * \param[in] length Absolute CSS length. + * \param[in] unit Unit of the length. * \return length in points */ -css_fixed nscss_len2pt(css_fixed length, css_unit unit); +css_fixed nscss_len2pt( + const nscss_len_ctx *ctx, + css_fixed length, + css_unit unit); /** * Convert a CSS length to pixels. * - * \param length Length to convert - * \param unit Corresponding unit - * \param style Computed style applying to length. May be NULL if unit is - * neither em nor ex + * \param[in] ctx Length conversion context. + * \param[in] length Length to convert. + * \param[in] unit Corresponding unit. + * \param[in] style Computed style applying to length. + * May be NULL if unit is not em, ex, cap, ch, or ic. * \return length in pixels */ -css_fixed nscss_len2px(css_fixed length, css_unit unit, const css_computed_style *style); +css_fixed nscss_len2px( + const nscss_len_ctx *ctx, + css_fixed length, + css_unit unit, + const css_computed_style *style); + + +/** + * Temporary helper wrappers for for libcss computed style getter, while + * we don't support flexbox related property values. + */ + +static inline uint8_t ns_computed_display( + const css_computed_style *style, bool root) +{ + uint8_t value = css_computed_display(style, root); + + if (value == CSS_DISPLAY_FLEX) { + return CSS_DISPLAY_BLOCK; + + } else if (value == CSS_DISPLAY_INLINE_FLEX) { + return CSS_DISPLAY_INLINE_BLOCK; + } + + return value; +} + + +static inline uint8_t ns_computed_display_static( + const css_computed_style *style) +{ + uint8_t value = css_computed_display_static(style); + + if (value == CSS_DISPLAY_FLEX) { + return CSS_DISPLAY_BLOCK; + + } else if (value == CSS_DISPLAY_INLINE_FLEX) { + return CSS_DISPLAY_INLINE_BLOCK; + } + + return value; +} + + +static inline uint8_t ns_computed_min_height( + const css_computed_style *style, + css_fixed *length, css_unit *unit) +{ + uint8_t value = css_computed_min_height(style, length, unit); + + if (value == CSS_MIN_HEIGHT_AUTO) { + value = CSS_MIN_HEIGHT_SET; + *length = 0; + *unit = CSS_UNIT_PX; + } + + return value; +} + + +static inline uint8_t ns_computed_min_width( + const css_computed_style *style, + css_fixed *length, css_unit *unit) +{ + uint8_t value = css_computed_min_width(style, length, unit); + + if (value == CSS_MIN_WIDTH_AUTO) { + value = CSS_MIN_WIDTH_SET; + *length = 0; + *unit = CSS_UNIT_PX; + } + + return value; +} #endif |