aboutsummaryrefslogtreecommitdiff
path: root/modules/libfont/libfont.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/libfont/libfont.c')
-rw-r--r--modules/libfont/libfont.c725
1 files changed, 725 insertions, 0 deletions
diff --git a/modules/libfont/libfont.c b/modules/libfont/libfont.c
new file mode 100644
index 0000000..b934b4e
--- /dev/null
+++ b/modules/libfont/libfont.c
@@ -0,0 +1,725 @@
+/*
+ * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd)
+ * Copyright © 2002-2006 Fenix Team (Fenix)
+ * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix)
+ *
+ * This file is part of Bennu - Game Development
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ * distribution.
+ *
+ */
+
+/* --------------------------------------------------------------------------- */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "bgdrtm.h"
+
+#define __LIB_FONT
+#include "libfont.h"
+
+/* --------------------------------------------------------------------------- */
+
+FONT * fonts[MAX_FONTS] = { 0 } ;
+int font_count = 0 ; /* Fuente 0 reservada para sistema */
+
+unsigned char default_font[256*8] =
+{
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x7F, 0xC1, 0xF7, 0xC1, 0xFF, 0xDD, 0xC1, 0x7F,
+ 0x7F, 0xFF, 0xFF, 0xFF, 0xE3, 0xF7, 0xFF, 0x7F,
+ 0x7E, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00,
+ 0x18, 0x3C, 0x7E, 0xFF, 0x7E, 0x3C, 0x18, 0x00,
+ 0x3C, 0x7E, 0x3C, 0xFF, 0xFF, 0x7E, 0x3C, 0x7E,
+ 0x18, 0x18, 0x3C, 0x7E, 0xFF, 0x7E, 0x3C, 0x7E,
+ 0x00, 0x00, 0x1C, 0x3E, 0x3E, 0x1C, 0x00, 0x00,
+ 0xFF, 0xFF, 0xF7, 0xE3, 0xE3, 0xF7, 0xFF, 0xFF,
+ 0x00, 0x3E, 0x77, 0x63, 0x63, 0x77, 0x3E, 0x00,
+ 0xFF, 0xE3, 0xDD, 0xFF, 0xFF, 0xDD, 0xE3, 0xFF,
+ 0x0F, 0x07, 0x0F, 0x7F, 0xEE, 0xEE, 0xEE, 0x7C,
+ 0x3E, 0x77, 0x77, 0x77, 0x3E, 0x1C, 0x7F, 0x1C,
+ 0x3F, 0x3B, 0x3F, 0x38, 0x38, 0x78, 0xF8, 0xF0,
+ 0x7F, 0x73, 0x7F, 0x73, 0x73, 0x77, 0xF7, 0xE0,
+ 0xDD, 0x7F, 0x3E, 0xF7, 0xF7, 0x3E, 0x7F, 0xDD,
+ 0xC0, 0xF0, 0xFC, 0xFF, 0xFC, 0xF0, 0xC0, 0x00,
+ 0x03, 0x0F, 0x3F, 0xFF, 0x3F, 0x0F, 0x03, 0x00,
+ 0x1C, 0x3E, 0x7F, 0x1C, 0x1C, 0x7F, 0x3E, 0x1C,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x00, 0x77, 0x00,
+ 0x7F, 0xFF, 0xFF, 0x7F, 0x1F, 0x1F, 0x1F, 0x00,
+ 0x3F, 0x73, 0x3C, 0x7E, 0x7E, 0x3C, 0xEE, 0x7C,
+ 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x00,
+ 0x1C, 0x3E, 0x7F, 0x1C, 0x7F, 0x3E, 0x1C, 0xFF,
+ 0x1C, 0x3E, 0x7F, 0x1C, 0x1C, 0x1C, 0x1C, 0x00,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x7F, 0x3E, 0x1C, 0x00,
+ 0x00, 0x1C, 0x0E, 0xFF, 0x0E, 0x1C, 0x00, 0x00,
+ 0x00, 0x38, 0x70, 0xFF, 0x70, 0x38, 0x00, 0x00,
+ 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xFF, 0x00, 0x00,
+ 0x00, 0x36, 0x77, 0xFF, 0x77, 0x36, 0x00, 0x00,
+ 0x00, 0x1C, 0x3E, 0x7F, 0xFF, 0xFF, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0x7F, 0x3E, 0x1C, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00,
+ 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x36, 0x7F, 0x36, 0x36, 0x7F, 0x36, 0x00,
+ 0x00, 0x0C, 0x3F, 0x3C, 0x3F, 0x0F, 0x3F, 0x0C,
+ 0x00, 0x73, 0x76, 0x0C, 0x18, 0x37, 0x67, 0x00,
+ 0x00, 0x18, 0x3C, 0x18, 0x3F, 0x66, 0x3F, 0x00,
+ 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x00,
+ 0x00, 0x30, 0x18, 0x18, 0x18, 0x18, 0x30, 0x00,
+ 0x00, 0x00, 0x1E, 0x0C, 0x3F, 0x0C, 0x1E, 0x00,
+ 0x00, 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00,
+ 0x00, 0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x00,
+ 0x00, 0x3E, 0x67, 0x6F, 0x7B, 0x73, 0x3E, 0x00,
+ 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0xFE, 0x00,
+ 0x00, 0x3E, 0x63, 0x03, 0x3E, 0x60, 0x7F, 0x00,
+ 0x00, 0x7E, 0x03, 0x3E, 0x03, 0x03, 0x7E, 0x00,
+ 0x00, 0x0E, 0x1E, 0x36, 0x66, 0x7F, 0x06, 0x00,
+ 0x00, 0x7F, 0x60, 0x7E, 0x03, 0x03, 0x7E, 0x00,
+ 0x00, 0x3F, 0x60, 0x7E, 0x63, 0x63, 0x3E, 0x00,
+ 0x00, 0x7F, 0x03, 0x06, 0x0C, 0x18, 0x18, 0x00,
+ 0x00, 0x3E, 0x63, 0x3E, 0x63, 0x63, 0x3E, 0x00,
+ 0x00, 0x3E, 0x63, 0x63, 0x3F, 0x03, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
+ 0x00, 0x00, 0x06, 0x0C, 0x18, 0x0C, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00,
+ 0x00, 0x00, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x00,
+ 0x00, 0x3E, 0x63, 0x06, 0x0C, 0x00, 0x0C, 0x00,
+ 0x00, 0x3E, 0x6F, 0x7F, 0x7F, 0x60, 0x3E, 0x00,
+ 0x00, 0x3E, 0x63, 0x63, 0x7F, 0x63, 0x63, 0x00,
+ 0x00, 0x7E, 0x63, 0x7E, 0x63, 0x63, 0x7E, 0x00,
+ 0x00, 0x3F, 0x60, 0x60, 0x60, 0x60, 0x3F, 0x00,
+ 0x00, 0x7E, 0x63, 0x63, 0x63, 0x63, 0x7E, 0x00,
+ 0x00, 0x7F, 0x60, 0x7C, 0x60, 0x60, 0x7F, 0x00,
+ 0x00, 0x7F, 0x60, 0x7F, 0x60, 0x60, 0x60, 0x00,
+ 0x00, 0x3F, 0x60, 0x60, 0x6F, 0x63, 0x3F, 0x00,
+ 0x00, 0x63, 0x63, 0x7F, 0x63, 0x63, 0x63, 0x00,
+ 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00,
+ 0x00, 0x03, 0x03, 0x03, 0x03, 0x63, 0x3E, 0x00,
+ 0x00, 0x66, 0x6C, 0x7C, 0x66, 0x63, 0x63, 0x00,
+ 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x00,
+ 0x00, 0x63, 0x77, 0x7F, 0x63, 0x63, 0x63, 0x00,
+ 0x00, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x63, 0x00,
+ 0x00, 0x3E, 0x63, 0x63, 0x63, 0x63, 0x3E, 0x00,
+ 0x00, 0x7E, 0x63, 0x63, 0x7E, 0x60, 0x60, 0x00,
+ 0x00, 0x3E, 0x63, 0x63, 0x6F, 0x67, 0x3F, 0x00,
+ 0x00, 0x7E, 0x63, 0x63, 0x7E, 0x66, 0x63, 0x00,
+ 0x00, 0x3F, 0x60, 0x3E, 0x03, 0x03, 0x7E, 0x00,
+ 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00,
+ 0x00, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3E, 0x00,
+ 0x00, 0x63, 0x63, 0x63, 0x36, 0x36, 0x1C, 0x00,
+ 0x00, 0x63, 0x63, 0x6B, 0x6B, 0x6B, 0x36, 0x00,
+ 0x00, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00,
+ 0x00, 0xC3, 0xC3, 0x7E, 0x18, 0x18, 0x18, 0x00,
+ 0x00, 0x7F, 0x06, 0x0C, 0x18, 0x30, 0x7F, 0x00,
+ 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0F, 0x00,
+ 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00,
+ 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
+ 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
+ 0x00, 0x1E, 0x33, 0x7C, 0x30, 0x30, 0x7F, 0x00,
+ 0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
+ 0x00, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00,
+ 0x00, 0x00, 0x3E, 0x60, 0x60, 0x60, 0x3E, 0x00,
+ 0x00, 0x03, 0x03, 0x1F, 0x33, 0x33, 0x1F, 0x00,
+ 0x00, 0x00, 0x1E, 0x33, 0x3E, 0x30, 0x1F, 0x00,
+ 0x00, 0x1F, 0x30, 0x3C, 0x30, 0x30, 0x30, 0x00,
+ 0x00, 0x00, 0x1F, 0x33, 0x33, 0x1F, 0x03, 0x3E,
+ 0x00, 0x30, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x00,
+ 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00,
+ 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x66, 0x3C,
+ 0x00, 0x30, 0x36, 0x36, 0x3E, 0x33, 0x33, 0x00,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0E, 0x00,
+ 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0xDB, 0xDB, 0x00,
+ 0x00, 0x00, 0x3E, 0x33, 0x33, 0x33, 0x33, 0x00,
+ 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x00, 0x00, 0x3E, 0x33, 0x33, 0x3E, 0x30, 0x30,
+ 0x00, 0x00, 0x1F, 0x33, 0x33, 0x1F, 0x03, 0x03,
+ 0x00, 0x00, 0x36, 0x38, 0x30, 0x30, 0x30, 0x00,
+ 0x00, 0x00, 0x1F, 0x30, 0x1E, 0x03, 0x3E, 0x00,
+ 0x00, 0x18, 0x1E, 0x18, 0x18, 0x18, 0x0E, 0x00,
+ 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x00, 0x00, 0x33, 0x33, 0x1E, 0x1E, 0x0C, 0x00,
+ 0x00, 0x00, 0x63, 0x63, 0x6B, 0x6B, 0x36, 0x00,
+ 0x00, 0x00, 0x33, 0x1E, 0x0C, 0x1E, 0x33, 0x00,
+ 0x00, 0x00, 0x33, 0x33, 0x33, 0x1F, 0x03, 0x3E,
+ 0x00, 0x00, 0x3F, 0x07, 0x0C, 0x38, 0x3F, 0x00,
+ 0x00, 0x07, 0x06, 0x1C, 0x06, 0x06, 0x07, 0x00,
+ 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00,
+ 0x00, 0xF0, 0x30, 0x1C, 0x30, 0x30, 0xF0, 0x00,
+ 0x00, 0x3B, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x63, 0xDD, 0xF1, 0xF1, 0xDD, 0x63, 0x3E,
+ 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
+ 0x3F, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x07, 0x00, 0x1E, 0x33, 0x3E, 0x30, 0x1F, 0x00,
+ 0x7E, 0xC3, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
+ 0x7E, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
+ 0x70, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
+ 0x18, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
+ 0x00, 0x00, 0x7C, 0xE0, 0xE0, 0x7C, 0x0E, 0x3C,
+ 0x3F, 0x61, 0x1E, 0x33, 0x3E, 0x30, 0x1E, 0x00,
+ 0x3F, 0x00, 0x1E, 0x33, 0x3E, 0x30, 0x1E, 0x00,
+ 0x38, 0x00, 0x1E, 0x33, 0x3E, 0x30, 0x1E, 0x00,
+ 0x00, 0x3F, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0x00,
+ 0x00, 0x1E, 0x33, 0x0C, 0x0C, 0x0C, 0x0C, 0x00,
+ 0x00, 0x38, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0x00,
+ 0xE7, 0x3C, 0x66, 0xC3, 0xFF, 0xC3, 0xC3, 0x00,
+ 0x38, 0x38, 0x00, 0x7C, 0xC6, 0xFE, 0xC6, 0x00,
+ 0x1E, 0x00, 0xFE, 0x70, 0x7C, 0x70, 0xFE, 0x00,
+ 0x00, 0x00, 0x7F, 0x0E, 0x7F, 0xEE, 0x7F, 0x00,
+ 0x3F, 0x7E, 0xEE, 0xFF, 0xEE, 0xEE, 0xEF, 0x00,
+ 0x3F, 0x61, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x3F, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x38, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x1E, 0x33, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x38, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x3F, 0x00, 0x36, 0x36, 0x1E, 0x06, 0x06, 0x3C,
+ 0xE3, 0x1C, 0x3E, 0x77, 0x77, 0x3E, 0x1C, 0x00,
+ 0xEE, 0x00, 0xEE, 0xEE, 0xEE, 0xEE, 0x7C, 0x00,
+ 0x1C, 0x1C, 0x7F, 0xC0, 0xC0, 0x7F, 0x1C, 0x1C,
+ 0x1C, 0x36, 0x33, 0x7C, 0x30, 0x63, 0x7E, 0x00,
+ 0xEE, 0xEE, 0x7C, 0xFE, 0x38, 0xFE, 0x38, 0x38,
+ 0xF8, 0xCC, 0xCC, 0xF8, 0xC6, 0xCF, 0xC6, 0xC7,
+ 0x0E, 0x1B, 0x18, 0x3E, 0x18, 0x18, 0xD8, 0x70,
+ 0x0E, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
+ 0x00, 0x07, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0x00,
+ 0x07, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x07, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00,
+ 0x1E, 0x00, 0x3E, 0x33, 0x33, 0x33, 0x33, 0x00,
+ 0xFE, 0x00, 0xEE, 0xFE, 0xFE, 0xFE, 0xEE, 0x00,
+ 0x3C, 0x6C, 0x6C, 0x3F, 0x00, 0x7F, 0x00, 0x00,
+ 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x7E, 0x00, 0x00,
+ 0x00, 0x18, 0x00, 0x18, 0x30, 0x63, 0x3E, 0x00,
+ 0x00, 0x00, 0x00, 0xFE, 0xE0, 0xE0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xFE, 0x0E, 0x0E, 0x00, 0x00,
+ 0xC3, 0xC6, 0xCC, 0xDF, 0x31, 0x63, 0xC6, 0x07,
+ 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x01,
+ 0x00, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00,
+ 0x00, 0x3F, 0x66, 0xCC, 0x66, 0x3F, 0x00, 0x00,
+ 0x00, 0xFC, 0x66, 0x33, 0x66, 0xFC, 0x00, 0x00,
+ 0x33, 0xCC, 0x33, 0xCC, 0x33, 0xCC, 0x33, 0xCC,
+ 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF,
+ 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0xFC, 0x1C, 0xFC, 0x1C, 0x1C, 0x1C,
+ 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0x3F, 0x3F, 0x3F,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x3F, 0x3F,
+ 0x00, 0x00, 0xFC, 0x1C, 0xFC, 0x1C, 0x1C, 0x1C,
+ 0x3F, 0x3F, 0xFF, 0x07, 0xFF, 0x3F, 0x3F, 0x3F,
+ 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
+ 0x00, 0x00, 0xFF, 0x07, 0xFF, 0x3F, 0x3F, 0x3F,
+ 0x3F, 0x3F, 0xFF, 0x07, 0xFF, 0x00, 0x00, 0x00,
+ 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0x00, 0x00, 0x00,
+ 0x1C, 0x1C, 0xFC, 0x1C, 0xFC, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x00, 0x00, 0x00,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1C, 0x1C, 0x1C,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1F, 0x1C, 0x1F, 0x1C, 0x1C, 0x1C,
+ 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
+ 0x3F, 0x3F, 0x3F, 0x38, 0x3F, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3F, 0x38, 0x3F, 0x3F, 0x3F, 0x3F,
+ 0x3F, 0x3F, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x3F, 0x3F, 0x3F,
+ 0x3F, 0x3F, 0x3F, 0x38, 0x3F, 0x3F, 0x3F, 0x3F,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
+ 0x3F, 0x3F, 0xFF, 0x00, 0xFF, 0x3F, 0x3F, 0x3F,
+ 0x1C, 0x1C, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
+ 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x1C, 0x1C, 0x1C,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x3F, 0x3F,
+ 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00,
+ 0x1C, 0x1C, 0x1F, 0x1C, 0x1F, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1F, 0x1C, 0x1F, 0x1C, 0x1C, 0x1C,
+ 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F,
+ 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0x3F, 0x3F, 0x3F,
+ 0x1C, 0x1C, 0xFF, 0x1C, 0xFF, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1C, 0x1C, 0x1C,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7F, 0xFE, 0xEC, 0xFE, 0x7F, 0x00,
+ 0x00, 0x7C, 0xEE, 0xFC, 0xEE, 0xFC, 0xE0, 0xE0,
+ 0x00, 0xFE, 0xEE, 0xE0, 0xE0, 0xE0, 0xE0, 0x00,
+ 0x00, 0xFF, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x00,
+ 0xFE, 0xEE, 0x70, 0x38, 0x70, 0xEE, 0xFE, 0x00,
+ 0x00, 0x00, 0x7F, 0xFC, 0xFC, 0xFC, 0x78, 0x00,
+ 0x00, 0x77, 0x77, 0x77, 0x77, 0x7E, 0x70, 0xE0,
+ 0x00, 0x7F, 0xFE, 0x1C, 0x1C, 0x1C, 0x1C, 0x00,
+ 0xFE, 0x38, 0x7C, 0xEE, 0xEE, 0x7C, 0x38, 0xFE,
+ 0x3C, 0x7E, 0xE7, 0xFF, 0xE7, 0x7E, 0x3C, 0x00,
+ 0x3C, 0x7E, 0xE7, 0xE7, 0x7E, 0x7E, 0xFF, 0x00,
+ 0x1E, 0x38, 0x1C, 0x7E, 0xEE, 0xEE, 0x7C, 0x00,
+ 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x7F, 0x00, 0x00,
+ 0x07, 0x0E, 0x7F, 0xFF, 0xFF, 0x7F, 0x70, 0xE0,
+ 0x3C, 0x70, 0xE0, 0xFC, 0xE0, 0x70, 0x3C, 0x00,
+ 0x7C, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00,
+ 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00,
+ 0x38, 0x38, 0xFE, 0x38, 0x38, 0x00, 0xFE, 0x00,
+ 0x70, 0x38, 0x1C, 0x38, 0x70, 0x00, 0xFE, 0x00,
+ 0x1C, 0x38, 0x70, 0x38, 0x1C, 0x00, 0xFE, 0x00,
+ 0x0F, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0xFC, 0xFC, 0x78,
+ 0x38, 0x38, 0x00, 0xFE, 0x00, 0x38, 0x38, 0x00,
+ 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x00,
+ 0x3C, 0x7E, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
+ 0x0F, 0x0E, 0x0E, 0x0E, 0xFE, 0x7E, 0x3E, 0x1E,
+ 0x7C, 0x7E, 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00,
+ 0x78, 0x1C, 0x38, 0x70, 0x7C, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3E, 0x3E, 0x3E, 0x3E, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+/* --------------------------------------------------------------------------- */
+
+static int align_bitmap_char_left( unsigned char *data, int width, int height, int pitch, int bpp );
+static int get_bitmap_char_width( unsigned char *data, int width, int height, int pitch, int bpp );
+
+/* --------------------------------------------------------------------------- */
+/*
+ * FUNCTION : gr_font_new
+ *
+ * Create a new font, with no characters in it.
+ * The font uses the MS-DOS charset and 8bpp by default.
+ *
+ * PARAMS :
+ * charset
+ * bpp
+ *
+ * RETURN VALUE :
+ * Code of the new font or -1 if error
+ * The font data is in the global array fonts[index]
+ *
+ */
+
+int gr_font_new( int charset, uint32_t bpp )
+{
+ FONT * f = ( FONT * )malloc( sizeof( FONT ) );
+
+ if ( f == NULL ) return -1; // No memory
+
+ if ( font_count == MAX_FONTS - 1 ) // Too much fonts
+ {
+ free( f );
+ return -1;
+ }
+
+ memset( f, 0, sizeof( FONT ) );
+ f->charset = charset; // CHARSET_CP850
+ f->bpp = bpp; // 8
+ f->maxwidth = 0;
+ f->maxheight = 0;
+
+ fonts[font_count] = f ;
+ return font_count++ ;
+}
+
+/* --------------------------------------------------------------------------- */
+/*
+ * FUNCTION : gr_font_newfrombitmap
+ *
+ * Create a new font using a bitmap as source.
+ * For 1bpp fonts, the bitmap should be in black and white (1 bit per pixel)
+ * with a fixed character size and a character width of 8, 16, 24...
+ *
+ * PARAMS :
+ * map Pointer to the bitmap
+ * charset Charset
+ * width Width of each character, in bits (pixels)
+ * height Height of each character
+ * first First char
+ * last Last char
+ * options Can be 0 or a combination of the following flags:
+ *
+ * NFB_FIXEDWIDTH Create a fixed width font (the default is a propotional width one)
+ *
+ * RETURN VALUE :
+ * -1 if Error, id otherwise
+ *
+ */
+
+int gr_font_newfrombitmap( GRAPH * map, int charset, int width, int height, int first, int last, int options )
+{
+ char * chardata ;
+ FONT * f ;
+ char * ptr, * charptr ;
+ int i, y, id ;
+ int charsize ;
+ int linesize = 0 ;
+ int w, h, cw, ch;
+ GRAPH * bitmap;
+
+ id = gr_font_new( charset, map->format->depth ) ;
+ if ( id == -1 ) return -1;
+
+ f = fonts[id];
+
+ charsize = map->pitch * height;
+
+ switch ( map->format->depth )
+ {
+ case 1:
+ linesize = width / 8;
+ break;
+
+ case 8:
+ linesize = width;
+ break;
+
+ case 16:
+ linesize = width * sizeof( uint16_t );
+ break;
+
+ case 32:
+ linesize = width * sizeof( uint32_t );
+ break;
+ }
+
+ ch = map->height / height;
+ cw = map->width / width;
+
+ i = first;
+
+ for ( h = 0; h < ch; h++ )
+ {
+ if ( i > last ) break;
+
+ chardata = map->data + h * charsize;
+
+ for ( charptr = chardata, w = 0; w < cw; w++, charptr += linesize, i++ )
+ {
+ int align = 0;
+
+ if ( options != NFB_FIXEDWIDTH ) align = align_bitmap_char_left( ( unsigned char * ) charptr, width, height, map->pitch, map->format->depth ) * map->format->depthb ;
+
+ bitmap = bitmap_new( i, width, height, map->format->depth );
+ if ( !bitmap )
+ {
+ gr_font_destroy( id );
+ return -1; // No memory
+ }
+
+ f->glyph[i].bitmap = bitmap;
+ f->glyph[i].xoffset = 0;
+ f->glyph[i].yoffset = 0;
+
+ bitmap_add_cpoint( bitmap, 0, 0 ) ;
+
+ ptr = bitmap->data ;
+ memset( bitmap->data, '\0', bitmap->pitch * bitmap->height );
+
+ for ( y = 0 ; y < height ; y++, ptr += bitmap->pitch ) memcpy( ptr, charptr + map->pitch * y + align, bitmap->widthb - align );
+
+ if ( options != NFB_FIXEDWIDTH )
+ {
+ if ( map->format->depth == 1 )
+ f->glyph[i].xadvance = get_bitmap_char_width( ( unsigned char * ) charptr, width, height, map->pitch, map->format->depth ) + 1;
+ else
+ f->glyph[i].xadvance = get_bitmap_char_width( bitmap->data, width, height, bitmap->pitch, bitmap->format->depth ) + 1;
+ }
+ else
+ f->glyph[i].xadvance = width + 1;
+
+ bitmap->modified = 0 ;
+ bitmap->info_flags = 0 ;
+ }
+ }
+
+ /* Set a reasonable size for the space */
+
+ f->glyph[32].xadvance = width * 65 / 100 ;
+ f->maxwidth = width;
+ f->maxheight = height;
+
+ return id ;
+}
+
+/* --------------------------------------------------------------------------- */
+/* Utility function used by gr_new_fontfrombitmap to align characters */
+
+static int align_bitmap_char_left( unsigned char *data, int width, int height, int pitch, int bpp )
+{
+ int leftest, n, c, x ;
+ static int leftest_table[256] = { 0 } ;
+
+ if ( leftest_table[0] == 0 )
+ {
+ for ( n = 0 ; n < 256 ; n++ )
+ {
+ if ( n & 0x80 ) leftest_table[n] = 0 ;
+ else if ( n & 0x40 ) leftest_table[n] = 1 ;
+ else if ( n & 0x20 ) leftest_table[n] = 2 ;
+ else if ( n & 0x10 ) leftest_table[n] = 3 ;
+ else if ( n & 0x08 ) leftest_table[n] = 4 ;
+ else if ( n & 0x04 ) leftest_table[n] = 5 ;
+ else if ( n & 0x02 ) leftest_table[n] = 6 ;
+ else if ( n & 0x01 ) leftest_table[n] = 7 ;
+ else leftest_table[n] = 8 ;
+ }
+ }
+
+ if ( bpp == 1 )
+ {
+ leftest = 8 ;
+ for ( n = 0 ; n < height ; n++ )
+ {
+ for ( c = 0 ; c < width ; c += 8 )
+ {
+ if ( leftest > c + leftest_table[data[( width*n+c )/8]] ) leftest = c + leftest_table[data[( width*n+c )/8]] ;
+ }
+ }
+
+ if ( leftest > 7 )
+ {
+ if ( width > leftest )
+ for ( n = 0 ; n < height ; n++ )
+ memmove( data + n*width / 8, data + ( n*width + leftest ) / 8, ( width - leftest ) / 8 );
+
+ leftest &= 7;
+ }
+
+ for ( n = 0 ; n < height*width / 8 ; n++ ) data[n] <<= leftest ;
+
+ return 0;
+ }
+ else
+ {
+ int align = width;
+
+ switch( bpp )
+ {
+ case 8:
+ {
+ uint8_t * p = ( uint8_t * ) data;
+ while ( height-- )
+ {
+ p = ( uint8_t * ) ( data + height * pitch );
+ for ( x = 0; x < width && !*p++; x++ );
+ if ( align > x ) align = x;
+ }
+ return ( align == width ) ? 0 : align;
+ }
+
+ case 16:
+ {
+ uint16_t * p = ( uint16_t * ) data;
+ while ( height-- )
+ {
+ p = ( uint16_t * ) ( data + height * pitch );
+ for ( x = 0; x < width && !*p++; x++ );
+ if ( align > x ) align = x;
+ }
+ return ( align == width ) ? 0 : align;
+ }
+
+ case 32:
+ {
+ uint32_t * p = ( uint32_t * ) data;
+ while ( height-- )
+ {
+ p = ( uint32_t * ) ( data + height * pitch );
+ for ( x = 0; x < width && !*p++; x++ );
+ if ( align > x ) align = x;
+ }
+ return ( align == width ) ? 0 : align;
+ }
+ }
+
+ return 0;
+ }
+}
+
+/* --------------------------------------------------------------------------- */
+/* Utility function used by gr_new_fontfrombitmap to calculate char widths */
+
+static int get_bitmap_char_width( unsigned char *data, int width, int height, int pitch, int bpp )
+{
+ int x, c, d, max = 0, w ;
+
+ switch( bpp )
+ {
+ case 1:
+ while ( height-- )
+ {
+ for ( x = 0 ; x < width ; x += 8 )
+ {
+ c = *data++ ;
+ for ( d = 8 ; d > 0 ; d--, c >>= 1 ) if ( c & 0x01 ) break ;
+ if ( x*8 + d > max ) max = x * 8 + d ;
+ }
+ }
+ return ( max < 4 ) ? 4 : max;
+
+ case 8:
+ {
+ uint8_t * p = ( uint8_t * ) data;
+ while ( height-- )
+ {
+ w = 0;
+ p = ( uint8_t * ) ( data + height * pitch );
+ for ( x = 0; x < width; x++ )
+ {
+ if ( *p++ ) w = x;
+ }
+ if ( max < w ) max = w;
+ }
+ return ( !max ) ? width * 65 / 100 : max;
+ }
+
+ case 16:
+ {
+ uint16_t * p;
+ while ( height-- )
+ {
+ w = 0;
+ p = ( uint16_t * ) ( data + height * pitch );
+ for ( x = 0; x < width; x++ )
+ {
+ if ( *p++ ) w = x;
+ }
+ if ( max < w ) max = w;
+ }
+ return ( !max ) ? width * 65 / 100 : max;
+ }
+
+ case 32:
+ {
+ uint32_t * p;
+ while ( height-- )
+ {
+ w = 0;
+ p = ( uint32_t * ) ( data + height * pitch );
+ for ( x = 0; x < width; x++ )
+ {
+ if ( *p++ ) w = x;
+ }
+ if ( max < w ) max = w;
+ }
+ return ( !max ) ? width * 65 / 100 : max;
+ }
+ }
+
+ return width;
+}
+
+/* --------------------------------------------------------------------------- */
+/*
+ * FUNCTION : gr_font_systemfont
+ *
+ * Create the system font. This function should be called once.
+ *
+ * PARAMS :
+ * chardata Pointer to the system font data
+ *
+ * RETURN VALUE :
+ * Always returns 1
+ *
+ */
+
+int gr_font_systemfont( char * chardata )
+{
+ GRAPH * map = bitmap_new_ex( 0, 8, 8 * 256, 1, chardata, 1 );
+ if ( !map ) return -1;
+
+ int last_count = font_count ;
+ if ( fonts[0] ) gr_font_destroy( 0 ) ;
+ font_count = 0 ;
+
+ gr_font_newfrombitmap( map, CHARSET_CP850, 8, 8, 0, 255, 0 );
+ if ( last_count ) font_count = last_count ;
+
+ bitmap_destroy( map );
+
+ return 1;
+}
+
+/* --------------------------------------------------------------------------- */
+/*
+ * FUNCTION : gr_font_destroy
+ *
+ * Destroy a font and all the internal bitmap data
+ *
+ * PARAMS :
+ * fontid ID of the font
+ *
+ * RETURN VALUE :
+ * None
+ *
+ */
+
+void gr_font_destroy( int fontid )
+{
+ int n ;
+
+ if ( fontid >= 0 && fontid < font_count )
+ {
+ if ( !fonts[fontid] ) return ;
+
+ for ( n = 0 ; n < MAX_FONTS ; n++ )
+ if ( fonts[fontid]->glyph[n].bitmap )
+ bitmap_destroy( fonts[fontid]->glyph[n].bitmap ) ;
+
+ free( fonts[fontid] ) ;
+ fonts[fontid] = NULL ;
+ while ( font_count > 0 && fonts[font_count-1] == 0 ) font_count-- ;
+ }
+}
+
+/* --------------------------------------------------------------------------- */
+/*
+ * FUNCTION : gr_font_get
+ *
+ * Return a font object, given an ID
+ *
+ * PARAMS :
+ * id id of the font
+ *
+ * RETURN VALUE :
+ * Pointer to the font object or NULL if it does not exist
+ *
+ */
+
+FONT * gr_font_get( int id )
+{
+ if ( id >= 0 && id < MAX_FONTS ) return fonts[id];
+ return NULL;
+}
+
+/* --------------------------------------------------------------------------- */
+/* exports */
+/* --------------------------------------------------------------------------- */
+
+#include "libfont_exports.h"
+
+/* --------------------------------------------------------------------------- */