[clutter/wip/pango-share-atlas: 3/14] cogl-atlas-texture: Split out new_from_bitmap to new_with_size



commit 9aaaee03085d709db930f56333c204672d32d81d
Author: Neil Roberts <neil linux intel com>
Date:   Thu Feb 18 16:33:12 2010 +0000

    cogl-atlas-texture: Split out new_from_bitmap to new_with_size
    
    This adds a new function called _cogl_atlas_texture_new_with_size. The
    old new_from_bitmap function now just calls this and updates the
    texture with the data.

 clutter/cogl/cogl/cogl-atlas-texture-private.h |    6 ++
 clutter/cogl/cogl/cogl-atlas-texture.c         |   81 +++++++++++++++---------
 2 files changed, 57 insertions(+), 30 deletions(-)
---
diff --git a/clutter/cogl/cogl/cogl-atlas-texture-private.h b/clutter/cogl/cogl/cogl-atlas-texture-private.h
index cdac7d3..49d933c 100644
--- a/clutter/cogl/cogl/cogl-atlas-texture-private.h
+++ b/clutter/cogl/cogl/cogl-atlas-texture-private.h
@@ -63,4 +63,10 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
                                      CoglTextureFlags flags,
                                      CoglPixelFormat  internal_format);
 
+CoglHandle
+_cogl_atlas_texture_new_with_size (unsigned int     width,
+                                   unsigned int     height,
+                                   CoglTextureFlags flags,
+                                   CoglPixelFormat  internal_format);
+
 #endif /* __COGL_ATLAS_TEXTURE_H */
diff --git a/clutter/cogl/cogl/cogl-atlas-texture.c b/clutter/cogl/cogl/cogl-atlas-texture.c
index c818a4a..1f46584 100644
--- a/clutter/cogl/cogl/cogl-atlas-texture.c
+++ b/clutter/cogl/cogl/cogl-atlas-texture.c
@@ -581,26 +581,17 @@ _cogl_atlas_texture_can_use_format (CoglPixelFormat format)
 }
 
 CoglHandle
-_cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
-                                     CoglTextureFlags flags,
-                                     CoglPixelFormat  internal_format)
+_cogl_atlas_texture_new_with_size (unsigned int width,
+                                   unsigned int height,
+                                   CoglTextureFlags flags,
+                                   CoglPixelFormat internal_format)
 {
   CoglAtlasTexture *atlas_tex;
-  CoglBitmap       *dst_bmp;
-  CoglBitmap       *override_bmp;
-  GLenum            gl_intformat;
-  GLenum            gl_format;
-  GLenum            gl_type;
-  int               bmp_width;
-  int               bmp_height;
-  CoglPixelFormat   bmp_format;
   CoglAtlas        *atlas;
   GSList           *l;
 
   _COGL_GET_CONTEXT (ctx, COGL_INVALID_HANDLE);
 
-  g_return_val_if_fail (cogl_is_bitmap (bmp), COGL_INVALID_HANDLE);
-
   /* Don't put textures in the atlas if the user has explicitly
      requested to disable it */
   if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_DISABLE_ATLAS)))
@@ -612,13 +603,9 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
   if (flags)
     return COGL_INVALID_HANDLE;
 
-  bmp_width = _cogl_bitmap_get_width (bmp);
-  bmp_height = _cogl_bitmap_get_height (bmp);
-  bmp_format = _cogl_bitmap_get_format (bmp);
-
   /* We can't atlas zero-sized textures because it breaks the atlas
      data structure */
-  if (bmp_width < 1 || bmp_height < 1)
+  if (width < 1 || height < 1)
     return COGL_INVALID_HANDLE;
 
   /* If we can't use FBOs then it will be too slow to migrate textures
@@ -626,10 +613,7 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
   if (!cogl_features_available (COGL_FEATURE_OFFSCREEN))
     return COGL_INVALID_HANDLE;
 
-  COGL_NOTE (ATLAS, "Adding texture of size %ix%i", bmp_width, bmp_height);
-
-  internal_format = _cogl_texture_determine_internal_format (bmp_format,
-                                                             internal_format);
+  COGL_NOTE (ATLAS, "Adding texture of size %ix%i", width, height);
 
   /* If the texture is in a strange format then we won't use it */
   if (!_cogl_atlas_texture_can_use_format (internal_format))
@@ -657,7 +641,7 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
     /* 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 */
-                                   bmp_width + 2, bmp_height + 2,
+                                   width + 2, height + 2,
                                    atlas_tex))
       {
         cogl_object_ref (atlas);
@@ -671,7 +655,7 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
       COGL_NOTE (ATLAS, "Created new atlas for textures: %p", atlas);
       if (!_cogl_atlas_reserve_space (atlas,
                                       /* Add two pixels for the border */
-                                      bmp_width + 2, bmp_height + 2,
+                                      width + 2, height + 2,
                                       atlas_tex))
         {
           /* Ok, this means we really can't add it to the atlas */
@@ -681,6 +665,47 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
         }
     }
 
+  atlas_tex->format = internal_format;
+  atlas_tex->atlas = atlas;
+
+  return _cogl_atlas_texture_handle_new (atlas_tex);
+}
+
+CoglHandle
+_cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
+                                     CoglTextureFlags flags,
+                                     CoglPixelFormat  internal_format)
+{
+  CoglHandle atlas_tex_handle;
+  CoglAtlasTexture *atlas_tex;
+  CoglBitmap *dst_bmp;
+  CoglBitmap *override_bmp;
+  GLenum gl_intformat;
+  GLenum gl_format;
+  GLenum gl_type;
+  int bmp_width;
+  int bmp_height;
+  CoglPixelFormat bmp_format;
+
+  _COGL_GET_CONTEXT (ctx, COGL_INVALID_HANDLE);
+
+  g_return_val_if_fail (cogl_is_bitmap (bmp), COGL_INVALID_HANDLE);
+
+  bmp_width = _cogl_bitmap_get_width (bmp);
+  bmp_height = _cogl_bitmap_get_height (bmp);
+  bmp_format = _cogl_bitmap_get_format (bmp);
+
+  internal_format = _cogl_texture_determine_internal_format (bmp_format,
+                                                             internal_format);
+
+  atlas_tex_handle = _cogl_atlas_texture_new_with_size (bmp_width, bmp_height,
+                                                        flags, internal_format);
+
+  if (atlas_tex_handle == COGL_INVALID_HANDLE)
+    return COGL_INVALID_HANDLE;
+
+  atlas_tex = atlas_tex_handle;
+
   dst_bmp = _cogl_texture_prepare_for_upload (bmp,
                                               internal_format,
                                               &internal_format,
@@ -690,13 +715,9 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
 
   if (dst_bmp == NULL)
     {
-      _cogl_atlas_remove (atlas, &atlas_tex->rectangle);
-      cogl_object_unref (atlas);
-      g_free (atlas_tex);
+      cogl_handle_unref (atlas_tex_handle);
       return COGL_INVALID_HANDLE;
     }
-  atlas_tex->format = internal_format;
-  atlas_tex->atlas = atlas;
 
   /* Make another bitmap so that we can override the format */
   override_bmp = _cogl_bitmap_new_shared (dst_bmp,
@@ -722,7 +743,7 @@ _cogl_atlas_texture_new_from_bitmap (CoglBitmap      *bmp,
 
   cogl_object_unref (override_bmp);
 
-  return _cogl_atlas_texture_handle_new (atlas_tex);
+  return atlas_tex_handle;
 }
 
 static const CoglTextureVtable



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