summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2016-03-25 04:54:00 +0100
committerBenjamin Otte <otte@redhat.com>2016-04-08 16:18:31 +0200
commitca1c46c17061aa6faa1ade29125d61025857627b (patch)
tree52ea59b78ea8bf0a1fcea90d8b324a76d2bdcddb
parent23c729459fa63e555a77bb50d9a668888db1c31f (diff)
downloadgtk+-ca1c46c17061aa6faa1ade29125d61025857627b.tar.gz
csskeyframes: Allow constructing from KeyframesRule
This requires a bunch of API being added to the rules.
-rw-r--r--gtk/gtkcsskeyframerule.c37
-rw-r--r--gtk/gtkcsskeyframeruleprivate.h6
-rw-r--r--gtk/gtkcsskeyframes.c70
-rw-r--r--gtk/gtkcsskeyframesprivate.h2
-rw-r--r--gtk/gtkcsskeyframesrule.c23
-rw-r--r--gtk/gtkcsskeyframesruleprivate.h2
6 files changed, 140 insertions, 0 deletions
diff --git a/gtk/gtkcsskeyframerule.c b/gtk/gtkcsskeyframerule.c
index bb73e61774..0572d227c6 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 c17879a311..2d94595658 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 ed14ac3451..c1ea28df78 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 b9dc13e627..d6f6a60d7b 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 5b2c8dd566..8b16b2f294 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 c45ff5c716..3d038ee5d5 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