font.h 4.83 KB
Newer Older
1
/*
2
 *  GRUB  --  GRand Unified Bootloader
3
 *  Copyright (C) 2003,2007,2008,2009  Free Software Foundation, Inc.
4
 *
5
 *  GRUB is free software: you can redistribute it and/or modify
6
 *  it under the terms of the GNU General Public License as published by
7
 *  the Free Software Foundation, either version 3 of the License, or
8 9
 *  (at your option) any later version.
 *
10
 *  GRUB is distributed in the hope that it will be useful,
11 12 13 14 15
 *  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
16
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
17 18
 */

19 20
#ifndef GRUB_FONT_HEADER
#define GRUB_FONT_HEADER	1
21

22
#include <grub/types.h>
23
#include <grub/video.h>
phcoder's avatar
phcoder committed
24
#include <grub/file.h>
25
#include <grub/unicode.h>
26

27 28 29
/* Forward declaration of opaque structure grub_font.
   Users only pass struct grub_font pointers to the font module functions,
   and do not have knowledge of the structure contents.  */
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
/* Full structure was moved here for inline function but still
   shouldn't be used directly.
 */
struct grub_font
{
  char *name;
  grub_file_t file;
  char *family;
  short point_size;
  short weight;
  short max_char_width;
  short max_char_height;
  short ascent;
  short descent;
  short leading;
  grub_uint32_t num_chars;
  struct char_index_entry *char_index;
  grub_uint16_t *bmp_idx;
};
49 50 51 52 53 54 55 56 57 58 59 60

/* Font type used to access font functions.  */
typedef struct grub_font *grub_font_t;

struct grub_font_node
{
  struct grub_font_node *next;
  grub_font_t value;
};

/* Global font registry.  */
extern struct grub_font_node *grub_font_list;
61

62 63
struct grub_font_glyph
{
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
  /* Reference to the font this glyph belongs to.  */
  grub_font_t font;

  /* Glyph bitmap width in pixels.  */
  grub_uint16_t width;

  /* Glyph bitmap height in pixels.  */
  grub_uint16_t height;

  /* Glyph bitmap x offset in pixels.  Add to screen coordinate.  */
  grub_int16_t offset_x;

  /* Glyph bitmap y offset in pixels.  Subtract from screen coordinate.  */
  grub_int16_t offset_y;

  /* Number of pixels to advance to start the next character.  */
  grub_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.  */
  grub_uint8_t bitmap[0];
89 90
};

91 92 93 94 95
/* Part of code field which is really used as such.  */
#define GRUB_FONT_CODE_CHAR_MASK     0x001fffff
#define GRUB_FONT_CODE_RIGHT_JOINED  0x80000000
#define GRUB_FONT_CODE_LEFT_JOINED   0x40000000

96 97 98 99 100 101
/* Initialize the font loader.
   Must be called before any fonts are loaded or used.  */
void grub_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.  */
102
grub_font_t EXPORT_FUNC(grub_font_load) (const char *filename);
103 104 105 106 107

/* 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.  */
108
grub_font_t EXPORT_FUNC (grub_font_get) (const char *font_name);
109

110
const char *EXPORT_FUNC (grub_font_get_name) (grub_font_t font);
111

112
int EXPORT_FUNC (grub_font_get_max_char_width) (grub_font_t font);
113

114 115 116 117 118 119
/* Get the maximum height of any character in the font in pixels.  */
static inline int
grub_font_get_max_char_height (grub_font_t font)
{
  return font->max_char_height;
}
120

121 122 123 124 125 126
/* Get the distance in pixels from the top of characters to the baseline.  */
static inline int
grub_font_get_ascent (grub_font_t font)
{
  return font->ascent;
}
127

128
int EXPORT_FUNC (grub_font_get_descent) (grub_font_t font);
129

130
int EXPORT_FUNC (grub_font_get_leading) (grub_font_t font);
131

132
int EXPORT_FUNC (grub_font_get_height) (grub_font_t font);
133

134
int EXPORT_FUNC (grub_font_get_xheight) (grub_font_t font);
135

136 137
struct grub_font_glyph *EXPORT_FUNC (grub_font_get_glyph) (grub_font_t font,
							   grub_uint32_t code);
138

139 140
struct grub_font_glyph *EXPORT_FUNC (grub_font_get_glyph_with_fallback) (grub_font_t font,
									 grub_uint32_t code);
141

142 143 144
grub_err_t EXPORT_FUNC (grub_font_draw_glyph) (struct grub_font_glyph *glyph,
					       grub_video_color_t color,
					       int left_x, int baseline_y);
145

146 147 148 149 150 151 152
int
EXPORT_FUNC (grub_font_get_constructed_device_width) (grub_font_t hinted_font,
					const struct grub_unicode_glyph *glyph_id);
struct grub_font_glyph *
EXPORT_FUNC (grub_font_construct_glyph) (grub_font_t hinted_font,
			   const struct grub_unicode_glyph *glyph_id);

153
#endif /* ! GRUB_FONT_HEADER */