Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629097
  • 博文数量: 112
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 1406
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-25 18:46
文章分类
文章存档

2011年(1)

2010年(5)

2009年(25)

2008年(81)

我的朋友

分类: LINUX

2008-04-26 11:19:17

Fb console中的字体

/driver/video目录下:
font_6x11.c,font_8x8.c,font_8x16.c

font_acorn_8x8.c,font_pearl_8x8.c,

font_sun8x16.c,font_sun12x22.c

fonts.c

这些文件都是用来处理在fbcon中的字体显示问题。其中除最后一个文件fonts.c外,其他都是字模文件由cpi2fnt产生。

/include/video/目录下:

font.h

1.          首先介绍font.h文件

font.h文件中,定义了字体的描述结构

struct fbcon_font_desc {

    int idx;     /字体的索引号

    char *name;/字体的描述

    int width, height;/字模的宽和高

    void *data;/字模的起始指针

    int pref;    /额外信息,平台用

};

width的值不一定是8的整数倍,考虑到计算机存储的问题,即使width小于8的整数倍,存储时仍以字节为单位,不足的右补齐0

Linux内核自带了7种字体,name依次为:

font_vga_8x8,

                            font_vga_8x16,

                            font_pearl_8x8,

                            font_vga_6x11,

                            font_sun_8x16,

                            font_sun_12x22,

                            font_acorn_8x8;

根据定义name长度不大于32字节。

2.          Font.c文件

/* 根据字体名返回该字体的描述结构 */

 struct fbcon_font_desc *fbcon_find_font(char *name);

 

/*根据屏幕大小,获取默认字体描述 */

struct fbcon_font_desc *fbcon_get_default_font(int xres, int yres);

 

由此看来,linux中基于fbcon的字体比较单一,描述和使用也相对简单。主要是由于采用字模描述,只描述256ascii字符,故存储空间不大,从204811264不等。

Fbcon中的颜色查找表

Fbcon-cfbx表示该console使用的是xbpp颜色描述。颜色数为2^x。

在此,我们仅以x=8,x=24举例,使用颜色分别是256色和真彩16M。

/driver/video/fbcon-cfb8.c

/driver/video/fbcon-cfb24.c

/include/video/fbcon-cfb8.h

/include/video/fbcon-cfb24.h

4个文件实现的具体的操作,而fbcon的底层操作,参考前面的fbcon的介绍,不重复了:)

实现fbcon的颜色映射只需完成下面的功能,以fb8为例:

struct display_switch fbcon_cfb8;  

void fbcon_cfb8_setup(struct display *p);

void fbcon_cfb8_bmove(struct display *p, int sy, int sx, int dy, int dx, int height, int width);

void fbcon_cfb8_clear(struct vc_data *conp, struct display *p, int sy, int sx, int height, int width);

void fbcon_cfb8_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx);

void fbcon_cfb8_putcs(struct vc_data *conp, struct display *p, const unsigned short *s, int count, int yy, int xx);

void fbcon_cfb8_revc(struct display *p, int xx, int yy);

void fbcon_cfb8_clear_margins(struct vc_data *conp, struct display *p,int bottom_only);

fbcon_cfb8是系统的实现关键,具体解释参考fbcon介绍。

fbcon_cfb8_setup函数完成设定display结构中next_line和next_palne的值。

fbcon_cfb8_bmove函数完成当前坐标的移动。

fbcon_cfb8_clear函数通过调用rectfill函数清屏幕缓冲区。

fbcon_cfb8_putc函数向屏幕输出单字符,字体宽度必须小于等于16。

fbcon_cfb8_putcs函数向屏幕输出字符串。

fbcon_cfb8_revc函数从屏幕输入单个字符,并回显到fb上。

fbcon_cfb8_clear_margins函数和fbcon_cfb8_clear类似,调用rectfill清除区域。

其中,fb_writel函数和fb_readl函数实现输入输出的底层操作。这两个函数实际上实在fbcon_h中定义的宏操作,IOMEM操作而已。

关注一下“(nibbletab_cfb8[*cdat++ >> 4] & eorx) ^ bgx,”

这是所谓8bpp的具体实现,不同的位深就在写fb缓冲时体现了。让我们从后向前分析,

1.()^bgx,颜色和背景色异或,只有这样才能保证背景色改变时,文字一直显示。

2.~&eorx,eorx是前景色和背景色异或后的值,只有在前景色和背景色一致的时候,eorx才是0。

3. nibbletab_cfb8[~],根据字体的~值,调用查找表,取颜色值

4.~从字体文件中去读字模的值。

 

还有点疑问,就是这两句的作用,attr_fgcol在fbcon_h中定义:

fgx=attr_fgcol(p,c);

    bgx=attr_bgcol(p,c);

从前面的看,c应该是个字符的ascii码,ascii与颜色有什么关系呢?研究中….

阅读(1636) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~