Index: base/applications/mstsc/bsops.c =================================================================== --- base/applications/mstsc/bsops.c (revision 69191) +++ base/applications/mstsc/bsops.c (working copy) @@ -91,6 +91,10 @@ { return *((unsigned short *) p); } + else if (g_Bpp == 3) + { + return (*((unsigned short *) p))&0xffffff; + } else { return *((unsigned int *) p); @@ -128,6 +132,12 @@ { *((unsigned short *) p) = pixel; } + else if (g_Bpp == 3) + { + *((unsigned char *) p++) = (pixel>>16) & 0xff; + *((unsigned char *) p++) = (pixel>>8) & 0xff; + *((unsigned char *) p++) = pixel & 0xff; + } else { *((unsigned int *) p) = pixel; @@ -228,8 +238,14 @@ return data[(y * 2) * width + (x * 2)] != 0 || data[(y * 2) * width + (x * 2) + 1] != 0; } - else if (bpp == 24 || bpp == 32) + else if (bpp == 24) { + return data[(y * 3) * width + (x * 3)] != 0 || + data[(y * 3) * width + (x * 3) + 1] != 0 || + data[(y * 3) * width + (x * 3) + 2] != 0; + } + else if (bpp == 32) + { return data[(y * 4) * width + (x * 4)] != 0 || data[(y * 4) * width + (x * 4) + 1] != 0 || data[(y * 4) * width + (x * 4) + 2] != 0 || @@ -271,8 +287,14 @@ { ((unsigned short *) data)[y * width + x] = pixel; } - else if (bpp == 24 || bpp == 32) + else if (bpp == 24) { + data[(y * width + x)*3] = pixel & 0xff; + data[(y * width + x)*3+1] = (pixel >> 8) & 0xff; + data[(y * width + x)*3+2] = (pixel >> 16) & 0xff; + } + else if (bpp == 32) + { ((unsigned int *) data)[y * width + x] = (unsigned int) pixel; } } Index: base/applications/mstsc/uimain.c =================================================================== --- base/applications/mstsc/uimain.c (revision 69191) +++ base/applications/mstsc/uimain.c (working copy) @@ -199,7 +199,7 @@ { bs_set_pixel_on(am, j, 31 - i, 32, 1, 1); } - if (bs_is_pixel_on((char *)xormask, j, i, 32, 24)) + if (bs_is_pixel_on((char *)xormask, j, i, 32, xor_bpp)) { bs_set_pixel_on(xm, j, 31 - i, 32, 1, 1); } Index: base/applications/mstsc/uimain.h =================================================================== --- base/applications/mstsc/uimain.h (revision 69191) +++ base/applications/mstsc/uimain.h (working copy) @@ -63,7 +63,7 @@ ); \ } -#define MAKE_COLOUR32(c, r, g, b) \ +#define MAKE_COLOUR24(c, r, g, b) \ { \ c = ( \ ((r & 0xff) << 16) | \ Index: base/applications/mstsc/win32.c =================================================================== --- base/applications/mstsc/win32.c (revision 69191) +++ base/applications/mstsc/win32.c (working copy) @@ -886,6 +886,7 @@ int red; int green; int blue; + int index; ZeroMemory(&bi, sizeof(bi)); bi.bmiHeader.biSize = sizeof(bi.bmiHeader); @@ -907,12 +908,13 @@ { for (j = cx - 1; j >= 0; j--) { - colour = ((unsigned char*)data)[i * cx + j]; + index = i * cx + j; + colour = ((unsigned char*)data)[index]; red = (pal_entries[colour & 0xff] & 0xff0000) >> 16; green = (pal_entries[colour & 0xff] & 0xff00) >> 8; blue = pal_entries[colour & 0xff] & 0xff; - MAKE_COLOUR32(colour, red, green, blue); - ((unsigned int*)bits)[i * cx + j] = colour; + MAKE_COLOUR24(colour, red, green, blue); + ((unsigned int*)bits)[index] = colour; } } } @@ -922,10 +924,11 @@ { for (j = cx - 1; j >= 0; j--) { - colour = ((unsigned short*)data)[i * cx + j]; + index = i * cx + j; + colour = ((unsigned short*)data)[index]; SPLIT_COLOUR15(colour, red, green, blue); - MAKE_COLOUR32(colour, red, green, blue); - ((unsigned int*)bits)[i * cx + j] = colour; + MAKE_COLOUR24(colour, red, green, blue); + ((unsigned int*)bits)[index] = colour; } } } @@ -935,14 +938,30 @@ { for (j = cx - 1; j >= 0; j--) { - colour = ((unsigned short*)data)[i * cx + j]; + index = i * cx + j; + colour = ((unsigned short*)data)[index]; SPLIT_COLOUR16(colour, red, green, blue); - MAKE_COLOUR32(colour, red, green, blue); + MAKE_COLOUR24(colour, red, green, blue); + ((unsigned int*)bits)[index] = colour; + } + } + } + else if (g_server_depth == 24) + { + for (i = cy - 1; i >= 0; i--) + { + for (j = cx - 1; j >= 0; j--) + { + index = (i * cx + j) * 3; + red = ((unsigned char*)data)[index + 2]; + green = ((unsigned char*)data)[index + 1]; + blue = ((unsigned char*)data)[index]; + MAKE_COLOUR24(colour, red, green, blue); ((unsigned int*)bits)[i * cx + j] = colour; } } } - else if (g_server_depth == 24 || g_server_depth == 32) + else if (g_server_depth == 32) { memcpy(bits, data, cx*cy*4); }