From 241c3c0d43ef562fa8d04b6cac1848fad6ba2a29 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Wed, 30 Mar 2011 12:53:50 +0100 Subject: [PATCH] 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. --- .../cogl/cogl/cogl-atlas-texture-private.h | 8 +++++ clutter/cogl/cogl/cogl-atlas-texture.c | 36 +++++++++++++++++++ clutter/cogl/cogl/cogl-context-private.h | 1 + clutter/cogl/cogl/cogl-context.c | 2 ++ 4 files changed, 47 insertions(+) diff --git a/clutter/cogl/cogl/cogl-atlas-texture-private.h b/clutter/cogl/cogl/cogl-atlas-texture-private.h index 49d933c82..b7f7b035b 100644 --- a/clutter/cogl/cogl/cogl-atlas-texture-private.h +++ b/clutter/cogl/cogl/cogl-atlas-texture-private.h @@ -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 */ diff --git a/clutter/cogl/cogl/cogl-atlas-texture.c b/clutter/cogl/cogl/cogl-atlas-texture.c index 1f46584b3..3b87d4ce1 100644 --- a/clutter/cogl/cogl/cogl-atlas-texture.c +++ b/clutter/cogl/cogl/cogl-atlas-texture.c @@ -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 = { diff --git a/clutter/cogl/cogl/cogl-context-private.h b/clutter/cogl/cogl/cogl-context-private.h index 2f1642cab..c9b7c640a 100644 --- a/clutter/cogl/cogl/cogl-context-private.h +++ b/clutter/cogl/cogl/cogl-context-private.h @@ -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 diff --git a/clutter/cogl/cogl/cogl-context.c b/clutter/cogl/cogl/cogl-context.c index d8dc5c6a4..53a09d6d1 100644 --- a/clutter/cogl/cogl/cogl-context.c +++ b/clutter/cogl/cogl/cogl-context.c @@ -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);