mirror of
https://github.com/brl/mutter.git
synced 2024-11-29 19:40:43 -05:00
[cogl-material] Converts clutter-texture/clutter-clone-texture to the material API
This converts clutter-texture to use the new CoglMaterial API instead of cogl_texture_rectangle. This change does not add multi-texturing support to Clutter, it's more about aiming to deprecate cogl_texture_rectangle, and moving everything over to the cogl_set_source(material); cogl_draw_somthing(); coding pattern. With this patch, the code can be built with/without CoglMaterial support so we can do comparisons of the old/new code for a transient period. (look for the USE_COGL_MATERIAL define) Note: The FBO paths haven't currently been tested, so they may need some tweaks.
This commit is contained in:
parent
bb938ac4ff
commit
4e57972bd6
@ -61,6 +61,8 @@ 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;
|
||||||
@ -145,6 +147,10 @@ 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;
|
||||||
|
CoglFixed tex_coords[4];
|
||||||
|
#endif
|
||||||
|
|
||||||
priv = CLUTTER_CLONE_TEXTURE (self)->priv;
|
priv = CLUTTER_CLONE_TEXTURE (self)->priv;
|
||||||
|
|
||||||
@ -187,7 +193,14 @@ 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);
|
||||||
|
/* FIXME: This is a lazy 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;
|
||||||
@ -206,11 +219,24 @@ clutter_clone_texture_paint (ClutterActor *self)
|
|||||||
else
|
else
|
||||||
t_h = COGL_FIXED_1;
|
t_h = COGL_FIXED_1;
|
||||||
|
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
cogl_set_source (cogl_material);
|
||||||
|
|
||||||
|
tex_coords[0] = 0;
|
||||||
|
tex_coords[1] = 0;
|
||||||
|
tex_coords[2] = t_w;
|
||||||
|
tex_coords[3] = t_h;
|
||||||
|
cogl_material_rectangle (0, 0,
|
||||||
|
COGL_FIXED_FROM_INT (x_2 - x_1),
|
||||||
|
COGL_FIXED_FROM_INT (y_2 - y_1),
|
||||||
|
tex_coords);
|
||||||
|
#else
|
||||||
/* Parent paint translated us into position */
|
/* Parent paint translated us into position */
|
||||||
cogl_texture_rectangle (cogl_texture, 0, 0,
|
cogl_texture_rectangle (cogl_texture, 0, 0,
|
||||||
COGL_FIXED_FROM_INT (x_2 - x_1),
|
COGL_FIXED_FROM_INT (x_2 - x_1),
|
||||||
COGL_FIXED_FROM_INT (y_2 - y_1),
|
COGL_FIXED_FROM_INT (y_2 - y_1),
|
||||||
0, 0, t_w, t_h);
|
0, 0, t_w, t_h);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -79,7 +79,12 @@ 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;
|
||||||
|
#else
|
||||||
CoglHandle texture;
|
CoglHandle texture;
|
||||||
|
#endif
|
||||||
|
CoglHandle fbo_texture;
|
||||||
gboolean no_slice;
|
gboolean no_slice;
|
||||||
|
|
||||||
ClutterActor *fbo_source;
|
ClutterActor *fbo_source;
|
||||||
@ -109,6 +114,9 @@ enum
|
|||||||
PROP_REPEAT_X,
|
PROP_REPEAT_X,
|
||||||
PROP_FILTER_QUALITY,
|
PROP_FILTER_QUALITY,
|
||||||
PROP_COGL_TEXTURE,
|
PROP_COGL_TEXTURE,
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
PROP_COGL_MATERIAL,
|
||||||
|
#endif
|
||||||
PROP_FILENAME,
|
PROP_FILENAME,
|
||||||
PROP_KEEP_ASPECT_RATIO
|
PROP_KEEP_ASPECT_RATIO
|
||||||
};
|
};
|
||||||
@ -175,11 +183,15 @@ texture_free_gl_resources (ClutterTexture *texture)
|
|||||||
|
|
||||||
CLUTTER_MARK();
|
CLUTTER_MARK();
|
||||||
|
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
cogl_material_remove_layer (priv->material, 0);
|
||||||
|
#else
|
||||||
if (priv->texture != COGL_INVALID_HANDLE)
|
if (priv->texture != COGL_INVALID_HANDLE)
|
||||||
{
|
{
|
||||||
cogl_texture_unref (priv->texture);
|
cogl_texture_unref (priv->texture);
|
||||||
priv->texture = COGL_INVALID_HANDLE;
|
priv->texture = COGL_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -191,8 +203,13 @@ 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)
|
||||||
|
return;
|
||||||
|
#else
|
||||||
if (priv->texture == COGL_INVALID_HANDLE)
|
if (priv->texture == COGL_INVALID_HANDLE)
|
||||||
return;
|
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
|
||||||
@ -249,10 +266,10 @@ clutter_texture_realize (ClutterActor *actor)
|
|||||||
{
|
{
|
||||||
/* Handle FBO's */
|
/* Handle FBO's */
|
||||||
|
|
||||||
if (priv->texture != COGL_INVALID_HANDLE)
|
if (priv->fbo_texture != COGL_INVALID_HANDLE)
|
||||||
cogl_texture_unref (priv->texture);
|
cogl_texture_unref (priv->fbo_texture);
|
||||||
|
|
||||||
priv->texture
|
priv->fbo_texture
|
||||||
= cogl_texture_new_with_size
|
= cogl_texture_new_with_size
|
||||||
(priv->width,
|
(priv->width,
|
||||||
priv->height,
|
priv->height,
|
||||||
@ -260,11 +277,11 @@ clutter_texture_realize (ClutterActor *actor)
|
|||||||
priv->filter_quality == CLUTTER_TEXTURE_QUALITY_HIGH,
|
priv->filter_quality == CLUTTER_TEXTURE_QUALITY_HIGH,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888);
|
COGL_PIXEL_FORMAT_RGBA_8888);
|
||||||
|
|
||||||
cogl_texture_set_filters (priv->texture,
|
cogl_texture_set_filters (priv->fbo_texture,
|
||||||
clutter_texture_quality_to_cogl_min_filter (priv->filter_quality),
|
clutter_texture_quality_to_cogl_min_filter (priv->filter_quality),
|
||||||
clutter_texture_quality_to_cogl_mag_filter (priv->filter_quality));
|
clutter_texture_quality_to_cogl_mag_filter (priv->filter_quality));
|
||||||
|
|
||||||
priv->fbo_handle = cogl_offscreen_new_to_texture (priv->texture);
|
priv->fbo_handle = cogl_offscreen_new_to_texture (priv->fbo_texture);
|
||||||
|
|
||||||
if (priv->fbo_handle == COGL_INVALID_HANDLE)
|
if (priv->fbo_handle == COGL_INVALID_HANDLE)
|
||||||
{
|
{
|
||||||
@ -475,6 +492,9 @@ 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));
|
||||||
@ -587,10 +607,23 @@ clutter_texture_paint (ClutterActor *self)
|
|||||||
t_h = COGL_FIXED_1;
|
t_h = COGL_FIXED_1;
|
||||||
|
|
||||||
/* Paint will have translated us */
|
/* Paint will have translated us */
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
cogl_set_source (priv->material);
|
||||||
|
|
||||||
|
tex_coords[0] = 0;
|
||||||
|
tex_coords[1] = 0;
|
||||||
|
tex_coords[2] = t_w;
|
||||||
|
tex_coords[3] = t_h;
|
||||||
|
cogl_material_rectangle (0, 0,
|
||||||
|
COGL_FIXED_FROM_INT (x_2 - x_1),
|
||||||
|
COGL_FIXED_FROM_INT (y_2 - y_1),
|
||||||
|
tex_coords);
|
||||||
|
#else
|
||||||
cogl_texture_rectangle (priv->texture, 0, 0,
|
cogl_texture_rectangle (priv->texture, 0, 0,
|
||||||
COGL_FIXED_FROM_INT (x_2 - x_1),
|
COGL_FIXED_FROM_INT (x_2 - x_1),
|
||||||
COGL_FIXED_FROM_INT (y_2 - y_1),
|
COGL_FIXED_FROM_INT (y_2 - y_1),
|
||||||
0, 0, t_w, t_h);
|
0, 0, t_w, t_h);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -667,6 +700,11 @@ 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
|
||||||
|
clutter_texture_set_cogl_material
|
||||||
|
(texture, (CoglHandle) g_value_get_boxed (value));
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case PROP_FILENAME:
|
case PROP_FILENAME:
|
||||||
clutter_texture_set_from_file (texture,
|
clutter_texture_set_from_file (texture,
|
||||||
g_value_get_string (value),
|
g_value_get_string (value),
|
||||||
@ -692,6 +730,7 @@ clutter_texture_get_property (GObject *object,
|
|||||||
{
|
{
|
||||||
ClutterTexture *texture;
|
ClutterTexture *texture;
|
||||||
ClutterTexturePrivate *priv;
|
ClutterTexturePrivate *priv;
|
||||||
|
CoglHandle cogl_texture;
|
||||||
|
|
||||||
texture = CLUTTER_TEXTURE(object);
|
texture = CLUTTER_TEXTURE(object);
|
||||||
priv = texture->priv;
|
priv = texture->priv;
|
||||||
@ -702,10 +741,11 @@ clutter_texture_get_property (GObject *object,
|
|||||||
g_value_set_int (value, clutter_texture_get_max_tile_waste (texture));
|
g_value_set_int (value, clutter_texture_get_max_tile_waste (texture));
|
||||||
break;
|
break;
|
||||||
case PROP_PIXEL_FORMAT:
|
case PROP_PIXEL_FORMAT:
|
||||||
if (priv->texture == COGL_INVALID_HANDLE)
|
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
||||||
|
if (cogl_texture == COGL_INVALID_HANDLE)
|
||||||
g_value_set_int (value, COGL_PIXEL_FORMAT_ANY);
|
g_value_set_int (value, COGL_PIXEL_FORMAT_ANY);
|
||||||
else
|
else
|
||||||
g_value_set_int (value, cogl_texture_get_format (priv->texture));
|
g_value_set_int (value, cogl_texture_get_format (cogl_texture));
|
||||||
break;
|
break;
|
||||||
case PROP_SYNC_SIZE:
|
case PROP_SYNC_SIZE:
|
||||||
g_value_set_boolean (value, priv->sync_actor_size);
|
g_value_set_boolean (value, priv->sync_actor_size);
|
||||||
@ -722,6 +762,11 @@ 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
|
||||||
|
case PROP_COGL_MATERIAL:
|
||||||
|
g_value_set_boxed (value, clutter_texture_get_cogl_material (texture));
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case PROP_NO_SLICE:
|
case PROP_NO_SLICE:
|
||||||
g_value_set_boolean (value, priv->no_slice);
|
g_value_set_boolean (value, priv->no_slice);
|
||||||
break;
|
break;
|
||||||
@ -836,6 +881,17 @@ clutter_texture_class_init (ClutterTextureClass *klass)
|
|||||||
CLUTTER_TYPE_TEXTURE_HANDLE,
|
CLUTTER_TYPE_TEXTURE_HANDLE,
|
||||||
G_PARAM_READWRITE));
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
g_object_class_install_property
|
||||||
|
(gobject_class, PROP_COGL_MATERIAL,
|
||||||
|
g_param_spec_boxed ("cogl-material",
|
||||||
|
"COGL Material",
|
||||||
|
"The underlying COGL material handle used to draw "
|
||||||
|
"this actor",
|
||||||
|
CLUTTER_TYPE_MATERIAL_HANDLE,
|
||||||
|
G_PARAM_READWRITE));
|
||||||
|
#endif
|
||||||
|
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
(gobject_class, PROP_FILENAME,
|
(gobject_class, PROP_FILENAME,
|
||||||
g_param_spec_string ("filename",
|
g_param_spec_string ("filename",
|
||||||
@ -956,7 +1012,12 @@ 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->fbo_texture = COGL_INVALID_HANDLE;
|
||||||
|
#else
|
||||||
priv->texture = COGL_INVALID_HANDLE;
|
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;
|
||||||
@ -968,6 +1029,7 @@ clutter_texture_save_to_local_data (ClutterTexture *texture)
|
|||||||
ClutterTexturePrivate *priv;
|
ClutterTexturePrivate *priv;
|
||||||
int bpp;
|
int bpp;
|
||||||
CoglPixelFormat pixel_format;
|
CoglPixelFormat pixel_format;
|
||||||
|
CoglHandle cogl_texture;
|
||||||
|
|
||||||
priv = texture->priv;
|
priv = texture->priv;
|
||||||
|
|
||||||
@ -977,12 +1039,23 @@ 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)
|
||||||
|
return;
|
||||||
|
#else
|
||||||
if (priv->texture == COGL_INVALID_HANDLE)
|
if (priv->texture == COGL_INVALID_HANDLE)
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
priv->local_data_width = cogl_texture_get_width (priv->texture);
|
#if USE_COGL_MATERIAL
|
||||||
priv->local_data_height = cogl_texture_get_height (priv->texture);
|
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
||||||
pixel_format = cogl_texture_get_format (priv->texture);
|
#else
|
||||||
|
cogl_texture = priv->texture;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
priv->local_data_width = cogl_texture_get_width (cogl_texture);
|
||||||
|
priv->local_data_height = cogl_texture_get_height (cogl_texture);
|
||||||
|
pixel_format = cogl_texture_get_format (cogl_texture);
|
||||||
priv->local_data_has_alpha = pixel_format & COGL_A_BIT;
|
priv->local_data_has_alpha = pixel_format & COGL_A_BIT;
|
||||||
bpp = priv->local_data_has_alpha ? 4 : 3;
|
bpp = priv->local_data_has_alpha ? 4 : 3;
|
||||||
|
|
||||||
@ -998,7 +1071,7 @@ clutter_texture_save_to_local_data (ClutterTexture *texture)
|
|||||||
priv->local_data = g_malloc (priv->local_data_rowstride
|
priv->local_data = g_malloc (priv->local_data_rowstride
|
||||||
* priv->local_data_height);
|
* priv->local_data_height);
|
||||||
|
|
||||||
if (cogl_texture_get_data (priv->texture,
|
if (cogl_texture_get_data (cogl_texture,
|
||||||
priv->local_data_has_alpha
|
priv->local_data_has_alpha
|
||||||
? COGL_PIXEL_FORMAT_RGBA_8888
|
? COGL_PIXEL_FORMAT_RGBA_8888
|
||||||
: COGL_PIXEL_FORMAT_RGB_888,
|
: COGL_PIXEL_FORMAT_RGB_888,
|
||||||
@ -1033,6 +1106,58 @@ clutter_texture_load_from_local_data (ClutterTexture *texture)
|
|||||||
priv->local_data = NULL;
|
priv->local_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
/**
|
||||||
|
* clutter_texture_get_cogl_material:
|
||||||
|
* @texture: A #ClutterTexture
|
||||||
|
*
|
||||||
|
* Returns a handle to the underlying COGL material used for drawing
|
||||||
|
* the actor. No extra reference is taken so if you need to keep the
|
||||||
|
* handle then you should call cogl_material_ref on it.
|
||||||
|
*
|
||||||
|
* Since: 1.0
|
||||||
|
*
|
||||||
|
* Return value: COGL material handle
|
||||||
|
*/
|
||||||
|
CoglHandle
|
||||||
|
clutter_texture_get_cogl_material (ClutterTexture *texture)
|
||||||
|
{
|
||||||
|
return texture->priv->material;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clutter_texture_set_cogl_material:
|
||||||
|
* @texture: A #ClutterTexture
|
||||||
|
* @cogl_material: A CoglHandle for a material
|
||||||
|
*
|
||||||
|
* Replaces the underlying COGL texture drawn by this actor with
|
||||||
|
* @cogl_tex. A reference to the texture is taken so if the handle is
|
||||||
|
* no longer needed it should be deref'd with cogl_texture_unref.
|
||||||
|
*
|
||||||
|
* Since: 0.8
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
clutter_texture_set_cogl_material (ClutterTexture *texture,
|
||||||
|
CoglHandle cogl_material)
|
||||||
|
{
|
||||||
|
CoglHandle cogl_texture;
|
||||||
|
|
||||||
|
/* This */
|
||||||
|
if (texture->priv->material)
|
||||||
|
cogl_material_unref (texture->priv->material);
|
||||||
|
|
||||||
|
texture->priv->material = cogl_material;
|
||||||
|
|
||||||
|
/* XXX: We are re-asserting the first layer of the new material to ensure the
|
||||||
|
* priv state is in sync with the contents of the material. */
|
||||||
|
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
||||||
|
clutter_texture_set_cogl_texture (texture, cogl_texture);
|
||||||
|
/* XXX: If we add support for more material layers, this will need
|
||||||
|
* extending */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clutter_texture_get_cogl_texture
|
* clutter_texture_get_cogl_texture
|
||||||
* @texture: A #ClutterTexture
|
* @texture: A #ClutterTexture
|
||||||
@ -1048,9 +1173,25 @@ clutter_texture_load_from_local_data (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;
|
||||||
|
int n_layers;
|
||||||
|
|
||||||
g_return_val_if_fail (CLUTTER_IS_TEXTURE (texture), COGL_INVALID_HANDLE);
|
g_return_val_if_fail (CLUTTER_IS_TEXTURE (texture), COGL_INVALID_HANDLE);
|
||||||
|
|
||||||
|
layers = cogl_material_get_layers (texture->priv->material);
|
||||||
|
n_layers = g_list_length ((GList *)layers);
|
||||||
|
if (n_layers == 0)
|
||||||
|
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);
|
||||||
|
#else
|
||||||
return texture->priv->texture;
|
return texture->priv->texture;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1090,7 +1231,12 @@ clutter_texture_set_cogl_texture (ClutterTexture *texture,
|
|||||||
/* Remove old texture */
|
/* Remove old 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);
|
||||||
|
#else
|
||||||
priv->texture = cogl_tex;
|
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;
|
||||||
@ -1379,11 +1525,12 @@ clutter_texture_set_filter_quality (ClutterTexture *texture,
|
|||||||
|
|
||||||
if (filter_quality != old_quality)
|
if (filter_quality != old_quality)
|
||||||
{
|
{
|
||||||
|
CoglHandle cogl_texture = clutter_texture_get_cogl_texture (texture);
|
||||||
priv->filter_quality = filter_quality;
|
priv->filter_quality = filter_quality;
|
||||||
|
|
||||||
/* Is this actually needed - causes problems with TFP mipmaps */
|
/* Is this actually needed - causes problems with TFP mipmaps */
|
||||||
if (priv->texture != COGL_INVALID_HANDLE)
|
if (cogl_texture != COGL_INVALID_HANDLE)
|
||||||
cogl_texture_set_filters (priv->texture,
|
cogl_texture_set_filters (cogl_texture,
|
||||||
clutter_texture_quality_to_cogl_min_filter (priv->filter_quality),
|
clutter_texture_quality_to_cogl_min_filter (priv->filter_quality),
|
||||||
clutter_texture_quality_to_cogl_mag_filter (priv->filter_quality));
|
clutter_texture_quality_to_cogl_mag_filter (priv->filter_quality));
|
||||||
|
|
||||||
@ -1451,15 +1598,21 @@ clutter_texture_set_max_tile_waste (ClutterTexture *texture,
|
|||||||
gint max_tile_waste)
|
gint max_tile_waste)
|
||||||
{
|
{
|
||||||
ClutterTexturePrivate *priv;
|
ClutterTexturePrivate *priv;
|
||||||
|
CoglHandle cogl_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);
|
||||||
|
#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
|
||||||
value from the texture handle */
|
value from the texture handle */
|
||||||
if (priv->texture == COGL_INVALID_HANDLE)
|
if (cogl_texture == COGL_INVALID_HANDLE)
|
||||||
priv->max_tile_waste = max_tile_waste;
|
priv->max_tile_waste = max_tile_waste;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1479,17 +1632,23 @@ gint
|
|||||||
clutter_texture_get_max_tile_waste (ClutterTexture *texture)
|
clutter_texture_get_max_tile_waste (ClutterTexture *texture)
|
||||||
{
|
{
|
||||||
ClutterTexturePrivate *priv;
|
ClutterTexturePrivate *priv;
|
||||||
|
CoglHandle cogl_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);
|
||||||
|
#else
|
||||||
|
cogl_texture = priv->texture;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (priv->texture == COGL_INVALID_HANDLE)
|
if (cogl_texture == COGL_INVALID_HANDLE)
|
||||||
return texture->priv->max_tile_waste;
|
return texture->priv->max_tile_waste;
|
||||||
else
|
else
|
||||||
/* If we have a valid texture handle then use the value from that
|
/* If we have a valid texture handle then use the value from that
|
||||||
instead */
|
instead */
|
||||||
return cogl_texture_get_max_waste (texture->priv->texture);
|
return cogl_texture_get_max_waste (cogl_texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1603,6 +1762,7 @@ clutter_texture_set_area_from_rgb_data (ClutterTexture *texture,
|
|||||||
{
|
{
|
||||||
ClutterTexturePrivate *priv;
|
ClutterTexturePrivate *priv;
|
||||||
CoglPixelFormat source_format;
|
CoglPixelFormat source_format;
|
||||||
|
CoglHandle cogl_texture;
|
||||||
|
|
||||||
priv = texture->priv;
|
priv = texture->priv;
|
||||||
|
|
||||||
@ -1635,7 +1795,8 @@ clutter_texture_set_area_from_rgb_data (ClutterTexture *texture,
|
|||||||
|
|
||||||
clutter_actor_realize (CLUTTER_ACTOR (texture));
|
clutter_actor_realize (CLUTTER_ACTOR (texture));
|
||||||
|
|
||||||
if (priv->texture == COGL_INVALID_HANDLE)
|
cogl_texture = clutter_texture_get_cogl_texture (texture);
|
||||||
|
if (cogl_texture == COGL_INVALID_HANDLE)
|
||||||
{
|
{
|
||||||
g_set_error (error, CLUTTER_TEXTURE_ERROR,
|
g_set_error (error, CLUTTER_TEXTURE_ERROR,
|
||||||
CLUTTER_TEXTURE_ERROR_BAD_FORMAT,
|
CLUTTER_TEXTURE_ERROR_BAD_FORMAT,
|
||||||
@ -1643,7 +1804,7 @@ clutter_texture_set_area_from_rgb_data (ClutterTexture *texture,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cogl_texture_set_region (priv->texture,
|
if (!cogl_texture_set_region (cogl_texture,
|
||||||
0, 0,
|
0, 0,
|
||||||
x, y, width, height,
|
x, y, width, height,
|
||||||
width, height,
|
width, height,
|
||||||
@ -1686,17 +1847,17 @@ on_fbo_source_size_change (GObject *object,
|
|||||||
priv->width = w;
|
priv->width = w;
|
||||||
priv->height = h;
|
priv->height = h;
|
||||||
|
|
||||||
priv->texture = cogl_texture_new_with_size (MAX (priv->width, 1),
|
priv->fbo_texture = cogl_texture_new_with_size (MAX (priv->width, 1),
|
||||||
MAX (priv->height, 1),
|
MAX (priv->height, 1),
|
||||||
-1,
|
-1,
|
||||||
priv->filter_quality == CLUTTER_TEXTURE_QUALITY_HIGH,
|
priv->filter_quality == CLUTTER_TEXTURE_QUALITY_HIGH,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888);
|
COGL_PIXEL_FORMAT_RGBA_8888);
|
||||||
|
|
||||||
cogl_texture_set_filters (priv->texture,
|
cogl_texture_set_filters (priv->fbo_texture,
|
||||||
clutter_texture_quality_to_cogl_min_filter (priv->filter_quality),
|
clutter_texture_quality_to_cogl_min_filter (priv->filter_quality),
|
||||||
clutter_texture_quality_to_cogl_mag_filter (priv->filter_quality));
|
clutter_texture_quality_to_cogl_mag_filter (priv->filter_quality));
|
||||||
|
|
||||||
priv->fbo_handle = cogl_offscreen_new_to_texture (priv->texture);
|
priv->fbo_handle = cogl_offscreen_new_to_texture (priv->fbo_texture);
|
||||||
|
|
||||||
if (priv->fbo_handle == COGL_INVALID_HANDLE)
|
if (priv->fbo_handle == COGL_INVALID_HANDLE)
|
||||||
{
|
{
|
||||||
@ -1940,3 +2101,22 @@ clutter_texture_handle_get_type (void)
|
|||||||
|
|
||||||
return our_type;
|
return our_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
GType
|
||||||
|
clutter_material_handle_get_type (void)
|
||||||
|
{
|
||||||
|
static GType our_type = 0;
|
||||||
|
|
||||||
|
if (G_UNLIKELY (!our_type))
|
||||||
|
{
|
||||||
|
our_type =
|
||||||
|
g_boxed_type_register_static (I_("ClutterMaterialHandle"),
|
||||||
|
(GBoxedCopyFunc) cogl_material_ref,
|
||||||
|
(GBoxedFreeFunc) cogl_material_unref);
|
||||||
|
}
|
||||||
|
|
||||||
|
return our_type;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define USE_COGL_MATERIAL 1
|
||||||
|
|
||||||
#define CLUTTER_TYPE_TEXTURE (clutter_texture_get_type ())
|
#define CLUTTER_TYPE_TEXTURE (clutter_texture_get_type ())
|
||||||
#define CLUTTER_TEXTURE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_TEXTURE, ClutterTexture))
|
#define CLUTTER_TEXTURE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_TEXTURE, ClutterTexture))
|
||||||
#define CLUTTER_TEXTURE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_TEXTURE, ClutterTextureClass))
|
#define CLUTTER_TEXTURE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_TEXTURE, ClutterTextureClass))
|
||||||
@ -41,6 +43,9 @@ G_BEGIN_DECLS
|
|||||||
#define CLUTTER_TEXTURE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_TEXTURE, ClutterTextureClass))
|
#define CLUTTER_TEXTURE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_TEXTURE, ClutterTextureClass))
|
||||||
|
|
||||||
#define CLUTTER_TYPE_TEXTURE_HANDLE (clutter_texture_handle_get_type ())
|
#define CLUTTER_TYPE_TEXTURE_HANDLE (clutter_texture_handle_get_type ())
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
#define CLUTTER_TYPE_MATERIAL_HANDLE (clutter_material_handle_get_type ())
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ClutterTextureError:
|
* ClutterTextureError:
|
||||||
@ -135,6 +140,9 @@ typedef enum { /*< prefix=CLUTTER_TEXTURE_QUALITY >*/
|
|||||||
|
|
||||||
GType clutter_texture_get_type (void) G_GNUC_CONST;
|
GType clutter_texture_get_type (void) G_GNUC_CONST;
|
||||||
GType clutter_texture_handle_get_type (void) G_GNUC_CONST;
|
GType clutter_texture_handle_get_type (void) G_GNUC_CONST;
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
GType clutter_material_handle_get_type (void) G_GNUC_CONST;
|
||||||
|
#endif
|
||||||
|
|
||||||
ClutterActor * clutter_texture_new (void);
|
ClutterActor * clutter_texture_new (void);
|
||||||
ClutterActor * clutter_texture_new_from_file (const gchar *filename,
|
ClutterActor * clutter_texture_new_from_file (const gchar *filename,
|
||||||
@ -181,6 +189,11 @@ gint clutter_texture_get_max_tile_waste (ClutterTexture
|
|||||||
CoglHandle clutter_texture_get_cogl_texture (ClutterTexture *texture);
|
CoglHandle clutter_texture_get_cogl_texture (ClutterTexture *texture);
|
||||||
void clutter_texture_set_cogl_texture (ClutterTexture *texture,
|
void clutter_texture_set_cogl_texture (ClutterTexture *texture,
|
||||||
CoglHandle cogl_tex);
|
CoglHandle cogl_tex);
|
||||||
|
#if USE_COGL_MATERIAL
|
||||||
|
CoglHandle clutter_texture_get_cogl_material (ClutterTexture *texture);
|
||||||
|
void clutter_texture_set_cogl_material (ClutterTexture *texture,
|
||||||
|
CoglHandle cogl_material);
|
||||||
|
#endif
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user