[gtk+] cssmatcher: Rewrite nth-child matcher
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] cssmatcher: Rewrite nth-child matcher
- Date: Thu, 28 May 2015 15:42:31 +0000 (UTC)
commit 59a7739fce02627e5e24b03d9e0837c8ce01aa7b
Author: Benjamin Otte <otte redhat com>
Date: Thu May 28 17:12:57 2015 +0200
cssmatcher: Rewrite nth-child matcher
Instead of trying to be smart, be stupid but correct.
Fixes nth-child reftest.
gtk/gtkcssmatcher.c | 28 ++++++++++++----------------
1 files changed, 12 insertions(+), 16 deletions(-)
---
diff --git a/gtk/gtkcssmatcher.c b/gtk/gtkcssmatcher.c
index c68f650..14597cc 100644
--- a/gtk/gtkcssmatcher.c
+++ b/gtk/gtkcssmatcher.c
@@ -356,27 +356,23 @@ gtk_css_matcher_node_nth_child (GtkCssNode *node,
int a,
int b)
{
- while (b-- > 0)
- {
- if (node == NULL)
- return FALSE;
+ int pos, x;
- node = prev_node_func (node);
- }
+ /* count nodes */
+ for (pos = 0; node != NULL; pos++)
+ node = prev_node_func (node);
+
+ /* solve pos = a * X + b
+ * and return TRUE if X is integer >= 0 */
+ x = pos - b;
if (a == 0)
- return node == NULL;
- else if (a == 1)
- return TRUE;
+ return x == 0;
- b = 0;
- while (node)
- {
- b++;
- node = prev_node_func (node);
- }
+ if (x % a)
+ return FALSE;
- return b % a == 0;
+ return x / a > 0;
}
static gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]