X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcssnumbervalue.c;h=ed2bfe506fac69de634231aa960b775f450211c8;hb=f076b6bb0284b59de67d5be8d53a14b5bb32e119;hp=c929f1d2740d273d4427e4f6ce6af705d1cbf53e;hpb=9b4ed662181cabde506248cf8b344420a0300a3e;p=~andy%2Fgtk diff --git a/gtk/gtkcssnumbervalue.c b/gtk/gtkcssnumbervalue.c index c929f1d27..ed2bfe506 100644 --- a/gtk/gtkcssnumbervalue.c +++ b/gtk/gtkcssnumbervalue.c @@ -19,6 +19,8 @@ #include "gtkcssnumbervalueprivate.h" +#include "gtkcssenumvalueprivate.h" +#include "gtkcssinitialvalueprivate.h" #include "gtkstylepropertyprivate.h" struct _GtkCssValue { @@ -33,10 +35,33 @@ gtk_css_value_number_free (GtkCssValue *value) g_slice_free (GtkCssValue, value); } +static double +get_base_font_size (guint property_id, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GtkCssDependencies *dependencies) +{ + if (property_id == GTK_CSS_PROPERTY_FONT_SIZE) + { + *dependencies = GTK_CSS_DEPENDS_ON_PARENT; + if (parent_values) + return _gtk_css_number_value_get (_gtk_css_computed_values_get_value (parent_values, GTK_CSS_PROPERTY_FONT_SIZE), 100); + else + return _gtk_css_font_size_get_default (provider); + } + + *dependencies = GTK_CSS_DEPENDS_ON_FONT_SIZE; + return _gtk_css_number_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_FONT_SIZE), 100); +} + static GtkCssValue * -gtk_css_value_number_compute (GtkCssValue *number, - guint property_id, - GtkStyleContext *context) +gtk_css_value_number_compute (GtkCssValue *number, + guint property_id, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GtkCssDependencies *dependencies) { switch (number->unit) { @@ -44,6 +69,11 @@ gtk_css_value_number_compute (GtkCssValue *number, g_assert_not_reached(); /* fall through */ case GTK_CSS_PERCENT: + /* percentages for font sizes are computed, other percentages aren't */ + if (property_id == GTK_CSS_PROPERTY_FONT_SIZE) + return _gtk_css_number_value_new (number->value / 100.0 * + get_base_font_size (property_id, provider, values, parent_values, dependencies), + GTK_CSS_PX); case GTK_CSS_NUMBER: case GTK_CSS_PX: case GTK_CSS_DEG: @@ -70,13 +100,13 @@ gtk_css_value_number_compute (GtkCssValue *number, break; case GTK_CSS_EM: return _gtk_css_number_value_new (number->value * - _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_FONT_SIZE), 100), + get_base_font_size (property_id, provider, values, parent_values, dependencies), GTK_CSS_PX); break; case GTK_CSS_EX: /* for now we pretend ex is half of em */ return _gtk_css_number_value_new (number->value * 0.5 * - _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_FONT_SIZE), 100), + get_base_font_size (property_id, provider, values, parent_values, dependencies), GTK_CSS_PX); case GTK_CSS_RAD: return _gtk_css_number_value_new (number->value * 360.0 / (2 * G_PI), @@ -104,6 +134,7 @@ gtk_css_value_number_equal (const GtkCssValue *number1, static GtkCssValue * gtk_css_value_number_transition (GtkCssValue *start, GtkCssValue *end, + guint property_id, double progress) { /* FIXME: This needs to be supported at least for percentages, @@ -158,7 +189,10 @@ GtkCssValue * _gtk_css_number_value_new (double value, GtkCssUnit unit) { - static GtkCssValue zero_singleton = { >K_CSS_VALUE_NUMBER, 1, GTK_CSS_NUMBER, 0 }; + static GtkCssValue number_singletons[] = { + { >K_CSS_VALUE_NUMBER, 1, GTK_CSS_NUMBER, 0 }, + { >K_CSS_VALUE_NUMBER, 1, GTK_CSS_NUMBER, 1 }, + }; static GtkCssValue px_singletons[] = { { >K_CSS_VALUE_NUMBER, 1, GTK_CSS_PX, 0 }, { >K_CSS_VALUE_NUMBER, 1, GTK_CSS_PX, 1 }, @@ -168,8 +202,8 @@ _gtk_css_number_value_new (double value, }; GtkCssValue *result; - if (unit == GTK_CSS_NUMBER && value == 0) - return _gtk_css_value_ref (&zero_singleton); + if (unit == GTK_CSS_NUMBER && (value == 0 || value == 1)) + return _gtk_css_value_ref (&number_singletons[(int) value]); if (unit == GTK_CSS_PX && (value == 0 ||