From 147e52c02c83894a0040d08c49b1f8d2d52cd4d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Fri, 30 Jul 2010 02:15:46 +0000 Subject: [PATCH] [WIN32K] - Cast Colors to RGBQUAD in EngCreateBitmap, since that's what they are. - Copy selected palette of the DC when creating a DIBSection with DIB_PAL_COLORS. - Do not try to get Colors in NtGdiGetDIBitsInternal when bpp == 0, this doesn't make any sense. - Get rid of SURFACE::dsBitfields and SURFACE::biClrUsed. - Use RGB as default palette mod when creating the DIB Palette. svn path=/branches/reactos-yarotows/; revision=48369 --- subsystems/win32/win32k/include/surface.h | 2 - subsystems/win32/win32k/objects/bitmaps.c | 8 +- subsystems/win32/win32k/objects/dibobj.c | 106 +++++++--------------- subsystems/win32/win32k/objects/palette.c | 10 +- 4 files changed, 48 insertions(+), 78 deletions(-) diff --git a/subsystems/win32/win32k/include/surface.h b/subsystems/win32/win32k/include/surface.h index 27942cb5c76..e19a1986425 100644 --- a/subsystems/win32/win32k/include/surface.h +++ b/subsystems/win32/win32k/include/surface.h @@ -39,8 +39,6 @@ typedef struct _SURFACE //UINT unk_078; /* reactos specific */ - DWORD dsBitfields[3]; // hack, should probably use palette instead - DWORD biClrUsed; DWORD biClrImportant; } SURFACE, *PSURFACE; diff --git a/subsystems/win32/win32k/objects/bitmaps.c b/subsystems/win32/win32k/objects/bitmaps.c index e6049570d29..bea379c9f6a 100644 --- a/subsystems/win32/win32k/objects/bitmaps.c +++ b/subsystems/win32/win32k/objects/bitmaps.c @@ -1032,11 +1032,11 @@ BITMAP_GetObject(SURFACE *psurf, INT Count, LPVOID buffer) pds->dsBmih.biSizeImage = psurf->SurfObj.cjBits; pds->dsBmih.biXPelsPerMeter = 0; pds->dsBmih.biYPelsPerMeter = 0; - pds->dsBmih.biClrUsed = psurf->biClrUsed; + pds->dsBmih.biClrUsed = psurf->ppal->NumColors; pds->dsBmih.biClrImportant = psurf->biClrImportant; - pds->dsBitfields[0] = psurf->dsBitfields[0]; - pds->dsBitfields[1] = psurf->dsBitfields[1]; - pds->dsBitfields[2] = psurf->dsBitfields[2]; + pds->dsBitfields[0] = psurf->ppal->RedMask; + pds->dsBitfields[1] = psurf->ppal->GreenMask; + pds->dsBitfields[2] = psurf->ppal->BlueMask; pds->dshSection = psurf->hDIBSection; pds->dsOffset = psurf->dwOffset; diff --git a/subsystems/win32/win32k/objects/dibobj.c b/subsystems/win32/win32k/objects/dibobj.c index 5741113544e..49b0129a89d 100644 --- a/subsystems/win32/win32k/objects/dibobj.c +++ b/subsystems/win32/win32k/objects/dibobj.c @@ -705,7 +705,6 @@ NtGdiGetDIBitsInternal( goto done; } -get_info: /* Fill in the structure */ switch(bpp) { @@ -755,8 +754,7 @@ get_info: Info->bmiHeader.biClrImportant = 0; ScanLines = psurf->SurfObj.sizlBitmap.cy; /* Get Complete info now */ - bpp = Info->bmiHeader.biBitCount ; - goto get_info; + goto done; case 1: case 4: @@ -916,7 +914,12 @@ get_info: case 16: if (Info->bmiHeader.biCompression == BI_BITFIELDS) { - if (psurf->hSecure) RtlCopyMemory( Info->bmiColors, psurf->dsBitfields, 3 * sizeof(DWORD) ); + if (psurf->hSecure) + { + ((PDWORD)Info->bmiColors)[0] = psurf->ppal->RedMask; + ((PDWORD)Info->bmiColors)[1] = psurf->ppal->GreenMask; + ((PDWORD)Info->bmiColors)[2] = psurf->ppal->BlueMask; + } else { ((PDWORD)Info->bmiColors)[0] = 0xf800; @@ -930,7 +933,12 @@ get_info: case 32: if (Info->bmiHeader.biCompression == BI_BITFIELDS) { - if (psurf->hSecure) RtlCopyMemory( Info->bmiColors, psurf->dsBitfields, 3 * sizeof(DWORD) ); + if (psurf->hSecure) + { + ((PDWORD)Info->bmiColors)[0] = psurf->ppal->RedMask; + ((PDWORD)Info->bmiColors)[1] = psurf->ppal->GreenMask; + ((PDWORD)Info->bmiColors)[2] = psurf->ppal->BlueMask; + } else { ((PDWORD)Info->bmiColors)[0] = 0xff0000; @@ -1427,7 +1435,7 @@ DIB_CreateDIBSection( SURFACE *bmp = NULL; void *mapBits = NULL; HPALETTE hpal ; - ULONG palMode = PAL_INDEXED; + INT palMode = PAL_INDEXED; // Fill BITMAP32 structure with DIB data CONST BITMAPINFOHEADER *bi = &bmi->bmiHeader; @@ -1435,10 +1443,7 @@ DIB_CreateDIBSection( ULONG totalSize; BITMAP bm; SIZEL Size; - CONST RGBQUAD *lpRGB = NULL; HANDLE hSecure; - DWORD dsBitfields[3] = {0}; - ULONG ColorCount; DPRINT("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n", bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount, @@ -1520,55 +1525,28 @@ DIB_CreateDIBSection( if (usage == DIB_PAL_COLORS) { - lpRGB = DIB_MapPaletteColors(dc, bmi); - ColorCount = bi->biClrUsed; - if (ColorCount == 0) - { - ColorCount = max(1 << bi->biBitCount, 256); - } + PPALETTE pdcPal ; + pdcPal = PALETTE_LockPalette(dc->dclevel.hpal); + if(!pdcPal) + { + DPRINT1("Unable to lock DC palette?!\n"); + goto cleanup; + } + if(pdcPal->Mode != PAL_INDEXED) + { + DPRINT1("Not indexed palette selected in the DC?!\n"); + PALETTE_UnlockPalette(pdcPal); + } + hpal = PALETTE_AllocPalette(PAL_INDEXED, + pdcPal->NumColors, + (ULONG*)pdcPal->IndexedColors, 0, 0, 0); + PALETTE_UnlockPalette(pdcPal); } - else if(bi->biBitCount <= 8) - { - lpRGB = bmi->bmiColors; - ColorCount = 1 << bi->biBitCount; - } - else + else { - lpRGB = NULL; - ColorCount = 0; + hpal = BuildDIBPalette(bmi, &palMode); } - /* Set dsBitfields values */ - if (usage == DIB_PAL_COLORS || bi->biBitCount <= 8) - { - dsBitfields[0] = dsBitfields[1] = dsBitfields[2] = 0; - palMode = PAL_INDEXED; - } - else if (bi->biCompression == BI_RGB) - { - dsBitfields[0] = dsBitfields[1] = dsBitfields[2] = 0; - switch (bi->biBitCount) - { - case 15: - palMode = PAL_RGB16_555; - break; - - case 16: - palMode = PAL_RGB16_565; - break; - - case 24: - case 32: - palMode = PAL_RGB; - break; - } - } - else - { - RtlCopyMemory(dsBitfields, bmi->bmiColors, sizeof(dsBitfields)); - palMode = PAL_BITFIELDS; - } - // Create Device Dependent Bitmap and add DIB pointer Size.cx = bm.bmWidth; Size.cy = abs(bm.bmHeight); @@ -1600,18 +1578,9 @@ DIB_CreateDIBSection( bmp->hSecure = hSecure; bmp->dwOffset = offset; bmp->flags = API_BITMAP; - bmp->dsBitfields[0] = dsBitfields[0]; - bmp->dsBitfields[1] = dsBitfields[1]; - bmp->dsBitfields[2] = dsBitfields[2]; - bmp->biClrUsed = ColorCount; bmp->biClrImportant = bi->biClrImportant; - hpal = PALETTE_AllocPalette(palMode, ColorCount, (ULONG*)lpRGB, - dsBitfields[0], - dsBitfields[1], - dsBitfields[2]); - - bmp->ppal = PALETTE_ShareLockPalette(hpal); + bmp->ppal = PALETTE_ShareLockPalette(hpal); /* Lazy delete hpal, it will be freed at surface release */ GreDeleteObject(hpal); @@ -1643,11 +1612,6 @@ cleanup: } } - if (lpRGB != bmi->bmiColors && lpRGB) - { - ExFreePoolWithTag((PVOID)lpRGB, TAG_COLORMAP); - } - if (bmp) { SURFACE_UnlockSurface(bmp); @@ -1853,7 +1817,7 @@ BuildDIBPalette(CONST BITMAPINFO *bmi, PINT paletteType) } else { - *paletteType = PAL_BGR; + *paletteType = PAL_RGB; RedMask = 0xff0000; GreenMask = 0x00ff00; BlueMask = 0x0000ff; @@ -1874,7 +1838,7 @@ BuildDIBPalette(CONST BITMAPINFO *bmi, PINT paletteType) } else { - hPal = PALETTE_AllocPalette(*paletteType, ColorCount, + hPal = PALETTE_AllocPalette(*paletteType, 0, NULL, RedMask, GreenMask, BlueMask); } diff --git a/subsystems/win32/win32k/objects/palette.c b/subsystems/win32/win32k/objects/palette.c index 37ed607ef0d..35065d043e4 100644 --- a/subsystems/win32/win32k/objects/palette.c +++ b/subsystems/win32/win32k/objects/palette.c @@ -392,7 +392,15 @@ EngCreatePalette( { HPALETTE Palette; - Palette = PALETTE_AllocPalette(Mode, NumColors, Colors, Red, Green, Blue); + /* Low order three bytes are RGB -> RGBQUAD */ + if(Mode == PAL_INDEXED) + { + Palette = PALETTE_AllocPaletteIndexedRGB(NumColors, (RGBQUAD*)Colors); + } + else + { + Palette = PALETTE_AllocPalette(Mode, NumColors, Colors, Red, Green, Blue); + } if (Palette != NULL) { GDIOBJ_SetOwnership(Palette, NULL);