--- fbgrab-1.0/fbgrab.c 2002-04-15 22:22:54.000000000 +0200 +++ fbgrab-1.0/fbgrab.c.new 2006-07-14 02:46:49.000000000 +0200 @@ -163,15 +163,17 @@ for (i=0; i < (unsigned int) height*width*2; i+=2) { - /* BLUE = 0 */ - outbuffer[(i<<1)+0] = (inbuffer[i] & 0x1f) << 3; - /* GREEN = 1 */ - outbuffer[(i<<1)+1] = (((inbuffer[i+1] & 0x7) << 3) | - (inbuffer[i] & 0xE0) >> 5) << 2; - /* RED = 2 */ - outbuffer[(i<<1)+2] = (inbuffer[i+1] & 0xF8); - /* ALPHA = 3 */ - outbuffer[(i<<1)+3] = '\0'; + int16_t v = +#ifdef __BIG_ENDIAN__ + (inbuffer[i] << 8) + inbuffer[i+1]; +#else + (inbuffer[i+1] << 8) + inbuffer[i]; +#endif + + outbuffer[(i<<1)+0] = (v << 3) & 0xf8; /* B */ + outbuffer[(i<<1)+1] = (v >> 3) & 0xfc; /* G */ + outbuffer[(i<<1)+2] = (v >> 8) & 0xf8; /* R */ + outbuffer[(i<<1)+3] = 0; /* A */ } } @@ -194,6 +196,22 @@ } } +static void convertARGBtoBGRA(int width, int height, + unsigned char *inbuffer, + unsigned char *outbuffer) +{ + unsigned int i; + + for (i=0; i < (unsigned int) height*width*4; i+=4) + { + outbuffer[i+0] = inbuffer[i+3]; + outbuffer[i+1] = inbuffer[i+2]; + outbuffer[i+2] = inbuffer[i+1]; + outbuffer[i+3] = inbuffer[i+0]; + } +} + + static void write_PNG(unsigned char *outbuffer, char *filename, int width, int height, int interlace) { @@ -283,8 +301,13 @@ write_PNG(outbuffer, filename, width, height, interlace); break; case 32: +#ifdef __BIG_ENDIAN__ + convertARGBtoBGRA(width, height, inbuffer, outbuffer); + write_PNG(outbuffer, filename, width, height, interlace); +#else /* No conversion needed */ write_PNG(inbuffer, filename, width, height, interlace); +#endif break; default: fprintf(stderr, "%d bits per pixel are not supported! ", bits);