clutter-{clone-,}texture weren't updating their material opacity.
cogl_set_source_color4ub was previously used to set a transparent white source color according to the actors opacity, but since cogl_set_source_color now always implies you want a solid fill we we use cogl_material_set_color4ub to achieve the same result.
This commit is contained in:
parent
4a7fa6d0fa
commit
28f9749e8e
@ -61,11 +61,11 @@ G_DEFINE_TYPE (ClutterCloneTexture,
|
|||||||
#define CLUTTER_CLONE_TEXTURE_GET_PRIVATE(obj) \
|
#define CLUTTER_CLONE_TEXTURE_GET_PRIVATE(obj) \
|
||||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), CLUTTER_TYPE_CLONE_TEXTURE, ClutterCloneTexturePrivate))
|
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), CLUTTER_TYPE_CLONE_TEXTURE, ClutterCloneTexturePrivate))
|
||||||
|
|
||||||
#define USE_COGL_MATERIAL 1
|
|
||||||
|
|
||||||
struct _ClutterCloneTexturePrivate
|
struct _ClutterCloneTexturePrivate
|
||||||
{
|
{
|
||||||
ClutterTexture *parent_texture;
|
ClutterTexture *parent_texture;
|
||||||
|
CoglHandle material;
|
||||||
guint repeat_x : 1;
|
guint repeat_x : 1;
|
||||||
guint repeat_y : 1;
|
guint repeat_y : 1;
|
||||||
};
|
};
|
||||||
@ -147,10 +147,7 @@ clutter_clone_texture_paint (ClutterActor *self)
|
|||||||
CoglHandle cogl_texture;
|
CoglHandle cogl_texture;
|
||||||
ClutterFixed t_w, t_h;
|
ClutterFixed t_w, t_h;
|
||||||
guint tex_width, tex_height;
|
guint tex_width, tex_height;
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
CoglHandle cogl_material;
|
CoglHandle cogl_material;
|
||||||
CoglFixed tex_coords[4];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
priv = CLUTTER_CLONE_TEXTURE (self)->priv;
|
priv = CLUTTER_CLONE_TEXTURE (self)->priv;
|
||||||
|
|
||||||
@ -183,7 +180,7 @@ clutter_clone_texture_paint (ClutterActor *self)
|
|||||||
CLUTTER_TEXTURE_IN_CLONE_PAINT);
|
CLUTTER_TEXTURE_IN_CLONE_PAINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_set_source_color4ub (255, 255, 255,
|
cogl_material_set_color4ub (priv->material, 0xff, 0xff, 0xff,
|
||||||
clutter_actor_get_paint_opacity (self));
|
clutter_actor_get_paint_opacity (self));
|
||||||
|
|
||||||
clutter_actor_get_allocation_coords (self, &x_1, &y_1, &x_2, &y_2);
|
clutter_actor_get_allocation_coords (self, &x_1, &y_1, &x_2, &y_2);
|
||||||
@ -193,14 +190,7 @@ clutter_clone_texture_paint (ClutterActor *self)
|
|||||||
x_1, y_1, x_2, y_2,
|
x_1, y_1, x_2, y_2,
|
||||||
clutter_actor_get_opacity (self));
|
clutter_actor_get_opacity (self));
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
cogl_material = clutter_texture_get_cogl_material (priv->parent_texture);
|
|
||||||
/* This is just a convenient way of extracting the cogl_texture for the
|
|
||||||
* the first layer of the above material... */
|
|
||||||
cogl_texture = clutter_texture_get_cogl_texture (priv->parent_texture);
|
cogl_texture = clutter_texture_get_cogl_texture (priv->parent_texture);
|
||||||
#else
|
|
||||||
cogl_texture = clutter_texture_get_cogl_texture (priv->parent_texture);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (cogl_texture == COGL_INVALID_HANDLE)
|
if (cogl_texture == COGL_INVALID_HANDLE)
|
||||||
return;
|
return;
|
||||||
@ -219,11 +209,8 @@ clutter_clone_texture_paint (ClutterActor *self)
|
|||||||
else
|
else
|
||||||
t_h = 1.0;
|
t_h = 1.0;
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
cogl_material_set_layer (priv->material, 0, cogl_texture);
|
||||||
cogl_set_source (cogl_material);
|
cogl_set_source (priv->material);
|
||||||
#else
|
|
||||||
cogl_set_source_texture (cogl_texture);
|
|
||||||
#endif
|
|
||||||
/* Parent paint translated us into position */
|
/* Parent paint translated us into position */
|
||||||
cogl_rectangle_with_texture_coords (0, 0,
|
cogl_rectangle_with_texture_coords (0, 0,
|
||||||
(float) (x_2 - x_1),
|
(float) (x_2 - x_1),
|
||||||
@ -406,6 +393,7 @@ clutter_clone_texture_init (ClutterCloneTexture *self)
|
|||||||
|
|
||||||
self->priv = priv = CLUTTER_CLONE_TEXTURE_GET_PRIVATE (self);
|
self->priv = priv = CLUTTER_CLONE_TEXTURE_GET_PRIVATE (self);
|
||||||
priv->parent_texture = NULL;
|
priv->parent_texture = NULL;
|
||||||
|
priv->material = cogl_material_new ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -79,11 +79,7 @@ struct _ClutterTexturePrivate
|
|||||||
gint height;
|
gint height;
|
||||||
gint max_tile_waste;
|
gint max_tile_waste;
|
||||||
ClutterTextureQuality filter_quality;
|
ClutterTextureQuality filter_quality;
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
CoglHandle material;
|
CoglHandle material;
|
||||||
#else
|
|
||||||
CoglHandle texture;
|
|
||||||
#endif
|
|
||||||
CoglHandle fbo_texture;
|
CoglHandle fbo_texture;
|
||||||
gboolean no_slice;
|
gboolean no_slice;
|
||||||
|
|
||||||
@ -121,7 +117,7 @@ enum
|
|||||||
PROP_REPEAT_X,
|
PROP_REPEAT_X,
|
||||||
PROP_FILTER_QUALITY,
|
PROP_FILTER_QUALITY,
|
||||||
PROP_COGL_TEXTURE,
|
PROP_COGL_TEXTURE,
|
||||||
#if USE_COGL_MATERIAL
|
#if EXPOSE_COGL_MATERIAL_PROP
|
||||||
PROP_COGL_MATERIAL,
|
PROP_COGL_MATERIAL,
|
||||||
#endif
|
#endif
|
||||||
PROP_FILENAME,
|
PROP_FILENAME,
|
||||||
@ -194,15 +190,7 @@ texture_free_gl_resources (ClutterTexture *texture)
|
|||||||
|
|
||||||
CLUTTER_MARK();
|
CLUTTER_MARK();
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
cogl_material_remove_layer (priv->material, 0);
|
cogl_material_remove_layer (priv->material, 0);
|
||||||
#else
|
|
||||||
if (priv->texture != COGL_INVALID_HANDLE)
|
|
||||||
{
|
|
||||||
cogl_texture_unref (priv->texture);
|
|
||||||
priv->texture = COGL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -214,13 +202,8 @@ clutter_texture_unrealize (ClutterActor *actor)
|
|||||||
texture = CLUTTER_TEXTURE(actor);
|
texture = CLUTTER_TEXTURE(actor);
|
||||||
priv = texture->priv;
|
priv = texture->priv;
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
if (priv->material == COGL_INVALID_HANDLE)
|
if (priv->material == COGL_INVALID_HANDLE)
|
||||||
return;
|
return;
|
||||||
#else
|
|
||||||
if (priv->texture == COGL_INVALID_HANDLE)
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* there's no need to read the pixels back when unrealizing inside
|
/* there's no need to read the pixels back when unrealizing inside
|
||||||
* a dispose run, and the dispose() call will release the GL
|
* a dispose run, and the dispose() call will release the GL
|
||||||
@ -516,9 +499,6 @@ clutter_texture_paint (ClutterActor *self)
|
|||||||
gint x_1, y_1, x_2, y_2;
|
gint x_1, y_1, x_2, y_2;
|
||||||
CoglColor transparent_col;
|
CoglColor transparent_col;
|
||||||
ClutterFixed t_w, t_h;
|
ClutterFixed t_w, t_h;
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
CoglFixed tex_coords[4];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR(texture)))
|
if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR(texture)))
|
||||||
clutter_actor_realize (CLUTTER_ACTOR(texture));
|
clutter_actor_realize (CLUTTER_ACTOR(texture));
|
||||||
@ -610,7 +590,7 @@ clutter_texture_paint (ClutterActor *self)
|
|||||||
clutter_actor_get_name (self) ? clutter_actor_get_name (self)
|
clutter_actor_get_name (self) ? clutter_actor_get_name (self)
|
||||||
: "unknown");
|
: "unknown");
|
||||||
|
|
||||||
cogl_set_source_color4ub (255, 255, 255,
|
cogl_material_set_color4ub (priv->material, 0xff, 0xff, 0xff,
|
||||||
clutter_actor_get_paint_opacity (self));
|
clutter_actor_get_paint_opacity (self));
|
||||||
|
|
||||||
clutter_actor_get_allocation_coords (self, &x_1, &y_1, &x_2, &y_2);
|
clutter_actor_get_allocation_coords (self, &x_1, &y_1, &x_2, &y_2);
|
||||||
@ -633,11 +613,7 @@ clutter_texture_paint (ClutterActor *self)
|
|||||||
t_h = 1.0;
|
t_h = 1.0;
|
||||||
|
|
||||||
/* Paint will have translated us */
|
/* Paint will have translated us */
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
cogl_set_source (priv->material);
|
cogl_set_source (priv->material);
|
||||||
#else
|
|
||||||
cogl_set_source_texture (priv->texture);
|
|
||||||
#endif
|
|
||||||
cogl_rectangle_with_texture_coords (0, 0,
|
cogl_rectangle_with_texture_coords (0, 0,
|
||||||
(float) (x_2 - x_1),
|
(float) (x_2 - x_1),
|
||||||
(float) (y_2 - y_1),
|
(float) (y_2 - y_1),
|
||||||
@ -759,7 +735,7 @@ clutter_texture_set_property (GObject *object,
|
|||||||
clutter_texture_set_cogl_texture
|
clutter_texture_set_cogl_texture
|
||||||
(texture, (CoglHandle) g_value_get_boxed (value));
|
(texture, (CoglHandle) g_value_get_boxed (value));
|
||||||
break;
|
break;
|
||||||
#if USE_COGL_MATERIAL
|
#if EXPOSE_COGL_MATERIAL_PROP
|
||||||
case PROP_COGL_MATERIAL:
|
case PROP_COGL_MATERIAL:
|
||||||
clutter_texture_set_cogl_material
|
clutter_texture_set_cogl_material
|
||||||
(texture, (CoglHandle) g_value_get_boxed (value));
|
(texture, (CoglHandle) g_value_get_boxed (value));
|
||||||
@ -825,7 +801,7 @@ clutter_texture_get_property (GObject *object,
|
|||||||
case PROP_COGL_TEXTURE:
|
case PROP_COGL_TEXTURE:
|
||||||
g_value_set_boxed (value, clutter_texture_get_cogl_texture (texture));
|
g_value_set_boxed (value, clutter_texture_get_cogl_texture (texture));
|
||||||
break;
|
break;
|
||||||
#if USE_COGL_MATERIAL
|
#if EXPOSE_COGL_MATERIAL_PROP
|
||||||
case PROP_COGL_MATERIAL:
|
case PROP_COGL_MATERIAL:
|
||||||
g_value_set_boxed (value, clutter_texture_get_cogl_material (texture));
|
g_value_set_boxed (value, clutter_texture_get_cogl_material (texture));
|
||||||
break;
|
break;
|
||||||
@ -947,7 +923,7 @@ clutter_texture_class_init (ClutterTextureClass *klass)
|
|||||||
CLUTTER_TYPE_TEXTURE_HANDLE,
|
CLUTTER_TYPE_TEXTURE_HANDLE,
|
||||||
G_PARAM_READWRITE));
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
#if EXPOSE_COGL_MATERIAL_PROP
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
(gobject_class, PROP_COGL_MATERIAL,
|
(gobject_class, PROP_COGL_MATERIAL,
|
||||||
g_param_spec_boxed ("cogl-material",
|
g_param_spec_boxed ("cogl-material",
|
||||||
@ -1122,12 +1098,8 @@ clutter_texture_init (ClutterTexture *self)
|
|||||||
priv->repeat_x = FALSE;
|
priv->repeat_x = FALSE;
|
||||||
priv->repeat_y = FALSE;
|
priv->repeat_y = FALSE;
|
||||||
priv->sync_actor_size = TRUE;
|
priv->sync_actor_size = TRUE;
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
priv->material = cogl_material_new ();
|
priv->material = cogl_material_new ();
|
||||||
priv->fbo_texture = COGL_INVALID_HANDLE;
|
priv->fbo_texture = COGL_INVALID_HANDLE;
|
||||||
#else
|
|
||||||
priv->texture = COGL_INVALID_HANDLE;
|
|
||||||
#endif
|
|
||||||
priv->fbo_handle = COGL_INVALID_HANDLE;
|
priv->fbo_handle = COGL_INVALID_HANDLE;
|
||||||
priv->local_data = NULL;
|
priv->local_data = NULL;
|
||||||
priv->keep_aspect_ratio = FALSE;
|
priv->keep_aspect_ratio = FALSE;
|
||||||
@ -1149,19 +1121,10 @@ clutter_texture_save_to_local_data (ClutterTexture *texture)
|
|||||||
priv->local_data = NULL;
|
priv->local_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
if (priv->material == COGL_INVALID_HANDLE)
|
if (priv->material == COGL_INVALID_HANDLE)
|
||||||
return;
|
return;
|
||||||
#else
|
|
||||||
if (priv->texture == COGL_INVALID_HANDLE)
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
||||||
#else
|
|
||||||
cogl_texture = priv->texture;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
priv->local_data_width = cogl_texture_get_width (cogl_texture);
|
priv->local_data_width = cogl_texture_get_width (cogl_texture);
|
||||||
priv->local_data_height = cogl_texture_get_height (cogl_texture);
|
priv->local_data_height = cogl_texture_get_height (cogl_texture);
|
||||||
@ -1216,7 +1179,7 @@ clutter_texture_load_from_local_data (ClutterTexture *texture)
|
|||||||
priv->local_data = NULL;
|
priv->local_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
#if EXPOSE_COGL_MATERIAL_PROP
|
||||||
/**
|
/**
|
||||||
* clutter_texture_get_cogl_material:
|
* clutter_texture_get_cogl_material:
|
||||||
* @texture: A #ClutterTexture
|
* @texture: A #ClutterTexture
|
||||||
@ -1283,7 +1246,6 @@ clutter_texture_set_cogl_material (ClutterTexture *texture,
|
|||||||
CoglHandle
|
CoglHandle
|
||||||
clutter_texture_get_cogl_texture (ClutterTexture *texture)
|
clutter_texture_get_cogl_texture (ClutterTexture *texture)
|
||||||
{
|
{
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
const GList *layers;
|
const GList *layers;
|
||||||
int n_layers;
|
int n_layers;
|
||||||
|
|
||||||
@ -1293,15 +1255,8 @@ clutter_texture_get_cogl_texture (ClutterTexture *texture)
|
|||||||
n_layers = g_list_length ((GList *)layers);
|
n_layers = g_list_length ((GList *)layers);
|
||||||
if (n_layers == 0)
|
if (n_layers == 0)
|
||||||
return COGL_INVALID_HANDLE;
|
return COGL_INVALID_HANDLE;
|
||||||
else if (n_layers != 1)
|
|
||||||
{
|
|
||||||
g_warning ("FIXME: Clutter texture only works with single layer"
|
|
||||||
" materials at the moment!\n");
|
|
||||||
}
|
|
||||||
return cogl_material_layer_get_texture (layers->data);
|
return cogl_material_layer_get_texture (layers->data);
|
||||||
#else
|
|
||||||
return texture->priv->texture;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1342,11 +1297,7 @@ clutter_texture_set_cogl_texture (ClutterTexture *texture,
|
|||||||
texture_free_gl_resources (texture);
|
texture_free_gl_resources (texture);
|
||||||
/* Use the new texture */
|
/* Use the new texture */
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
cogl_material_set_layer (priv->material, 0, cogl_tex);
|
cogl_material_set_layer (priv->material, 0, cogl_tex);
|
||||||
#else
|
|
||||||
priv->texture = cogl_tex;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size_change = width != priv->width || height != priv->height;
|
size_change = width != priv->width || height != priv->height;
|
||||||
priv->width = width;
|
priv->width = width;
|
||||||
@ -1931,11 +1882,7 @@ clutter_texture_set_max_tile_waste (ClutterTexture *texture,
|
|||||||
g_return_if_fail (CLUTTER_IS_TEXTURE (texture));
|
g_return_if_fail (CLUTTER_IS_TEXTURE (texture));
|
||||||
|
|
||||||
priv = texture->priv;
|
priv = texture->priv;
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
||||||
#else
|
|
||||||
cogl_texture = priv->texture;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* There's no point in changing the max_tile_waste if the texture
|
/* There's no point in changing the max_tile_waste if the texture
|
||||||
has already been created because it will be overridden with the
|
has already been created because it will be overridden with the
|
||||||
@ -1965,11 +1912,7 @@ clutter_texture_get_max_tile_waste (ClutterTexture *texture)
|
|||||||
g_return_val_if_fail (CLUTTER_IS_TEXTURE (texture), 0);
|
g_return_val_if_fail (CLUTTER_IS_TEXTURE (texture), 0);
|
||||||
|
|
||||||
priv = texture->priv;
|
priv = texture->priv;
|
||||||
#if USE_COGL_MATERIAL
|
|
||||||
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
||||||
#else
|
|
||||||
cogl_texture = priv->texture;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (cogl_texture == COGL_INVALID_HANDLE)
|
if (cogl_texture == COGL_INVALID_HANDLE)
|
||||||
return texture->priv->max_tile_waste;
|
return texture->priv->max_tile_waste;
|
||||||
@ -2436,7 +2379,7 @@ clutter_texture_handle_get_type (void)
|
|||||||
return our_type;
|
return our_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_COGL_MATERIAL
|
#if EXPOSE_COGL_MATERIAL_PROP
|
||||||
GType
|
GType
|
||||||
clutter_material_handle_get_type (void)
|
clutter_material_handle_get_type (void)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user