diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c index 7b695b2..e3a55ca 100644 --- a/miscutils/fbsplash.c +++ b/miscutils/fbsplash.c @@ -9,6 +9,7 @@ * - put somewhere fbsplash.cfg file and an image in .ppm format. * - run applet: $ setsid fbsplash [params] & * -c: hide cursor + * -x: center image (if smaller than screen) * -d /dev/fbN: framebuffer device (if not /dev/fb0) * -s path_to_image_file (can be "-" for stdin) * -i path_to_cfg_file @@ -22,10 +23,11 @@ */ //usage:#define fbsplash_trivial_usage -//usage: "-s IMGFILE [-c] [-d DEV] [-i INIFILE] [-f CMD]" +//usage: "-s IMGFILE [-c] [-x] [-d DEV] [-i INIFILE] [-f CMD]" //usage:#define fbsplash_full_usage "\n\n" //usage: " -s Image" //usage: "\n -c Hide cursor" +//usage: "\n -x Center image (if smaller than screen)" //usage: "\n -d Framebuffer device (default /dev/fb0)" //usage: "\n -i Config file (var=value):" //usage: "\n BAR_LEFT,BAR_TOP,BAR_WIDTH,BAR_HEIGHT" @@ -54,6 +56,7 @@ struct globals { unsigned red_shift; unsigned green_shift; unsigned blue_shift; + bool bcenter_image; }; #define G (*ptr_to_globals) #define INIT_G() do { \ @@ -349,6 +352,8 @@ static void fb_drawimage(void) char *read_ptr; unsigned char *pixline; unsigned i, j, width, height, line_size; + int xoffset = 0; + int yoffset = 0; if (LONE_DASH(G.image_filename)) { theme_file = stdin; @@ -396,6 +401,13 @@ static void fb_drawimage(void) line_size = width*3; pixline = xmalloc(line_size); + if (G.bcenter_image) { + if (width < G.scr_var.xres) + xoffset = ((G.scr_var.xres - width) / 2) * G.bytes_per_pixel; + if (height < G.scr_var.yres) + yoffset = (G.scr_var.yres - height) / 2; + } + if (width > G.scr_var.xres) width = G.scr_var.xres; if (height > G.scr_var.yres) @@ -407,7 +419,7 @@ static void fb_drawimage(void) if (fread(pixline, 1, line_size, theme_file) != line_size) bb_error_msg_and_die("bad PPM file '%s'", G.image_filename); pixel = pixline; - src = G.addr + j * G.scr_fix.line_length; + src = G.addr + (j + yoffset) * G.scr_fix.line_length + xoffset; for (i = 0; i < width; i++) { unsigned thispix = fb_pixel_value(pixel[0], pixel[1], pixel[2]); fb_write_pixel(src, thispix); @@ -463,6 +475,7 @@ int fbsplash_main(int argc UNUSED_PARAM, char **argv) FILE *fp = fp; // for compiler char *num_buf; unsigned num; + unsigned optret; bool bCursorOff; INIT_G(); @@ -471,8 +484,10 @@ int fbsplash_main(int argc UNUSED_PARAM, char **argv) fb_device = "/dev/fb0"; cfg_filename = NULL; fifo_filename = NULL; - bCursorOff = 1 & getopt32(argv, "cs:d:i:f:", + optret = getopt32(argv, "cxs:d:i:f:", &G.image_filename, &fb_device, &cfg_filename, &fifo_filename); + bCursorOff = 1 & optret; + G.bcenter_image = 2 & optret; // parse configuration file if (cfg_filename)