text: font: add .finalize callback
authorDavid Herrmann <dh.herrmann@googlemail.com>
Thu, 3 Jan 2013 13:03:58 +0000 (14:03 +0100)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Thu, 3 Jan 2013 13:03:58 +0000 (14:03 +0100)
Each font-backend now also gets a .finalize callback that is called when
the last font-user drops its font. This will allow modules to destroy
themself when the last reference is dropped.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
src/text.h
src/text_font.c
src/text_font_8x16.c
src/text_font_freetype2.c
src/text_font_pango.c
src/text_font_unifont.c

index 8a89de1..9ce7178 100644 (file)
@@ -95,6 +95,7 @@ struct kmscon_font_ops {
                             const struct kmscon_glyph **out);
        int (*render_inval) (struct kmscon_font *font,
                             const struct kmscon_glyph **out);
+       void (*finalize) (void);
 };
 
 int kmscon_font_register(const struct kmscon_font_ops *ops);
@@ -183,10 +184,10 @@ int kmscon_text_render_cb(struct tsm_screen *con, void *data);
 
 /* modularized backends */
 
-extern const struct kmscon_font_ops kmscon_font_8x16_ops;
-extern const struct kmscon_font_ops kmscon_font_unifont_ops;
-extern const struct kmscon_font_ops kmscon_font_freetype2_ops;
-extern const struct kmscon_font_ops kmscon_font_pango_ops;
+extern struct kmscon_font_ops kmscon_font_8x16_ops;
+extern struct kmscon_font_ops kmscon_font_unifont_ops;
+extern struct kmscon_font_ops kmscon_font_freetype2_ops;
+extern struct kmscon_font_ops kmscon_font_pango_ops;
 
 #ifdef BUILD_ENABLE_RENDERER_BBLIT
 
index 3754f62..bdcaff9 100644 (file)
@@ -133,6 +133,14 @@ bool kmscon_font_attr_match(const struct kmscon_font_attr *a1,
        return true;
 }
 
+static inline void kmscon_font_destroy(void *data)
+{
+       const struct kmscon_font_ops *ops = data;
+
+       if (ops->finalize)
+               ops->finalize();
+}
+
 /**
  * kmscon_font_register:
  * @ops: Font operations and name for new font backend
@@ -156,7 +164,8 @@ int kmscon_font_register(const struct kmscon_font_ops *ops)
 
        log_debug("register font backend %s", ops->name);
 
-       ret = shl_register_add(&font_reg, ops->name, (void*)ops);
+       ret = shl_register_add_cb(&font_reg, ops->name, (void*)ops,
+                                 kmscon_font_destroy);
        if (ret) {
                log_error("cannot register font backend %s: %d", ops->name,
                          ret);
index 5f29e57..0714ce3 100644 (file)
@@ -105,13 +105,14 @@ static int kmscon_font_8x16_render_inval(struct kmscon_font *font,
        return 0;
 }
 
-const struct kmscon_font_ops kmscon_font_8x16_ops = {
+struct kmscon_font_ops kmscon_font_8x16_ops = {
        .name = "8x16",
        .init = kmscon_font_8x16_init,
        .destroy = kmscon_font_8x16_destroy,
        .render = kmscon_font_8x16_render,
        .render_empty = kmscon_font_8x16_render_empty,
        .render_inval = kmscon_font_8x16_render_inval,
+       .finalize = NULL,
 };
 
 static const struct kmscon_glyph kmscon_font_8x16_glyphs[256] = {
index 11eb892..fb1c30e 100644 (file)
@@ -682,11 +682,12 @@ static int kmscon_font_freetype2_render_inval(struct kmscon_font *font,
        return 0;
 }
 
-const struct kmscon_font_ops kmscon_font_freetype2_ops = {
+struct kmscon_font_ops kmscon_font_freetype2_ops = {
        .name = "freetype2",
        .init = kmscon_font_freetype2_init,
        .destroy = kmscon_font_freetype2_destroy,
        .render = kmscon_font_freetype2_render,
        .render_empty = kmscon_font_freetype2_render_empty,
        .render_inval = kmscon_font_freetype2_render_inval,
+       .finalize = NULL,
 };
index 9ef1a8e..34c83c1 100644 (file)
@@ -428,11 +428,12 @@ static int kmscon_font_pango_render_inval(struct kmscon_font *font,
                                        out);
 }
 
-const struct kmscon_font_ops kmscon_font_pango_ops = {
+struct kmscon_font_ops kmscon_font_pango_ops = {
        .name = "pango",
        .init = kmscon_font_pango_init,
        .destroy = kmscon_font_pango_destroy,
        .render = kmscon_font_pango_render,
        .render_empty = kmscon_font_pango_render_empty,
        .render_inval = kmscon_font_pango_render_inval,
+       .finalize = NULL,
 };
index bc1427f..f3c1c19 100644 (file)
@@ -111,11 +111,12 @@ static int kmscon_font_unifont_render_empty(struct kmscon_font *font,
        }
 }
 
-const struct kmscon_font_ops kmscon_font_unifont_ops = {
+struct kmscon_font_ops kmscon_font_unifont_ops = {
        .name = "unifont",
        .init = kmscon_font_unifont_init,
        .destroy = kmscon_font_unifont_destroy,
        .render = kmscon_font_unifont_render,
        .render_empty = kmscon_font_unifont_render_empty,
        .render_inval = kmscon_font_unifont_render_inval,
+       .finalize = NULL,
 };