diff options
author | Florent Villard <warly@mandriva.com> | 2003-08-12 08:22:43 +0000 |
---|---|---|
committer | Florent Villard <warly@mandriva.com> | 2003-08-12 08:22:43 +0000 |
commit | 5606f67a26f876bc83e3928a41e7919d9aea2ca8 (patch) | |
tree | bcbffafd8ab4884e363da50c0f8b32751b886ae0 /fbmngplay/fbmngplay.c | |
parent | 0bfd2d68ceaa132a57abc8dec8b67edc8e7e37ed (diff) | |
download | bootsplash-5606f67a26f876bc83e3928a41e7919d9aea2ca8.tar bootsplash-5606f67a26f876bc83e3928a41e7919d9aea2ca8.tar.gz bootsplash-5606f67a26f876bc83e3928a41e7919d9aea2ca8.tar.bz2 bootsplash-5606f67a26f876bc83e3928a41e7919d9aea2ca8.tar.xz bootsplash-5606f67a26f876bc83e3928a41e7919d9aea2ca8.zip |
add fbmngplay and fbtruetype
Diffstat (limited to 'fbmngplay/fbmngplay.c')
-rw-r--r-- | fbmngplay/fbmngplay.c | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/fbmngplay/fbmngplay.c b/fbmngplay/fbmngplay.c new file mode 100644 index 0000000..d0dbac2 --- /dev/null +++ b/fbmngplay/fbmngplay.c @@ -0,0 +1,250 @@ +/* + * fbmngplay - fb console MNG player. + * (c) 2001-2002 by Stefan Reinauer, <stepan@suse.de> + * + * This program is based on mngplay, written and (C) by + * Ralph Giles <giles@ashlu.bc.ca> + * + * This program my be redistributed under the terms of the + * GNU General Public Licence, version 2, or at your preference, + * any later version. + */ + +#include <unistd.h> +#include <fcntl.h> +#include <getopt.h> +#include <sys/mman.h> +#include <sys/ioctl.h> +#include <linux/fb.h> +#include <signal.h> + +#include "fbmngplay.h" +#include "messages.h" +#include "console.h" +#include "mng.h" + +volatile int run = 1; +int verbose = 0; +int buffered = 0; +int waitsignal = 0; +int delta = 16; +int sconly=0; + +/* + * Signal handlers + */ + +void sigint_handler(int sig) +{ + if (waitsignal) + return; + run = 2; +} + +void sigterm_handler(int sig) +{ + if (waitsignal) + return; + restore_area(); + run = 0; +} + +void sigusr1_handler(int sig) +{ + signal(SIGUSR1, SIG_IGN); + run = 0; +} + +/* + * Main loop + */ + +int main(int argc, char *argv[]) +{ + int fbdev,c,option_index; + unsigned int alpha; + struct fb_var_screeninfo var; + struct fb_fix_screeninfo fix; + + /* Check which console we're running on */ + init_consoles(); + + /* allocate our stream data structure */ + mng = (mngstuff *) calloc(1, sizeof(*mng)); + if (mng == NULL) { + fprintf(stderr, "could not allocate stream structure.\n"); + exit(0); + } + + alpha = 100; + mng->alpha = 100; + mng->fbx = 15; + mng->fby = 15; + mng->background = NULL; + + while (1) { + static struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"verbose", 0, 0, 'v'}, + {"alpha", 1, 0, 'a'}, + {"buffered", 0, 0, 'b'}, + {"signal", 0, 0, 's'}, + {"delta", 0, 0, 'd'}, + {"version", 0, 0, 'V'}, + {"start-console",0,0,'S'}, + {"console",1,0,'c'}, + {0, 0, 0, 0} + }; + + c = getopt_long(argc, argv, "a:x:y:bh?vsd:VSc:", + long_options, &option_index); + + if (c == -1) + break; + + switch (c) { + case 'a': + alpha = atoi(optarg); + if (alpha > 100) + alpha = 100; + mng->alpha = alpha; + break; + case 'x': + mng->fbx = atoi(optarg); + break; + case 'y': + mng->fby = atoi(optarg); + break; + case 'd': + delta = atoi(optarg); + break; + case '?': + case 'h': + usage(argv[0]); + exit(0); + case 'v': + verbose = 1; + break; + case 's': + waitsignal = 1; + break; + case 'b': + buffered = 1; + break; + case 'V': + version(); + exit(0); + case 'c': + start_console=atoi(optarg)-1; + case 'S': + sconly=1; + break; + default: + break; + } + } +#if 0 + if (!output && optind >= argc) { +#else + if (optind >= argc) { +#endif + printf("Which files do you want to play?\n"); + exit(0); + } + + /* Initialize framebuffer */ + fbdev = open("/dev/fb0", O_RDWR); + if (fbdev < 0) { + fprintf(stderr, "error while opening framebuffer.\n"); + exit(fbdev); + } + + ioctl(fbdev, FBIOGET_VSCREENINFO, &var); + mng->fbwidth = var.xres; + mng->fbheight = var.yres; + mng->fbbpp = var.bits_per_pixel; + + mng->fbredo = var.red.offset; + mng->fbgreeno = var.green.offset; + mng->fbblueo = var.blue.offset; + mng->fbredl = var.red.length; + mng->fbgreenl = var.green.length; + mng->fbbluel = var.blue.length; + + /* Display might have a line length unequal + * the visible line. + */ + ioctl(fbdev, FBIOGET_FSCREENINFO, &fix); + mng->fbrow = fix.line_length; + + mng->display = + mmap(NULL, mng->fbrow * mng->fbheight , + PROT_WRITE | PROT_READ, MAP_SHARED, fbdev, 0); +#if 0 + if (output) + prepare_output(); +#endif + /* arrange to call the shutdown routine before we exit */ + atexit(&cleanup); + + while (optind < argc) { + /* leftover arguements are filenames. */ + mng->filename = argv[optind++]; + + /* set up the mng decoder for our stream */ + mng->mng = mng_initialize(mng, mngalloc, mngfree, MNG_NULL); + if (mng->mng == MNG_NULL) { + fprintf(stderr, "could not initialize libmng.\n"); + exit(1); + } + + /* set the callbacks */ + mng_setcb_errorproc(mng->mng, mngerror); + mng_setcb_openstream(mng->mng, mngopenstream); + mng_setcb_closestream(mng->mng, mngclosestream); + mng_setcb_readdata(mng->mng, mngreadstream); + mng_setcb_gettickcount(mng->mng, mnggetticks); + mng_setcb_settimer(mng->mng, mngsettimer); + mng_setcb_processheader(mng->mng, mngprocessheader); + mng_setcb_getcanvasline(mng->mng, mnggetcanvasline); + mng_setcb_refresh(mng->mng, mngrefresh); + + signal(SIGINT, sigint_handler); + signal(SIGTERM, sigterm_handler); + + mng_readdisplay(mng->mng); + + /* loop though the frames */ + while (mng->delay && run) { + usleep(mng->delay * 1000); + mng->delay = 0; + mng_display_resume(mng->mng); + if (run == 2) { + if (mng->alpha == 0) + run = 0; + mng->alpha -= delta; + if (mng->alpha < 0) + mng->alpha = 0; + } + } + + if (waitsignal && optind < argc) { + signal(SIGUSR1, sigusr1_handler); + run = 1; + while (run) { + sleep(2); + } + } + + memset(mng->copybuffer, 0, + 4 * mng->width * mng->height); + run = 1; + mng->alpha = alpha; + if (optind == argc) { /* last file */ + restore_area(); + } + } + + /* cleanup and quit */ + return mngquit(mng->mng); +} |