近日一直在折腾vt,感觉这是FreeBSD的一大进步,最大的意义在于:可以通过非常小的代价来显示汉字,包括安装在内的一些步骤,以后就可以用汉字或其他多字节语言了,不必再被英文不好的同学所鄙视。
无意中竟然发现一个彩蛋,就是在某些情况下,会出现一个黑白的FreeBSD的logo,这个logo虽然小一些,但有终究比没有强。
显示方法:
使用通用内核,在loader.conf中添加以下三行,然后重启:
hw.vga.textmode=”0”
kern.vty=”vt”
boot_mute="YES"
显示限制:
1、这个splash(其实这本质上就是一个splash)只能是黑白的,彩色的不行,灰度的也不行。
2、这个logo的分辨率只有257x219,也就是中间的那么一块,整个屏幕是640x480。
Logo显示源代码追踪:
通过查看logo的源代码,可以看出这个限制:
1、 图像是嵌入在c语言当中的,没有办法自定义图片,大致看了一下,觉得数据有些不对劲,有时间再分析一下,看能不能把windows的bmp转为这个logo。
2、logo位置:/usr/src/sys/dev/vt/logo/logo_freebsd.c,从这里可以看到图像的大小的颜色深度:
……
unsigned int vt_logo_width = 257;
unsigned int vt_logo_height = 219;
unsigned int vt_logo_depth = 1;
unsigned char vt_logo_image[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00
……
3、显示部分,从这部分可以看到显示的条件:(1)用vt模式;(2)boot_mute;(3)logo的色彩深度为1;(4)有splash。
……
/* Display a nice boot splash. */
if (!(vd->vd_flags & VDF_TEXTMODE) && (boothowto & RB_MUTE)) {
top = (vd->vd_height - vt_logo_height) / 2;
left = (vd->vd_width - vt_logo_width) / 2;
switch (vt_logo_depth) {
case 1:
/* XXX: Unhardcode colors! */
vd->vd_driver->vd_bitblt_bmp(vd, vd->vd_curwindow,
vt_logo_image, NULL, vt_logo_width, vt_logo_height,
left, top, TC_WHITE, TC_BLACK);
}
vd->vd_flags |= VDF_SPLASH;
}
……
自定义内核:
1、有splash选项;
2、有vt、vt_vga选项;
后续:对比了bmp格式,发现跟windows中的不一样,甚至顺序都不一样,看来还要深入源代码才能找真相——话说显示bmp,本身的代码就挺复杂,不信你搜一下,清一色使用mfc来显示,C语言都极为罕见!