summaryrefslogtreecommitdiff
path: root/css/ruleset.c
diff options
context:
space:
mode:
authorRichard Wilson <rjw@netsurf-browser.org>2005-03-23 18:14:38 +0000
committerRichard Wilson <rjw@netsurf-browser.org>2005-03-23 18:14:38 +0000
commit511891d27c94afc892ecc0d203a39827cb834e78 (patch)
tree58da177b9f957b5eed4fd28d0c7c83ddb21d1f0e /css/ruleset.c
parentc16c3ffa2f478b7432c5641b15e713356419dc36 (diff)
downloadnetsurf-511891d27c94afc892ecc0d203a39827cb834e78.tar.gz
netsurf-511891d27c94afc892ecc0d203a39827cb834e78.tar.bz2
[project @ 2005-03-23 18:14:38 by rjw]
Fix incorrect background position calculations. Modify CSS parser to pass all background-position testcases. svn path=/import/netsurf/; revision=1574
Diffstat (limited to 'css/ruleset.c')
-rw-r--r--css/ruleset.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/css/ruleset.c b/css/ruleset.c
index c09bd0d1c..54d7ff87d 100644
--- a/css/ruleset.c
+++ b/css/ruleset.c
@@ -1085,7 +1085,9 @@ bool css_background_position_parse(const struct css_node **node,
{
const struct css_node *v = *node;
const struct css_node *w = v->next;
- struct css_background_entry *bg = 0, *bg2 = 0;
+ const struct css_node *n_temp = 0;
+ struct css_background_entry *bg = 0, *bg2 = 0, *b_temp = 0;
+ bool switched = false;
if (v->type == CSS_NODE_IDENT)
bg = css_background_lookup(v);
@@ -1151,6 +1153,14 @@ bool css_background_position_parse(const struct css_node **node,
*node = w->next;
return true;
}
+
+ /* reverse specifiers such that idents are places in h, v order */
+ if ((v->type == CSS_NODE_IDENT && bg && bg->vertical) ||
+ (w->type == CSS_NODE_IDENT && bg2 && bg2->horizontal)) {
+ n_temp = v; v = w; w = n_temp;
+ b_temp = bg; bg = bg2; bg2 = b_temp;
+ switched = true;
+ }
if (v->type == CSS_NODE_IDENT) { /* horizontal value */
if (!bg || bg->vertical)
@@ -1185,6 +1195,12 @@ bool css_background_position_parse(const struct css_node **node,
vert->pos = CSS_BACKGROUND_POSITION_LENGTH;
}
+ /* undo any switching we did */
+ if (switched) {
+ n_temp = v; v = w; w = n_temp;
+ b_temp = bg; bg = bg2; bg2 = b_temp;
+ }
+
*node = w->next;
return true;
}