font: fbconsole: add custom font supports
Subsystems (2)
PATCH 1/1 font: fbconsole: add custom font supports
Signed-off-by Du Huanpeng <[email protected]>
--- drivers/video/fbconsole.c | 5 +++-- include/linux/font.h | 8 ++++++++ lib/fonts/Kconfig | 5 +++++ lib/fonts/Makefile | 1 + lib/fonts/font_custom_16x.c | 50 +++++++++++++++++++++++++++++++++++++++++++++ lib/fonts/fonts.c | 23 +++++++++++++++++++++ 6 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 lib/fonts/font_custom_16x.c
drivers/video/fbconsole.c +3 -2
@@ -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;
include/linux/font.h +8 -0
@@ -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),
lib/fonts/Kconfig +5 -0
@@ -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
lib/fonts/Makefile +1 -0
@@ -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)
lib/fonts/font_custom_16x.c new file +50 -0
50 lines not on this page · raw message
lib/fonts/fonts.c +23 -0
@@ -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) {
Signature · 7 lines
1.9.1 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Sascha Hauer
AppliedQuoted 10 lines · Du Huanpeng
Signed-off-by Du Huanpeng <[email protected]>--- drivers/video/fbconsole.c | 5 +++-- include/linux/font.h | 8 ++++++++ lib/fonts/Kconfig | 5 +++++ lib/fonts/Makefile | 1 + lib/fonts/font_custom_16x.c | 50 +++++++++++++++++++++++++++++++++++++++++++++ lib/fonts/fonts.c | 23 +++++++++++++++++++++ 6 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 lib/fonts/font_custom_16x.c
Applied, thanks
Sascha
Quoted 181 lines
drivers/video/fbconsole.c +3
-2@@ -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;include/linux/font.h +8
-0@@ -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),lib/fonts/Kconfig +5
-0@@ -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_4x6lib/fonts/Makefile +1
-0@@ -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)lib/fonts/font_custom_16x.c new file +50
-0@@ -0,0 +1,50 @@ +/* +* by Du Huanpeng <[email protected]> +*/ + +#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);lib/fonts/fonts.c +23
-0@@ -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) {Signature · 7 lines
1.9.1 _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox
Signature · 9 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list [email protected] http://lists.infradead.org/mailman/listinfo/barebox