diff --git a/ChangeLog b/ChangeLog index 38bc499d8..ba158dbcb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2008-05-09 Emmanuele Bassi + + Bug #902 - Support transform from G_TYPE_INT to ClutterUnit + + * clutter/clutter-units.c: + (clutter_value_transform_int_unit), + (clutter_unit_get_type): Add GValue transformation function from + integer values to ClutterUnit. (#902) + + (param_unit_validate): Fix validation for ClutterParamSpecUnit; + this allows writable ClutterUnit properties. + + * clutter/clutter-fixed.c: + (clutter_value_transform_int_fixed), + (clutter_value_transform_double_fixed), + (clutter_value_transform_float_fixed): Add GValue transformation + functions from native types (int, double, float) to ClutterFixed. + + (clutter_fixed_get_type): Register the new transformation functions. + + (param_fixed_validate): Fix validation for ClutterParamSpecUnit; + this allows writable ClutterFixed properties. + 2008-05-07 Ivan Leben * clutter/cogl/cogl.h.in: diff --git a/clutter/clutter-deprecated.h b/clutter/clutter-deprecated.h index eb896e122..b093d8b1d 100644 --- a/clutter/clutter-deprecated.h +++ b/clutter/clutter-deprecated.h @@ -43,5 +43,6 @@ #define clutter_shader_is_bound clutter_shader_is_bound_REPLACED_BY_clutter_shader_is_compiled #define clutter_texture_new_from_pixbuf clutter_texture_new_from_pixbuf_DEPRECATED_BY_clutter_texture_new_from_file_OR_clutter_texture_new_AND_clutter_texture_set_from_rgb_data +#define clutter_texture_set_pixbuf clutter_texture_set_pixbuf+DEPRECATED_BY_clutter_texture_set_from_rgb_data #endif /* CLUTTER_DEPRECATED_H */ diff --git a/clutter/clutter-fixed.c b/clutter/clutter-fixed.c index 095a1f739..cd6dbef39 100644 --- a/clutter/clutter-fixed.c +++ b/clutter/clutter-fixed.c @@ -1035,7 +1035,7 @@ static void clutter_value_transform_fixed_int (const GValue *src, GValue *dest) { - dest->data[0].v_int = src->data[0].v_int; + dest->data[0].v_int = CLUTTER_FIXED_TO_INT (src->data[0].v_int); } static void @@ -1052,6 +1052,28 @@ clutter_value_transform_fixed_float (const GValue *src, dest->data[0].v_float = CLUTTER_FIXED_TO_FLOAT (src->data[0].v_int); } +static void +clutter_value_transform_int_fixed (const GValue *src, + GValue *dest) +{ + dest->data[0].v_int = CLUTTER_INT_TO_FIXED (src->data[0].v_int); +} + +static void +clutter_value_transform_double_fixed (const GValue *src, + GValue *dest) +{ + dest->data[0].v_int = CLUTTER_FLOAT_TO_FIXED (src->data[0].v_double); +} + +static void +clutter_value_transform_float_fixed (const GValue *src, + GValue *dest) +{ + dest->data[0].v_int = CLUTTER_FLOAT_TO_FIXED (src->data[0].v_float); +} + + static const GTypeValueTable _clutter_fixed_value_table = { clutter_value_init_fixed, NULL, @@ -1078,10 +1100,16 @@ clutter_fixed_get_type (void) g_value_register_transform_func (_clutter_fixed_type, G_TYPE_INT, clutter_value_transform_fixed_int); + g_value_register_transform_func (G_TYPE_INT, _clutter_fixed_type, + clutter_value_transform_int_fixed); g_value_register_transform_func (_clutter_fixed_type, G_TYPE_FLOAT, clutter_value_transform_fixed_float); + g_value_register_transform_func (G_TYPE_FLOAT, _clutter_fixed_type, + clutter_value_transform_float_fixed); g_value_register_transform_func (_clutter_fixed_type, G_TYPE_DOUBLE, clutter_value_transform_fixed_double); + g_value_register_transform_func (G_TYPE_DOUBLE, _clutter_fixed_type, + clutter_value_transform_double_fixed); } return _clutter_fixed_type; @@ -1145,13 +1173,27 @@ param_fixed_validate (GParamSpec *pspec, GValue *value) { ClutterParamSpecFixed *fspec = CLUTTER_PARAM_SPEC_FIXED (pspec); - gint oval = value->data[0].v_int; + gint oval = CLUTTER_FIXED_TO_INT (value->data[0].v_int); + gint min, max, val; - value->data[0].v_int = CLAMP (value->data[0].v_int, - fspec->minimum, - fspec->maximum); + g_assert (CLUTTER_IS_PARAM_SPEC_FIXED (pspec)); - return value->data[0].v_int != oval; + /* we compare the integer part of the value because the minimum + * and maximum values cover just that part of the representation + */ + + min = fspec->minimum; + max = fspec->maximum; + val = CLUTTER_FIXED_TO_INT (value->data[0].v_int); + + val = CLAMP (val, min, max); + if (val != oval) + { + value->data[0].v_int = val; + return TRUE; + } + + return FALSE; } static gint diff --git a/clutter/clutter-units.c b/clutter/clutter-units.c index bbb48861f..97dce9790 100644 --- a/clutter/clutter-units.c +++ b/clutter/clutter-units.c @@ -4,7 +4,8 @@ * * An OpenGL based 'interactive canvas' library. * - * Authored By Tomas Frydrych + * Authored By: Tomas Frydrych + * Emmanuele Bassi * * Copyright (C) 2007 OpenedHand * @@ -29,19 +30,65 @@ * @short_description: A logical distance unit. * * Clutter units are logical units with granularity greater than that of the - * device units; they are used by #ClutterActorBox and the _units() family of - * ClutterActor functions. To convert between clutter units and device units, - * use #CLUTTER_UNITS_FROM_DEVICE and #CLUTTER_UNITS_TO_DEVICE macros. + * device units; they are used by #ClutterActorBox and the units-based family + * of #ClutterActor functions. To convert between Clutter units and device + * units, use %CLUTTER_UNITS_FROM_DEVICE and %CLUTTER_UNITS_TO_DEVICE macros. * - * Note: It is expected that as of version 0.6 all dimensions in the public - * Clutter API will be given in clutter units. In order to ease the transition, - * two extra macros have been provided, #CLUTTER_UNITS_TMP_TO_DEVICE and - * #CLUTTER_UNITS_TMP_FROM_DEVICE. In version 0.4 these are identity macros, - * but when the API transition happens will map to #CLUTTER_UNITS_TO_DEVICE and - * #CLUTTER_UNITS_FROM_DEVICE respectively. You can use these in newly written - * code as place holders. + * #ClutterUnits can be converted from other units like millimeters, + * typographic points (at the current resolution) and percentages. It is + * also possible to convert fixed point values to and from #ClutterUnit + * values. * - * Since: 0.4 + * In order to register a #ClutterUnit property, the #ClutterParamSpecUnit + * #GParamSpec sub-class should be used: + * + * |[ + * GParamSpec *pspec; + * + * pspec = clutter_param_spec_unit ("width", + * "Width", + * "Width of the actor, in units", + * 0, CLUTTER_MAXUNIT, + * 0, + * G_PARAM_READWRITE); + * g_object_class_install_property (gobject_class, PROP_WIDTH, pspec); + * ]| + * + * A #GValue holding units can be manipulated using clutter_value_set_unit() + * and clutter_value_get_unit(). #GValues containing a #ClutterUnit + * value can also be transformed to #GValues containing integer + * values - with a loss of precision: + * + * |[ + * static gboolean + * units_to_int (const GValue *src, + * GValue *dest) + * { + * g_return_val_if_fail (CLUTTER_VALUE_HOLDS_UNIT (src), FALSE); + * + * g_value_init (dest, G_TYPE_INT); + * return g_value_transform (src, &dest); + * } + * ]| + * + * The code above is equivalent to: + * + * |[ + * static gboolean + * units_to_int (const GValue *src, + * GValue *dest) + * { + * g_return_val_if_fail (CLUTTER_VALUE_HOLDS_UNIT (src), FALSE); + * + * g_value_init (dest, G_TYPE_INT); + * g_value_set_int (dest, + * CLUTTER_UNITS_TO_INT (clutter_value_get_unit (src))); + * + * return TRUE; + * } + * ]| + * + * #ClutterUnit is available since Clutter 0.4 */ #ifdef HAVE_CONFIG_H @@ -114,7 +161,14 @@ static void clutter_value_transform_unit_int (const GValue *src, GValue *dest) { - dest->data[0].v_int = src->data[0].v_int; + dest->data[0].v_int = CLUTTER_UNITS_TO_INT (src->data[0].v_int); +} + +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); } static const GTypeValueTable _clutter_unit_value_table = { @@ -143,6 +197,8 @@ clutter_unit_get_type (void) g_value_register_transform_func (_clutter_unit_type, G_TYPE_INT, clutter_value_transform_unit_int); + g_value_register_transform_func (G_TYPE_INT, _clutter_unit_type, + clutter_value_transform_int_unit); } return _clutter_unit_type; @@ -206,13 +262,26 @@ param_unit_validate (GParamSpec *pspec, GValue *value) { ClutterParamSpecUnit *uspec = CLUTTER_PARAM_SPEC_UNIT (pspec); - gint oval = value->data[0].v_int; + gint oval = CLUTTER_UNITS_TO_INT (value->data[0].v_int); + gint min, max, val; - value->data[0].v_int = CLAMP (value->data[0].v_int, - uspec->minimum, - uspec->maximum); + g_assert (CLUTTER_IS_PARAM_SPEC_UNIT (pspec)); - return value->data[0].v_int != oval; + /* 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); + + val = CLAMP (val, min, max); + if (val != oval) + { + value->data[0].v_int = val; + return TRUE; + } + + return FALSE; } static gint diff --git a/tests/test-text.c b/tests/test-text.c index 9eeb3ea0e..a44f39d4e 100644 --- a/tests/test-text.c +++ b/tests/test-text.c @@ -31,6 +31,8 @@ gboolean idle (gpointer data) clutter_actor_paint (stage); ++fps; + + return TRUE; } int