actor: Deprecate :clip and introduce :clip-rect instead
The :clip property still uses ClutterGeometry, which is a very bad rectangle type. Since we cannot change the type of the property compatibly, we should introduce a new property using ClutterRect instead. This also matches the ClutterActor.set_clip() API, which uses a decomposed rectangle with floating point values, like we do with set_position() and set_size().
This commit is contained in:
parent
9515cc5b94
commit
7a59b69f96
@ -672,7 +672,7 @@ struct _ClutterActorPrivate
|
||||
ClutterAllocationFlags allocation_flags;
|
||||
|
||||
/* clip, in actor coordinates */
|
||||
cairo_rectangle_t clip;
|
||||
ClutterRect clip;
|
||||
|
||||
/* the cached transformation matrix; see apply_transform() */
|
||||
CoglMatrix transform;
|
||||
@ -857,7 +857,8 @@ enum
|
||||
PROP_DEPTH, /* XXX:2.0 remove */
|
||||
PROP_Z_POSITION,
|
||||
|
||||
PROP_CLIP,
|
||||
PROP_CLIP, /* XXX:2.0 remove */
|
||||
PROP_CLIP_RECT,
|
||||
PROP_HAS_CLIP,
|
||||
PROP_CLIP_TO_ALLOCATION,
|
||||
|
||||
@ -3686,10 +3687,10 @@ clutter_actor_paint (ClutterActor *self)
|
||||
|
||||
if (priv->has_clip)
|
||||
{
|
||||
cogl_clip_push_rectangle (priv->clip.x,
|
||||
priv->clip.y,
|
||||
priv->clip.x + priv->clip.width,
|
||||
priv->clip.y + priv->clip.height);
|
||||
cogl_clip_push_rectangle (priv->clip.origin.x,
|
||||
priv->clip.origin.y,
|
||||
priv->clip.origin.x + priv->clip.size.width,
|
||||
priv->clip.origin.y + priv->clip.size.height);
|
||||
clip_set = TRUE;
|
||||
}
|
||||
else if (priv->clip_to_allocation)
|
||||
@ -4759,6 +4760,28 @@ clutter_actor_set_anchor_coord (ClutterActor *self,
|
||||
g_object_thaw_notify (obj);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_actor_set_clip_rect (ClutterActor *self,
|
||||
const ClutterRect *clip)
|
||||
{
|
||||
ClutterActorPrivate *priv = self->priv;
|
||||
GObject *obj = G_OBJECT (self);
|
||||
|
||||
if (clip != NULL)
|
||||
{
|
||||
priv->clip = *clip;
|
||||
priv->has_clip = TRUE;
|
||||
}
|
||||
else
|
||||
priv->has_clip = FALSE;
|
||||
|
||||
clutter_actor_queue_redraw (self);
|
||||
|
||||
g_object_notify_by_pspec (obj, obj_props[PROP_CLIP]); /* XXX:2.0 - remove */
|
||||
g_object_notify_by_pspec (obj, obj_props[PROP_CLIP_RECT]);
|
||||
g_object_notify_by_pspec (obj, obj_props[PROP_HAS_CLIP]);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_actor_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
@ -4942,7 +4965,7 @@ clutter_actor_set_property (GObject *object,
|
||||
clutter_actor_set_scale_gravity (actor, g_value_get_enum (value));
|
||||
break;
|
||||
|
||||
case PROP_CLIP: /* XXX:2.0 - use ClutterRect */
|
||||
case PROP_CLIP: /* XXX:2.0 - remove */
|
||||
{
|
||||
const ClutterGeometry *geom = g_value_get_boxed (value);
|
||||
|
||||
@ -4952,6 +4975,10 @@ clutter_actor_set_property (GObject *object,
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_CLIP_RECT:
|
||||
clutter_actor_set_clip_rect (actor, g_value_get_boxed (value));
|
||||
break;
|
||||
|
||||
case PROP_CLIP_TO_ALLOCATION:
|
||||
clutter_actor_set_clip_to_allocation (actor, g_value_get_boolean (value));
|
||||
break;
|
||||
@ -5282,19 +5309,23 @@ clutter_actor_get_property (GObject *object,
|
||||
g_value_set_boolean (value, priv->has_clip);
|
||||
break;
|
||||
|
||||
case PROP_CLIP: /* XXX:2.0 - use ClutterRect */
|
||||
case PROP_CLIP: /* XXX:2.0 - remove */
|
||||
{
|
||||
ClutterGeometry clip;
|
||||
|
||||
clip.x = CLUTTER_NEARBYINT (priv->clip.x);
|
||||
clip.y = CLUTTER_NEARBYINT (priv->clip.y);
|
||||
clip.width = CLUTTER_NEARBYINT (priv->clip.width);
|
||||
clip.height = CLUTTER_NEARBYINT (priv->clip.height);
|
||||
clip.x = CLUTTER_NEARBYINT (priv->clip.origin.x);
|
||||
clip.y = CLUTTER_NEARBYINT (priv->clip.origin.y);
|
||||
clip.width = CLUTTER_NEARBYINT (priv->clip.size.width);
|
||||
clip.height = CLUTTER_NEARBYINT (priv->clip.size.height);
|
||||
|
||||
g_value_set_boxed (value, &clip);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_CLIP_RECT:
|
||||
g_value_set_boxed (value, &priv->clip);
|
||||
break;
|
||||
|
||||
case PROP_CLIP_TO_ALLOCATION:
|
||||
g_value_set_boolean (value, priv->clip_to_allocation);
|
||||
break;
|
||||
@ -5824,18 +5855,18 @@ clutter_actor_update_default_paint_volume (ClutterActor *self,
|
||||
ClutterActor *child;
|
||||
|
||||
if (priv->has_clip &&
|
||||
priv->clip.width >= 0 &&
|
||||
priv->clip.height >= 0)
|
||||
priv->clip.size.width >= 0 &&
|
||||
priv->clip.size.height >= 0)
|
||||
{
|
||||
ClutterVertex origin;
|
||||
|
||||
origin.x = priv->clip.x;
|
||||
origin.y = priv->clip.y;
|
||||
origin.x = priv->clip.origin.x;
|
||||
origin.y = priv->clip.origin.y;
|
||||
origin.z = 0;
|
||||
|
||||
clutter_paint_volume_set_origin (volume, &origin);
|
||||
clutter_paint_volume_set_width (volume, priv->clip.width);
|
||||
clutter_paint_volume_set_height (volume, priv->clip.height);
|
||||
clutter_paint_volume_set_width (volume, priv->clip.size.width);
|
||||
clutter_paint_volume_set_height (volume, priv->clip.size.height);
|
||||
|
||||
res = TRUE;
|
||||
}
|
||||
@ -6594,18 +6625,38 @@ clutter_actor_class_init (ClutterActorClass *klass)
|
||||
/**
|
||||
* ClutterActor:clip:
|
||||
*
|
||||
* The clip region for the actor, in actor-relative coordinates
|
||||
* The visible region of the actor, in actor-relative coordinates
|
||||
*
|
||||
* Every part of the actor outside the clip region will not be
|
||||
* painted
|
||||
* Deprecated: 1.12: Use #ClutterActor:clip-rect instead.
|
||||
*/
|
||||
obj_props[PROP_CLIP] = /* XXX:2.0 - use ClutterRect */
|
||||
obj_props[PROP_CLIP] = /* XXX:2.0 - remove */
|
||||
g_param_spec_boxed ("clip",
|
||||
P_("Clip"),
|
||||
P_("The clip region for the actor"),
|
||||
CLUTTER_TYPE_GEOMETRY,
|
||||
CLUTTER_PARAM_READWRITE);
|
||||
|
||||
/**
|
||||
* ClutterActor:clip-rect:
|
||||
*
|
||||
* The visible region of the actor, in actor-relative coordinates,
|
||||
* expressed as a #ClutterRect.
|
||||
*
|
||||
* Setting this property to %NULL will unset the existing clip.
|
||||
*
|
||||
* Setting this property will change the #ClutterActor:has-clip
|
||||
* property as a side effect.
|
||||
*
|
||||
* Since: 1.12
|
||||
*/
|
||||
obj_props[PROP_CLIP_RECT] =
|
||||
g_param_spec_boxed ("clip-rect",
|
||||
P_("Clip Rectangle"),
|
||||
P_("The visible region of the actor"),
|
||||
CLUTTER_TYPE_RECT,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
|
||||
/**
|
||||
* ClutterActor:name:
|
||||
*
|
||||
@ -11947,29 +11998,33 @@ clutter_actor_set_clip (ClutterActor *self,
|
||||
gfloat height)
|
||||
{
|
||||
ClutterActorPrivate *priv;
|
||||
GObject *obj;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
|
||||
priv = self->priv;
|
||||
|
||||
if (priv->has_clip &&
|
||||
priv->clip.x == xoff &&
|
||||
priv->clip.y == yoff &&
|
||||
priv->clip.width == width &&
|
||||
priv->clip.height == height)
|
||||
priv->clip.origin.x == xoff &&
|
||||
priv->clip.origin.y == yoff &&
|
||||
priv->clip.size.width == width &&
|
||||
priv->clip.size.height == height)
|
||||
return;
|
||||
|
||||
priv->clip.x = xoff;
|
||||
priv->clip.y = yoff;
|
||||
priv->clip.width = width;
|
||||
priv->clip.height = height;
|
||||
obj = G_OBJECT (self);
|
||||
|
||||
priv->clip.origin.x = xoff;
|
||||
priv->clip.origin.y = yoff;
|
||||
priv->clip.size.width = width;
|
||||
priv->clip.size.height = height;
|
||||
|
||||
priv->has_clip = TRUE;
|
||||
|
||||
clutter_actor_queue_redraw (self);
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_HAS_CLIP]);
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CLIP]);
|
||||
g_object_notify_by_pspec (obj, obj_props[PROP_CLIP]);
|
||||
g_object_notify_by_pspec (obj, obj_props[PROP_CLIP_RECT]);
|
||||
g_object_notify_by_pspec (obj, obj_props[PROP_HAS_CLIP]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -12023,7 +12078,7 @@ clutter_actor_has_clip (ClutterActor *self)
|
||||
* @height: (out) (allow-none): return location for the height of
|
||||
* the clip rectangle, or %NULL
|
||||
*
|
||||
* Gets the clip area for @self, if any is set
|
||||
* Gets the clip area for @self, if any is set.
|
||||
*
|
||||
* Since: 0.6
|
||||
*/
|
||||
@ -12044,16 +12099,16 @@ clutter_actor_get_clip (ClutterActor *self,
|
||||
return;
|
||||
|
||||
if (xoff != NULL)
|
||||
*xoff = priv->clip.x;
|
||||
*xoff = priv->clip.origin.x;
|
||||
|
||||
if (yoff != NULL)
|
||||
*yoff = priv->clip.y;
|
||||
*yoff = priv->clip.origin.y;
|
||||
|
||||
if (width != NULL)
|
||||
*width = priv->clip.width;
|
||||
*width = priv->clip.size.width;
|
||||
|
||||
if (height != NULL)
|
||||
*height = priv->clip.height;
|
||||
*height = priv->clip.size.height;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -16507,6 +16562,7 @@ clutter_actor_set_clip_to_allocation (ClutterActor *self,
|
||||
clutter_actor_queue_redraw (self);
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CLIP_TO_ALLOCATION]);
|
||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_HAS_CLIP]);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user