From 4ea3593ebff29f2fd707b37114c9afd2cbab53ea Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Fri, 18 Aug 2023 09:43:14 +0200 Subject: [PATCH] cogl: Port Atlas away from CoglObject Part-of: --- cogl/cogl-pango/cogl-pango-glyph-cache.c | 4 +- cogl/cogl/cogl-atlas-texture.c | 17 ++++--- cogl/cogl/cogl-atlas.c | 59 +++++++++++++++--------- cogl/cogl/cogl-atlas.h | 15 +++--- 4 files changed, 57 insertions(+), 38 deletions(-) diff --git a/cogl/cogl-pango/cogl-pango-glyph-cache.c b/cogl/cogl-pango/cogl-pango-glyph-cache.c index 3a6a0f24b..cb77efcda 100644 --- a/cogl/cogl-pango/cogl-pango-glyph-cache.c +++ b/cogl/cogl-pango/cogl-pango-glyph-cache.c @@ -156,7 +156,7 @@ cogl_pango_glyph_cache_reorganize_cb (void *user_data) void cogl_pango_glyph_cache_clear (CoglPangoGlyphCache *cache) { - g_slist_foreach (cache->atlases, (GFunc) cogl_object_unref, NULL); + g_slist_foreach (cache->atlases, (GFunc) g_object_unref, NULL); g_slist_free (cache->atlases); cache->atlases = NULL; cache->has_dirty_glyphs = FALSE; @@ -294,7 +294,7 @@ cogl_pango_glyph_cache_add_to_local_atlas (CoglPangoGlyphCache *cache, value->draw_height + 1, value)) { - cogl_object_unref (atlas); + g_object_unref (atlas); return FALSE; } diff --git a/cogl/cogl/cogl-atlas-texture.c b/cogl/cogl/cogl-atlas-texture.c index 5627e8bd8..d19e8dc8f 100644 --- a/cogl/cogl/cogl-atlas-texture.c +++ b/cogl/cogl/cogl-atlas-texture.c @@ -53,6 +53,7 @@ #include static void _cogl_atlas_texture_free (CoglAtlasTexture *sub_tex); +static GQuark atlas_private_key = 0; COGL_TEXTURE_DEFINE (AtlasTexture, atlas_texture); COGL_GTYPE_DEFINE_CLASS (AtlasTexture, atlas_texture); @@ -199,7 +200,7 @@ _cogl_atlas_texture_atlas_destroyed_cb (void *user_data) static CoglAtlas * _cogl_atlas_texture_create_atlas (CoglContext *ctx) { - static CoglUserDataKey atlas_private_key; + atlas_private_key = g_quark_from_static_string ("-cogl-atlas-texture-create-key"); CoglAtlas *atlas = _cogl_atlas_new (COGL_PIXEL_FORMAT_RGBA_8888, 0, @@ -217,8 +218,10 @@ _cogl_atlas_texture_create_atlas (CoglContext *ctx) effectively holds a weak reference. We don't need a strong reference because the atlas textures take a reference on the atlas so it will stay alive */ - cogl_object_set_user_data (COGL_OBJECT (atlas), &atlas_private_key, atlas, - _cogl_atlas_texture_atlas_destroyed_cb); + g_object_set_qdata_full (G_OBJECT (atlas), + atlas_private_key, + atlas, + _cogl_atlas_texture_atlas_destroyed_cb); return atlas; } @@ -269,7 +272,7 @@ _cogl_atlas_texture_remove_from_atlas (CoglAtlasTexture *atlas_tex) _cogl_atlas_remove (atlas_tex->atlas, &atlas_tex->rectangle); - cogl_object_unref (atlas_tex->atlas); + g_object_unref (atlas_tex->atlas); atlas_tex->atlas = NULL; } } @@ -729,7 +732,7 @@ allocate_space (CoglAtlasTexture *atlas_tex, /* 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); + atlas = g_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 */ @@ -741,7 +744,7 @@ allocate_space (CoglAtlasTexture *atlas_tex, } else { - cogl_object_unref (atlas); + g_object_unref (atlas); } } @@ -756,7 +759,7 @@ allocate_space (CoglAtlasTexture *atlas_tex, atlas_tex)) { /* Ok, this means we really can't add it to the atlas */ - cogl_object_unref (atlas); + g_object_unref (atlas); g_set_error_literal (error, COGL_SYSTEM_ERROR, diff --git a/cogl/cogl/cogl-atlas.c b/cogl/cogl/cogl-atlas.c index 51eddfc19..ea0b8dd8a 100644 --- a/cogl/cogl/cogl-atlas.c +++ b/cogl/cogl/cogl-atlas.c @@ -45,31 +45,13 @@ #include -static void _cogl_atlas_free (CoglAtlas *atlas); - -COGL_OBJECT_INTERNAL_DEFINE (Atlas, atlas); - -CoglAtlas * -_cogl_atlas_new (CoglPixelFormat texture_format, - CoglAtlasFlags flags, - CoglAtlasUpdatePositionCallback update_position_cb) -{ - CoglAtlas *atlas = g_new (CoglAtlas, 1); - - atlas->update_position_cb = update_position_cb; - atlas->map = NULL; - atlas->texture = NULL; - atlas->flags = flags; - atlas->texture_format = texture_format; - g_hook_list_init (&atlas->pre_reorganize_callbacks, sizeof (GHook)); - g_hook_list_init (&atlas->post_reorganize_callbacks, sizeof (GHook)); - - return _cogl_atlas_object_new (atlas); -} +G_DEFINE_TYPE (CoglAtlas, cogl_atlas, G_TYPE_OBJECT); static void -_cogl_atlas_free (CoglAtlas *atlas) +cogl_atlas_dispose (GObject *object) { + CoglAtlas *atlas = COGL_ATLAS (object); + COGL_NOTE (ATLAS, "%p: Atlas destroyed", atlas); if (atlas->texture) @@ -80,7 +62,38 @@ _cogl_atlas_free (CoglAtlas *atlas) g_hook_list_clear (&atlas->pre_reorganize_callbacks); g_hook_list_clear (&atlas->post_reorganize_callbacks); - g_free (atlas); + G_OBJECT_CLASS (cogl_atlas_parent_class)->dispose (object); +} + +static void +cogl_atlas_init (CoglAtlas *atlas) +{ +} + +static void +cogl_atlas_class_init (CoglAtlasClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->dispose = cogl_atlas_dispose; +} + +CoglAtlas * +_cogl_atlas_new (CoglPixelFormat texture_format, + CoglAtlasFlags flags, + CoglAtlasUpdatePositionCallback update_position_cb) +{ + CoglAtlas *atlas = g_object_new (COGL_TYPE_ATLAS, NULL); + + atlas->update_position_cb = update_position_cb; + atlas->map = NULL; + atlas->texture = NULL; + atlas->flags = flags; + atlas->texture_format = texture_format; + g_hook_list_init (&atlas->pre_reorganize_callbacks, sizeof (GHook)); + g_hook_list_init (&atlas->post_reorganize_callbacks, sizeof (GHook)); + + return atlas; } typedef struct _CoglAtlasRepositionData diff --git a/cogl/cogl/cogl-atlas.h b/cogl/cogl/cogl-atlas.h index 7b15453a2..ac5c8df10 100644 --- a/cogl/cogl/cogl-atlas.h +++ b/cogl/cogl/cogl-atlas.h @@ -29,7 +29,6 @@ #pragma once #include "cogl/cogl-rectangle-map.h" -#include "cogl/cogl-object-private.h" #include "cogl/cogl-texture.h" typedef void @@ -45,11 +44,18 @@ typedef enum typedef struct _CoglAtlas CoglAtlas; -#define COGL_ATLAS(object) ((CoglAtlas *) object) +#define COGL_TYPE_ATLAS (cogl_atlas_get_type ()) + +COGL_EXPORT +G_DECLARE_FINAL_TYPE (CoglAtlas, + cogl_atlas, + COGL, + ATLAS, + GObject) struct _CoglAtlas { - CoglObject _parent; + GObject parent_instance; CoglRectangleMap *map; @@ -97,6 +103,3 @@ _cogl_atlas_remove_reorganize_callback (CoglAtlas *atlas, GHookFunc pre_callback, GHookFunc post_callback, void *user_data); - -gboolean -_cogl_is_atlas (void *object);