summaryrefslogtreecommitdiff
path: root/include/linux/font.h
blob: 6845f02d739a0d0d3803f33cb7b79917db02eec7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
 *  font.h -- `Soft' font definitions
 *
 *  Created 1995 by Geert Uytterhoeven
 *
 *  This file is subject to the terms and conditions of the GNU General Public
 *  License.  See the file COPYING in the main directory of this archive
 *  for more details.
 */

#ifndef _VIDEO_FONT_H
#define _VIDEO_FONT_H

#include <linux/math.h>
#include <linux/types.h>

struct console_font;

/*
 * Glyphs
 */

/**
 * font_glyph_pitch - Calculates the number of bytes per scanline
 * @width: The glyph width in bits per scanline
 *
 * A glyph's pitch is the number of bytes in a single scanline, rounded
 * up to the next full byte. The parameter @width receives the number
 * of visible bits per scanline. For example, if width is 14 bytes per
 * scanline, the pitch is 2 bytes per scanline. If width is 8 bits per
 * scanline, the pitch is 1 byte per scanline.
 *
 * Returns:
 * The number of bytes in a single scanline of the glyph
 */
static inline unsigned int font_glyph_pitch(unsigned int width)
{
	return DIV_ROUND_UP(width, 8);
}

/**
 * font_glyph_size - Calculates the number of bytes per glyph
 * @width: The glyph width in bits per scanline
 * @vpitch: The number of scanlines in the glyph
 *
 * The number of bytes in a glyph depends on the pitch and the number
 * of scanlines. font_glyph_size automatically calculates the pitch
 * from the given width. The parameter @vpitch gives the number of
 * scanlines, which is usually the glyph's height in scanlines. Fonts
 * coming from user space can sometimes have a different vertical pitch
 * with empty scanlines between two adjacent glyphs.
 */
static inline unsigned int font_glyph_size(unsigned int width, unsigned int vpitch)
{
	return font_glyph_pitch(width) * vpitch;
}

/*
 * font_data_t and helpers
 */

/**
 * font_data_t - Raw font data
 *
 * Values of type font_data_t store a pointer to raw font data. The format
 * is monochrome. Each bit sets a pixel of a stored glyph. Font data does
 * not store geometry information for the individual glyphs. Users of the
 * font have to store glyph size, pitch and character count separately.
 *
 * Font data in font_data_t is not equivalent to raw u8. Each pointer stores
 * an additional hidden header before the font data. The layout is
 *
 * +------+-----------------------------+
 * | -16  |  CRC32 Checksum (optional)  |
 * | -12  |  <Unused>                   |
 * |  -8  |  Number of data bytes       |
 * |  -4  |  Reference count            |
 * +------+-----------------------------+
 * |   0  |  Data buffer                |
 * |  ... |                             |
 * +------+-----------------------------+
 *
 * Use helpers to access font_data_t. Use font_data_buf() to get the stored data.
 */
typedef const unsigned char font_data_t;

/**
 * font_data_buf() - Returns the font data as raw bytes
 * @fd: The font data
 *
 * Returns:
 * The raw font data. The provided buffer is read-only.
 */
static inline const unsigned char *font_data_buf(font_data_t *fd)
{
	return (const unsigned char *)fd;
}

font_data_t *font_data_import(const struct console_font *font, unsigned int vpitch,
			      u32 (*calc_csum)(u32, const void *, size_t));
void font_data_get(font_data_t *fd);
bool font_data_put(font_data_t *fd);
unsigned int font_data_size(font_data_t *fd);
bool font_data_is_equal(font_data_t *lhs, font_data_t *rhs);
int font_data_export(font_data_t *fd, struct console_font *font, unsigned int vpitch);

/* font_rotate.c */
void font_glyph_rotate_90(const unsigned char *glyph, unsigned int width, unsigned int height,
			  unsigned char *out);
void font_glyph_rotate_180(const unsigned char *glyph, unsigned int width, unsigned int height,
			   unsigned char *out);
void font_glyph_rotate_270(const unsigned char *glyph, unsigned int width, unsigned int height,
			   unsigned char *out);
unsigned char *font_data_rotate(font_data_t *fd, unsigned int width, unsigned int height,
				unsigned int charcount, unsigned int steps,
				unsigned char *buf, size_t *bufsize);

/*
 * Font description
 */

struct font_desc {
    int idx;
    const char *name;
    unsigned int width, height;
    unsigned int charcount;
    font_data_t *data;
    int pref;
};

/* Find a font with a specific name */

extern const struct font_desc *find_font(const char *name);

/* Get the default font for a specific screen size */

extern const struct font_desc *get_default_font(int xres, int yres,
						unsigned long *font_w,
						unsigned long *font_h);

/* Max. length for the name of a predefined font */
#define MAX_FONT_NAME	32

/*
 * Built-in fonts
 */

extern const struct font_desc font_10x18;
extern const struct font_desc font_6x10;
extern const struct font_desc font_6x8;
extern const struct font_desc font_7x14;
extern const struct font_desc font_acorn_8x8;
extern const struct font_desc font_mini_4x6;
extern const struct font_desc font_pearl_8x8;
extern const struct font_desc font_sun_12x22;
extern const struct font_desc font_sun_8x16;
extern const struct font_desc font_ter_10x18;
extern const struct font_desc font_ter_16x32;
extern const struct font_desc font_vga_6x11;
extern const struct font_desc font_vga_8x16;
extern const struct font_desc font_vga_8x8;

#endif /* _VIDEO_FONT_H */