vaseboot/include/VasEBoot/font.h

154 lines
5.1 KiB
C

/*
* VasEBoot -- GRand Unified Bootloader
* Copyright (C) 2003,2007,2008,2009 Free Software Foundation, Inc.
*
* VasEBoot is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* VasEBoot is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with VasEBoot. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef VasEBoot_FONT_HEADER
#define VasEBoot_FONT_HEADER 1
#include <VasEBoot/types.h>
#include <VasEBoot/video.h>
#include <VasEBoot/file.h>
#include <VasEBoot/unicode.h>
/* Forward declaration of opaque structure VasEBoot_font.
Users only pass struct VasEBoot_font pointers to the font module functions,
and do not have knowledge of the structure contents. */
/* Full structure was moved here for inline function but still
shouldn't be used directly.
*/
struct VasEBoot_font
{
char *name;
VasEBoot_file_t file;
char *family;
short point_size;
short weight;
short max_char_width;
short max_char_height;
short ascent;
short descent;
short leading;
VasEBoot_uint32_t num_chars;
struct char_index_entry *char_index;
VasEBoot_uint16_t *bmp_idx;
};
/* Font type used to access font functions. */
typedef struct VasEBoot_font *VasEBoot_font_t;
struct VasEBoot_font_node
{
struct VasEBoot_font_node *next;
VasEBoot_font_t value;
};
/* Global font registry. */
extern struct VasEBoot_font_node *VasEBoot_font_list;
struct VasEBoot_font_glyph
{
/* Reference to the font this glyph belongs to. */
VasEBoot_font_t font;
/* Glyph bitmap width in pixels. */
VasEBoot_uint16_t width;
/* Glyph bitmap height in pixels. */
VasEBoot_uint16_t height;
/* Glyph bitmap x offset in pixels. Add to screen coordinate. */
VasEBoot_int16_t offset_x;
/* Glyph bitmap y offset in pixels. Subtract from screen coordinate. */
VasEBoot_int16_t offset_y;
/* Number of pixels to advance to start the next character. */
VasEBoot_uint16_t device_width;
/* Row-major order, packed bits (no padding; rows can break within a byte).
The length of the array is (width * height + 7) / 8. Within a
byte, the most significant bit is the first (leftmost/uppermost) pixel.
Pixels are coded as bits, value 1 meaning of opaque pixel and 0 is
transparent. If the length of the array does not fit byte boundary, it
will be padded with 0 bits to make it fit. */
VasEBoot_uint8_t bitmap[0];
};
/* Part of code field which is really used as such. */
#define VasEBoot_FONT_CODE_CHAR_MASK 0x001fffff
#define VasEBoot_FONT_CODE_RIGHT_JOINED 0x80000000
#define VasEBoot_FONT_CODE_LEFT_JOINED 0x40000000
/* Initialize the font loader.
Must be called before any fonts are loaded or used. */
void VasEBoot_font_loader_init (void);
/* Load a font and add it to the beginning of the global font list.
Returns: 0 upon success; nonzero upon failure. */
VasEBoot_font_t EXPORT_FUNC(VasEBoot_font_load) (const char *filename);
/* Get the font that has the specified name. Font names are in the form
"Family Name Bold Italic 14", where Bold and Italic are optional.
If no font matches the name specified, the most recently loaded font
is returned as a fallback. */
VasEBoot_font_t EXPORT_FUNC (VasEBoot_font_get) (const char *font_name);
const char *EXPORT_FUNC (VasEBoot_font_get_name) (VasEBoot_font_t font);
int EXPORT_FUNC (VasEBoot_font_get_max_char_width) (VasEBoot_font_t font);
/* Get the maximum height of any character in the font in pixels. */
static inline int
VasEBoot_font_get_max_char_height (VasEBoot_font_t font)
{
return font->max_char_height;
}
/* Get the distance in pixels from the top of characters to the baseline. */
static inline int
VasEBoot_font_get_ascent (VasEBoot_font_t font)
{
return font->ascent;
}
int EXPORT_FUNC (VasEBoot_font_get_descent) (VasEBoot_font_t font);
int EXPORT_FUNC (VasEBoot_font_get_leading) (VasEBoot_font_t font);
int EXPORT_FUNC (VasEBoot_font_get_height) (VasEBoot_font_t font);
int EXPORT_FUNC (VasEBoot_font_get_xheight) (VasEBoot_font_t font);
struct VasEBoot_font_glyph *EXPORT_FUNC (VasEBoot_font_get_glyph) (VasEBoot_font_t font,
VasEBoot_uint32_t code);
struct VasEBoot_font_glyph *EXPORT_FUNC (VasEBoot_font_get_glyph_with_fallback) (VasEBoot_font_t font,
VasEBoot_uint32_t code);
VasEBoot_err_t EXPORT_FUNC (VasEBoot_font_draw_glyph) (struct VasEBoot_font_glyph *glyph,
VasEBoot_video_color_t color,
int left_x, int baseline_y);
int
EXPORT_FUNC (VasEBoot_font_get_constructed_device_width) (VasEBoot_font_t hinted_font,
const struct VasEBoot_unicode_glyph *glyph_id);
struct VasEBoot_font_glyph *
EXPORT_FUNC (VasEBoot_font_construct_glyph) (VasEBoot_font_t hinted_font,
const struct VasEBoot_unicode_glyph *glyph_id);
#endif /* ! VasEBoot_FONT_HEADER */