From da2c006495db400134c3e788e398cbcba1dba1d0 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sun, 22 Nov 2015 20:18:08 +0000 Subject: Make node data contain list of partial node styles. --- src/select/computed.h | 4 ++++ src/select/select.c | 26 ++++++++++++++++++++++++-- src/select/select.h | 1 + 3 files changed, 29 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/select/computed.h b/src/select/computed.h index 57981b2..f77bda2 100644 --- a/src/select/computed.h +++ b/src/select/computed.h @@ -338,6 +338,10 @@ static inline css_computed_style * css__computed_style_ref( if (style == NULL) return NULL; + if (style->i.uncommon != NULL) { + style->i.uncommon->count++; + } + style->count++; return style; } diff --git a/src/select/select.c b/src/select/select.c index 5fef4e4..ec01d32 100644 --- a/src/select/select.c +++ b/src/select/select.c @@ -170,12 +170,21 @@ static css_error css__create_node_data(struct css_node_data **node_data) static void css__destroy_node_data(struct css_node_data *node_data) { + int i; + assert(node_data != NULL); if (node_data->bloom != NULL) { free(node_data->bloom); } + for (i = 0; i < CSS_PSEUDO_ELEMENT_COUNT; i++) { + if (node_data->partial.styles[i] != NULL) { + css_computed_style_destroy( + node_data->partial.styles[i]); + } + } + free(node_data); } @@ -651,18 +660,31 @@ cleanup: static css_error css__set_node_data(void *node, css_select_state *state, css_select_handler *handler, void *pw) { + int i; css_error error; css_bloom *bloom; + css_select_results *results; + + struct css_node_data *node_data = state->node_data; /* Set node bloom filter */ error = css__create_node_bloom(&bloom, state); if (error != CSS_OK) { return error; } - state->node_data->bloom = bloom; + node_data->bloom = bloom; - error = handler->set_libcss_node_data(pw, node, state->node_data); + /* Set selection results */ + results = state->results; + for (i = 0; i < CSS_PSEUDO_ELEMENT_COUNT; i++) { + node_data->partial.styles[i] = + css__computed_style_ref(results->styles[i]); + } + + error = handler->set_libcss_node_data(pw, node, node_data); if (error != CSS_OK) { + css__destroy_node_data(node_data); + state->node_data = NULL; return error; } diff --git a/src/select/select.h b/src/select/select.h index 196914d..254b095 100644 --- a/src/select/select.h +++ b/src/select/select.h @@ -32,6 +32,7 @@ typedef struct prop_state { } prop_state; struct css_node_data { + css_select_results partial; css_bloom *bloom; }; -- cgit v1.2.3