psplash开机进度条制作

一、思路分析

  1. 准备两张图片,一张作为背景图,一张作为进度条背景框
  2. 使用psplash里make-image-header.sh脚本,将图片转换为头文件。
  3. 修改psplash.c文件,图片头文件替换为刚刚生成的头文件。
  4. 制作生成Makefile的脚本文件,执行脚本生成Makefile.am文件。
  5. 修改Makefile.am文件, 图片头文件替换为刚刚生成的头文件。
  6. 使能环境变量。
  7. make即可得到psplashpsplash-write文件
  8. psplashpsplash-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);
}

大道至简。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值