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;
|
ClutterAllocationFlags allocation_flags;
|
||||||
|
|
||||||
/* clip, in actor coordinates */
|
/* clip, in actor coordinates */
|
||||||
cairo_rectangle_t clip;
|
ClutterRect clip;
|
||||||
|
|
||||||
/* the cached transformation matrix; see apply_transform() */
|
/* the cached transformation matrix; see apply_transform() */
|
||||||
CoglMatrix transform;
|
CoglMatrix transform;
|
||||||
@ -857,7 +857,8 @@ enum
|
|||||||
PROP_DEPTH, /* XXX:2.0 remove */
|
PROP_DEPTH, /* XXX:2.0 remove */
|
||||||
PROP_Z_POSITION,
|
PROP_Z_POSITION,
|
||||||
|
|
||||||
PROP_CLIP,
|
PROP_CLIP, /* XXX:2.0 remove */
|
||||||
|
PROP_CLIP_RECT,
|
||||||
PROP_HAS_CLIP,
|
PROP_HAS_CLIP,
|
||||||
PROP_CLIP_TO_ALLOCATION,
|
PROP_CLIP_TO_ALLOCATION,
|
||||||
|
|
||||||
@ -3686,10 +3687,10 @@ clutter_actor_paint (ClutterActor *self)
|
|||||||
|
|
||||||
if (priv->has_clip)
|
if (priv->has_clip)
|
||||||
{
|
{
|
||||||
cogl_clip_push_rectangle (priv->clip.x,
|
cogl_clip_push_rectangle (priv->clip.origin.x,
|
||||||
priv->clip.y,
|
priv->clip.origin.y,
|
||||||
priv->clip.x + priv->clip.width,
|
priv->clip.origin.x + priv->clip.size.width,
|
||||||
priv->clip.y + priv->clip.height);
|
priv->clip.origin.y + priv->clip.size.height);
|
||||||
clip_set = TRUE;
|
clip_set = TRUE;
|
||||||
}
|
}
|
||||||
else if (priv->clip_to_allocation)
|
else if (priv->clip_to_allocation)
|
||||||
@ -4759,6 +4760,28 @@ clutter_actor_set_anchor_coord (ClutterActor *self,
|
|||||||
g_object_thaw_notify (obj);
|
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
|
static void
|
||||||
clutter_actor_set_property (GObject *object,
|
clutter_actor_set_property (GObject *object,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
@ -4942,7 +4965,7 @@ clutter_actor_set_property (GObject *object,
|
|||||||
clutter_actor_set_scale_gravity (actor, g_value_get_enum (value));
|
clutter_actor_set_scale_gravity (actor, g_value_get_enum (value));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_CLIP: /* XXX:2.0 - use ClutterRect */
|
case PROP_CLIP: /* XXX:2.0 - remove */
|
||||||
{
|
{
|
||||||
const ClutterGeometry *geom = g_value_get_boxed (value);
|
const ClutterGeometry *geom = g_value_get_boxed (value);
|
||||||
|
|
||||||
@ -4952,6 +4975,10 @@ clutter_actor_set_property (GObject *object,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PROP_CLIP_RECT:
|
||||||
|
clutter_actor_set_clip_rect (actor, g_value_get_boxed (value));
|
||||||
|
break;
|
||||||
|
|
||||||
case PROP_CLIP_TO_ALLOCATION:
|
case PROP_CLIP_TO_ALLOCATION:
|
||||||
clutter_actor_set_clip_to_allocation (actor, g_value_get_boolean (value));
|
clutter_actor_set_clip_to_allocation (actor, g_value_get_boolean (value));
|
||||||
break;
|
break;
|
||||||
@ -5282,19 +5309,23 @@ clutter_actor_get_property (GObject *object,
|
|||||||
g_value_set_boolean (value, priv->has_clip);
|
g_value_set_boolean (value, priv->has_clip);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_CLIP: /* XXX:2.0 - use ClutterRect */
|
case PROP_CLIP: /* XXX:2.0 - remove */
|
||||||
{
|
{
|
||||||
ClutterGeometry clip;
|
ClutterGeometry clip;
|
||||||
|
|
||||||
clip.x = CLUTTER_NEARBYINT (priv->clip.x);
|
clip.x = CLUTTER_NEARBYINT (priv->clip.origin.x);
|
||||||
clip.y = CLUTTER_NEARBYINT (priv->clip.y);
|
clip.y = CLUTTER_NEARBYINT (priv->clip.origin.y);
|
||||||
clip.width = CLUTTER_NEARBYINT (priv->clip.width);
|
clip.width = CLUTTER_NEARBYINT (priv->clip.size.width);
|
||||||
clip.height = CLUTTER_NEARBYINT (priv->clip.height);
|
clip.height = CLUTTER_NEARBYINT (priv->clip.size.height);
|
||||||
|
|
||||||
g_value_set_boxed (value, &clip);
|
g_value_set_boxed (value, &clip);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PROP_CLIP_RECT:
|
||||||
|
g_value_set_boxed (value, &priv->clip);
|
||||||
|
break;
|
||||||
|
|
||||||
case PROP_CLIP_TO_ALLOCATION:
|
case PROP_CLIP_TO_ALLOCATION:
|
||||||
g_value_set_boolean (value, priv->clip_to_allocation);
|
g_value_set_boolean (value, priv->clip_to_allocation);
|
||||||
break;
|
break;
|
||||||
@ -5824,18 +5855,18 @@ clutter_actor_update_default_paint_volume (ClutterActor *self,
|
|||||||
ClutterActor *child;
|
ClutterActor *child;
|
||||||
|
|
||||||
if (priv->has_clip &&
|
if (priv->has_clip &&
|
||||||
priv->clip.width >= 0 &&
|
priv->clip.size.width >= 0 &&
|
||||||
priv->clip.height >= 0)
|
priv->clip.size.height >= 0)
|
||||||
{
|
{
|
||||||
ClutterVertex origin;
|
ClutterVertex origin;
|
||||||
|
|
||||||
origin.x = priv->clip.x;
|
origin.x = priv->clip.origin.x;
|
||||||
origin.y = priv->clip.y;
|
origin.y = priv->clip.origin.y;
|
||||||
origin.z = 0;
|
origin.z = 0;
|
||||||
|
|
||||||
clutter_paint_volume_set_origin (volume, &origin);
|
clutter_paint_volume_set_origin (volume, &origin);
|
||||||
clutter_paint_volume_set_width (volume, priv->clip.width);
|
clutter_paint_volume_set_width (volume, priv->clip.size.width);
|
||||||
clutter_paint_volume_set_height (volume, priv->clip.height);
|
clutter_paint_volume_set_height (volume, priv->clip.size.height);
|
||||||
|
|
||||||
res = TRUE;
|
res = TRUE;
|
||||||
}
|
}
|
||||||
@ -6594,18 +6625,38 @@ clutter_actor_class_init (ClutterActorClass *klass)
|
|||||||
/**
|
/**
|
||||||
* ClutterActor:clip:
|
* 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
|
* Deprecated: 1.12: Use #ClutterActor:clip-rect instead.
|
||||||
* painted
|
|
||||||
*/
|
*/
|
||||||
obj_props[PROP_CLIP] = /* XXX:2.0 - use ClutterRect */
|
obj_props[PROP_CLIP] = /* XXX:2.0 - remove */
|
||||||
g_param_spec_boxed ("clip",
|
g_param_spec_boxed ("clip",
|
||||||
P_("Clip"),
|
P_("Clip"),
|
||||||
P_("The clip region for the actor"),
|
P_("The clip region for the actor"),
|
||||||
CLUTTER_TYPE_GEOMETRY,
|
CLUTTER_TYPE_GEOMETRY,
|
||||||
CLUTTER_PARAM_READWRITE);
|
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:
|
* ClutterActor:name:
|
||||||
*
|
*
|
||||||
@ -11947,29 +11998,33 @@ clutter_actor_set_clip (ClutterActor *self,
|
|||||||
gfloat height)
|
gfloat height)
|
||||||
{
|
{
|
||||||
ClutterActorPrivate *priv;
|
ClutterActorPrivate *priv;
|
||||||
|
GObject *obj;
|
||||||
|
|
||||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||||
|
|
||||||
priv = self->priv;
|
priv = self->priv;
|
||||||
|
|
||||||
if (priv->has_clip &&
|
if (priv->has_clip &&
|
||||||
priv->clip.x == xoff &&
|
priv->clip.origin.x == xoff &&
|
||||||
priv->clip.y == yoff &&
|
priv->clip.origin.y == yoff &&
|
||||||
priv->clip.width == width &&
|
priv->clip.size.width == width &&
|
||||||
priv->clip.height == height)
|
priv->clip.size.height == height)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
priv->clip.x = xoff;
|
obj = G_OBJECT (self);
|
||||||
priv->clip.y = yoff;
|
|
||||||
priv->clip.width = width;
|
priv->clip.origin.x = xoff;
|
||||||
priv->clip.height = height;
|
priv->clip.origin.y = yoff;
|
||||||
|
priv->clip.size.width = width;
|
||||||
|
priv->clip.size.height = height;
|
||||||
|
|
||||||
priv->has_clip = TRUE;
|
priv->has_clip = TRUE;
|
||||||
|
|
||||||
clutter_actor_queue_redraw (self);
|
clutter_actor_queue_redraw (self);
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_HAS_CLIP]);
|
g_object_notify_by_pspec (obj, obj_props[PROP_CLIP]);
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), 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
|
* @height: (out) (allow-none): return location for the height of
|
||||||
* the clip rectangle, or %NULL
|
* 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
|
* Since: 0.6
|
||||||
*/
|
*/
|
||||||
@ -12044,16 +12099,16 @@ clutter_actor_get_clip (ClutterActor *self,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (xoff != NULL)
|
if (xoff != NULL)
|
||||||
*xoff = priv->clip.x;
|
*xoff = priv->clip.origin.x;
|
||||||
|
|
||||||
if (yoff != NULL)
|
if (yoff != NULL)
|
||||||
*yoff = priv->clip.y;
|
*yoff = priv->clip.origin.y;
|
||||||
|
|
||||||
if (width != NULL)
|
if (width != NULL)
|
||||||
*width = priv->clip.width;
|
*width = priv->clip.size.width;
|
||||||
|
|
||||||
if (height != NULL)
|
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);
|
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_CLIP_TO_ALLOCATION]);
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_HAS_CLIP]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user