psplash進度條旋轉成功

kunkliu發表於2020-04-05

轉載地址:https://blog.csdn.net/zhanzheng520/article/details/13002459

pspfalsh是一個嵌入式中顯示開機進度的開源軟體,http://wiki.openmoko.org/wiki/Splash_screen可以看到相關的一些內容,看了一下,大概是什麼進行開機介面設定的一個程式,好像不止一個,分什麼Splash screen、U-boot Splash 、psplash 、X splash等,看樣子是用在不同的階段吧,這裡只需搞定psplash就可以了。
  psplash開機畫面的大概修改過程如下:
  先準備一個png圖片檔案,
      make-image-header.sh my_image.png HAND
      進行處理,
      mv my_image-img.h psplash-hand-img.h
      修改名字,
      然後configure,然後make,有效,開機畫面被成功修改為所準備的png圖片。

因為屏的方向與通常的不一致,且旋轉引數修改無效,開機畫面可以重新繪製,但進度條的方向非得自己改程式碼了。

首先通常執行時總出現一條橫貫左右的白條,經查,該函式作怪,

/* Clear */

  /*psplash_fb_draw_rect (fb, 
   0, 
   fb->height - (fb->height/6) - h, 
   fb->width,
   h,
   0xec, 0xec, 0xe1);*/

刪後該問題解決。

 關於進度條,先刪了一個進度條的外框函式,感覺沒什麼用,刪後效果還好,該函式為:

/* Draw progress bar border */
  /*psplash_fb_draw_image (fb, 
    (fb->width  - BAR_IMG_WIDTH)/2, 
    fb->height - (fb->height/10), 
    BAR_IMG_WIDTH,
    BAR_IMG_HEIGHT,
    BAR_IMG_BYTES_PER_PIXEL,
    BAR_IMG_RLE_PIXEL_DATA);*/

檢視psplash.c裡邊有關於進度條的函式,

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      = fb->height - (fb->height/6) + 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,
   0xec, 0xec, 0xe1);
      psplash_fb_draw_rect (fb, x, y, barwidth,
       height, 0x6d, 0x6d, 0x70);
    }
  else
    {
      barwidth = (CLAMP(-value,0,100) * width) / 100;
      psplash_fb_draw_rect (fb, x, y, 
       width - barwidth, height,
   0xec, 0xec, 0xe1);
      psplash_fb_draw_rect (fb, x + width - barwidth,
       y, barwidth, height,
       0x6d, 0x6d, 0x70);
    }

  DBG("value: %i, width: %i, barwidth :%i/n", value, 
  width, barwidth);
}

看了一下,也就是畫方框,之後根據進度畫著了色的進度框,改程式碼如下:

void
psplash_draw_progress (PSplashFB *fb, int value)
{
  int x, y, width, height, barhight;

   x      = 100;
   y      = ((fb->height  - BAR_IMG_WIDTH)/2) + 4;

 width  =BAR_IMG_HEIGHT - 16;//width  = BAR_IMG_WIDTH - 8;
 // height = BAR_IMG_HEIGHT - 8;
  height = BAR_IMG_WIDTH - 8;//height = BAR_IMG_HEIGHT - 16;


  if (value > 0)
    {
      //barwidth = (CLAMP(value,0,100) * width) / 100;
      barhight = (CLAMP(value,0,100) * height ) / 100;
      psplash_fb_draw_rect (fb, x , y+ barhight,//psplash_fb_draw_rect (fb, x + barwidth, y, 
       width , height- barhight,//width - barwidth, height,
   0xec, 0xec, 0xe1);
      psplash_fb_draw_rect (fb, x, y, width,
       barhight, 0x6d, 0x6d, 0x70);
    }
  else
    {
      barhight = (CLAMP(-value,0,100) *  height) / 100;
      psplash_fb_draw_rect (fb, x, y, 
       width, height- barhight,
   0xec, 0xec, 0xe1);
      psplash_fb_draw_rect (fb, x,
       y, width, barhight,
       0x6d, 0x6d, 0x70);
    }

  DBG("value: %i, width: %i, barhight :%i/n", value, 
  width, barhight);
}

改後一試,ok,效果還不錯。

相關文章