织梦CMS - 轻松建站从此开始!

罗索

linux 2.6的Kernel LOGO 显示调整

落鹤生 发布于 2010-10-14 23:38 点击:次 
2.6的logo数据在/drivers/video/logo里,ppm文件就是logo图像了。每个ppm对应一个.c文件,内容大概就是图像尺寸、调色板、位图数据等信息。.c文件无需自己建立,在make的时候如果不存在某个ppm文件对应的.c文件,就会自动从 ppm生成一个,然后把它编译成.o文件。
TAG:

2.6的Kernel LOGO 似乎比2.4容易。

2.6的logo数据在/drivers/video/logo里,ppm文件就是logo图像了。每个ppm对应一个. c文件,内容大概就是图像尺寸、调色板、位图数据等信息。.c文件无需自己建立,在make的时候如果不存在某个ppm文件对应的.c文件,就会自动从 ppm生成一个,然后把它编译成.o文件。所以看看目录下哪些.ppm文件有同名的.o文件,就说明那个logo被编译进了kernel。标准的224色 logo是logo_linux_clut224.ppm,因此修改这个图片就可以实现修改logo了。
在windows下,可以用PaintShopProX直接打开ppm进行编辑,编辑完毕后用decrease color depth命令降为224色,然后保存,把logo_linux_clut224.c删掉,重新make就可以了。

深入一点点。很容易发现,对于一般的vga console,logo是由drivers/video/fbmem.c里的fb_show_logo()函数显示的,这个函数的调用者是 drivers/video/console/fbcon.c(跟2.4差不多,嗯)。这个函数做的事情不多,就是先把非8位色深的位图转换为8位色深,然后用info->fbops->fb_imageblit(info, &image);把logo显示出来,有一个cpu时显示一个logo,有2个cpu时显示2个,以此类推。

略加修改,就可以实现将logo居中显示,并加入一个“重复显示右边界”,也就是把logo最右边4个点宽的区域作为背景填充到整个logo bar。diff如下:

--- /gs2e/source/linux26-2edev/drivers/video/fbmem.c2006-08-29 14:07:15.000000000 +0800

+++ ./fbmem.c2006-09-27 20:40:08.000000000 +0800

@@ -375,9 +375,9 @@

 int fb_show_logo(struct fb_info *info)

 {

 u32 *palette = NULL, *saved_pseudo_palette = NULL;

-unsigned char *logo_new = NULL;

-struct fb_image image;

-int x;

+unsigned char *logo_new = NULL, *border = NULL;

+struct fb_image image, imageborder;

+int x, xoffset;

 

 /* Return if the frame buffer is not mapped or suspended */

 if (fb_logo.logo == NULL || info->state != FBINFO_STATE_RUNNING)

@@ -421,12 +421,45 @@

 image.height = fb_logo.logo->height;

 image.dy = 0;

 

+#ifdef CONFIG_LOGO_REPEAT_RIGHT

+border = kmalloc(4 * fb_logo.logo->height, GFP_KERNEL);

+if (border != NULL){

+   for (x = 0; x < fb_logo.logo->height; x++){ /* use x as y */

+*((u32 *)border + x) = /* will repeat 4 pixels of the right side*/

+*(u32 *)(image.data + (x+1)*fb_logo.logo->width - 4);

+   }

+   imageborder.depth = 8;

+   imageborder.data = border;

+   imageborder.width = 4;

+   imageborder.height = image.height;

+   imageborder.dy = 0;

+   for (x = 0; x < info->var.xres; x+=4){

+imageborder.dx = x;

+info->fbops->fb_imageblit(info, &imageborder);

+   }

+   kfree(border);

+}

+#endif

+#ifndef CONFIG_CENTER_LOGO

+xoffset = 0;

 for (x = 0; x < num_online_cpus() * (fb_logo.logo->width + 8) &&

       x <= info->var.xres-fb_logo.logo->width; x += (fb_logo.logo->width + 8)) {

 image.dx = x;

 info->fbops->fb_imageblit(info, &image);

 }

-

+#else

+xoffset = (info->var.xres - num_online_cpus() * (fb_logo.logo->width + 8))>>1;

+if (xoffset<0)xoffset = 0;

+         for (x = xoffset; x < num_online_cpus() * (fb_logo.logo->width + 8) + xoffset   &&

+              x <= info->var.xres-fb_logo.logo->width+xoffset; x += (fb_logo.logo->width + 8)) {

+                image.dx = x;

+                info->fbops->fb_imageblit(info, &image);

+}

+#endif

 kfree(palette);

 if (saved_pseudo_palette != NULL)

 info->pseudo_palette = saved_pseudo_palette;



我在这里定义了两个配置变量,CONFIG_LOGO_REPEAT_RIGHT和CONFIG_CENTER_LOGO,修改/drivers/video/logo/Kconfig,加上:

config CENTER_LOGO

         bool "Center logo"

         depends on LOGO

         default n

config LOGO_REPEAT_RIGHT

         bool "Repeat the right border (4 pixels)"

         depends on LOGO

         default n


这样就可以在make menuconfig之类的界面中设置是否开启这两项功能了

(rzsheng)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201010/10309.html]
本文出处:CSDN博客 作者:rzsheng
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容