font: fbconsole: add custom font supports
Signed-off-by: Du Huanpeng <u74147@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
314b5402d9
commit
ea682776db
|
@ -84,7 +84,7 @@ static struct rgb colors[] = {
|
|||
{ 255, 255, 255 },
|
||||
};
|
||||
|
||||
static void drawchar(struct fbc_priv *priv, int x, int y, char c)
|
||||
static void drawchar(struct fbc_priv *priv, int x, int y, int c)
|
||||
{
|
||||
void *buf;
|
||||
int bpp = priv->fb->bits_per_pixel >> 3;
|
||||
|
@ -97,7 +97,8 @@ static void drawchar(struct fbc_priv *priv, int x, int y, char c)
|
|||
|
||||
buf = gui_screen_render_buffer(priv->sc);
|
||||
|
||||
inbuf = priv->font->data + c * priv->font->height;
|
||||
i = find_font_index(priv->font, c);
|
||||
inbuf = priv->font->data + i;
|
||||
|
||||
line_length = priv->fb->line_length;
|
||||
|
||||
|
|
|
@ -12,17 +12,25 @@
|
|||
#define _VIDEO_FONT_H
|
||||
|
||||
#include <param.h>
|
||||
#include <wchar.h>
|
||||
|
||||
struct font_index {
|
||||
wchar_t wc; /* code of the char. */
|
||||
short index; /* offset of the char in the bitmap. */
|
||||
};
|
||||
struct font_desc {
|
||||
const char *name;
|
||||
int width, height;
|
||||
struct font_index *index;
|
||||
const void *data;
|
||||
int num_chars;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
/* Max. length for the name of a predefined font */
|
||||
#define MAX_FONT_NAME 32
|
||||
|
||||
extern int find_font_index(const struct font_desc *font, int ch);
|
||||
extern const struct font_desc *find_font_enum(int n);
|
||||
extern struct param_d *add_param_font(struct device_d *dev,
|
||||
int (*set)(struct param_d *p, void *priv),
|
||||
|
|
|
@ -20,6 +20,11 @@ config FONT_7x14
|
|||
config FONT_MINI_4x6
|
||||
bool "Mini 4x6 font"
|
||||
|
||||
config FONT_CUSTOM_16X
|
||||
bool "Custom 16x16 font"
|
||||
help
|
||||
This font is useful for Chinese and other non ascii chars.
|
||||
|
||||
config FONT_AUTOSELECT
|
||||
def_bool y
|
||||
depends on !FONT_MINI_4x6
|
||||
|
|
|
@ -5,6 +5,7 @@ font-objs := fonts.o
|
|||
font-objs-$(CONFIG_FONT_8x16) += font_8x16.o
|
||||
font-objs-$(CONFIG_FONT_7x14) += font_7x14.o
|
||||
font-objs-$(CONFIG_FONT_MINI_4x6) += font_mini_4x6.o
|
||||
font-objs-$(CONFIG_FONT_CUSTOM_16X)+= font_custom_16x.o
|
||||
|
||||
font-objs += $(font-objs-y)
|
||||
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* by Du Huanpeng <u74147@gmail.com>
|
||||
*/
|
||||
|
||||
#include <init.h>
|
||||
#include <module.h>
|
||||
#include <linux/font.h>
|
||||
#include <common.h>
|
||||
|
||||
/* place real font data here or set fontdata_custom_16x points to
|
||||
* the address of font data and also setup the index.
|
||||
*/
|
||||
|
||||
static const unsigned char fontdata_custom_16x[] = {
|
||||
0xFF, 0xFF, /*OOOOOOOOOOOOOOOO*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0x80, 0x01, /*O______________O*/
|
||||
0xFF, 0xFF, /*OOOOOOOOOOOOOOOO*/
|
||||
};
|
||||
|
||||
static struct font_index fontdata_custom_16x_index[] = {
|
||||
{ 0x0000, 0x0000 },
|
||||
};
|
||||
|
||||
static struct font_desc font_custom_16x = {
|
||||
.name = "CUSTOM-16x",
|
||||
.width = 16,
|
||||
.height = 16,
|
||||
.data = fontdata_custom_16x,
|
||||
.index = fontdata_custom_16x_index,
|
||||
.num_chars = ARRAY_SIZE(fontdata_custom_16x_index),
|
||||
};
|
||||
|
||||
static int font_custom_16x_register(void)
|
||||
{
|
||||
return font_register(&font_custom_16x);
|
||||
}
|
||||
postcore_initcall(font_custom_16x_register);
|
|
@ -31,6 +31,29 @@ int font_register(struct font_desc *font)
|
|||
|
||||
return 0;
|
||||
}
|
||||
int find_font_index(const struct font_desc *font, int ch)
|
||||
{
|
||||
int index;
|
||||
if (font->index == NULL) {
|
||||
index = font->width + 7;
|
||||
index /= 8;
|
||||
index *= font->height;
|
||||
index *= ch;
|
||||
} else {
|
||||
/*
|
||||
* FIXME: use binary search instead!
|
||||
*/
|
||||
index = font->num_chars - 1;
|
||||
|
||||
while (index && font->index[index].wc != ch)
|
||||
index--;
|
||||
|
||||
/* return 0 if not found. */
|
||||
index = font->index->index;
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
const struct font_desc *find_font_enum(int n)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue