Kun i src/: fbi.gdb diff -ur fbi-1.23/fbtools.c src/fbtools.c --- fbi-1.23/fbtools.c 2002-02-15 10:18:35.000000000 +0100 +++ src/fbtools.c 2007-04-17 17:30:42.000000000 +0200 @@ -255,11 +255,11 @@ fprintf(stderr,"access %s: %s\n",vtname,strerror(errno)); exit(1); } - switch (fork()) { + switch (vfork()) { case 0: break; case -1: - perror("fork"); + perror("vfork"); exit(1); default: exit(0); @@ -465,10 +465,10 @@ { int status; - switch (fork()) { + switch (vfork()) { case -1: fb_cleanup(); - perror("fork"); + perror("vfork"); exit(1); case 0: return; @@ -483,6 +483,6 @@ wait(&status); fb_cleanup(); if (WIFSIGNALED(status)) - fprintf(stderr,"Oops: %s\n",sys_siglist[WTERMSIG(status)]); + fprintf(stderr,"Oops: sys_siglist[%d]\n",WTERMSIG(status)); exit(status); } diff -ur fbi-1.23/main.c src/main.c --- fbi-1.23/main.c 2002-02-04 13:34:09.000000000 +0100 +++ src/main.c 2007-04-17 17:06:21.000000000 +0200 @@ -24,7 +24,10 @@ #include #include +#if HAVE_LIBPCD #include "pcd.h" +#endif + #include "loader.h" #include "dither.h" #include "fbtools.h" @@ -53,7 +56,7 @@ /* ---------------------------------------------------------------------- */ /* variables for read_image */ -unsigned long *lut_red = NULL, *lut_green = NULL, *lut_blue = NULL; +int32_t lut_red[256], lut_green[256], lut_blue[256]; int dither = FALSE, pcd_res = 3, steps = 50; int textreading = 0, visible = 1, redraw = 0; int new_image, left, top; @@ -94,6 +97,59 @@ /* ---------------------------------------------------------------------- */ +static void init_one(int32_t *lut, int bits, int shift) +{ + int i; + + if (bits > 8) + for (i = 0; i < 256; i++) + lut[i] = (i << (bits + shift - 8)); + else + for (i = 0; i < 256; i++) + lut[i] = (i >> (8 - bits)) << shift; +} + +static void +lut_init(int depth) +{ + if (fb_var.red.length && + fb_var.green.length && + fb_var.blue.length) { + /* fb_var.{red|green|blue} looks sane, use it */ + init_one(lut_red, fb_var.red.length, fb_var.red.offset); + init_one(lut_green, fb_var.green.length, fb_var.green.offset); + init_one(lut_blue, fb_var.blue.length, fb_var.blue.offset); + } else { + /* fallback */ + int i; + switch (depth) { + case 15: + for (i = 0; i < 256; i++) { + lut_red[i] = (i & 0xf8) << 7; /* bits -rrrrr-- -------- */ + lut_green[i] = (i & 0xf8) << 2; /* bits ------gg ggg----- */ + lut_blue[i] = (i & 0xf8) >> 3; /* bits -------- ---bbbbb */ + } + break; + case 16: + for (i = 0; i < 256; i++) { + lut_red[i] = (i & 0xf8) << 8; /* bits rrrrr--- -------- */ + lut_green[i] = (i & 0xfc) << 3; /* bits -----ggg ggg----- */ + lut_blue[i] = (i & 0xf8) >> 3; /* bits -------- ---bbbbb */ + } + break; + case 24: + for (i = 0; i < 256; i++) { + lut_red[i] = i << 16; /* byte -r-- */ + lut_green[i] = i << 8; /* byte --g- */ + lut_blue[i] = i; /* byte ---b */ + } + break; + } + } +} + +/* ---------------------------------------------------------------------- */ + static void version(void) { @@ -755,13 +811,9 @@ if (fb_fix.visual == FB_VISUAL_DIRECTCOLOR) linear_palette(5); if (fb_var.green.length == 5) { - lut_red = LUT_15_red; - lut_green = LUT_15_green; - lut_blue = LUT_15_blue; + lut_init(15); } else { - lut_red = LUT_16_red; - lut_green = LUT_16_green; - lut_blue = LUT_16_blue; + lut_init(16); } break; case 24: @@ -771,9 +823,7 @@ case 32: if (fb_fix.visual == FB_VISUAL_DIRECTCOLOR) linear_palette(8); - lut_red = LUT_24_red; - lut_green = LUT_24_green; - lut_blue = LUT_24_blue; + lut_init(24); break; default: fprintf(stderr, "Oops: %i bit/pixel ???\n", @@ -787,7 +837,9 @@ exit(1); } } +#if HAVE_LIBPCD pcd_get_LUT_init(); +#endif if (verbose) { sprintf(linebuffer,"video mode: %ix%i", fb_var.xres, fb_var.yres); diff -ur fbi-1.23/Makefile.in src/Makefile.in --- fbi-1.23/Makefile.in 2002-02-08 19:38:12.000000000 +0100 +++ src/Makefile.in 2007-04-17 17:19:58.000000000 +0200 @@ -22,7 +22,7 @@ @X_CFLAGS@ -I/usr/X11R6/include/X11/fonts MAGICK=@MAGICK@ UNGIF3=-L$(HOME)/ports/libungif-3.0/lib/.libs -LDLIBS=$(UNGIF3) @LIBS@ $(MAGICK) -lpcd -lm +LDLIBS=$(UNGIF3) @LIBS@ $(MAGICK) -lm # build TARGET=fbi @@ -36,7 +36,7 @@ all build:: $(TARGET) $(I18N) $(TARGET): $(OBJS) - $(CC) $(CFLAGS) -o $@ $(OBJS) $(LDLIBS) + $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS) install:: all