#include "clutter-units.h"
#include "clutter-private.h"
-#define DPI_FALLBACK 96.0
+#define DPI_FALLBACK (96.0)
+
+#define FLOAT_EPSILON (1e-30)
/**
* clutter_units_mm:
static void
clutter_value_init_unit (GValue *value)
{
- value->data[0].v_int = 0;
+ value->data[0].v_float = 0.0;
}
static void
clutter_value_copy_unit (const GValue *src,
GValue *dest)
{
- dest->data[0].v_int = src->data[0].v_int;
+ dest->data[0].v_float = src->data[0].v_float;
}
static gchar *
GTypeCValue *collect_values,
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;
}
GTypeCValue *collect_values,
guint collect_flags)
{
- gint32 *units_p = collect_values[0].v_pointer;
+ gfloat *units_p = collect_values[0].v_pointer;
if (!units_p)
return g_strdup_printf ("value location for `%s' passed as NULL",
G_VALUE_TYPE_NAME (value));
- *units_p = value->data[0].v_int;
+ *units_p = value->data[0].v_float;
return NULL;
}
clutter_value_transform_unit_int (const GValue *src,
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
clutter_value_transform_int_unit (const GValue *src,
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 = {
NULL,
clutter_value_copy_unit,
NULL,
- "i",
+ "d",
clutter_value_collect_unit,
"p",
clutter_value_lcopy_unit
{
g_return_if_fail (CLUTTER_VALUE_HOLDS_UNIT (value));
- value->data[0].v_int = units;
+ value->data[0].v_float = units;
}
/**
{
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
param_unit_set_default (GParamSpec *pspec,
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
GValue *value)
{
ClutterParamSpecUnit *uspec = CLUTTER_PARAM_SPEC_UNIT (pspec);
- gint oval = CLUTTER_UNITS_TO_INT (value->data[0].v_int);
- gint min, max, val;
+ gfloat oval = value->data[0].v_float;
g_assert (CLUTTER_IS_PARAM_SPEC_UNIT (pspec));
- /* we compare the integer part of the value because the minimum
- * and maximum values cover just that part of the representation
- */
- min = uspec->minimum;
- max = uspec->maximum;
- val = CLUTTER_UNITS_TO_INT (value->data[0].v_int);
+ value->data[0].v_float = CLAMP (value->data[0].v_float,
+ uspec->minimum,
+ uspec->maximum);
- val = CLAMP (val, min, max);
- if (val != oval)
- {
- value->data[0].v_int = val;
- return TRUE;
- }
-
- return FALSE;
+ return value->data[0].v_float != oval;
}
static gint
const GValue *value1,
const GValue *value2)
{
- if (value1->data[0].v_int < value2->data[0].v_int)
- return -1;
+ gfloat epsilon = FLOAT_EPSILON;
+
+ if (value1->data[0].v_float < value2->data[0].v_float)
+ return - (value2->data[0].v_float - value1->data[0].v_float > epsilon);
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