X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcssnumbervalue.c;h=ed2bfe506fac69de634231aa960b775f450211c8;hb=9f41970832b60f3cf6644dfbd154df7ec24f26ce;hp=106fd76378eebe2d4ad29b331a90542cdcd86430;hpb=1a9dfab825eb18ee101b579743a47ebb55e06a35;p=~andy%2Fgtk diff --git a/gtk/gtkcssnumbervalue.c b/gtk/gtkcssnumbervalue.c index 106fd7637..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,6 +35,94 @@ 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, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GtkCssDependencies *dependencies) +{ + switch (number->unit) + { + default: + 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: + case GTK_CSS_S: + return _gtk_css_value_ref (number); + case GTK_CSS_PT: + return _gtk_css_number_value_new (number->value * 96.0 / 72.0, + GTK_CSS_PX); + case GTK_CSS_PC: + return _gtk_css_number_value_new (number->value * 96.0 / 72.0 * 12.0, + GTK_CSS_PX); + break; + case GTK_CSS_IN: + return _gtk_css_number_value_new (number->value * 96.0, + GTK_CSS_PX); + break; + case GTK_CSS_CM: + return _gtk_css_number_value_new (number->value * 96.0 * 0.39370078740157477, + GTK_CSS_PX); + break; + case GTK_CSS_MM: + return _gtk_css_number_value_new (number->value * 96.0 * 0.039370078740157477, + GTK_CSS_PX); + break; + case GTK_CSS_EM: + return _gtk_css_number_value_new (number->value * + 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 * + 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), + GTK_CSS_DEG); + case GTK_CSS_GRAD: + return _gtk_css_number_value_new (number->value * 360.0 / 400.0, + GTK_CSS_DEG); + case GTK_CSS_TURN: + return _gtk_css_number_value_new (number->value * 360.0, + GTK_CSS_DEG); + case GTK_CSS_MS: + return _gtk_css_number_value_new (number->value / 1000.0, + GTK_CSS_S); + } +} + static gboolean gtk_css_value_number_equal (const GtkCssValue *number1, const GtkCssValue *number2) @@ -44,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, @@ -76,6 +167,8 @@ gtk_css_value_number_print (const GtkCssValue *number, /* [GTK_CSS_DEG] = */ "deg", /* [GTK_CSS_GRAD] = */ "grad", /* [GTK_CSS_TURN] = */ "turn", + /* [GTK_CSS_S] = */ "s", + /* [GTK_CSS_MS] = */ "ms", }; g_ascii_dtostr (buf, sizeof (buf), number->value); @@ -86,6 +179,7 @@ gtk_css_value_number_print (const GtkCssValue *number, static const GtkCssValueClass GTK_CSS_VALUE_NUMBER = { gtk_css_value_number_free, + gtk_css_value_number_compute, gtk_css_value_number_equal, gtk_css_value_number_transition, gtk_css_value_number_print @@ -95,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 }, @@ -105,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 || @@ -125,18 +222,12 @@ _gtk_css_number_value_new (double value, return result; } -GtkCssValue * -_gtk_css_number_value_parse (GtkCssParser *parser, - GtkCssNumberParseFlags flags) +GtkCssUnit +_gtk_css_number_value_get_unit (const GtkCssValue *value) { - GtkCssNumber number; + g_return_val_if_fail (value->class == >K_CSS_VALUE_NUMBER, GTK_CSS_NUMBER); - g_return_val_if_fail (parser != NULL, NULL); - - if (!_gtk_css_parser_read_number (parser, &number, flags)) - return NULL; - - return _gtk_css_number_value_new (number.value, number.unit); + return value->unit; } double @@ -152,60 +243,3 @@ _gtk_css_number_value_get (const GtkCssValue *number, return number->value; } -GtkCssValue * -_gtk_css_number_value_compute (GtkCssValue *number, - GtkStyleContext *context) -{ - g_return_val_if_fail (number->class == >K_CSS_VALUE_NUMBER, NULL); - - switch (number->unit) - { - default: - g_assert_not_reached(); - /* fall through */ - case GTK_CSS_PERCENT: - case GTK_CSS_NUMBER: - case GTK_CSS_PX: - case GTK_CSS_DEG: - return _gtk_css_value_ref (number); - case GTK_CSS_PT: - return _gtk_css_number_value_new (number->value * 96.0 / 72.0, - GTK_CSS_PX); - case GTK_CSS_PC: - return _gtk_css_number_value_new (number->value * 96.0 / 72.0 * 12.0, - GTK_CSS_PX); - break; - case GTK_CSS_IN: - return _gtk_css_number_value_new (number->value * 96.0, - GTK_CSS_PX); - break; - case GTK_CSS_CM: - return _gtk_css_number_value_new (number->value * 96.0 * 0.39370078740157477, - GTK_CSS_PX); - break; - case GTK_CSS_MM: - return _gtk_css_number_value_new (number->value * 96.0 * 0.039370078740157477, - GTK_CSS_PX); - break; - case GTK_CSS_EM: - return _gtk_css_number_value_new (number->value * - _gtk_css_number_value_get (_gtk_style_context_peek_property (context, "font-size"), 100), - 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, "font-size"), 100), - GTK_CSS_PX); - case GTK_CSS_RAD: - return _gtk_css_number_value_new (number->value * 360.0 / (2 * G_PI), - GTK_CSS_DEG); - case GTK_CSS_GRAD: - return _gtk_css_number_value_new (number->value * 360.0 / 400.0, - GTK_CSS_DEG); - case GTK_CSS_TURN: - return _gtk_css_number_value_new (number->value * 360.0, - GTK_CSS_DEG); - } -} -