Index: subsystems/win32/win32k/include/dib.h =================================================================== --- subsystems/win32/win32k/include/dib.h (revision 39857) +++ subsystems/win32/win32k/include/dib.h (working copy) @@ -17,6 +17,6 @@ DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi); HPALETTE FASTCALL -BuildDIBPalette (CONST BITMAPINFO *bmi, PINT paletteType); +BuildDIBPalette (CONST BITMAPINFO *bmi, PINT paletteType, INT colorres); #endif /* _WIN32K_DIB_H */ Index: subsystems/win32/win32k/objects/brush.c =================================================================== --- subsystems/win32/win32k/objects/brush.c (revision 39857) +++ subsystems/win32/win32k/objects/brush.c (working copy) @@ -365,7 +365,7 @@ psurfPattern = SURFACE_LockSurface(hPattern); ASSERT(psurfPattern != NULL); - psurfPattern->hDIBPalette = BuildDIBPalette(BitmapInfo, &PaletteType); + psurfPattern->hDIBPalette = BuildDIBPalette(BitmapInfo, &PaletteType, 0); SURFACE_UnlockSurface(psurfPattern); BrushObject = BRUSHOBJ_AllocBrushWithHandle(); Index: subsystems/win32/win32k/objects/dibobj.c =================================================================== --- subsystems/win32/win32k/objects/dibobj.c (revision 39857) +++ subsystems/win32/win32k/objects/dibobj.c (working copy) @@ -286,7 +286,7 @@ PALETTE_UnlockPalette(hDCPalette); // Source palette obtained from the BITMAPINFO - DIB_Palette = BuildDIBPalette ( (PBITMAPINFO)bmi, (PINT)&DIB_Palette_Type ); + DIB_Palette = BuildDIBPalette ( (PBITMAPINFO)bmi, (PINT)&DIB_Palette_Type, IntGdiGetDeviceCaps(DC, COLORRES) ); if (NULL == DIB_Palette) { EngUnlockSurface(SourceSurf); @@ -526,7 +526,7 @@ DDBPalette = ((GDIDEVICE *)pDC->pPDev)->DevInfo.hpalDefault; PALETTE_UnlockPalette(pDCPalette); - DIBPalette = BuildDIBPalette(bmi, (PINT)&DIBPaletteType); + DIBPalette = BuildDIBPalette(bmi, (PINT)&DIBPaletteType, IntGdiGetDeviceCaps(pDC, COLORRES)); if (!DIBPalette) { SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); @@ -718,7 +718,7 @@ bPaletteMatch = TRUE; } else - hDestPalette = BuildDIBPalette(Info, (PINT)&DestPaletteType); //hDestPalette = Dc->DevInfo->hpalDefault; + hDestPalette = BuildDIBPalette(Info, (PINT)&DestPaletteType, 0); //hDestPalette = Dc->DevInfo->hpalDefault; SourcePalette = PALETTE_LockPalette(hSourcePalette); /* FIXME - SourcePalette can be NULL!!! Don't assert here! */ @@ -1638,8 +1638,13 @@ return lpRGB; } +//Bitmap round bit always to 1, 2, 4, 8, 16, 24, 32 +//colorres for device real mask +//exalpe: +//16 bit device mask 555 "if not installed driver" +//16 bit device mask 565 "if installed driver" HPALETTE FASTCALL -BuildDIBPalette (CONST BITMAPINFO *bmi, PINT paletteType) +BuildDIBPalette (CONST BITMAPINFO *bmi, PINT paletteType, INT colorres) { BYTE bits; ULONG ColorCount; @@ -1663,12 +1668,19 @@ GreenMask = ((ULONG *)bmi->bmiColors)[1]; BlueMask = ((ULONG *)bmi->bmiColors)[2]; } - else if(bits < 24) + else if(bits < 16 || (bits == 16 && colorres == 15)) { *paletteType = PAL_BITFIELDS; RedMask = 0x7c00; GreenMask = 0x03e0; BlueMask = 0x001f; + } + else if(bits < 24) + { + *paletteType = PAL_BITFIELDS; + RedMask = 0xf800; + GreenMask = 0x07e0; + BlueMask = 0x001f; } else {