--- /dev/null
+/* 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);
+}