diff options
author | Benjamin Otte <otte@redhat.com> | 2016-03-25 04:54:00 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2016-04-08 16:18:31 +0200 |
commit | ca1c46c17061aa6faa1ade29125d61025857627b (patch) | |
tree | 52ea59b78ea8bf0a1fcea90d8b324a76d2bdcddb | |
parent | 23c729459fa63e555a77bb50d9a668888db1c31f (diff) | |
download | gtk+-ca1c46c17061aa6faa1ade29125d61025857627b.tar.gz |
csskeyframes: Allow constructing from KeyframesRule
This requires a bunch of API being added to the rules.
-rw-r--r-- | gtk/gtkcsskeyframerule.c | 37 | ||||
-rw-r--r-- | gtk/gtkcsskeyframeruleprivate.h | 6 | ||||
-rw-r--r-- | gtk/gtkcsskeyframes.c | 70 | ||||
-rw-r--r-- | gtk/gtkcsskeyframesprivate.h | 2 | ||||
-rw-r--r-- | gtk/gtkcsskeyframesrule.c | 23 | ||||
-rw-r--r-- | gtk/gtkcsskeyframesruleprivate.h | 2 |
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 |