cogl-pipeline: Fix comparing the color in set_layer_combine_constant

In cogl_pipeline_set_layer_combine_constant it was comparing whether
the new color is the same as the old color using a memcmp on the
constant_color parameter. However the combine constant is stored in
the layer data as an array of four floats but the passed in color is a
CoglColor (which is currently an array of four guint8s). This was
causing valgrind errors and presumably also the check for setting the
same color twice would always fail.

This patch makes it do the conversion to a float array upfront before
the comparison.
This commit is contained in:
Neil Roberts 2011-02-01 17:38:58 +00:00
parent a573ad05c9
commit 5740a5a38a

View File

@ -5264,6 +5264,7 @@ cogl_pipeline_set_layer_combine_constant (CoglPipeline *pipeline,
CoglPipelineLayer *layer; CoglPipelineLayer *layer;
CoglPipelineLayer *authority; CoglPipelineLayer *authority;
CoglPipelineLayer *new; CoglPipelineLayer *new;
float color_as_floats[4];
g_return_if_fail (cogl_is_pipeline (pipeline)); g_return_if_fail (cogl_is_pipeline (pipeline));
@ -5279,8 +5280,13 @@ cogl_pipeline_set_layer_combine_constant (CoglPipeline *pipeline,
* state we want to change */ * state we want to change */
authority = _cogl_pipeline_layer_get_authority (layer, state); authority = _cogl_pipeline_layer_get_authority (layer, state);
color_as_floats[0] = cogl_color_get_red_float (constant_color);
color_as_floats[1] = cogl_color_get_green_float (constant_color);
color_as_floats[2] = cogl_color_get_blue_float (constant_color);
color_as_floats[3] = cogl_color_get_alpha_float (constant_color);
if (memcmp (authority->big_state->texture_combine_constant, if (memcmp (authority->big_state->texture_combine_constant,
constant_color, sizeof (float) * 4) == 0) color_as_floats, sizeof (float) * 4) == 0)
return; return;
new = _cogl_pipeline_layer_pre_change_notify (pipeline, layer, state); new = _cogl_pipeline_layer_pre_change_notify (pipeline, layer, state);
@ -5301,7 +5307,7 @@ cogl_pipeline_set_layer_combine_constant (CoglPipeline *pipeline,
CoglPipelineLayerBigState *old_big_state = old_authority->big_state; CoglPipelineLayerBigState *old_big_state = old_authority->big_state;
if (memcmp (old_big_state->texture_combine_constant, if (memcmp (old_big_state->texture_combine_constant,
constant_color, sizeof (float) * 4) == 0) color_as_floats, sizeof (float) * 4) == 0)
{ {
layer->differences &= ~state; layer->differences &= ~state;
@ -5314,14 +5320,9 @@ cogl_pipeline_set_layer_combine_constant (CoglPipeline *pipeline,
} }
} }
layer->big_state->texture_combine_constant[0] = memcpy (layer->big_state->texture_combine_constant,
cogl_color_get_red_float (constant_color); color_as_floats,
layer->big_state->texture_combine_constant[1] = sizeof (color_as_floats));
cogl_color_get_green_float (constant_color);
layer->big_state->texture_combine_constant[2] =
cogl_color_get_blue_float (constant_color);
layer->big_state->texture_combine_constant[3] =
cogl_color_get_alpha_float (constant_color);
/* If we weren't previously the authority on this state then we need /* If we weren't previously the authority on this state then we need
* to extended our differences mask and so it's possible that some * to extended our differences mask and so it's possible that some