[units] Fix Units in GValue and ClutterParamSpecUnit

The GValue and GParamSpec integration of ClutterUnit was still
using the old, fixed-point based logic.

Storing ClutterUnits in a GValue should use floating point values,
and ClutterParamSpecUnit should follow suit.
This commit is contained in:
Emmanuele Bassi 2009-01-22 12:11:25 +00:00
parent 1876785d12
commit 6ca40faaec

View File

@ -101,7 +101,9 @@
#include "clutter-units.h" #include "clutter-units.h"
#include "clutter-private.h" #include "clutter-private.h"
#define DPI_FALLBACK 96.0 #define DPI_FALLBACK (96.0)
#define FLOAT_EPSILON (1e-30)
/** /**
* clutter_units_mm: * clutter_units_mm:
@ -192,14 +194,14 @@ static GTypeFundamentalInfo _finfo = { 0, };
static void static void
clutter_value_init_unit (GValue *value) clutter_value_init_unit (GValue *value)
{ {
value->data[0].v_int = 0; value->data[0].v_float = 0.0;
} }
static void static void
clutter_value_copy_unit (const GValue *src, clutter_value_copy_unit (const GValue *src,
GValue *dest) GValue *dest)
{ {
dest->data[0].v_int = src->data[0].v_int; dest->data[0].v_float = src->data[0].v_float;
} }
static gchar * static gchar *
@ -208,7 +210,7 @@ clutter_value_collect_unit (GValue *value,
GTypeCValue *collect_values, GTypeCValue *collect_values,
guint collect_flags) guint collect_flags)
{ {
value->data[0].v_int = collect_values[0].v_int; value->data[0].v_float = collect_values[0].v_double;
return NULL; return NULL;
} }
@ -219,13 +221,13 @@ clutter_value_lcopy_unit (const GValue *value,
GTypeCValue *collect_values, GTypeCValue *collect_values,
guint collect_flags) guint collect_flags)
{ {
gint32 *units_p = collect_values[0].v_pointer; gfloat *units_p = collect_values[0].v_pointer;
if (!units_p) if (!units_p)
return g_strdup_printf ("value location for `%s' passed as NULL", return g_strdup_printf ("value location for `%s' passed as NULL",
G_VALUE_TYPE_NAME (value)); G_VALUE_TYPE_NAME (value));
*units_p = value->data[0].v_int; *units_p = value->data[0].v_float;
return NULL; return NULL;
} }
@ -234,14 +236,14 @@ static void
clutter_value_transform_unit_int (const GValue *src, clutter_value_transform_unit_int (const GValue *src,
GValue *dest) GValue *dest)
{ {
dest->data[0].v_int = CLUTTER_UNITS_TO_INT (src->data[0].v_int); dest->data[0].v_int = CLUTTER_UNITS_TO_INT (src->data[0].v_float);
} }
static void static void
clutter_value_transform_int_unit (const GValue *src, clutter_value_transform_int_unit (const GValue *src,
GValue *dest) GValue *dest)
{ {
dest->data[0].v_int = CLUTTER_UNITS_FROM_INT (src->data[0].v_int); dest->data[0].v_float = CLUTTER_UNITS_FROM_INT (src->data[0].v_int);
} }
static const GTypeValueTable _clutter_unit_value_table = { static const GTypeValueTable _clutter_unit_value_table = {
@ -249,7 +251,7 @@ static const GTypeValueTable _clutter_unit_value_table = {
NULL, NULL,
clutter_value_copy_unit, clutter_value_copy_unit,
NULL, NULL,
"i", "d",
clutter_value_collect_unit, clutter_value_collect_unit,
"p", "p",
clutter_value_lcopy_unit clutter_value_lcopy_unit
@ -292,7 +294,7 @@ clutter_value_set_unit (GValue *value,
{ {
g_return_if_fail (CLUTTER_VALUE_HOLDS_UNIT (value)); g_return_if_fail (CLUTTER_VALUE_HOLDS_UNIT (value));
value->data[0].v_int = units; value->data[0].v_float = units;
} }
/** /**
@ -310,7 +312,7 @@ clutter_value_get_unit (const GValue *value)
{ {
g_return_val_if_fail (CLUTTER_VALUE_HOLDS_UNIT (value), 0); g_return_val_if_fail (CLUTTER_VALUE_HOLDS_UNIT (value), 0);
return value->data[0].v_int; return value->data[0].v_float;
} }
static void static void
@ -327,7 +329,7 @@ static void
param_unit_set_default (GParamSpec *pspec, param_unit_set_default (GParamSpec *pspec,
GValue *value) GValue *value)
{ {
value->data[0].v_int = CLUTTER_PARAM_SPEC_UNIT (pspec)->default_value; value->data[0].v_float = CLUTTER_PARAM_SPEC_UNIT (pspec)->default_value;
} }
static gboolean static gboolean
@ -335,26 +337,15 @@ param_unit_validate (GParamSpec *pspec,
GValue *value) GValue *value)
{ {
ClutterParamSpecUnit *uspec = CLUTTER_PARAM_SPEC_UNIT (pspec); ClutterParamSpecUnit *uspec = CLUTTER_PARAM_SPEC_UNIT (pspec);
gint oval = CLUTTER_UNITS_TO_INT (value->data[0].v_int); gfloat oval = value->data[0].v_float;
gint min, max, val;
g_assert (CLUTTER_IS_PARAM_SPEC_UNIT (pspec)); g_assert (CLUTTER_IS_PARAM_SPEC_UNIT (pspec));
/* we compare the integer part of the value because the minimum value->data[0].v_float = CLAMP (value->data[0].v_float,
* and maximum values cover just that part of the representation uspec->minimum,
*/ uspec->maximum);
min = uspec->minimum;
max = uspec->maximum;
val = CLUTTER_UNITS_TO_INT (value->data[0].v_int);
val = CLAMP (val, min, max); return value->data[0].v_float != oval;
if (val != oval)
{
value->data[0].v_int = val;
return TRUE;
}
return FALSE;
} }
static gint static gint
@ -362,10 +353,12 @@ param_unit_values_cmp (GParamSpec *pspec,
const GValue *value1, const GValue *value1,
const GValue *value2) const GValue *value2)
{ {
if (value1->data[0].v_int < value2->data[0].v_int) gfloat epsilon = FLOAT_EPSILON;
return -1;
if (value1->data[0].v_float < value2->data[0].v_float)
return - (value2->data[0].v_float - value1->data[0].v_float > epsilon);
else else
return value1->data[0].v_int > value2->data[0].v_int; return value1->data[0].v_float - value2->data[0].v_float > epsilon;
} }
GType GType