/*
- * kmscon - Font Management
+ * kmscon - Font Renderer
*
- * Copyright (c) 2011 David Herrmann <dh.herrmann@googlemail.com>
- * Copyright (c) 2011 University of Tuebingen
+ * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@googlemail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files
*/
/*
- * Font Management
- * A font factory helps loading and initializing fonts. The font object is used
- * to draw glyphs onto the screen.
- * Efficient caching is used to allow fast drawing operations.
+ * Font Renderer
*/
#ifndef KMSCON_FONT_H
#define KMSCON_FONT_H
+#include <errno.h>
#include <stdlib.h>
-#include "gl.h"
-#include "unicode.h"
+#include "kmscon_module.h"
+#include "uterm_video.h"
-struct kmscon_font_factory;
+/* fonts */
+
+struct kmscon_font_attr;
+struct kmscon_glyph;
struct kmscon_font;
+struct kmscon_font_ops;
+
+#define KMSCON_FONT_MAX_NAME 128
+#define KMSCON_FONT_DEFAULT_NAME "monospace"
+#define KMSCON_FONT_DEFAULT_PPI 72
+
+struct kmscon_font_attr {
+ char name[KMSCON_FONT_MAX_NAME];
+ unsigned int ppi;
+ unsigned int points;
+ bool bold;
+ bool italic;
+ unsigned int height;
+ unsigned int width;
+};
+
+void kmscon_font_attr_normalize(struct kmscon_font_attr *attr);
+bool kmscon_font_attr_match(const struct kmscon_font_attr *a1,
+ const struct kmscon_font_attr *a2);
-int kmscon_font_factory_new(struct kmscon_font_factory **out,
- struct kmscon_symbol_table *st);
-void kmscon_font_factory_ref(struct kmscon_font_factory *ff);
-void kmscon_font_factory_unref(struct kmscon_font_factory *ff);
+struct kmscon_glyph {
+ struct uterm_video_buffer buf;
+ unsigned int width;
+ void *data;
+};
-int kmscon_font_factory_load(struct kmscon_font_factory *ff,
- struct kmscon_font **out, unsigned int width, unsigned int height);
+struct kmscon_font {
+ unsigned long ref;
+ struct shl_register_record *record;
+ const struct kmscon_font_ops *ops;
+ struct kmscon_font_attr attr;
+ unsigned int baseline;
+ void *data;
+};
+struct kmscon_font_ops {
+ const char *name;
+ struct kmscon_module *owner;
+ int (*init) (struct kmscon_font *out,
+ const struct kmscon_font_attr *attr);
+ void (*destroy) (struct kmscon_font *font);
+ int (*render) (struct kmscon_font *font,
+ uint32_t id, const uint32_t *ch, size_t len,
+ const struct kmscon_glyph **out);
+ int (*render_empty) (struct kmscon_font *font,
+ const struct kmscon_glyph **out);
+ int (*render_inval) (struct kmscon_font *font,
+ const struct kmscon_glyph **out);
+};
+
+int kmscon_font_register(const struct kmscon_font_ops *ops);
+void kmscon_font_unregister(const char *name);
+
+int kmscon_font_find(struct kmscon_font **out,
+ const struct kmscon_font_attr *attr,
+ const char *backend);
void kmscon_font_ref(struct kmscon_font *font);
void kmscon_font_unref(struct kmscon_font *font);
-unsigned int kmscon_font_get_height(struct kmscon_font *font);
-unsigned int kmscon_font_get_width(struct kmscon_font *font);
-int kmscon_font_draw(struct kmscon_font *font, kmscon_symbol_t ch, float *m,
- struct gl_shader *shader);
+int kmscon_font_render(struct kmscon_font *font,
+ uint32_t id, const uint32_t *ch, size_t len,
+ const struct kmscon_glyph **out);
+int kmscon_font_render_empty(struct kmscon_font *font,
+ const struct kmscon_glyph **out);
+int kmscon_font_render_inval(struct kmscon_font *font,
+ const struct kmscon_glyph **out);
+
+/* modularized backends */
+
+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_pango_ops;
#endif /* KMSCON_FONT_H */