cogl-atlas-texture: Add a callback for when any atlas reorganizes

This adds cogl_atlas_texture_* functions to register a callback that
will get invoked whenever any of the CoglAtlas's the textures use get
reorganized. The callback is global and is not tied to any particular
atlas texture.
This commit is contained in:
Neil Roberts 2011-03-30 12:53:50 +01:00
parent e3c57941bd
commit 241c3c0d43
4 changed files with 47 additions and 0 deletions

View File

@ -69,4 +69,12 @@ _cogl_atlas_texture_new_with_size (unsigned int width,
CoglTextureFlags flags,
CoglPixelFormat internal_format);
void
_cogl_atlas_texture_add_reorganize_callback (GHookFunc callback,
void *user_data);
void
_cogl_atlas_texture_remove_reorganize_callback (GHookFunc callback,
void *user_data);
#endif /* __COGL_ATLAS_TEXTURE_H */

View File

@ -142,6 +142,8 @@ _cogl_atlas_texture_post_reorganize_cb (void *user_data)
{
CoglAtlas *atlas = user_data;
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
if (atlas->map)
{
CoglAtlasTextureGetRectanglesData data;
@ -171,6 +173,9 @@ _cogl_atlas_texture_post_reorganize_cb (void *user_data)
g_free (data.textures);
}
/* Notify any listeners that an atlas has changed */
g_hook_list_invoke (&ctx->atlas_reorganize_callbacks, FALSE);
}
static void
@ -746,6 +751,37 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap *bmp,
return atlas_tex_handle;
}
void
_cogl_atlas_texture_add_reorganize_callback (GHookFunc callback,
void *user_data)
{
GHook *hook;
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
hook = g_hook_alloc (&ctx->atlas_reorganize_callbacks);
hook->func = callback;
hook->data = user_data;
g_hook_prepend (&ctx->atlas_reorganize_callbacks, hook);
}
void
_cogl_atlas_texture_remove_reorganize_callback (GHookFunc callback,
void *user_data)
{
GHook *hook;
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
hook = g_hook_find_func_data (&ctx->atlas_reorganize_callbacks,
FALSE,
callback,
user_data);
if (hook)
g_hook_destroy_link (&ctx->atlas_reorganize_callbacks, hook);
}
static const CoglTextureVtable
cogl_atlas_texture_vtable =
{

View File

@ -186,6 +186,7 @@ struct _CoglContext
CoglPipeline *blit_texture_pipeline;
GSList *atlases;
GHookList atlas_reorganize_callbacks;
/* This debugging variable is used to pick a colour for visually
displaying the quad batches. It needs to be global so that it can

View File

@ -353,6 +353,7 @@ cogl_context_new (CoglDisplay *display,
_cogl_flush_face_winding ();
context->atlases = NULL;
g_hook_list_init (&context->atlas_reorganize_callbacks, sizeof (GHook));
_context->buffer_map_fallback_array = g_byte_array_new ();
_context->buffer_map_fallback_in_use = FALSE;
@ -433,6 +434,7 @@ _cogl_context_free (CoglContext *context)
_cogl_clip_stack_unref (context->current_clip_stack);
g_slist_free (context->atlases);
g_hook_list_clear (&context->atlas_reorganize_callbacks);
_cogl_bitmask_destroy (&context->arrays_enabled);
_cogl_bitmask_destroy (&context->temp_bitmask);