[gtk+/wip/otte/tokenizer: 52/78] csskeyframes: Allow constructing from KeyframesRule



commit ca1c46c17061aa6faa1ade29125d61025857627b
Author: Benjamin Otte <otte redhat com>
Date:   Fri Mar 25 04:54:00 2016 +0100

    csskeyframes: Allow constructing from KeyframesRule
    
    This requires a bunch of API being added to the rules.

 gtk/gtkcsskeyframerule.c         |   37 ++++++++++++++++++++
 gtk/gtkcsskeyframeruleprivate.h  |    6 +++
 gtk/gtkcsskeyframes.c            |   70 ++++++++++++++++++++++++++++++++++++++
 gtk/gtkcsskeyframesprivate.h     |    2 +
 gtk/gtkcsskeyframesrule.c        |   23 ++++++++++++
 gtk/gtkcsskeyframesruleprivate.h |    2 +
 6 files changed, 140 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkcsskeyframerule.c b/gtk/gtkcsskeyframerule.c
index bb73e61..0572d22 100644
--- a/gtk/gtkcsskeyframerule.c
+++ b/gtk/gtkcsskeyframerule.c
@@ -137,3 +137,40 @@ gtk_css_keyframe_rule_new_parse (GtkCssTokenSource *source,
   return rule;
 }
 
+gsize
+gtk_css_keyframe_rule_get_n_offsets (GtkCssKeyframeRule *rule)
+{
+  GtkCssKeyframeRulePrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_CSS_KEYFRAME_RULE (rule), 0);
+
+  priv = gtk_css_keyframe_rule_get_instance_private (rule);
+
+  return priv->n_offsets;
+}
+
+double
+gtk_css_keyframe_rule_get_offset (GtkCssKeyframeRule *rule,
+                                  gsize               id)
+{
+  GtkCssKeyframeRulePrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_CSS_KEYFRAME_RULE (rule), 0.0);
+
+  priv = gtk_css_keyframe_rule_get_instance_private (rule);
+  g_return_val_if_fail (id < priv->n_offsets, 0.0);
+
+  return priv->offsets[id];
+}
+
+GtkCssStyleDeclaration *
+gtk_css_keyframe_rule_get_style (GtkCssKeyframeRule *rule)
+{
+  GtkCssKeyframeRulePrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_CSS_KEYFRAME_RULE (rule), 0);
+
+  priv = gtk_css_keyframe_rule_get_instance_private (rule);
+
+  return priv->style;
+}
diff --git a/gtk/gtkcsskeyframeruleprivate.h b/gtk/gtkcsskeyframeruleprivate.h
index c17879a..2d94595 100644
--- a/gtk/gtkcsskeyframeruleprivate.h
+++ b/gtk/gtkcsskeyframeruleprivate.h
@@ -51,6 +51,12 @@ GtkCssRule *            gtk_css_keyframe_rule_new_parse         (GtkCssTokenSour
                                                                  GtkCssRule             *parent_rule,
                                                                  GtkCssStyleSheet       *parent_style_sheet);
 
+gsize                   gtk_css_keyframe_rule_get_n_offsets     (GtkCssKeyframeRule     *rule);
+double                  gtk_css_keyframe_rule_get_offset        (GtkCssKeyframeRule     *rule,
+                                                                 gsize                   id);
+
+GtkCssStyleDeclaration *gtk_css_keyframe_rule_get_style         (GtkCssKeyframeRule     *rule);
+
 
 G_END_DECLS
 
diff --git a/gtk/gtkcsskeyframes.c b/gtk/gtkcsskeyframes.c
index ed14ac3..c1ea28d 100644
--- a/gtk/gtkcsskeyframes.c
+++ b/gtk/gtkcsskeyframes.c
@@ -20,6 +20,8 @@
 #include "gtkcsskeyframesprivate.h"
 
 #include "gtkcssarrayvalueprivate.h"
+#include "gtkcssdeclarationprivate.h"
+#include "gtkcsskeyframeruleprivate.h"
 #include "gtkcssshorthandpropertyprivate.h"
 #include "gtkcssstylepropertyprivate.h"
 #include "gtkstylepropertyprivate.h"
@@ -370,6 +372,74 @@ _gtk_css_keyframes_parse (GtkCssParser *parser)
   return keyframes;
 }
 
+GtkCssKeyframes *
+gtk_css_keyframes_new_from_rule (GtkCssKeyframesRule *rule)
+{
+  GtkCssKeyframes *keyframes;
+  GtkCssRuleList *rules;
+  guint i, j, k, l;
+
+  keyframes = gtk_css_keyframes_new ();
+
+  rules = gtk_css_keyframes_rule_get_css_rules (rule);
+  for (i = 0; i < gtk_css_rule_list_get_length (rules); i++)
+    {
+      /* Don't do GTK_CSS_KEYFRAME_RULE() cast here. */
+      GtkCssKeyframeRule *keyframe = (GtkCssKeyframeRule *) gtk_css_rule_list_get_item (rules, i);
+
+      if (!GTK_IS_CSS_KEYFRAME_RULE (keyframe))
+        continue;
+
+      for (j = 0; j < gtk_css_keyframe_rule_get_n_offsets (keyframe); j++)
+        {
+          double offset = gtk_css_keyframe_rule_get_offset (keyframe, j) / 100;
+          GtkCssStyleDeclaration *style;
+          guint offset_idx;
+
+          if (offset < 0 || offset > 1)
+            continue;
+
+          offset_idx = gtk_css_keyframes_add_keyframe (keyframes, offset);
+          style = gtk_css_keyframe_rule_get_style (keyframe);
+
+          for (k = 0; k < gtk_css_style_declaration_get_length (style); k++)
+            {
+              GtkCssDeclaration *decl = gtk_css_style_declaration_get_declaration (style, k);
+              GtkStyleProperty *property;
+              GtkCssValue *value;
+
+              property = _gtk_style_property_lookup (gtk_css_declaration_get_name (decl));
+              if (property == NULL)
+                continue;
+
+              value = gtk_css_declaration_get_value (decl);
+              if (GTK_IS_CSS_SHORTHAND_PROPERTY (property))
+                {
+                  GtkCssShorthandProperty *shorthand = GTK_CSS_SHORTHAND_PROPERTY (property);
+
+                  for (l = 0; l < _gtk_css_shorthand_property_get_n_subproperties (shorthand); l++)
+                    {
+                      GtkCssStyleProperty *child = _gtk_css_shorthand_property_get_subproperty (shorthand, 
l);
+                      GtkCssValue *sub = _gtk_css_array_value_get_nth (value, l);
+
+                      keyframes_set_value (keyframes, offset_idx, child, _gtk_css_value_ref (sub));
+                    }
+                }
+              else if (GTK_IS_CSS_STYLE_PROPERTY (property))
+                {
+                  keyframes_set_value (keyframes, offset_idx, GTK_CSS_STYLE_PROPERTY (property), 
_gtk_css_value_ref (value));
+                }
+              else
+                {
+                  g_assert_not_reached ();
+                }
+            }
+        }
+    }
+
+  return keyframes;
+}
+
 static int
 compare_property_by_name (gconstpointer a,
                           gconstpointer b,
diff --git a/gtk/gtkcsskeyframesprivate.h b/gtk/gtkcsskeyframesprivate.h
index b9dc13e..d6f6a60 100644
--- a/gtk/gtkcsskeyframesprivate.h
+++ b/gtk/gtkcsskeyframesprivate.h
@@ -21,6 +21,7 @@
 #define __GTK_CSS_KEYFRAMES_PRIVATE_H__
 
 #include "gtkcssparserprivate.h"
+#include "gtkcsskeyframesruleprivate.h"
 #include "gtkcssvalueprivate.h"
 #include "gtktypes.h"
 
@@ -29,6 +30,7 @@ G_BEGIN_DECLS
 typedef struct _GtkCssKeyframes GtkCssKeyframes;
 
 GtkCssKeyframes *   _gtk_css_keyframes_parse                  (GtkCssParser           *parser);
+GtkCssKeyframes *   gtk_css_keyframes_new_from_rule           (GtkCssKeyframesRule    *rule);
 
 GtkCssKeyframes *   _gtk_css_keyframes_ref                    (GtkCssKeyframes        *keyframes);
 void                _gtk_css_keyframes_unref                  (GtkCssKeyframes        *keyframes);
diff --git a/gtk/gtkcsskeyframesrule.c b/gtk/gtkcsskeyframesrule.c
index 5b2c8dd..8b16b2f 100644
--- a/gtk/gtkcsskeyframesrule.c
+++ b/gtk/gtkcsskeyframesrule.c
@@ -262,3 +262,26 @@ gtk_css_keyframes_rule_new_parse (GtkCssTokenSource *source,
   return rule;
 }
 
+const char *
+gtk_css_keyframes_rule_get_name (GtkCssKeyframesRule *rule)
+{
+  GtkCssKeyframesRulePrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_CSS_KEYFRAMES_RULE (rule), NULL);
+
+  priv = gtk_css_keyframes_rule_get_instance_private (rule);
+
+  return priv->name;
+}
+
+GtkCssRuleList *
+gtk_css_keyframes_rule_get_css_rules (GtkCssKeyframesRule *rule)
+{
+  GtkCssKeyframesRulePrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_CSS_KEYFRAMES_RULE (rule), NULL);
+
+  priv = gtk_css_keyframes_rule_get_instance_private (rule);
+
+  return priv->rules;
+}
diff --git a/gtk/gtkcsskeyframesruleprivate.h b/gtk/gtkcsskeyframesruleprivate.h
index c45ff5c..3d038ee 100644
--- a/gtk/gtkcsskeyframesruleprivate.h
+++ b/gtk/gtkcsskeyframesruleprivate.h
@@ -51,6 +51,8 @@ GtkCssRule *            gtk_css_keyframes_rule_new_parse        (GtkCssTokenSour
                                                                  GtkCssRule             *parent_rule,
                                                                  GtkCssStyleSheet       *parent_style_sheet);
 
+const char *            gtk_css_keyframes_rule_get_name         (GtkCssKeyframesRule    *rule);
+GtkCssRuleList *        gtk_css_keyframes_rule_get_css_rules    (GtkCssKeyframesRule    *rule);
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]