diff options
author | neonloop | 2021-10-20 14:54:27 +0000 |
---|---|---|
committer | neonloop | 2021-10-20 14:54:27 +0000 |
commit | ea1947ffcc606d757357398b24e74a3f4ecefa07 (patch) | |
tree | 2031b8d4fc4c61063c710a7148378f57e662efbd /modules/libfont/libfont.c | |
download | bennugd-main.tar.gz bennugd-main.tar.bz2 bennugd-main.zip |
Initial commit from steward-fu releasemain
Diffstat (limited to 'modules/libfont/libfont.c')
-rw-r--r-- | modules/libfont/libfont.c | 725 |
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" + +/* --------------------------------------------------------------------------- */ |