9
0
Fork 0

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:
Du Huanpeng 2015-11-22 20:24:49 +08:00 committed by Sascha Hauer
parent 314b5402d9
commit ea682776db
6 changed files with 90 additions and 2 deletions

View File

@ -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;

View File

@ -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),

View File

@ -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

View File

@ -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)

View File

@ -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);

View File

@ -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)
{