On Fri, Feb 08, 2008 at 11:41:08AM +0100, Michele Sanges wrote:
>Hello everybody, 
>
>here is a patch for busybox-1.9.0 tarball, that adds my implementation
>of an utility that shows a splash image and a progress bar on
>framebuffer device; it can be used during the boot phase of an embedded
>device. I named it 'bbsplash'.
>
>It consists of four files, 'bbsplash' and 'framebuffer' (.c and .h),
>that I added in miscutils directory. If this is not the appropriate
>place, fell free to move them (I wanted to put them into a subdirectory
>of miscutil, but I was unable to compile). 
>
>
>Usage of bbsplash:
>* reboot the system, passing to the kernel the options 'vga=xxx' in
>order to enable the framebuffer at the appropriate resolution, and
>'bbsplash=on'. This one is useful when you start the applet in the
>initramdisk and, for some reasons, you want disable it.
>
>* make the directory '/etc/bbsplash' and put in it the file
>'bbsplash.ini' and your splash image in .ppm format. Configure the
>applet by editing the .ini file.
>
>* when started, the applet daemonize it, make a fifo
>('/dev/bbsplash_fifo') and a log file ('/dev/bbsplash_log').
>- it is possible communicate with the daemon sending the following
>messages to the fifo:
>- the percentage of the boot process
>- the 'exit' command in order to kill the daemon
>
>* you can test this applet by means the script 'test.sh'.

How big is this applet?
Further comments below..

>
>Regards.
>Michele Sanges
>
>

># debug messages: ON or OFF
>DEBUG_MESSAGES=ON
># splash theme
>SPLASH_THEME=splash.ppm
># progress bar width
>BAR_WIDTH=300
># progress bar height
>BAR_HEIGHT=20
># progress bar orizzontal position
>BAR_POS_X=170
># progress bar vertical position 
>BAR_POS_Y=300
># progress bar colour red component
>BAR_R_COL=80
># progress bar colour green component
>BAR_G_COL=80
># progress bar colour blue component
>BAR_B_COL=130


>diff -urP busybox-1.9.0_originale/include/applets.h 
>busybox-1.9.0_bbsplash/include/applets.h
>--- busybox-1.9.0_originale/include/applets.h  2007-12-21 23:00:31.000000000 
>+0100
>+++ busybox-1.9.0_bbsplash/include/applets.h   2008-02-07 18:24:58.000000000 
>+0100
>@@ -85,6 +85,7 @@
> USE_AWK(APPLET_NOEXEC(awk, awk, _BB_DIR_USR_BIN, _BB_SUID_NEVER, awk))
> USE_BASENAME(APPLET_NOFORK(basename, basename, _BB_DIR_USR_BIN, 
> _BB_SUID_NEVER, basename))
> USE_BBCONFIG(APPLET(bbconfig, _BB_DIR_BIN, _BB_SUID_NEVER))
>+USE_BBSPLASH(APPLET(bbsplash, _BB_DIR_BIN, _BB_SUID_NEVER))
> //USE_BBSH(APPLET(bbsh, _BB_DIR_BIN, _BB_SUID_NEVER))

You have to maintain alphabetical order here, see comment above this block.

> USE_BUNZIP2(APPLET(bunzip2, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
> USE_BUNZIP2(APPLET_ODDNAME(bzcat, bunzip2, _BB_DIR_USR_BIN, _BB_SUID_NEVER, 
> bzcat))
>diff -urP busybox-1.9.0_originale/include/usage.h 
>busybox-1.9.0_bbsplash/include/usage.h
>--- busybox-1.9.0_originale/include/usage.h    2007-12-21 23:00:31.000000000 
>+0100
>+++ busybox-1.9.0_bbsplash/include/usage.h     2008-02-07 18:24:07.000000000 
>+0100
>@@ -119,6 +119,17 @@
>        "$ basename /foo/bar.txt .txt\n" \
>        "bar"
> 
>+#define bbsplash_trivial_usage \
>+       "-[vh]"
>+#define bbsplash_full_usage \
>+       "Options:\n" \
>+       "      -v              Show program version informations\n" \
>+       "      -h              Show help informations\n" 

I think that both are not needed, i'd drop them.

>+#define bbsplash_example_usage \
>+       "$ bbsplash (start the daemon)" \
>+       "$ echo val > /dev/bbsplash (where val=0..100 - show a progress bar of 
>value val)\n" \
>+       "$ echo exit > /dev/bbsplash (kill the daemon)\n"
>+ 
> #define bunzip2_trivial_usage \
>        "[OPTION]... [FILE]"
> #define bunzip2_full_usage \
>diff -urP busybox-1.9.0_originale/miscutils/bbsplash.c 
>busybox-1.9.0_bbsplash/miscutils/bbsplash.c
>--- busybox-1.9.0_originale/miscutils/bbsplash.c       1970-01-01 
>01:00:00.000000000 +0100
>+++ busybox-1.9.0_bbsplash/miscutils/bbsplash.c        2008-02-08 
>10:49:25.000000000 +0100
>@@ -0,0 +1,313 @@
>+/* vi: set sw=4 ts=4: */
>+/*
>+ * boot splash implementation for busybox
>+ *
>+ * Copyright (C)[2008 by Michele Sanges <[EMAIL PROTECTED]> <[EMAIL 
>PROTECTED]>
>+ *
>+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for 
>details.
>+ */
>+
>+#include "bbsplash.h"
>+
>+StructSystemConfiguration SystemConfiguration;        ///< hold the system 
>configuration data
>+
>+
>+/**
>+ *    initializes the application with the data taken from the configuration 
>file.
>+ * \return nothing
>+ */

Can you reuse the configfile-parsing of e.g. mdev?

Also this looks like it should be static.
>+void Init(void)
>+{
>+      char strIniFile[40];
>+      FILE *pIniFile;
>+      char strIniRecord[150];
>+      
>+      sprintf(strIniFile, "/etc/%s/%s.ini", PROGRAM, PROGRAM);
>+      pIniFile = fopen(strIniFile, "r");
>+      
>+      if (pIniFile == NULL)
>+      {
>+              printf("configuration file /etc/bbsplash/bbsplash.ini not 
>found... exit\n");
>+              exit(EXIT_FAILURE);
>+      }
>+
>+      while(!feof(pIniFile))
>+      {
>+              char *pValue;
>+              int nPos;
>+              char strParam[100];
>+
>+              if (fgets(strIniRecord, 150, pIniFile) == NULL) // Reading 
>record
>+                      continue;
>+                      
>+              if (strIniRecord[0] == '#')                     // it's a 
>comment
>+                      continue;
>+                      
>+              pValue = strstr(strIniRecord, "=");     // pointer to character 
>'='
>+              nPos = pValue - strIniRecord;           // position of the 
>character '='
>+      
>+              // parameter    
>+              memcpy(strParam, strIniRecord, nPos);
>+              strParam[nPos] = '\0';
>+              // value                
>+              pValue[strlen(pValue)-1] = '\0';
>+              
>+              if (strcmp(strParam, "DEBUG_MESSAGES") == 0)

erm, no. Use index_in_str_array() or try to reuse mdev's config parser
for this..
>+              {               
>+                      // flag for enable/disable writing messages on the 
>standard output
>+                      SystemConfiguration.bDebugMessages = (strcmp(pValue + 
>1, "ON") == 0);
>+                      if (SystemConfiguration.bDebugMessages)
>+                      {
>+                              char strLogFile[40];
>+                              sprintf(strLogFile, "/dev/%s_log", PROGRAM);
>+                              SystemConfiguration.logFile_fd = 
>fopen(strLogFile, "w");
>+                      }
>+              }
>+              if (strcmp(strParam, "SPLASH_THEME") == 0)
>+              {               
>+                      // name of the splash theme
>+                      sprintf(SystemConfiguration.strSplashTheme, 
>"/etc/%s/%s", PROGRAM, (pValue + 1));
>+              }
>+              else if (strcmp(strParam, "BAR_WIDTH") == 0)
>+              {
>+                      // progress bar width
>+                      SystemConfiguration.nBar_Width = atoi(pValue + 1);
>+              }
>+              else if (strcmp(strParam, "BAR_HEIGHT") == 0)
>+              {
>+                      // progress bar height
>+                      SystemConfiguration.nBar_Height = atoi(pValue + 1);
>+              }
>+              else if (strcmp(strParam, "BAR_POS_X") == 0)
>+              {
>+                      // progress bar orizzontal position 
>+                      SystemConfiguration.nBar_PosX = atoi(pValue + 1);
>+              }
>+              else if (strcmp(strParam, "BAR_POS_Y") == 0)
>+              {
>+                      // progress bar vertical position  
>+                      SystemConfiguration.nBar_PosY = atoi(pValue + 1);
>+              }
>+              else if (strcmp(strParam, "BAR_R_COL") == 0)
>+              {
>+                      // progress bar colour red component
>+                      SystemConfiguration.nBarRCol = atoi(pValue + 1);
>+              }
>+              else if (strcmp(strParam, "BAR_G_COL") == 0)
>+              {
>+                      // progress bar colour green component
>+                      SystemConfiguration.nBarGCol = atoi(pValue + 1);
>+              }
>+              else if (strcmp(strParam, "BAR_B_COL") == 0)
>+              {
>+                      // progress bar colour blue component 
>+                      SystemConfiguration.nBarBCol = atoi(pValue + 1);
>+              }
>+      }
.. whole block.
>+
>+      fclose(pIniFile);
>+}
>+
>+
>+/**
>+ *    enable/disable the cursor apparance.
>+ * \param bEnable flag for enabling/disabling
>+ * \return nothing
>+ */

static?

>+bool enableCursor(bool bEnable)
>+{
>+      int fd, ret;
>+      char * cursoff = "\E[?25l\000";
>+      char * curson = "\E[?25h\000";
>+
>+      fd = open ("/dev/tty0", O_RDWR);        
>+      if (fd < 0)
>+              fd = open ("/dev/vc/0", O_RDWR);
>+      
>+      if (fd < 0)
>+      {
>+              return false;
>+      }
>+      else
>+      {
>+              if (bEnable)
>+              {
>+                      if ((ret = write (fd, curson, strlen (curson))) == -1)
>+                      {
>+                              DEBUG_MESSAGE("failed to write on console");
>+                      }       
>+              }
>+              else
>+              {
>+                      if ((ret = write (fd, cursoff, strlen (cursoff))) == -1)
>+                      {
>+                              DEBUG_MESSAGE("failed to write on console");
>+                      }       
>+              }
>+
>+              close (fd);
>+              return true;
>+      }
>+}
>+
>+int bbsplash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
>+int bbsplash_main(int argc, char **argv)
>+{
>+      int i, fd, len;
>+      char cmdline[1024];

That's a bit gross, isn't it?

>+      char *param;
>+      char strFifo[100];
>+      char buf[255];
>+      // process and session ID
>+      pid_t pid, sid;
>+      fd_set rfds;
>+
>+      // command line options
>+      opterr = 0; // disables writing on stderr
>+      while ((i = getopt (argc , argv , "vh")) != -1)

getopt32() if you really think you want to support those (just wastes
space).
>+      {
>+              switch (i)
>+              {
>+                      case 'v': // 'information' option
>+                              printf("\t%s - ver. %s\n", PROGRAM, VERSION); 
>+                              printf("\tcompiled: %s - %s\n", __DATE__, 
>__TIME__); 
>+                              exit(EXIT_SUCCESS);
>+                      case 'h': // 'help' option
>+                              printf("\trun the daemon for the management of 
>the splash screen during the boot process\n");
>+                              printf("\twritten by Michele Sanges - report 
>bugs to [EMAIL PROTECTED]");
>+                              exit(EXIT_SUCCESS);
>+                      case '?': // option not recognized
>+                              printf("\t%s: option '-%c' not recognized\n", 
>PROGRAM, optopt);
>+                              printf("\tuse '%s -v' for information about the 
>version\n", PROGRAM);
>+                              printf("\tuse '%s -h' for help\n", PROGRAM);
>+                              exit(EXIT_SUCCESS);
>+              }
>+      }       
>+      
>+      // initializes the application with the data taken from the 
>configuration file
>+      Init();

yea, just inline it here.
>+
>+      // parse /proc/cmdline in order to start or not the daemon
>+      if ((fd = open("/proc/cmdline", O_RDONLY)) < 0)
>+      {
>+              DEBUG_MESSAGE("failed to open /proc/cmdline... exit");
>+              exit(EXIT_FAILURE);

xopen()

>+      }
>+        len = read(fd, cmdline, sizeof(cmdline) - 1);

broken indentation and xread() instead.
>+        close(fd);
>+        if (len <= 0)
>+              exit(EXIT_SUCCESS);
>+
>+        cmdline[len] = '\0';
>+      param = strstr(cmdline, "bbsplash=on");
>+      if (param == NULL)
>+      {
>+              DEBUG_MESSAGE("non enabled by /proc/cmdline... exit");
>+              exit(EXIT_SUCCESS);
>+      }
>+      
>+//enableCursor(false);
>+//printf("\033[?25l"); 
>+
>+      
>+      // fork the parent process
>+      pid = fork();

i don't think that this will work. Use spawn() el al.

>+      if (pid < 0)
>+      {
>+              DEBUG_MESSAGE("failed to fork process... exit");
>+              exit(EXIT_FAILURE);
>+      }
>+
>+      // if we got a good PID, then we can exit the parent process.
>+      if (pid > 0)
>+      {
>+              exit(EXIT_SUCCESS);
>+      }
>+      
>+      // this is the child process
>+      // change the file mode mask
>+      umask(0);
>+                              
>+      // create a new SID for the child process
>+      sid = setsid();
>+      if (sid < 0)
>+      {
>+              DEBUG_MESSAGE("failed to create new sid... exit");
>+              exit(EXIT_FAILURE);
>+      }
>+              
>+      // close out the standard file descriptors 
>+//            close(STDIN_FILENO);
>+//            close(STDOUT_FILENO);
>+//            close(STDERR_FILENO);
>+
>+      // open the fifo used for receiving commands
>+      sprintf(strFifo, "/dev/%s_fifo", PROGRAM);      
>+      mkfifo(strFifo, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
>+
>+      // open the device to be non blocking (read will return immediatly) 
>+      if ((fd = open(strFifo, O_RDWR | O_NOCTTY | O_NONBLOCK)) == -1)
>+      {
>+              DEBUG_MESSAGE("failed to open the fifo... exit");
>+              exit(EXIT_FAILURE);
>+      }       
xopen() or xopen3() like above.
>+      
>+      FD_ZERO(&rfds);
>+      FD_SET(fd,&rfds);
>+
>+      fbOpen();
>+      fbDrawImage();
>+      fbDrawProgressBar(0);

Would be better if you inlined those here. Less files and easier to read
and follow.
>+              
>+      while(1)
>+      {
>+              int retval = select(fd+1, &rfds, NULL, NULL, NULL);
>+
>+              if (retval == -1)
>+                      continue;
>+
>+              if (FD_ISSET(fd, &rfds))
>+              {               
>+                      len = read(fd, buf, 255);
>+                      buf[len] = '\0';
>+                      
>+                      // comando di uscita
>+                      if(strcmp(buf, "exit\n") == 0)
>+                      {
>+                              DEBUG_MESSAGE("exit");
>+                              break;
>+                      }
>+                      else
>+                      {
>+                              int nVal = atoi(buf);
>+                              if ((nVal >= 0) && (nVal <= 100))
>+                              {
>+                                      char strVal[10];
>+                                      sprintf(strVal, "%d", nVal);
>+                                      DEBUG_MESSAGE(strVal);
>+                                      fbDrawProgressBar(nVal);
>+                              }
>+                      }
>+              }
>+      }
>+
>+//    if (SystemConfiguration.bDebugMessages)
>+//            {
>+//                    fclose(SystemConfiguration.logFile_fd);
>+//            }
>+
>+      //enableCursor(true);
>+      //printf("\033[?25h"); 
>+      close(fd);
>+/*
>+      // rimozione della fifo
>+      char strCmd[100];
>+      sprintf(strCmd, "rm -f /dev/%s", PROGRAM);
>+      system(strCmd);
>+*/
>+      fbClose();
>+      DEBUG_MESSAGE("bye");
>+
>+      exit(EXIT_SUCCESS);
>+}
>+
>diff -urP busybox-1.9.0_originale/miscutils/bbsplash.h 
>busybox-1.9.0_bbsplash/miscutils/bbsplash.h
>--- busybox-1.9.0_originale/miscutils/bbsplash.h       1970-01-01 
>01:00:00.000000000 +0100
>+++ busybox-1.9.0_bbsplash/miscutils/bbsplash.h        2008-02-07 
>18:28:14.000000000 +0100
>@@ -0,0 +1,71 @@
>+/**
>+ *    main module of the project 'bbsplash'
>+ * \file: bbsplash.h
>+ * \author Michele Sanges <[EMAIL PROTECTED]> <[EMAIL PROTECTED]>
>+ * \version 1.0.0
>+ * \date 07/02/2008
>+ */
>+
>+ 
>+#ifndef __BBSPLASH__
>+#define __BBSPLASH__
>+
>+#include "libbb.h"
>+
>+//@{
>+/// system include files
>+
>+/*#include <stdio.h>
>+#include <string.h>
>+#include <stdlib.h>
>+#include <unistd.h>
>+#include <sys/types.h>
>+#include <sys/stat.h>
>+#include <sys/mman.h>*/
>+#include <linux/fb.h>
>+// #include <fcntl.h>
>+// #include <sys/ioctl.h>
>+
>+//@}
>+
>+//@{
>+/// project include files
>+#include "framebuffer.h"
>+//@}
>+
>+/// function used for debug purpose
>+#define DEBUG_MESSAGE(strMessage, args...) \
>+      if (SystemConfiguration.bDebugMessages) \
>+      {       \
>+              fprintf(SystemConfiguration.logFile_fd, "[%s][%s] - %s\n", 
>__FILE__, __FUNCTION__, strMessage); \
>+      }
>+
>+#define PROGRAM       "bbsplash"
>+#define VERSION "1.0.0"
>+// typedef char bool;
>+// #define true       1
>+// #define false   0
>+
>+/// data struct with the application parameters
>+typedef struct 
>+{
>+      bool bDebugMessages;    ///< flag for enable/disable writing messages 
>in logfile
>+      FILE * logFile_fd;      ///< descriptor of log file
>+      char strSplashTheme[40];///< name of the splash theme
>+      ushort nBar_Width;      ///< progress bar width
>+      ushort nBar_Height;     ///< progress bar height
>+      ushort nBar_PosX;       ///< progress bar orizzontal position
>+      ushort nBar_PosY;       ///< progress bar vertical position 
>+      unsigned char nBarRCol; ///< progress bar colour red component
>+      unsigned char nBarGCol; ///< progress bar colour green component
>+      unsigned char nBarBCol; ///< progress bar colour blue component
>+} StructSystemConfiguration;
>+
>+
>+//############################ FUNCTION PROTOTYPES 
>############################
>+void Init(void);
>+bool enableCursor(bool bEnable);
>+
>+#endif
>+
>+
>diff -urP busybox-1.9.0_originale/miscutils/Config.in 
>busybox-1.9.0_bbsplash/miscutils/Config.in
>--- busybox-1.9.0_originale/miscutils/Config.in        2007-12-21 
>23:00:31.000000000 +0100
>+++ busybox-1.9.0_bbsplash/miscutils/Config.in 2008-02-07 18:09:39.000000000 
>+0100
>@@ -19,6 +19,13 @@
>         The bbconfig applet will print the config file with which
>         busybox was built.
> 
>+config BBSPLASH
>+      bool "bbsplash"
>+      default n
>+      help
>+        The bbsplash shows a splash image and a progress bar on framebuffer 
>device.
>+        Can be used during the boot phase of embedded device.

mention how much it adds to the size, too.
>+
> config CHRT
>       bool "chrt"
>       default n
>diff -urP busybox-1.9.0_originale/miscutils/framebuffer.c 
>busybox-1.9.0_bbsplash/miscutils/framebuffer.c
>--- busybox-1.9.0_originale/miscutils/framebuffer.c    1970-01-01 
>01:00:00.000000000 +0100
>+++ busybox-1.9.0_bbsplash/miscutils/framebuffer.c     2008-02-08 
>10:48:29.000000000 +0100
>@@ -0,0 +1,224 @@
>+#include "bbsplash.h"
>+
>+
>+extern StructSystemConfiguration SystemConfiguration;         ///< hold the 
>system configuration data
>+
>+int m_fbfd;           ///< descriptor of framebuffer device
>+FILE *m_ThemeFile;    ///< splash file
>+unsigned char *m_addr;        ///< pointer to framebuffer memory
>+struct fb_var_screeninfo m_ScreenInfoVar;
>+struct fb_fix_screeninfo m_ScreenInfoFix;
>+
>+
>+/**
>+ *    open and initialize the framebuffer device.
>+ * \return nothing
>+ */
>+void fbOpen(void)
>+{
>+      // apertura del frame buffer
>+      m_fbfd = open("/dev/fb0", O_RDWR);      

xopen3()

>+      if (m_fbfd < 0)
>+      {
>+              DEBUG_MESSAGE("failed to open the frame buffer device... exit");
>+              exit(EXIT_FAILURE);
>+      }
>+
>+      m_ThemeFile = fopen(SystemConfiguration.strSplashTheme, "r");
>+      if (m_ThemeFile == NULL)
>+      {
>+              DEBUG_MESSAGE("failed to open the splash image... exit");
>+              exit(EXIT_FAILURE);
>+      }

xfopen()

>+
>+      // Richiesta proprietà del framenbuffer
>+      if (ioctl(m_fbfd, FBIOGET_VSCREENINFO, &m_ScreenInfoVar))
>+      {
>+              DEBUG_MESSAGE("Errore richiesta proprietà variabili del frame 
>buffer.. exit");          
>+              exit(EXIT_FAILURE);
>+      }
xioctl()


>+      
>+      if (ioctl(m_fbfd, FBIOGET_FSCREENINFO, &m_ScreenInfoFix))
>+      {
>+              DEBUG_MESSAGE("Errore richiesta proprietà fisse del frame 
>buffer.. exit");
>+              exit(EXIT_FAILURE);
>+      }
ditto

>+
>+      // Mappa il device in memoria

wrong language ;)

>+      m_addr = (unsigned char *)mmap(0, m_ScreenInfoVar.xres * 
>m_ScreenInfoVar.yres * (m_ScreenInfoVar.bits_per_pixel / 8), /*PROT_READ | 
>*/PROT_WRITE, MAP_SHARED, m_fbfd, 0);
>+      
>+      if (m_addr == (unsigned char *)-1)
>+      {
>+              DEBUG_MESSAGE("Errore nel mappaggio del device in memoria.. 
>exit");

ditto.
>+              exit(EXIT_FAILURE);
>+      }
>+}
>+
>+
>+/**
>+ *    unmapp and close the device.
>+ * \return nothing
>+ */
>+void fbClose(void)
>+{     
>+      // Unmappa il device dalla memoria
>+      if (munmap(m_addr, m_ScreenInfoVar.xres * m_ScreenInfoVar.yres * 
>(m_ScreenInfoVar.bits_per_pixel / 8)))
>+      {
>+              DEBUG_MESSAGE("Errore nel unmappaggio del device dalla 
>memoria.. exit");
>+      }       
>+
>+      // Chiusura del frame buffer
>+      close(m_fbfd);
>+      
>+      // chiusura del file tema 
>+      fclose(m_ThemeFile);

Missing english translation.

>+}
>+
>+
>+/**
>+ *    draw a rectangle in the position and of color passed as a parameters
>+ * \return nothing

\r is a bit odd (everywhere).

>+ */
>+void fbDrawRectangle(short nX1Pos, short nY1Pos, short nX2Pos, short nY2Pos, 
>unsigned char nRed24, unsigned char nGreen24, unsigned char nBlue24)
>+{             
>+      int x, y, idx;
>+      unsigned char nRed16   = (nRed24)   >> 3;  // 5-bit red
>+      unsigned char nGreen16 = (nGreen24) >> 2;  // 6-bit green
>+      unsigned char nBlue16  = (nBlue24)  >> 3;  // 5-bit blue
>+      
>+      unsigned short nRGB2Bytes = nBlue16 + (nGreen16<<5) + (nRed16<<(5+6));
>+      DATA thispix = nRGB2Bytes;
>+              
>+              
>+      // Linea orizzontale superiore  

translation

>+      for (x = nX1Pos; x <= nX2Pos; x++)
>+      {
>+              idx = (nY1Pos * m_ScreenInfoVar.xres + x) * 
>(m_ScreenInfoVar.bits_per_pixel / 8);
>+              *(DATA *)(m_addr + idx) = thispix;
>+      }
>+      
>+      // Linea orizzontale inferiore  
>+      for (x = nX1Pos; x <= nX2Pos; x++)
>+      {
>+              idx = (nY2Pos * m_ScreenInfoVar.xres  + x) * 
>(m_ScreenInfoVar.bits_per_pixel / 8);
>+              *(DATA *)(m_addr + idx) = thispix;
>+      }
>+  
>+      // Linea verticale sinistra
>+      for (y = nY1Pos; y <= nY2Pos; y++)
>+      {
>+              idx = (y * m_ScreenInfoVar.xres + nX1Pos) * 
>(m_ScreenInfoVar.bits_per_pixel / 8);
>+              *(DATA *)(m_addr + idx) = thispix;
>+      }
>+      
>+      // Linea verticale destra
>+      for (y = nY1Pos; y <= nY2Pos; y++)
>+      {
>+              idx = (y * m_ScreenInfoVar.xres  + nX2Pos) * 
>(m_ScreenInfoVar.bits_per_pixel / 8);
>+              *(DATA *)(m_addr + idx) = thispix;
>+      }
>+}
>+
>+
>+/**
>+ *    draw a full rectangle in the position and of color passed as a 
>parameters
>+ * \return nothing
>+ */
>+void fbDrawFullRectangle(short nX1Pos, short nY1Pos, short nX2Pos, short 
>nY2Pos, unsigned char nRed24, unsigned char nGreen24, unsigned char nBlue24)
>+{      
>+      int x, y, idx;
>+      unsigned char nRed16   = (nRed24)   >> 3;  // 5-bit red
>+      unsigned char nGreen16 = (nGreen24) >> 2;  // 6-bit green
>+      unsigned char nBlue16  = (nBlue24)  >> 3;  // 5-bit blue
>+      
>+      unsigned short nRGB2Bytes = nBlue16 + (nGreen16<<5) + (nRed16<<(5+6));
>+      DATA thispix = nRGB2Bytes;
>+                      
>+      // linea orizzontale superiore  
>+      for (y = nY1Pos; y <= nY2Pos; y++)
>+      {
>+              for (x = nX1Pos; x <= nX2Pos; x++)
>+              {
>+                      idx = (y * m_ScreenInfoVar.xres + x) * 
>(m_ScreenInfoVar.bits_per_pixel / 8);
>+                      *(DATA *)(m_addr + idx) = thispix;
>+              }
>+      }       
>+}
>+
>+
>+/**
>+ *    draw a progress bar
>+ * \param nPercent percentage of loading
>+ * \return nothing
>+ */
>+void fbDrawProgressBar(unsigned char nPercent)
>+{
>+      int i;
>+
>+      fbDrawRectangle(SystemConfiguration.nBar_PosX, 
>SystemConfiguration.nBar_PosY,   SystemConfiguration.nBar_PosX + 
>SystemConfiguration.nBar_Width, SystemConfiguration.nBar_PosY + 
>SystemConfiguration.nBar_Height, SystemConfiguration.nBarRCol/2, 
>SystemConfiguration.nBarGCol/2, SystemConfiguration.nBarBCol/2);

heh. Please fit them into at most 80 chars per line.
[snip]
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to