diff --git a/clutter/Makefile.am b/clutter/Makefile.am index b7cefafe8..642bb1d6b 100644 --- a/clutter/Makefile.am +++ b/clutter/Makefile.am @@ -139,6 +139,7 @@ source_h = \ source_c = \ $(srcdir)/clutter-action.c \ + $(srcdir)/clutter-actor-box.c \ $(srcdir)/clutter-actor-meta.c \ $(srcdir)/clutter-actor.c \ $(srcdir)/clutter-align-constraint.c \ diff --git a/clutter/clutter-actor-box.c b/clutter/clutter-actor-box.c new file mode 100644 index 000000000..080578a50 --- /dev/null +++ b/clutter/clutter-actor-box.c @@ -0,0 +1,440 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "clutter-types.h" +#include "clutter-interval.h" +#include "clutter-private.h" + +/** + * clutter_actor_box_new: + * @x_1: X coordinate of the top left point + * @y_1: Y coordinate of the top left point + * @x_2: X coordinate of the bottom right point + * @y_2: Y coordinate of the bottom right point + * + * Allocates a new #ClutterActorBox using the passed coordinates + * for the top left and bottom right points + * + * Return value: the newly allocated #ClutterActorBox. Use + * clutter_actor_box_free() to free the resources + * + * Since: 1.0 + */ +ClutterActorBox * +clutter_actor_box_new (gfloat x_1, + gfloat y_1, + gfloat x_2, + gfloat y_2) +{ + ClutterActorBox *box; + + box = g_slice_new (ClutterActorBox); + box->x1 = x_1; + box->y1 = y_1; + box->x2 = x_2; + box->y2 = y_2; + + return box; +} + +/** + * clutter_actor_box_copy: + * @box: a #ClutterActorBox + * + * Copies @box + * + * Return value: a newly allocated copy of #ClutterActorBox. Use + * clutter_actor_box_free() to free the allocated resources + * + * Since: 1.0 + */ +ClutterActorBox * +clutter_actor_box_copy (const ClutterActorBox *box) +{ + if (G_LIKELY (box != NULL)) + return g_slice_dup (ClutterActorBox, box); + + return NULL; +} + +/** + * clutter_actor_box_free: + * @box: a #ClutterActorBox + * + * Frees a #ClutterActorBox allocated using clutter_actor_box_new() + * or clutter_actor_box_copy() + * + * Since: 1.0 + */ +void +clutter_actor_box_free (ClutterActorBox *box) +{ + if (G_LIKELY (box != NULL)) + g_slice_free (ClutterActorBox, box); +} + +static gboolean +clutter_actor_box_progress (const GValue *a, + const GValue *b, + gdouble factor, + GValue *retval) +{ + ClutterActorBox res = { 0, }; + + clutter_actor_box_interpolate (g_value_get_boxed (a), + g_value_get_boxed (b), + factor, + &res); + + g_value_set_boxed (retval, &res); + + return TRUE; +} + +GType +clutter_actor_box_get_type (void) +{ + static GType our_type = 0; + + if (G_UNLIKELY (our_type == 0)) + { + our_type = + g_boxed_type_register_static (I_("ClutterActorBox"), + (GBoxedCopyFunc) clutter_actor_box_copy, + (GBoxedFreeFunc) clutter_actor_box_free); + + clutter_interval_register_progress_func (our_type, + clutter_actor_box_progress); + } + + return our_type; +} + +/** + * clutter_actor_box_equal: + * @box_a: a #ClutterActorBox + * @box_b: a #ClutterActorBox + * + * Checks @box_a and @box_b for equality + * + * Return value: %TRUE if the passed #ClutterActorBox are equal + * + * Since: 1.0 + */ +gboolean +clutter_actor_box_equal (const ClutterActorBox *box_a, + const ClutterActorBox *box_b) +{ + g_return_val_if_fail (box_a != NULL && box_b != NULL, FALSE); + + if (box_a == box_b) + return TRUE; + + return box_a->x1 == box_b->x1 && box_a->y1 == box_b->y1 && + box_a->x2 == box_b->x2 && box_a->y2 == box_b->y2; +} + +/** + * clutter_actor_box_get_x: + * @box: a #ClutterActorBox + * + * Retrieves the X coordinate of the origin of @box + * + * Return value: the X coordinate of the origin + * + * Since: 1.0 + */ +gfloat +clutter_actor_box_get_x (const ClutterActorBox *box) +{ + g_return_val_if_fail (box != NULL, 0.); + + return box->x1; +} + +/** + * clutter_actor_box_get_y: + * @box: a #ClutterActorBox + * + * Retrieves the Y coordinate of the origin of @box + * + * Return value: the Y coordinate of the origin + * + * Since: 1.0 + */ +gfloat +clutter_actor_box_get_y (const ClutterActorBox *box) +{ + g_return_val_if_fail (box != NULL, 0.); + + return box->y1; +} + +/** + * clutter_actor_box_get_width: + * @box: a #ClutterActorBox + * + * Retrieves the width of the @box + * + * Return value: the width of the box + * + * Since: 1.0 + */ +gfloat +clutter_actor_box_get_width (const ClutterActorBox *box) +{ + g_return_val_if_fail (box != NULL, 0.); + + return box->x2 - box->x1; +} + +/** + * clutter_actor_box_get_height: + * @box: a #ClutterActorBox + * + * Retrieves the height of the @box + * + * Return value: the height of the box + * + * Since: 1.0 + */ +gfloat +clutter_actor_box_get_height (const ClutterActorBox *box) +{ + g_return_val_if_fail (box != NULL, 0.); + + return box->y2 - box->y1; +} + +/** + * clutter_actor_box_get_origin: + * @box: a #ClutterActorBox + * @x: (out) (allow-none): return location for the X coordinate, or %NULL + * @y: (out) (allow-none): return location for the Y coordinate, or %NULL + * + * Retrieves the origin of @box + * + * Since: 1.0 + */ +void +clutter_actor_box_get_origin (const ClutterActorBox *box, + gfloat *x, + gfloat *y) +{ + g_return_if_fail (box != NULL); + + if (x) + *x = box->x1; + + if (y) + *y = box->y1; +} + +/** + * clutter_actor_box_get_size: + * @box: a #ClutterActorBox + * @width: (out) (allow-none): return location for the width, or %NULL + * @height: (out) (allow-none): return location for the height, or %NULL + * + * Retrieves the size of @box + * + * Since: 1.0 + */ +void +clutter_actor_box_get_size (const ClutterActorBox *box, + gfloat *width, + gfloat *height) +{ + g_return_if_fail (box != NULL); + + if (width) + *width = box->x2 - box->x1; + + if (height) + *height = box->y2 - box->y1; +} + +/** + * clutter_actor_box_get_area: + * @box: a #ClutterActorBox + * + * Retrieves the area of @box + * + * Return value: the area of a #ClutterActorBox, in pixels + * + * Since: 1.0 + */ +gfloat +clutter_actor_box_get_area (const ClutterActorBox *box) +{ + g_return_val_if_fail (box != NULL, 0.); + + return (box->x2 - box->x1) * (box->y2 - box->y1); +} + +/** + * clutter_actor_box_contains: + * @box: a #ClutterActorBox + * @x: X coordinate of the point + * @y: Y coordinate of the point + * + * Checks whether a point with @x, @y coordinates is contained + * withing @box + * + * Return value: %TRUE if the point is contained by the #ClutterActorBox + * + * Since: 1.0 + */ +gboolean +clutter_actor_box_contains (const ClutterActorBox *box, + gfloat x, + gfloat y) +{ + g_return_val_if_fail (box != NULL, FALSE); + + return (x > box->x1 && x < box->x2) && + (y > box->y1 && y < box->y2); +} + +/** + * clutter_actor_box_from_vertices: + * @box: a #ClutterActorBox + * @verts: (array fixed-size=4): array of four #ClutterVertex + * + * Calculates the bounding box represented by the four vertices; for details + * of the vertex array see clutter_actor_get_abs_allocation_vertices(). + * + * Since: 1.0 + */ +void +clutter_actor_box_from_vertices (ClutterActorBox *box, + const ClutterVertex verts[]) +{ + gfloat x_1, x_2, y_1, y_2; + + g_return_if_fail (box != NULL); + g_return_if_fail (verts != NULL); + + /* 4-way min/max */ + x_1 = verts[0].x; + y_1 = verts[0].y; + + if (verts[1].x < x_1) + x_1 = verts[1].x; + + if (verts[2].x < x_1) + x_1 = verts[2].x; + + if (verts[3].x < x_1) + x_1 = verts[3].x; + + if (verts[1].y < y_1) + y_1 = verts[1].y; + + if (verts[2].y < y_1) + y_1 = verts[2].y; + + if (verts[3].y < y_1) + y_1 = verts[3].y; + + x_2 = verts[0].x; + y_2 = verts[0].y; + + if (verts[1].x > x_2) + x_2 = verts[1].x; + + if (verts[2].x > x_2) + x_2 = verts[2].x; + + if (verts[3].x > x_2) + x_2 = verts[3].x; + + if (verts[1].y > y_2) + y_2 = verts[1].y; + + if (verts[2].y > y_2) + y_2 = verts[2].y; + + if (verts[3].y > y_2) + y_2 = verts[3].y; + + box->x1 = x_1; + box->x2 = x_2; + box->y1 = y_1; + box->y2 = y_2; +} + +/** + * clutter_actor_box_interpolate: + * @initial: the initial #ClutterActorBox + * @final: the final #ClutterActorBox + * @progress: the interpolation progress + * @result: (out): return location for the interpolation + * + * Interpolates between @initial and @final #ClutterActorBoxes + * using @progress + * + * Since: 1.2 + */ +void +clutter_actor_box_interpolate (const ClutterActorBox *initial, + const ClutterActorBox *final, + gdouble progress, + ClutterActorBox *result) +{ + g_return_if_fail (initial != NULL); + g_return_if_fail (final != NULL); + g_return_if_fail (result != NULL); + + result->x1 = initial->x1 + (final->x1 - initial->x1) * progress; + result->y1 = initial->y1 + (final->y1 - initial->y1) * progress; + result->x2 = initial->x2 + (final->x2 - initial->x2) * progress; + result->y2 = initial->y2 + (final->y2 - initial->y2) * progress; +} + +/** + * clutter_actor_box_clamp_to_pixel: + * @box: (inout): the #ClutterActorBox to clamp + * + * Clamps the components of @box to the nearest integer + * + * Since: 1.2 + */ +void +clutter_actor_box_clamp_to_pixel (ClutterActorBox *box) +{ + g_return_if_fail (box != NULL); + + box->x1 = floorf (box->x1); + box->y1 = floorf (box->y1); + box->x2 = ceilf (box->x2); + box->y2 = ceilf (box->y2); +} + +/** + * clutter_actor_box_union: + * @a: (in) the first #ClutterActorBox + * @b: (in): the second #ClutterActorBox + * @result: (out): the #ClutterActorBox representing a union + * of @a and @b + * + * Unions the two boxes @a and @b and stores the result in @result. + * + * Since: 1.4 + */ +void +clutter_actor_box_union (const ClutterActorBox *a, + const ClutterActorBox *b, + ClutterActorBox *result) +{ + g_return_if_fail (a != NULL); + g_return_if_fail (b != NULL); + g_return_if_fail (result != NULL); + + result->x1 = MIN (a->x1, b->x1); + result->y1 = MIN (a->y1, b->y1); + + result->x2 = MAX (a->x2, b->x2); + result->y2 = MAX (a->y2, b->y2); +} diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index d08fcd042..49d28ab94 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -9340,444 +9340,6 @@ clutter_vertex_get_type (void) return our_type; } -/* - * ClutterActorBox - */ - -/** - * clutter_actor_box_new: - * @x_1: X coordinate of the top left point - * @y_1: Y coordinate of the top left point - * @x_2: X coordinate of the bottom right point - * @y_2: Y coordinate of the bottom right point - * - * Allocates a new #ClutterActorBox using the passed coordinates - * for the top left and bottom right points - * - * Return value: the newly allocated #ClutterActorBox. Use - * clutter_actor_box_free() to free the resources - * - * Since: 1.0 - */ -ClutterActorBox * -clutter_actor_box_new (gfloat x_1, - gfloat y_1, - gfloat x_2, - gfloat y_2) -{ - ClutterActorBox *box; - - box = g_slice_new (ClutterActorBox); - box->x1 = x_1; - box->y1 = y_1; - box->x2 = x_2; - box->y2 = y_2; - - return box; -} - -/** - * clutter_actor_box_copy: - * @box: a #ClutterActorBox - * - * Copies @box - * - * Return value: a newly allocated copy of #ClutterActorBox. Use - * clutter_actor_box_free() to free the allocated resources - * - * Since: 1.0 - */ -ClutterActorBox * -clutter_actor_box_copy (const ClutterActorBox *box) -{ - if (G_LIKELY (box != NULL)) - return g_slice_dup (ClutterActorBox, box); - - return NULL; -} - -/** - * clutter_actor_box_free: - * @box: a #ClutterActorBox - * - * Frees a #ClutterActorBox allocated using clutter_actor_box_new() - * or clutter_actor_box_copy() - * - * Since: 1.0 - */ -void -clutter_actor_box_free (ClutterActorBox *box) -{ - if (G_LIKELY (box != NULL)) - g_slice_free (ClutterActorBox, box); -} - -static gboolean -clutter_actor_box_progress (const GValue *a, - const GValue *b, - gdouble factor, - GValue *retval) -{ - ClutterActorBox res = { 0, }; - - clutter_actor_box_interpolate (g_value_get_boxed (a), - g_value_get_boxed (b), - factor, - &res); - - g_value_set_boxed (retval, &res); - - return TRUE; -} - -GType -clutter_actor_box_get_type (void) -{ - static GType our_type = 0; - - if (G_UNLIKELY (our_type == 0)) - { - our_type = - g_boxed_type_register_static (I_("ClutterActorBox"), - (GBoxedCopyFunc) clutter_actor_box_copy, - (GBoxedFreeFunc) clutter_actor_box_free); - - clutter_interval_register_progress_func (our_type, - clutter_actor_box_progress); - } - - return our_type; -} - -/** - * clutter_actor_box_equal: - * @box_a: a #ClutterActorBox - * @box_b: a #ClutterActorBox - * - * Checks @box_a and @box_b for equality - * - * Return value: %TRUE if the passed #ClutterActorBox are equal - * - * Since: 1.0 - */ -gboolean -clutter_actor_box_equal (const ClutterActorBox *box_a, - const ClutterActorBox *box_b) -{ - g_return_val_if_fail (box_a != NULL && box_b != NULL, FALSE); - - if (box_a == box_b) - return TRUE; - - return box_a->x1 == box_b->x1 && box_a->y1 == box_b->y1 && - box_a->x2 == box_b->x2 && box_a->y2 == box_b->y2; -} - -/** - * clutter_actor_box_get_x: - * @box: a #ClutterActorBox - * - * Retrieves the X coordinate of the origin of @box - * - * Return value: the X coordinate of the origin - * - * Since: 1.0 - */ -gfloat -clutter_actor_box_get_x (const ClutterActorBox *box) -{ - g_return_val_if_fail (box != NULL, 0.); - - return box->x1; -} - -/** - * clutter_actor_box_get_y: - * @box: a #ClutterActorBox - * - * Retrieves the Y coordinate of the origin of @box - * - * Return value: the Y coordinate of the origin - * - * Since: 1.0 - */ -gfloat -clutter_actor_box_get_y (const ClutterActorBox *box) -{ - g_return_val_if_fail (box != NULL, 0.); - - return box->y1; -} - -/** - * clutter_actor_box_get_width: - * @box: a #ClutterActorBox - * - * Retrieves the width of the @box - * - * Return value: the width of the box - * - * Since: 1.0 - */ -gfloat -clutter_actor_box_get_width (const ClutterActorBox *box) -{ - g_return_val_if_fail (box != NULL, 0.); - - return box->x2 - box->x1; -} - -/** - * clutter_actor_box_get_height: - * @box: a #ClutterActorBox - * - * Retrieves the height of the @box - * - * Return value: the height of the box - * - * Since: 1.0 - */ -gfloat -clutter_actor_box_get_height (const ClutterActorBox *box) -{ - g_return_val_if_fail (box != NULL, 0.); - - return box->y2 - box->y1; -} - -/** - * clutter_actor_box_get_origin: - * @box: a #ClutterActorBox - * @x: (out) (allow-none): return location for the X coordinate, or %NULL - * @y: (out) (allow-none): return location for the Y coordinate, or %NULL - * - * Retrieves the origin of @box - * - * Since: 1.0 - */ -void -clutter_actor_box_get_origin (const ClutterActorBox *box, - gfloat *x, - gfloat *y) -{ - g_return_if_fail (box != NULL); - - if (x) - *x = box->x1; - - if (y) - *y = box->y1; -} - -/** - * clutter_actor_box_get_size: - * @box: a #ClutterActorBox - * @width: (out) (allow-none): return location for the width, or %NULL - * @height: (out) (allow-none): return location for the height, or %NULL - * - * Retrieves the size of @box - * - * Since: 1.0 - */ -void -clutter_actor_box_get_size (const ClutterActorBox *box, - gfloat *width, - gfloat *height) -{ - g_return_if_fail (box != NULL); - - if (width) - *width = box->x2 - box->x1; - - if (height) - *height = box->y2 - box->y1; -} - -/** - * clutter_actor_box_get_area: - * @box: a #ClutterActorBox - * - * Retrieves the area of @box - * - * Return value: the area of a #ClutterActorBox, in pixels - * - * Since: 1.0 - */ -gfloat -clutter_actor_box_get_area (const ClutterActorBox *box) -{ - g_return_val_if_fail (box != NULL, 0.); - - return (box->x2 - box->x1) * (box->y2 - box->y1); -} - -/** - * clutter_actor_box_contains: - * @box: a #ClutterActorBox - * @x: X coordinate of the point - * @y: Y coordinate of the point - * - * Checks whether a point with @x, @y coordinates is contained - * withing @box - * - * Return value: %TRUE if the point is contained by the #ClutterActorBox - * - * Since: 1.0 - */ -gboolean -clutter_actor_box_contains (const ClutterActorBox *box, - gfloat x, - gfloat y) -{ - g_return_val_if_fail (box != NULL, FALSE); - - return (x > box->x1 && x < box->x2) && - (y > box->y1 && y < box->y2); -} - -/** - * clutter_actor_box_from_vertices: - * @box: a #ClutterActorBox - * @verts: (array fixed-size=4): array of four #ClutterVertex - * - * Calculates the bounding box represented by the four vertices; for details - * of the vertex array see clutter_actor_get_abs_allocation_vertices(). - * - * Since: 1.0 - */ -void -clutter_actor_box_from_vertices (ClutterActorBox *box, - const ClutterVertex verts[]) -{ - gfloat x_1, x_2, y_1, y_2; - - g_return_if_fail (box != NULL); - g_return_if_fail (verts != NULL); - - /* 4-way min/max */ - x_1 = verts[0].x; - y_1 = verts[0].y; - - if (verts[1].x < x_1) - x_1 = verts[1].x; - - if (verts[2].x < x_1) - x_1 = verts[2].x; - - if (verts[3].x < x_1) - x_1 = verts[3].x; - - if (verts[1].y < y_1) - y_1 = verts[1].y; - - if (verts[2].y < y_1) - y_1 = verts[2].y; - - if (verts[3].y < y_1) - y_1 = verts[3].y; - - x_2 = verts[0].x; - y_2 = verts[0].y; - - if (verts[1].x > x_2) - x_2 = verts[1].x; - - if (verts[2].x > x_2) - x_2 = verts[2].x; - - if (verts[3].x > x_2) - x_2 = verts[3].x; - - if (verts[1].y > y_2) - y_2 = verts[1].y; - - if (verts[2].y > y_2) - y_2 = verts[2].y; - - if (verts[3].y > y_2) - y_2 = verts[3].y; - - box->x1 = x_1; - box->x2 = x_2; - box->y1 = y_1; - box->y2 = y_2; -} - -/** - * clutter_actor_box_interpolate: - * @initial: the initial #ClutterActorBox - * @final: the final #ClutterActorBox - * @progress: the interpolation progress - * @result: (out): return location for the interpolation - * - * Interpolates between @initial and @final #ClutterActorBoxes - * using @progress - * - * Since: 1.2 - */ -void -clutter_actor_box_interpolate (const ClutterActorBox *initial, - const ClutterActorBox *final, - gdouble progress, - ClutterActorBox *result) -{ - g_return_if_fail (initial != NULL); - g_return_if_fail (final != NULL); - g_return_if_fail (result != NULL); - - result->x1 = initial->x1 + (final->x1 - initial->x1) * progress; - result->y1 = initial->y1 + (final->y1 - initial->y1) * progress; - result->x2 = initial->x2 + (final->x2 - initial->x2) * progress; - result->y2 = initial->y2 + (final->y2 - initial->y2) * progress; -} - -/** - * clutter_actor_box_clamp_to_pixel: - * @box: (inout): the #ClutterActorBox to clamp - * - * Clamps the components of @box to the nearest integer - * - * Since: 1.2 - */ -void -clutter_actor_box_clamp_to_pixel (ClutterActorBox *box) -{ - g_return_if_fail (box != NULL); - - box->x1 = floorf (box->x1); - box->y1 = floorf (box->y1); - box->x2 = ceilf (box->x2); - box->y2 = ceilf (box->y2); -} - -/** - * clutter_actor_box_union: - * @a: (in) the first #ClutterActorBox - * @b: (in): the second #ClutterActorBox - * @result: (out): the #ClutterActorBox representing a union - * of @a and @b - * - * Unions the two boxes @a and @b and stores the result in @result. - * - * Since: 1.4 - */ -void -clutter_actor_box_union (const ClutterActorBox *a, - const ClutterActorBox *b, - ClutterActorBox *result) -{ - g_return_if_fail (a != NULL); - g_return_if_fail (b != NULL); - g_return_if_fail (result != NULL); - - result->x1 = MIN (a->x1, b->x1); - result->y1 = MIN (a->y1, b->y1); - - result->x2 = MAX (a->x2, b->x2); - result->y2 = MAX (a->y2, b->y2); -} - - /******************************************************************************/ struct _ShaderData