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:
Robert Bragg 2009-01-19 19:11:00 +00:00
parent df7480090d
commit 8b39bfec7f
3 changed files with 8 additions and 38 deletions

View File

@ -99,10 +99,6 @@ clutter_actor_clone_paint (ClutterActor *self)
ClutterGeometry clone_source_geom;
float x_scale;
float y_scale;
ClutterActor *stage;
ClutterPerspective perspective;
guint stage_width;
guint stage_height;
CLUTTER_NOTE (PAINT,
"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
* 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
* the scale factors to the bottom of the current model view stack...
*/
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.
*/
x_scale = (float)geom.width / clone_source_geom.width;
y_scale = (float)geom.height / clone_source_geom.height;
stage = clutter_actor_get_stage (self);
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);
}
cogl_scale (COGL_FIXED_FROM_FLOAT (x_scale), COGL_FIXED_FROM_FLOAT (y_scale));
/* The final bits of magic:
* - We need to make sure that when the clone-source actor's paint method

View File

@ -5,7 +5,7 @@ UNIT_TESTS = \
test-offscreen.c \
test-scale.c \
test-actors.c \
test-actors2.c \
test-actor-clone.c \
test-behave.c \
test-project.c \
test-perspective.c \

View File

@ -124,7 +124,7 @@ frame_cb (ClutterTimeline *timeline,
}
G_MODULE_EXPORT int
test_actors2_main (int argc, char *argv[])
test_actor_clone_main (int argc, char *argv[])
{
ClutterTimeline *timeline;
ClutterAlpha *alpha;
@ -187,11 +187,13 @@ test_actors2_main (int argc, char *argv[])
g_error ("image load failed: %s", error->message);
exit (1);
}
clutter_actor_set_size (tmp, 300, 500);
real_hand = clutter_group_new ();
clutter_container_add_actor (CLUTTER_CONTAINER (real_hand), tmp);
tmp = clutter_rectangle_new_with_color (&clr);
clutter_actor_set_size (tmp, 100, 100);
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
* 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 */
oh->hand[i] = clutter_actor_clone_new (real_hand);
clutter_actor_set_size (oh->hand[i], 200, 213);
/* Place around a circle */
w = clutter_actor_get_width (oh->hand[0]);