From 77729c73624537021da731250a82937a8216a995 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 8 Mar 2012 17:18:17 +0000 Subject: [PATCH] actor: Add minification/magnification filters These settings are informative, and will only be used by the eventual content of an actor. --- clutter/clutter-actor.c | 120 +++++++++++++++++++++++++++++++++++++++- clutter/clutter-actor.h | 8 +++ clutter/clutter-enums.h | 6 ++ 3 files changed, 133 insertions(+), 1 deletion(-) diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index acbae9568..9c3b6c26d 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -166,7 +166,9 @@ * clutter_actor_get_allocation_box (actor, &box); * * /* the cogl_texture variable is set elsewhere */ - * node = clutter_texture_node_new (cogl_texture, CLUTTER_COLOR_White); + * node = clutter_texture_node_new (cogl_texture, CLUTTER_COLOR_White, + * CLUTTER_SCALING_FILTER_BILINEAR, + * CLUTTER_SCALING_FILTER_LINEAR); * * /* paint the content of the node using the allocation */ * clutter_paint_node_add_rectangle (node, &box); @@ -588,6 +590,8 @@ struct _ClutterActorPrivate ClutterContent *content; ClutterContentGravity content_gravity; + ClutterScalingFilter min_filter; + ClutterScalingFilter mag_filter; /* used when painting, to update the paint volume */ ClutterEffect *current_effect; @@ -754,6 +758,8 @@ enum PROP_CONTENT, PROP_CONTENT_GRAVITY, PROP_CONTENT_BOX, + PROP_MINIFICATION_FILTER, + PROP_MAGNIFICATION_FILTER, PROP_LAST }; @@ -4471,6 +4477,18 @@ clutter_actor_set_property (GObject *object, clutter_actor_set_content_gravity (actor, g_value_get_enum (value)); break; + case PROP_MINIFICATION_FILTER: + clutter_actor_set_content_scaling_filters (actor, + g_value_get_enum (value), + actor->priv->mag_filter); + break; + + case PROP_MAGNIFICATION_FILTER: + clutter_actor_set_content_scaling_filters (actor, + actor->priv->min_filter, + g_value_get_enum (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -4886,6 +4904,14 @@ clutter_actor_get_property (GObject *object, } break; + case PROP_MINIFICATION_FILTER: + g_value_set_enum (value, priv->min_filter); + break; + + case PROP_MAGNIFICATION_FILTER: + g_value_set_enum (value, priv->mag_filter); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -6352,6 +6378,22 @@ clutter_actor_class_init (ClutterActorClass *klass) CLUTTER_TYPE_ACTOR_BOX, CLUTTER_PARAM_READABLE); + obj_props[PROP_MINIFICATION_FILTER] = + g_param_spec_enum ("minification-filter", + P_("Minification Filter"), + P_("The filter used when reducing the size of the content"), + CLUTTER_TYPE_SCALING_FILTER, + CLUTTER_SCALING_FILTER_LINEAR, + CLUTTER_PARAM_READWRITE); + + obj_props[PROP_MAGNIFICATION_FILTER] = + g_param_spec_enum ("magnification-filter", + P_("Magnification Filter"), + P_("The filter used when increasing the size of the content"), + CLUTTER_TYPE_SCALING_FILTER, + CLUTTER_SCALING_FILTER_LINEAR, + CLUTTER_PARAM_READWRITE); + g_object_class_install_properties (object_class, PROP_LAST, obj_props); /** @@ -6937,6 +6979,8 @@ clutter_actor_init (ClutterActor *self) * the easiest thing to compute. */ priv->content_gravity = CLUTTER_CONTENT_GRAVITY_RESIZE_FILL; + priv->min_filter = CLUTTER_SCALING_FILTER_LINEAR; + priv->mag_filter = CLUTTER_SCALING_FILTER_LINEAR; } /** @@ -17745,3 +17789,77 @@ clutter_actor_get_content_box (ClutterActor *self, break; } } + +/** + * clutter_actor_set_content_scaling_filters: + * @self: a #ClutterActor + * @min_filter: FIXME + * @mag_filter: FIXME + * + * FIXME + * + * Since: 1.10 + */ +void +clutter_actor_set_content_scaling_filters (ClutterActor *self, + ClutterScalingFilter min_filter, + ClutterScalingFilter mag_filter) +{ + ClutterActorPrivate *priv; + gboolean changed; + GObject *obj; + + g_return_if_fail (CLUTTER_IS_ACTOR (self)); + + priv = self->priv; + obj = G_OBJECT (self); + + g_object_freeze_notify (obj); + + changed = FALSE; + + if (priv->min_filter != min_filter) + { + priv->min_filter = min_filter; + changed = TRUE; + + g_object_notify_by_pspec (obj, obj_props[PROP_MINIFICATION_FILTER]); + } + + if (priv->mag_filter != mag_filter) + { + priv->mag_filter = mag_filter; + changed = TRUE; + + g_object_notify_by_pspec (obj, obj_props[PROP_MAGNIFICATION_FILTER]); + } + + if (changed) + clutter_actor_queue_redraw (self); + + g_object_thaw_notify (obj); +} + +/** + * clutter_actor_get_content_scaling_filters: + * @self: a #ClutterActor + * @min_filter: (out): FIXME + * @mag_filter: (out): FIXME + * + * FIXME + * + * Since: 1.10 + */ +void +clutter_actor_get_content_scaling_filters (ClutterActor *self, + ClutterScalingFilter *min_filter, + ClutterScalingFilter *mag_filter) +{ + g_return_if_fail (CLUTTER_IS_ACTOR (self)); + + if (min_filter != NULL) + *min_filter = self->priv->min_filter; + + if (mag_filter != NULL) + *mag_filter = self->priv->mag_filter; +} diff --git a/clutter/clutter-actor.h b/clutter/clutter-actor.h index 42f0fcea7..85b5d695b 100644 --- a/clutter/clutter-actor.h +++ b/clutter/clutter-actor.h @@ -480,6 +480,14 @@ void clutter_actor_set_content_gravity CLUTTER_AVAILABLE_IN_1_10 ClutterContentGravity clutter_actor_get_content_gravity (ClutterActor *self); CLUTTER_AVAILABLE_IN_1_10 +void clutter_actor_set_content_scaling_filters (ClutterActor *self, + ClutterScalingFilter min_filter, + ClutterScalingFilter mag_filter); +CLUTTER_AVAILABLE_IN_1_10 +void clutter_actor_get_content_scaling_filters (ClutterActor *self, + ClutterScalingFilter *min_filter, + ClutterScalingFilter *mag_filter); +CLUTTER_AVAILABLE_IN_1_10 void clutter_actor_get_content_box (ClutterActor *self, ClutterActorBox *box); CLUTTER_AVAILABLE_IN_1_10 diff --git a/clutter/clutter-enums.h b/clutter/clutter-enums.h index 8e68015b6..b9323cbb8 100644 --- a/clutter/clutter-enums.h +++ b/clutter/clutter-enums.h @@ -1149,6 +1149,12 @@ typedef enum { CLUTTER_CONTENT_GRAVITY_RESIZE_ASPECT } ClutterContentGravity; +typedef enum { + CLUTTER_SCALING_FILTER_LINEAR, + CLUTTER_SCALING_FILTER_NEAREST, + CLUTTER_SCALING_FILTER_BILINEAR +} ClutterScalingFilter; + G_END_DECLS #endif /* __CLUTTER_ENUMS_H__ */