一、思路分析
- 准备两张图片,一张作为背景图,一张作为进度条背景框
- 使用psplash里
make-image-header.sh
脚本,将图片转换为头文件。 - 修改
psplash.c
文件,图片头文件替换为刚刚生成的头文件。 - 制作生成Makefile的脚本文件,执行脚本生成
Makefile.am
文件。 - 修改
Makefile.am
文件, 图片头文件替换为刚刚生成的头文件。 - 使能环境变量。
- make即可得到
psplash
和psplash-write
文件 - 将
psplash
和psplash-write
放到文件系统/usr/bin目录下即可。
二、 psplash.c文件分析
...
/* Draw the Poky logo */
psplash_fb_draw_image (fb,
(fb->width - POKY_IMG_WIDTH)/2,
#if PSPLASH_IMG_FULLSCREEN
(fb->height - POKY_IMG_HEIGHT)/2,
#else
(fb->height * PSPLASH_IMG_SPLIT_NUMERATOR
/ PSPLASH_IMG_SPLIT_DENOMINATOR - POKY_IMG_HEIGHT)/2,
#endif
POKY_IMG_WIDTH,
POKY_IMG_HEIGHT,
POKY_IMG_BYTES_PER_PIXEL,
POKY_IMG_ROWSTRIDE,
POKY_IMG_RLE_PIXEL_DATA);
/* Draw progress bar border */
psplash_fb_draw_image (fb,
(fb->width - BAR_IMG_WIDTH)/2,
SPLIT_LINE_POS(fb),
BAR_IMG_WIDTH,
BAR_IMG_HEIGHT,
BAR_IMG_BYTES_PER_PIXEL,
BAR_IMG_ROWSTRIDE,
BAR_IMG_RLE_PIXEL_DATA);
psplash_draw_progress (fb, 0);
...
psplash调用psplash_fb_draw_image
函数绘制图片到屏幕上。
然后psplash_draw_progress
函数绘制进度条。
void psplash_draw_progress (PSplashFB *fb, int value)
{
int x, y, width, height, barwidth;
/* 4 pix border */
x = ((fb->width - BAR_IMG_WIDTH)/2) + 4 ;
y = SPLIT_LINE_POS(fb) + 4;
width = BAR_IMG_WIDTH - 8;
height = BAR_IMG_HEIGHT - 8;
if (value > 0)
{
barwidth = (CLAMP(value,0,100) * width) / 100;
psplash_fb_draw_rect (fb, x + barwidth, y,
width - barwidth, height,
PSPLASH_BAR_BACKGROUND_COLOR);
psplash_fb_draw_rect (fb, x, y, barwidth,
height, PSPLASH_BAR_COLOR);
}
else
{
barwidth = (CLAMP(-value,0,100) * width) / 100;
psplash_fb_draw_rect (fb, x, y,
width - barwidth, height,
PSPLASH_BAR_BACKGROUND_COLOR);
psplash_fb_draw_rect (fb, x + width - barwidth,
y, barwidth, height,
PSPLASH_BAR_COLOR);
}
DBG("value: %i, width: %i, barwidth :%i\n", value,
width, barwidth);
}
value是传入的系统进度,1~100是开机进度。-1 ~ -100是关机进度。
绘制进度条其实就是根据value比例,调用psplash_fb_draw_rect
不断地绘制矩形。
三、竖屏进度条
绘制进度条的实质就是绘制矩形,最初给的进度条图片仅仅是为了让进度条好看而已。
既然这样,那干脆不要进度条图片了,直接在屏幕底端绘制长条型进度条。
代码如下:
psplash_draw_progress (PSplashFB *fb, int value)
{
int x, y, width, height, barwidth, barheidht;
/* 4 pix border */
x = 0;
y = 0;
width = 30;
height = 480;
if (value > 0)
{
barheidht = (CLAMP(value,0,100) * height) /100;
psplash_fb_draw_rect(fb, x, y+barheidht, 30, height-barheidht, PSPLASH_BAR_BACKGROUND_COLOR);
psplash_fb_draw_rect(fb, x, y, width, barheidht, PSPLASH_BAR_COLOR);
}
DBG("value: %i, width: %i, barwidth :%i\n", value,
width, barwidth);
}
大道至简。