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 committed by Robert Bragg
parent 25c36c452f
commit 239614a375
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, CoglTextureFlags flags,
CoglPixelFormat internal_format); 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 */ #endif /* __COGL_ATLAS_TEXTURE_H */

View File

@ -142,6 +142,8 @@ _cogl_atlas_texture_post_reorganize_cb (void *user_data)
{ {
CoglAtlas *atlas = user_data; CoglAtlas *atlas = user_data;
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
if (atlas->map) if (atlas->map)
{ {
CoglAtlasTextureGetRectanglesData data; CoglAtlasTextureGetRectanglesData data;
@ -171,6 +173,9 @@ _cogl_atlas_texture_post_reorganize_cb (void *user_data)
g_free (data.textures); g_free (data.textures);
} }
/* Notify any listeners that an atlas has changed */
g_hook_list_invoke (&ctx->atlas_reorganize_callbacks, FALSE);
} }
static void static void
@ -746,6 +751,37 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap *bmp,
return atlas_tex_handle; 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 static const CoglTextureVtable
cogl_atlas_texture_vtable = cogl_atlas_texture_vtable =
{ {

View File

@ -186,6 +186,7 @@ struct _CoglContext
CoglPipeline *blit_texture_pipeline; CoglPipeline *blit_texture_pipeline;
GSList *atlases; GSList *atlases;
GHookList atlas_reorganize_callbacks;
/* This debugging variable is used to pick a colour for visually /* This debugging variable is used to pick a colour for visually
displaying the quad batches. It needs to be global so that it can 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 (); _cogl_flush_face_winding ();
context->atlases = NULL; 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_array = g_byte_array_new ();
_context->buffer_map_fallback_in_use = FALSE; _context->buffer_map_fallback_in_use = FALSE;
@ -433,6 +434,7 @@ _cogl_context_free (CoglContext *context)
_cogl_clip_stack_unref (context->current_clip_stack); _cogl_clip_stack_unref (context->current_clip_stack);
g_slist_free (context->atlases); g_slist_free (context->atlases);
g_hook_list_clear (&context->atlas_reorganize_callbacks);
_cogl_bitmask_destroy (&context->arrays_enabled); _cogl_bitmask_destroy (&context->arrays_enabled);
_cogl_bitmask_destroy (&context->temp_bitmask); _cogl_bitmask_destroy (&context->temp_bitmask);