]>
Commit | Line | Data |
---|---|---|
60f8d802 | 1 | --- fbgrab-1.0/fbgrab.c 2002-04-15 22:22:54.000000000 +0200 |
2 | +++ fbgrab-1.0/fbgrab.c.new 2006-07-14 02:46:49.000000000 +0200 | |
3 | @@ -163,15 +163,17 @@ | |
4 | ||
5 | for (i=0; i < (unsigned int) height*width*2; i+=2) | |
6 | { | |
7 | - /* BLUE = 0 */ | |
8 | - outbuffer[(i<<1)+0] = (inbuffer[i] & 0x1f) << 3; | |
9 | - /* GREEN = 1 */ | |
10 | - outbuffer[(i<<1)+1] = (((inbuffer[i+1] & 0x7) << 3) | | |
11 | - (inbuffer[i] & 0xE0) >> 5) << 2; | |
12 | - /* RED = 2 */ | |
13 | - outbuffer[(i<<1)+2] = (inbuffer[i+1] & 0xF8); | |
14 | - /* ALPHA = 3 */ | |
15 | - outbuffer[(i<<1)+3] = '\0'; | |
16 | + int16_t v = | |
17 | +#ifdef __BIG_ENDIAN__ | |
18 | + (inbuffer[i] << 8) + inbuffer[i+1]; | |
19 | +#else | |
20 | + (inbuffer[i+1] << 8) + inbuffer[i]; | |
21 | +#endif | |
22 | + | |
23 | + outbuffer[(i<<1)+0] = (v << 3) & 0xf8; /* B */ | |
24 | + outbuffer[(i<<1)+1] = (v >> 3) & 0xfc; /* G */ | |
25 | + outbuffer[(i<<1)+2] = (v >> 8) & 0xf8; /* R */ | |
26 | + outbuffer[(i<<1)+3] = 0; /* A */ | |
27 | } | |
28 | } | |
29 | ||
30 | @@ -194,6 +196,22 @@ | |
31 | } | |
32 | } | |
33 | ||
34 | +static void convertARGBtoBGRA(int width, int height, | |
35 | + unsigned char *inbuffer, | |
36 | + unsigned char *outbuffer) | |
37 | +{ | |
38 | + unsigned int i; | |
39 | + | |
40 | + for (i=0; i < (unsigned int) height*width*4; i+=4) | |
41 | + { | |
42 | + outbuffer[i+0] = inbuffer[i+3]; | |
43 | + outbuffer[i+1] = inbuffer[i+2]; | |
44 | + outbuffer[i+2] = inbuffer[i+1]; | |
45 | + outbuffer[i+3] = inbuffer[i+0]; | |
46 | + } | |
47 | +} | |
48 | + | |
49 | + | |
50 | static void write_PNG(unsigned char *outbuffer, char *filename, | |
51 | int width, int height, int interlace) | |
52 | { | |
53 | @@ -283,8 +301,13 @@ | |
54 | write_PNG(outbuffer, filename, width, height, interlace); | |
55 | break; | |
56 | case 32: | |
57 | +#ifdef __BIG_ENDIAN__ | |
58 | + convertARGBtoBGRA(width, height, inbuffer, outbuffer); | |
59 | + write_PNG(outbuffer, filename, width, height, interlace); | |
60 | +#else | |
61 | /* No conversion needed */ | |
62 | write_PNG(inbuffer, filename, width, height, interlace); | |
63 | +#endif | |
64 | break; | |
65 | default: | |
66 | fprintf(stderr, "%d bits per pixel are not supported! ", bits); |