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;