mirror of
https://github.com/brl/mutter.git
synced 2024-11-12 17:27:03 -05:00
Improves the unit test to verify more awkward scaling and some corresponding fixes
This simplifies the mucking about with the model-view matrix that was previously done which improves its efficiency when scaling is necessary. Notably: There should now be no performance advantage to using ClutterCloneTexture as a special case clone actor since this method is just as efficient. The unit test was renamed to test-actor-clone.
This commit is contained in:
parent
df7480090d
commit
8b39bfec7f
@ -99,10 +99,6 @@ clutter_actor_clone_paint (ClutterActor *self)
|
|||||||
ClutterGeometry clone_source_geom;
|
ClutterGeometry clone_source_geom;
|
||||||
float x_scale;
|
float x_scale;
|
||||||
float y_scale;
|
float y_scale;
|
||||||
ClutterActor *stage;
|
|
||||||
ClutterPerspective perspective;
|
|
||||||
guint stage_width;
|
|
||||||
guint stage_height;
|
|
||||||
|
|
||||||
CLUTTER_NOTE (PAINT,
|
CLUTTER_NOTE (PAINT,
|
||||||
"painting clone actor '%s'",
|
"painting clone actor '%s'",
|
||||||
@ -115,40 +111,11 @@ clutter_actor_clone_paint (ClutterActor *self)
|
|||||||
|
|
||||||
/* We need to scale what the clone-source actor paints to fill our own
|
/* We need to scale what the clone-source actor paints to fill our own
|
||||||
* allocation... */
|
* allocation... */
|
||||||
x_scale = geom.width / clone_source_geom.width;
|
|
||||||
y_scale = geom.height / clone_source_geom.height;
|
|
||||||
|
|
||||||
/* Once we have calculated the scale factors it's a case of pushing
|
x_scale = (float)geom.width / clone_source_geom.width;
|
||||||
* the scale factors to the bottom of the current model view stack...
|
y_scale = (float)geom.height / clone_source_geom.height;
|
||||||
*/
|
|
||||||
if (x_scale != 1.0 || y_scale != 1.0)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* FIXME - this is quite expensive, it would be good it clutter kept
|
|
||||||
* the model view matrix changes made by cogl_setup_viewport seperate
|
|
||||||
* from those made while painting actors so we could simply replace the
|
|
||||||
* later by multiplying it with the scale avoiding the call to
|
|
||||||
* _clutter_actor_apply_modelview_transform_recursive.
|
|
||||||
*/
|
|
||||||
|
|
||||||
stage = clutter_actor_get_stage (self);
|
cogl_scale (COGL_FIXED_FROM_FLOAT (x_scale), COGL_FIXED_FROM_FLOAT (y_scale));
|
||||||
if (!stage)
|
|
||||||
return;
|
|
||||||
|
|
||||||
clutter_actor_get_size (stage, &stage_width, &stage_height);
|
|
||||||
clutter_stage_get_perspectivex (CLUTTER_STAGE (stage), &perspective);
|
|
||||||
|
|
||||||
cogl_setup_viewport (stage_width, stage_height,
|
|
||||||
perspective.fovy,
|
|
||||||
perspective.aspect,
|
|
||||||
perspective.z_near,
|
|
||||||
perspective.z_far);
|
|
||||||
|
|
||||||
cogl_scale (COGL_FIXED_FROM_FLOAT (x_scale),
|
|
||||||
COGL_FIXED_FROM_FLOAT (y_scale));
|
|
||||||
|
|
||||||
_clutter_actor_apply_modelview_transform_recursive (self, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The final bits of magic:
|
/* The final bits of magic:
|
||||||
* - We need to make sure that when the clone-source actor's paint method
|
* - We need to make sure that when the clone-source actor's paint method
|
||||||
|
@ -5,7 +5,7 @@ UNIT_TESTS = \
|
|||||||
test-offscreen.c \
|
test-offscreen.c \
|
||||||
test-scale.c \
|
test-scale.c \
|
||||||
test-actors.c \
|
test-actors.c \
|
||||||
test-actors2.c \
|
test-actor-clone.c \
|
||||||
test-behave.c \
|
test-behave.c \
|
||||||
test-project.c \
|
test-project.c \
|
||||||
test-perspective.c \
|
test-perspective.c \
|
||||||
|
@ -124,7 +124,7 @@ frame_cb (ClutterTimeline *timeline,
|
|||||||
}
|
}
|
||||||
|
|
||||||
G_MODULE_EXPORT int
|
G_MODULE_EXPORT int
|
||||||
test_actors2_main (int argc, char *argv[])
|
test_actor_clone_main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
ClutterTimeline *timeline;
|
ClutterTimeline *timeline;
|
||||||
ClutterAlpha *alpha;
|
ClutterAlpha *alpha;
|
||||||
@ -187,11 +187,13 @@ test_actors2_main (int argc, char *argv[])
|
|||||||
g_error ("image load failed: %s", error->message);
|
g_error ("image load failed: %s", error->message);
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
clutter_actor_set_size (tmp, 300, 500);
|
||||||
real_hand = clutter_group_new ();
|
real_hand = clutter_group_new ();
|
||||||
clutter_container_add_actor (CLUTTER_CONTAINER (real_hand), tmp);
|
clutter_container_add_actor (CLUTTER_CONTAINER (real_hand), tmp);
|
||||||
tmp = clutter_rectangle_new_with_color (&clr);
|
tmp = clutter_rectangle_new_with_color (&clr);
|
||||||
clutter_actor_set_size (tmp, 100, 100);
|
clutter_actor_set_size (tmp, 100, 100);
|
||||||
clutter_container_add_actor (CLUTTER_CONTAINER (real_hand), tmp);
|
clutter_container_add_actor (CLUTTER_CONTAINER (real_hand), tmp);
|
||||||
|
clutter_actor_set_scale (real_hand, 0.5, 0.5);
|
||||||
|
|
||||||
/* Now stick the group we want to clone into another group with a custom
|
/* Now stick the group we want to clone into another group with a custom
|
||||||
* opacity to verify that the clones don't traverse this parent when
|
* opacity to verify that the clones don't traverse this parent when
|
||||||
@ -211,6 +213,7 @@ test_actors2_main (int argc, char *argv[])
|
|||||||
|
|
||||||
/* Create a texture from file, then clone in to same resources */
|
/* Create a texture from file, then clone in to same resources */
|
||||||
oh->hand[i] = clutter_actor_clone_new (real_hand);
|
oh->hand[i] = clutter_actor_clone_new (real_hand);
|
||||||
|
clutter_actor_set_size (oh->hand[i], 200, 213);
|
||||||
|
|
||||||
/* Place around a circle */
|
/* Place around a circle */
|
||||||
w = clutter_actor_get_width (oh->hand[0]);
|
w = clutter_actor_get_width (oh->hand[0]);
|
Loading…
Reference in New Issue
Block a user