[cogl] atlas-texture: Keep reference on potential destination atlas



commit 2eec9758f67e9073371c2edd63379324849373c4
Author: Felix Riemann <friemann gnome org>
Date:   Sat Apr 12 00:26:00 2014 +0200

    atlas-texture: Keep reference on potential destination atlas
    
    When a new CoglAtlasTexture tries to fit into an existing CoglAtlas
    it should make sure the atlas stays valid while it expands.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=728064
    
    Reviewed-by: Neil Roberts <neil linux intel com>

 cogl/cogl-atlas-texture.c |   28 +++++++++++++++++++---------
 1 files changed, 19 insertions(+), 9 deletions(-)
---
diff --git a/cogl/cogl-atlas-texture.c b/cogl/cogl-atlas-texture.c
index a812a00..0c44d2b 100644
--- a/cogl/cogl-atlas-texture.c
+++ b/cogl/cogl-atlas-texture.c
@@ -740,15 +740,25 @@ allocate_space (CoglAtlasTexture *atlas_tex,
 
   /* Look for an existing atlas that can hold the texture */
   for (l = ctx->atlases; l; l = l->next)
-    /* Try to make some space in the atlas for the texture */
-    if (_cogl_atlas_reserve_space (atlas = l->data,
-                                   /* Add two pixels for the border */
-                                   width + 2, height + 2,
-                                   atlas_tex))
-      {
-        cogl_object_ref (atlas);
-        break;
-      }
+    {
+      /* We need to take a reference on the atlas before trying to
+       * reserve space because in some circumstances atlas migration
+       * can cause the atlas to be freed */
+      atlas = cogl_object_ref (l->data);
+      /* Try to make some space in the atlas for the texture */
+      if (_cogl_atlas_reserve_space (atlas,
+                                     /* Add two pixels for the border */
+                                     width + 2, height + 2,
+                                     atlas_tex))
+        {
+          /* keep the atlas reference */
+          break;
+        }
+      else
+        {
+          cogl_object_unref (atlas);
+        }
+    }
 
   /* If we couldn't find a suitable atlas then start another */
   if (l == NULL)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]