cogl-atlas-texture: Add a callback for when any atlas reorganizes
authorNeil Roberts <neil@linux.intel.com>
Wed, 30 Mar 2011 11:53:50 +0000 (12:53 +0100)
committerNeil Roberts <neil@linux.intel.com>
Thu, 5 May 2011 15:09:01 +0000 (16:09 +0100)
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.

clutter/cogl/cogl/cogl-atlas-texture-private.h
clutter/cogl/cogl/cogl-atlas-texture.c
clutter/cogl/cogl/cogl-context-private.h
clutter/cogl/cogl/cogl-context.c

index 49d933c..b7f7b03 100644 (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 */
index 1f46584..3b87d4c 100644 (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 =
   {
index 2f1642c..c9b7c64 100644 (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
index d8dc5c6..53a09d6 100644 (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);