wok-tiny rev 70

fbvnc: fix colormap
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Oct 16 13:31:04 2011 +0200 (2011-10-16)
parents d62defb9bb77
children 9df6bc5c5b80
files busybox/stuff/busybox-1.18.config fbvnc/stuff/fbvnc.u
line diff
     1.1 --- a/busybox/stuff/busybox-1.18.config	Fri Sep 16 18:15:41 2011 +0200
     1.2 +++ b/busybox/stuff/busybox-1.18.config	Sun Oct 16 13:31:04 2011 +0200
     1.3 @@ -513,9 +513,9 @@
     1.4  CONFIG_BLKID=y
     1.5  CONFIG_DMESG=y
     1.6  CONFIG_FEATURE_DMESG_PRETTY=y
     1.7 -# CONFIG_FBSET is not set
     1.8 -# CONFIG_FEATURE_FBSET_FANCY is not set
     1.9 -# CONFIG_FEATURE_FBSET_READMODE is not set
    1.10 +CONFIG_FBSET=y
    1.11 +CONFIG_FEATURE_FBSET_FANCY=y
    1.12 +CONFIG_FEATURE_FBSET_READMODE=y
    1.13  # CONFIG_FDFLUSH is not set
    1.14  CONFIG_FDFORMAT=y
    1.15  CONFIG_FDISK=y
     2.1 --- a/fbvnc/stuff/fbvnc.u	Fri Sep 16 18:15:41 2011 +0200
     2.2 +++ b/fbvnc/stuff/fbvnc.u	Sun Oct 16 13:31:04 2011 +0200
     2.3 @@ -14,7 +14,98 @@
     2.4   unsigned fb_val(int r, int g, int b);
     2.5  --- draw.c
     2.6  +++ draw.c
     2.7 -@@ -72,11 +72,14 @@
     2.8 +@@ -10,14 +10,13 @@
     2.9 + 
    2.10 + #define MIN(a, b)	((a) < (b) ? (a) : (b))
    2.11 + #define MAX(a, b)	((a) > (b) ? (a) : (b))
    2.12 +-#define NLEVELS		(1 << 8)
    2.13 ++#define NLEVELS		(1 << 16)
    2.14 + 
    2.15 + static int fd;
    2.16 + static void *fb;
    2.17 + static struct fb_var_screeninfo vinfo;
    2.18 + static struct fb_fix_screeninfo finfo;
    2.19 +-static int bpp;
    2.20 +-static int nr, ng, nb;
    2.21 ++static int bytes_per_pixel;
    2.22 + 
    2.23 + static int fb_len(void)
    2.24 + {
    2.25 +@@ -28,10 +27,12 @@
    2.26 + {
    2.27 + 	static unsigned short red[NLEVELS], green[NLEVELS], blue[NLEVELS];
    2.28 + 	struct fb_cmap cmap;
    2.29 ++
    2.30 + 	if (finfo.visual == FB_VISUAL_TRUECOLOR)
    2.31 + 		return;
    2.32 ++
    2.33 + 	cmap.start = 0;
    2.34 +-	cmap.len = MAX(nr, MAX(ng, nb));
    2.35 ++	cmap.len = NLEVELS;
    2.36 + 	cmap.red = red;
    2.37 + 	cmap.green = green;
    2.38 + 	cmap.blue = blue;
    2.39 +@@ -41,24 +42,39 @@
    2.40 + 
    2.41 + void fb_cmap(void)
    2.42 + {
    2.43 +-	unsigned short red[NLEVELS], green[NLEVELS], blue[NLEVELS];
    2.44 ++	struct fb_bitfield *color[3] = {
    2.45 ++		&vinfo.blue, &vinfo.green, &vinfo.red
    2.46 ++	};
    2.47 ++	int eye_sensibility[3] = { 2, 0, 1 }; // higher=red, blue, lower=green
    2.48 + 	struct fb_cmap cmap;
    2.49 +-	int i;
    2.50 ++	unsigned short map[3][NLEVELS];
    2.51 ++	int i, j, n, offset;
    2.52 ++
    2.53 + 	if (finfo.visual == FB_VISUAL_TRUECOLOR)
    2.54 + 		return;
    2.55 + 
    2.56 +-	for (i = 0; i < nr; i++)
    2.57 +-		red[i] = (65535 / (nr - 1)) * i;
    2.58 +-	for (i = 0; i < ng; i++)
    2.59 +-		green[i] = (65535 / (ng - 1)) * i;
    2.60 +-	for (i = 0; i < nb; i++)
    2.61 +-		blue[i] = (65535 / (nb - 1)) * i;
    2.62 +-
    2.63 ++	for (i = 0, n = vinfo.bits_per_pixel; i < 3; i++) {
    2.64 ++		n -= color[eye_sensibility[i]]->length = n / (3 - i);
    2.65 ++	}
    2.66 ++	n = (1 << vinfo.bits_per_pixel);
    2.67 ++	if (n > NLEVELS)
    2.68 ++		n = NLEVELS;
    2.69 ++	for (i = offset = 0; i < 3; i++) {
    2.70 ++		int length = color[i]->length;
    2.71 ++		color[i]->offset = offset;
    2.72 ++		for (j = 0; j < n; j++) {
    2.73 ++			int k = (j >> offset) << (16 - length);
    2.74 ++			if (k == (0xFFFF << (16 - length)))
    2.75 ++				k = 0xFFFF;
    2.76 ++			map[i][j] = k;
    2.77 ++		}
    2.78 ++		offset += length;
    2.79 ++	}
    2.80 + 	cmap.start = 0;
    2.81 +-	cmap.len = MAX(nr, MAX(ng, nb));
    2.82 +-	cmap.red = red;
    2.83 +-	cmap.green = green;
    2.84 +-	cmap.blue = blue;
    2.85 ++	cmap.len = n;
    2.86 ++	cmap.red = map[2];
    2.87 ++	cmap.green = map[1];
    2.88 ++	cmap.blue = map[0];
    2.89 + 	cmap.transp = NULL;
    2.90 + 
    2.91 + 	ioctl(fd, FBIOPUTCMAP, &cmap);
    2.92 +@@ -66,25 +82,26 @@
    2.93 + 
    2.94 + unsigned fb_mode(void)
    2.95 + {
    2.96 +-	return (bpp << 16) | (vinfo.red.length << 8) |
    2.97 ++	return (bytes_per_pixel << 16) | (vinfo.red.length << 8) |
    2.98 + 		(vinfo.green.length << 4) | (vinfo.blue.length);
    2.99 + }
   2.100   
   2.101   int fb_init(void)
   2.102   {
   2.103 @@ -29,15 +120,17 @@
   2.104   	if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) == -1)
   2.105   		goto failed;
   2.106   	fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
   2.107 -@@ -85,6 +88,7 @@
   2.108 - 	ng = 1 << vinfo.blue.length;
   2.109 - 	nb = 1 << vinfo.green.length;
   2.110 +-	bpp = (vinfo.bits_per_pixel + 7) >> 3;
   2.111 +-	nr = 1 << vinfo.red.length;
   2.112 +-	ng = 1 << vinfo.blue.length;
   2.113 +-	nb = 1 << vinfo.green.length;
   2.114 ++	bytes_per_pixel = (vinfo.bits_per_pixel + 7) >> 3;
   2.115   	fb = mmap(NULL, fb_len(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
   2.116  +	err++;
   2.117   	if (fb == MAP_FAILED)
   2.118   		goto failed;
   2.119   	fb_cmap_save(1);
   2.120 -@@ -93,7 +97,7 @@
   2.121 +@@ -93,7 +110,7 @@
   2.122   failed:
   2.123   	perror("fb_init()");
   2.124   	close(fd);
   2.125 @@ -46,8 +139,13 @@
   2.126   }
   2.127   
   2.128   void fb_free(void)
   2.129 -@@ -123,16 +127,26 @@
   2.130 - 	memcpy(fb_mem(r) + (c + vinfo.xoffset) * bpp, mem, len * bpp);
   2.131 +@@ -120,19 +137,30 @@
   2.132 + 
   2.133 + void fb_set(int r, int c, void *mem, int len)
   2.134 + {
   2.135 +-	memcpy(fb_mem(r) + (c + vinfo.xoffset) * bpp, mem, len * bpp);
   2.136 ++	memcpy(fb_mem(r) + (c + vinfo.xoffset) * bytes_per_pixel,
   2.137 ++		mem, len * bytes_per_pixel);
   2.138   }
   2.139   
   2.140  +void fill_rgb_conv(int mode, struct rgb_conv *s)
   2.141 @@ -85,12 +183,6 @@
   2.142   }
   2.143  --- fbvnc.c
   2.144  +++ fbvnc.c
   2.145 -@@ -1,4 +1,4 @@
   2.146 --/*
   2.147 -+/* // TODO user/passwd RDP?
   2.148 -  * fbvnc - a small linux framebuffer vnc viewer
   2.149 -  *
   2.150 -  * Copyright (C) 2009-2011 Ali Gholami Rudi
   2.151  @@ -36,13 +36,15 @@
   2.152   
   2.153   #define VNC_PORT		"5900"
   2.154 @@ -176,9 +268,8 @@
   2.155  -	pixfmt_cmd.format.rshl = 0;
   2.156  -	pixfmt_cmd.format.gshl = 2;
   2.157  -	pixfmt_cmd.format.bshl = 5;
   2.158 --
   2.159  +	if (bpp < 1)
   2.160 -+		bpp = 1;
   2.161 ++	  	bpp = FBM_BPP(fb_mode());
   2.162  +	if (bpp >= 3)
   2.163  +		bpp = 4;
   2.164  +	for (i = 0; bpp <= FBM_BPP(vncfmt[i]); i++)
   2.165 @@ -186,7 +277,7 @@
   2.166  +	bpp = FBM_BPP(vnc_mode);
   2.167  +	pixfmt_cmd.format.bpp =
   2.168  +	pixfmt_cmd.format.depth = bpp << 3;
   2.169 -+
   2.170 + 
   2.171  +	fill_rgb_conv(FBM_COLORS(vnc_mode), &format);
   2.172  +	pixfmt_cmd.format.rmax = htons(format.rmax);
   2.173  +	pixfmt_cmd.format.gmax = htons(format.gmax);
   2.174 @@ -255,7 +346,7 @@
   2.175   }
   2.176   
   2.177   static void xread(int fd, void *buf, int len)
   2.178 -@@ -159,54 +175,79 @@
   2.179 +@@ -159,54 +175,84 @@
   2.180   	while (nr < len && (n = read(fd, buf + nr, len - nr)) > 0)
   2.181   		nr += n;
   2.182   	if (nr < len) {
   2.183 @@ -324,18 +415,23 @@
   2.184  +			l = MIN(w, cols - x);
   2.185  +			if (x < 0) {
   2.186  +				l = MIN(w + x, cols);
   2.187 -+				i = -x;
   2.188 ++				i = MIN(w, -x);
   2.189  +				x = 0;
   2.190  +			}
   2.191 ++			if (l < 0)
   2.192 ++				l = 0;
   2.193  +			for (; h--; y++) {
   2.194 -+				int a, b, c = i;
   2.195 -+				for (a = b = 0; w > b; b += a, c = 0) {
   2.196 -+					a = MIN(w - b, MAXPIX);
   2.197 -+					xread(fd, buf, a * bpp);
   2.198 -+					if (y >= 0 && y < rows && l > b)
   2.199 -+						drawfb(buf + (c * bpp), x + b,
   2.200 -+						       y, MIN(a, l - b) - c);
   2.201 ++				int n = l;
   2.202 ++				int xj = x;
   2.203 ++				skip(fd, i * bpp);
   2.204 ++				while (n > 0) {
   2.205 ++					int j = MIN(n, MAXPIX);
   2.206 ++					xread(fd, buf, j * bpp);
   2.207 ++					if (y >= 0 && y < rows)
   2.208 ++						drawfb(buf, xj, y, j);
   2.209 ++					xj += j; n -= j;
   2.210  +				}
   2.211 ++				skip(fd, (w - l - i) * bpp);
   2.212  +			}
   2.213   		}
   2.214   		break;
   2.215 @@ -359,7 +455,7 @@
   2.216   		return -1;
   2.217   	}
   2.218   	return 0;
   2.219 -@@ -217,12 +258,31 @@
   2.220 +@@ -217,12 +263,31 @@
   2.221   	char ie[3];
   2.222   	struct vnc_client_ratevent me = {VNC_CLIENT_RATEVENT};
   2.223   	int mask = 0;
   2.224 @@ -393,7 +489,7 @@
   2.225   	if (ie[0] & 0x01)
   2.226   		mask |= VNC_BUTTON1_MASK;
   2.227   	if (ie[0] & 0x04)
   2.228 -@@ -233,6 +293,8 @@
   2.229 +@@ -233,6 +298,8 @@
   2.230   	me.x = htons(mc);
   2.231   	me.mask = mask;
   2.232   	write(fd, &me, sizeof(me));
   2.233 @@ -402,7 +498,7 @@
   2.234   	return 0;
   2.235   }
   2.236   
   2.237 -@@ -292,12 +354,11 @@
   2.238 +@@ -292,12 +359,11 @@
   2.239   			k = 0xff0d;
   2.240   			break;
   2.241   		case 0x0c:	/* ^L: redraw */
   2.242 @@ -417,7 +513,7 @@
   2.243   			mod[nmod++] = 0xffe1;
   2.244   		if (k >= 1 && k <= 26) {
   2.245   			k = 'a' + k - 1;
   2.246 -@@ -339,40 +400,42 @@
   2.247 +@@ -339,40 +405,42 @@
   2.248   	write(STDIN_FILENO, show, strlen(show));
   2.249   }
   2.250   
   2.251 @@ -467,7 +563,7 @@
   2.252   }
   2.253   
   2.254   int main(int argc, char * argv[])
   2.255 -@@ -380,27 +443,38 @@
   2.256 +@@ -380,27 +448,38 @@
   2.257   	char *port = VNC_PORT;
   2.258   	char *host = "127.0.0.1";
   2.259   	struct termios ti;