blob: afcd3745496077e790264094f9ca6d9f19618f99 [file] [log] [blame] [raw]
/* effects.c */
/* Adds splash screen and status bar effects for graphical yaboot */
#include "file.h"
#include "yaboot.h"
#include "stdlib.h"
#define SB_XSTART 170
#define SB_XEND 472
#define SB_YSTART 402
unsigned char bar_grad[] = { 228, 237, 246, 254, 207, 254, 246, 237, 228, 206 };
int scrOpen(void);
void scrSetEntireColorMap(unsigned char *);
void scrClear(unsigned char);
void pcxDisplay(unsigned char *, unsigned int);
void scrFadeColorMap(unsigned char *, unsigned char *, int);
unsigned char *pcxColormap(unsigned char *, int);
void scrPutPixel(int, int, unsigned char);
void fxDisplaySplash(struct boot_fspec_t *filespec)
{
void *gfx_file;
int gfx_len;
unsigned char *grey_map;
int start_time;
struct boot_file_t file;
int result;
static int been_here = 0;
if(!been_here)
{
been_here = 1;
gfx_file = (void *) malloc(1024 * 512);
if (gfx_file == NULL) {
prom_printf("malloc failed in fxDisplaySplash()\n");
return;
}
scrOpen();
result = open_file(filespec, &file);
if(result != FILE_ERR_OK)
{
prom_printf("Error loading splash screen\n");
return;
}
gfx_len = file.fs->read(&file, 1024 * 512 - 765, gfx_file);
file.fs->close(&file);
grey_map = gfx_file + gfx_len;
memset(grey_map, 0/*128*/, 765);
}
scrSetEntireColorMap(grey_map);
scrClear(0);
start_time = prom_getms();
while(prom_getms() < start_time + 2000);
pcxDisplay(gfx_file, gfx_len);
scrFadeColorMap(grey_map, pcxColormap( gfx_file, gfx_len ), 2);
}
void fxUpdateSB(unsigned number, unsigned total)
{
int x, y;
for(x = SB_XSTART; x < SB_XSTART + (SB_XEND - SB_XSTART) * number / total; ++x)
{
for(y = 0; y < 10; ++y)
scrPutPixel(x, SB_YSTART + y, bar_grad[y]);
}
}
#define BLOCK_INDEX (1024 * 64)
int fxReadImage(struct boot_file_t *file, unsigned int filesize, void *base)
{
unsigned int count, result = 0;
for(count = 0; count < filesize; count += result)
{
result = ((filesize - count) < BLOCK_INDEX) ? (filesize - count) : BLOCK_INDEX;
if ((result = file->fs->read(file, result, base + count)) != BLOCK_INDEX)
break;
fxUpdateSB(count + result, filesize);
}
fxUpdateSB(count + result, filesize);
return(count + result);
}