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'.

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

Attachment: test.sh
Description: application/shellscript

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))
 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" 
+#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
+ */
+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)
+		{		
+			// 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);
+		}
+	}
+
+	fclose(pIniFile);
+}
+
+
+/**
+ *	enable/disable the cursor apparance.
+ * \param bEnable flag for enabling/disabling
+ * \return nothing
+ */
+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];
+	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)
+	{
+		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();
+
+	// 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);
+	}
+        len = read(fd, cmdline, sizeof(cmdline) - 1);
+        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();
+	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);
+	}	
+	
+	FD_ZERO(&rfds);
+	FD_SET(fd,&rfds);
+
+	fbOpen();
+	fbDrawImage();
+	fbDrawProgressBar(0);
+		
+	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.
+
 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);	
+	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);
+	}
+
+	// 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);
+	}
+	
+	if (ioctl(m_fbfd, FBIOGET_FSCREENINFO, &m_ScreenInfoFix))
+	{
+		DEBUG_MESSAGE("Errore richiesta proprietà fisse del frame buffer.. exit");
+		exit(EXIT_FAILURE);
+	}
+
+	// Mappa il device in memoria
+	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");
+		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);
+}
+
+
+/**
+ *	draw a rectangle in the position and of color passed as a parameters
+ * \return nothing
+ */
+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	
+	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);
+
+	fbDrawFullRectangle(SystemConfiguration.nBar_PosX + 1, SystemConfiguration.nBar_PosY + 1,	
+	SystemConfiguration.nBar_PosX + SystemConfiguration.nBar_Width - 1, SystemConfiguration.nBar_PosY + SystemConfiguration.nBar_Height -1, SystemConfiguration.nBarRCol, SystemConfiguration.nBarGCol, SystemConfiguration.nBarBCol);
+/*	
+	DrawFullRectangle(SystemConfiguration.nBar_PosX + 1, SystemConfiguration.nBar_PosY + 1,	
+	SystemConfiguration.nBar_PosX + (SystemConfiguration.nBar_Width - 1)*nPercent/100, SystemConfiguration.nBar_PosY + SystemConfiguration.nBar_Height - 1, 130, 130, 130);
+*/
+ 	for (i = 1; i < SystemConfiguration.nBar_Height - 1; i++)
+		fbDrawFullRectangle(SystemConfiguration.nBar_PosX + 1, SystemConfiguration.nBar_PosY + i,	
+		SystemConfiguration.nBar_PosX + (SystemConfiguration.nBar_Width - 1)*nPercent/100, SystemConfiguration.nBar_PosY + (i+1), 200-4*i, 200-4*i, 200-4*i);
+}
+
+
+/**
+ *	draw the image
+ * \return nothing
+ */
+void fbDrawImage(void)
+{	 
+	uint i, j, x, y, z;
+	char head[256]="";
+	char s[80];
+	unsigned char pix[3];
+
+	rewind(m_ThemeFile);
+	while(1)
+	{
+		// parse ppm header 
+		fgets(s, 80, m_ThemeFile);
+
+		if (s[0] == '#')
+			continue;
+
+		if (strlen(head) + strlen(s) > 255)
+			exit(3);
+		
+		strcat(head, s);
+		if (head[0]!='P' || head[1]!='6')
+			exit(4);
+
+		if (sscanf(head, "P6 %i %i %i", &x, &y, &z) == 3)
+			break;
+	}
+
+	for (j=0; j<y; j++)
+	{
+		unsigned short thispix;
+		for (i=0; i<x; i++)
+		{
+			int idx;
+			fread(pix, 1, 3, m_ThemeFile);
+			if (i >= m_ScreenInfoVar.xres)
+				continue;
+			if (j >= m_ScreenInfoVar.yres)
+				continue;
+		
+			idx = j * m_ScreenInfoFix.line_length + i*2;
+			thispix = (((short)pix[0]<<8) & 0xf800)
+			| (((short)pix[1]<<3) & 0x07e0)
+			| ((short)pix[2]>>3);
+		
+			*(DATA *)(m_addr + idx) = thispix;
+		}
+	}
+}
+
diff -urP busybox-1.9.0_originale/miscutils/framebuffer.h busybox-1.9.0_bbsplash/miscutils/framebuffer.h
--- busybox-1.9.0_originale/miscutils/framebuffer.h	1970-01-01 01:00:00.000000000 +0100
+++ busybox-1.9.0_bbsplash/miscutils/framebuffer.h	2008-02-07 16:05:08.000000000 +0100
@@ -0,0 +1,25 @@
+/**
+ * 	module for manage the framebuffer
+ * \file: framebuffer.h
+ * \author Michele Sanges <[EMAIL PROTECTED]> <[EMAIL PROTECTED]>
+ * \version 1.0.0
+ * \date 07/02/2008
+ */
+
+
+#ifndef __FRAMEBUFFER__
+#define __FRAMEBUFFER__
+
+#define DATA		unsigned short
+
+
+void fbOpen(void);
+void fbClose(void);
+void fbDrawRectangle(short nX1Pos, short nY1Pos, short nX2Pos, short nY2Pos, unsigned char nRed24, unsigned char nGreen24, unsigned char nBlue24);
+void fbDrawFullRectangle(short nX1Pos, short nY1Pos, short nX2Pos, short nY2Pos, unsigned char nRed24, unsigned char nGreen24, unsigned char nBlue24);
+void fbDrawProgressBar(unsigned char nPercent);
+void fbDrawImage(void);
+
+#endif
+
+
diff -urP busybox-1.9.0_originale/miscutils/Kbuild busybox-1.9.0_bbsplash/miscutils/Kbuild
--- busybox-1.9.0_originale/miscutils/Kbuild	2007-12-21 23:00:31.000000000 +0100
+++ busybox-1.9.0_bbsplash/miscutils/Kbuild	2008-02-07 18:06:29.000000000 +0100
@@ -7,6 +7,7 @@
 lib-y:=
 lib-$(CONFIG_ADJTIMEX)    += adjtimex.o
 lib-$(CONFIG_BBCONFIG)    += bbconfig.o
+lib-$(CONFIG_BBSPLASH)    += bbsplash.o framebuffer.o
 lib-$(CONFIG_CHRT)        += chrt.o
 lib-$(CONFIG_CROND)       += crond.o
 lib-$(CONFIG_CRONTAB)     += crontab.o
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to