--- frame.c.orig 2008-01-18 17:56:12.000000000 +0100 +++ frame.c 2008-01-18 17:54:49.000000000 +0100 @@ -170,25 +170,41 @@ break; case VIDEO_PALETTE_RGB565: + /* |FEDCB|A98765|43210| <- 16bit + * R G B + * must become + * |FEDCBOOO|A98765OO|43210OOO| <- 24bit + */ + fprintf( fp, "255\n" ); + for ( i=0; i < (fr->width * fr->height); i++ ) { + // Retrieve 16-bit words + val = ((short*)(fr->data))[i]; + + fprintf( fp, "%c%c%c", + (val & 0xF800) >> 8, // red (mask: 1111100000000000) + (val & 0x07E0) >> 3, // green (mask: 0000011111100000) + (val & 0x001F) << 3 // blue (mask: 0000000000011111) + ); + } + break; case VIDEO_PALETTE_RGB555: - - // Max val - fprintf( fp, "65535\n" ); - - // Write image data - for ( i = 0; i < ( fr->width * fr->height ); i++ ) - { + /* |OEDCBA|98765|43210| <- 15bit + * R G B + * must become + * |EDCBAOOO|98765OOO|43210OOO| <- 24bit + */ + fprintf( fp, "255\n" ); + for ( i=0; i < (fr->width * fr->height); i++ ) { // Retrieve 16-bit words - val = ((short*)(fr->data))[i]; - - fprintf( fp, "%c%c", - ( val & 0xff00 ) >> 8, // High - ( val & 0x00ff ) // Low - ); - } - - break; - + val = ((short*)(fr->data))[i]; + + fprintf( fp, "%c%c%c", + (val & 0x7C00) >> 7, // red (mask: 0111110000000000) + (val & 0x03E0) >> 2, // green (mask: 0000001111100000) + (val & 0x001F) << 3 // blue (mask: 0000000000011111) + ); + } + break; case VIDEO_PALETTE_YUV422: // Max val