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);
/* 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
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
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);
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] = {
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,
};
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,
};
}
}
-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,
};