From c58f7a4ff983d282488b7b3413dd3dd572a84ad1 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 22 Mar 2009 00:23:55 +0000 Subject: Sketch out something for presentational hints. The client will have to maintain some state to be able to calculate this struct for every node selection, but that shouldn't be overly onerous. Also, the mess surrounding centering can only be sensibly solved through the addition of a new, prefixed, property. svn path=/trunk/libcss/; revision=6816 --- include/libcss/hint.h | 118 ++++++++++++++++++++++++++++++++++++++++++++++++ include/libcss/select.h | 3 +- src/select/select.c | 14 +++++- 3 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 include/libcss/hint.h diff --git a/include/libcss/hint.h b/include/libcss/hint.h new file mode 100644 index 0000000..366b254 --- /dev/null +++ b/include/libcss/hint.h @@ -0,0 +1,118 @@ +/* + * This file is part of LibCSS + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2009 John-Mark Bell + */ + +#ifndef libcss_hint_h_ +#define libcss_hint_h_ + +#include + +#include +#include +#include + +/** + * Length object for use in presentational hints + */ +typedef struct css_hint_length { + css_fixed value; + css_unit unit; +} css_hint_length; + +/** + * Typed colour object for use in presentational hints + */ +typedef struct css_hint_typed_colour { + uint8_t type; + css_colour color; +} css_hint_typed_colour; + +/** + * Typed length object for use in presentational hints + */ +typedef struct css_hint_typed_length { + uint8_t type; + css_hint_length length; +} css_hint_typed_length; + +/** + * Typed string object for use in presentational hints + */ +typedef struct css_hint_typed_string { + uint8_t type; + lwc_string *string; +} css_hint_typed_string; + +/** + * Presentational hint border + */ +typedef struct css_hint_border { + css_hint_typed_length width; + css_hint_typed_colour color; + uint8_t style; +} css_hint_border; + +/** + * Presentational hints + * + * \todo There's no way to flag that a property isn't set here. + */ +typedef struct css_hint { + css_hint_typed_colour background_color; + + css_hint_typed_string background_image; + + uint8_t border_collapse; + + css_hint_border border_bottom; + css_hint_border border_left; + css_hint_border border_right; + css_hint_border border_top; + + struct { + uint8_t type; + css_hint_length h; + css_hint_length v; + } border_spacing; + + uint8_t caption_side; + + uint8_t clear; + + css_hint_typed_colour color; + + uint8_t _float; + + css_hint_typed_string font_family; + + css_hint_typed_length font_size; + + css_hint_typed_length height; + + uint8_t list_style_type; + + css_hint_typed_length margin_bottom; + css_hint_typed_length margin_left; + css_hint_typed_length margin_right; + css_hint_typed_length margin_top; + + uint8_t overflow; + + css_hint_typed_length padding_bottom; + css_hint_typed_length padding_left; + css_hint_typed_length padding_right; + css_hint_typed_length padding_top; + + uint8_t text_align; + + css_hint_typed_length vertical_align; + + uint8_t white_space; + + css_hint_typed_length width; +} css_hint; + +#endif diff --git a/include/libcss/select.h b/include/libcss/select.h index 6d774ec..44befcd 100644 --- a/include/libcss/select.h +++ b/include/libcss/select.h @@ -12,6 +12,7 @@ #include #include +#include #include enum css_pseudo_element { @@ -79,7 +80,7 @@ css_error css_select_ctx_get_sheet(css_select_ctx *ctx, uint32_t index, css_error css_select_style(css_select_ctx *ctx, void *node, uint32_t pseudo_element, uint64_t media, - css_computed_style *result, + const css_hint *hints, css_computed_style *result, css_select_handler *handler, void *pw); #endif diff --git a/src/select/select.c b/src/select/select.c index a27a0cf..7b83f90 100644 --- a/src/select/select.c +++ b/src/select/select.c @@ -240,6 +240,7 @@ css_error css_select_ctx_get_sheet(css_select_ctx *ctx, uint32_t index, * \param node Node to select style for * \param pseudo_element Pseudo element to select for, instead * \param media Currently active media types + * \param hint Presentational hints, or NULL for none * \param result Pointer to style to populate (assumed clean) * \param handler Dispatch table of handler functions * \param pw Client-specific private data for handler functions @@ -256,7 +257,7 @@ css_error css_select_ctx_get_sheet(css_select_ctx *ctx, uint32_t index, */ css_error css_select_style(css_select_ctx *ctx, void *node, uint32_t pseudo_element, uint64_t media, - css_computed_style *result, + const css_hint *hints, css_computed_style *result, css_select_handler *handler, void *pw) { uint32_t i; @@ -287,6 +288,17 @@ css_error css_select_style(css_select_ctx *ctx, void *node, } } + /** \todo take account of presentational hints: + * + * foreach property in hints: + * if !state.property.set || (state.property.origin == UA || + * (state.property.origin == USER && + * !state.property.important)): + * result.property = property + * state.property.set = true + */ + UNUSED(hints); + /* Finally, fix up any remaining unset properties. * Those properties which are inherited need to be set as inherit. * Those which are not inherited need to be set to their default value. -- cgit v1.2.3