Author: jgardou Date: Thu Nov 8 12:40:41 2012 New Revision: 57691 URL: http://svn.reactos.org/svn/reactos?rev=57691&view=rev Log: [WIN32K] - Work only with BITMAPINFO in GreGetDIBItsInternal and convert the structure back to BITMAPCOREINFO if needed. - Set the rgbReserved member to 0 when getting palette of a DIB section
Modified: trunk/reactos/win32ss/gdi/ntgdi/dib.h trunk/reactos/win32ss/gdi/ntgdi/dibobj.c trunk/reactos/win32ss/user/ntuser/clipboard.c trunk/reactos/win32ss/user/ntuser/misc/file.c Modified: trunk/reactos/win32ss/gdi/ntgdi/dib.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dib.h?rev=57691&r1=57690&r2=57691&view=diff ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/dib.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/dib.h [iso-8859-1] Thu Nov 8 12:40:41 2012 @@ -7,8 +7,11 @@ INT APIENTRY DIB_GetDIBImageBytes (INT width, INT height, INT depth); HPALETTE FASTCALL DIB_MapPaletteColors(PPALETTE ppal, CONST BITMAPINFO* lpbmi); HPALETTE FASTCALL BuildDIBPalette (CONST BITMAPINFO *bmi); + +/* Those functions permit to tranparently work with a BITMAPCOREINFO structure */ BITMAPINFO* FASTCALL DIB_ConvertBitmapInfo(CONST BITMAPINFO* bmi, DWORD Usage); -VOID FASTCALL DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig); +/* Pass Usage = -1 if you don't want to convert the BITMAPINFO back to BITMAPCOREINFO */ +VOID FASTCALL DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig, DWORD Usage); INT APIENTRY Modified: trunk/reactos/win32ss/gdi/ntgdi/dibobj.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dibobj.c?rev=57691&r1=57690&r2=57691&view=diff ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] Thu Nov 8 12:40:41 2012 @@ -584,7 +584,6 @@ DWORD compr, size ; USHORT i; int bitmap_type; - RGBTRIPLE* rgbTriples; RGBQUAD* rgbQuads; VOID* colorPtr; @@ -594,7 +593,6 @@ return 0; colorPtr = (LPBYTE)Info + Info->bmiHeader.biSize; - rgbTriples = colorPtr; rgbQuads = colorPtr; bitmap_type = DIB_GetBitmapInfo(&Info->bmiHeader, @@ -643,15 +641,6 @@ switch(bpp) { case 0: /* Only info */ - if(pbmci) - { - pbmci->bmciHeader.bcWidth = (WORD)psurf->SurfObj.sizlBitmap.cx; - pbmci->bmciHeader.bcHeight = (WORD)((psurf->SurfObj.fjBitmap & BMF_TOPDOWN) ? - -psurf->SurfObj.sizlBitmap.cy : - psurf->SurfObj.sizlBitmap.cy); - pbmci->bmciHeader.bcPlanes = 1; - pbmci->bmciHeader.bcBitCount = BitsPerFormat(psurf->SurfObj.iBitmapFormat); - } Info->bmiHeader.biWidth = psurf->SurfObj.sizlBitmap.cx; Info->bmiHeader.biHeight = (psurf->SurfObj.fjBitmap & BMF_TOPDOWN) ? -psurf->SurfObj.sizlBitmap.cy : @@ -702,40 +691,27 @@ if(Usage == DIB_RGB_COLORS) { ULONG colors = min(psurf->ppal->NumColors, 256); - - if(pbmci) - { - for(i = 0; i < colors; i++) - { - rgbTriples[i].rgbtRed = psurf->ppal->IndexedColors[i].peRed; - rgbTriples[i].rgbtGreen = psurf->ppal->IndexedColors[i].peGreen; - rgbTriples[i].rgbtBlue = psurf->ppal->IndexedColors[i].peBlue; - } - } if(colors != 256) Info->bmiHeader.biClrUsed = colors; for(i = 0; i < colors; i++) { rgbQuads[i].rgbRed = psurf->ppal->IndexedColors[i].peRed; rgbQuads[i].rgbGreen = psurf->ppal->IndexedColors[i].peGreen; rgbQuads[i].rgbBlue = psurf->ppal->IndexedColors[i].peBlue; + rgbQuads[i].rgbReserved = 0; } } else + { + for(i = 0; i < 256; i++) + ((WORD*)rgbQuads)[i] = i; + } + } + else + { + if(Usage == DIB_PAL_COLORS) { for(i = 0; i < 256; i++) { - if(pbmci) ((WORD*)rgbTriples)[i] = i; - ((WORD*)rgbQuads)[i] = i; - } - } - } - else - { - if(Usage == DIB_PAL_COLORS) - { - for(i = 0; i < 256; i++) - { - if(pbmci) ((WORD*)rgbTriples)[i] = i; ((WORD*)rgbQuads)[i] = i; } } @@ -752,13 +728,6 @@ } for (i = 0; i < pDcPal->NumColors; i++) { - if (pbmci) - { - rgbTriples[i].rgbtRed = pDcPal->IndexedColors[i].peRed; - rgbTriples[i].rgbtGreen = pDcPal->IndexedColors[i].peGreen; - rgbTriples[i].rgbtBlue = pDcPal->IndexedColors[i].peBlue; - } - rgbQuads[i].rgbRed = pDcPal->IndexedColors[i].peRed; rgbQuads[i].rgbGreen = pDcPal->IndexedColors[i].peGreen; rgbQuads[i].rgbBlue = pDcPal->IndexedColors[i].peBlue; @@ -771,55 +740,20 @@ switch (bpp) { case 1: - if (pbmci) - { - rgbTriples[0].rgbtRed = rgbTriples[0].rgbtGreen = - rgbTriples[0].rgbtBlue = 0; - rgbTriples[1].rgbtRed = rgbTriples[1].rgbtGreen = - rgbTriples[1].rgbtBlue = 0xff; - } - rgbQuads[0].rgbRed = rgbQuads[0].rgbGreen = - rgbQuads[0].rgbBlue = 0; + rgbQuads[0].rgbRed = rgbQuads[0].rgbGreen = rgbQuads[0].rgbBlue = 0; rgbQuads[0].rgbReserved = 0; - rgbQuads[1].rgbRed = rgbQuads[1].rgbGreen = - rgbQuads[1].rgbBlue = 0xff; + rgbQuads[1].rgbRed = rgbQuads[1].rgbGreen = rgbQuads[1].rgbBlue = 0xff; rgbQuads[1].rgbReserved = 0; break; case 4: - if (pbmci) - RtlCopyMemory(rgbTriples, EGAColorsTriples, sizeof(EGAColorsTriples)); RtlCopyMemory(rgbQuads, EGAColorsQuads, sizeof(EGAColorsQuads)); - break; case 8: { INT r, g, b; RGBQUAD *color; - if (pbmci) - { - RGBTRIPLE *colorTriple; - - RtlCopyMemory(rgbTriples, DefLogPaletteTriples, - 10 * sizeof(RGBTRIPLE)); - RtlCopyMemory(rgbTriples + 246, DefLogPaletteTriples + 10, - 10 * sizeof(RGBTRIPLE)); - colorTriple = rgbTriples + 10; - for(r = 0; r <= 5; r++) /* FIXME */ - { - for(g = 0; g <= 5; g++) - { - for(b = 0; b <= 5; b++) - { - colorTriple->rgbtRed = (r * 0xff) / 5; - colorTriple->rgbtGreen = (g * 0xff) / 5; - colorTriple->rgbtBlue = (b * 0xff) / 5; - colorTriple++; - } - } - } - } memcpy(rgbQuads, DefLogPaletteQuads, 10 * sizeof(RGBQUAD)); memcpy(rgbQuads + 246, DefLogPaletteQuads + 10, @@ -933,11 +867,8 @@ } psurfDest = SURFACE_ShareLockSurface(hBmpDest); - - rcDest.left = 0; - rcDest.top = 0; - rcDest.bottom = ScanLines; - rcDest.right = psurf->SurfObj.sizlBitmap.cx; + + RECTL_vSetRect(&rcDest, 0, 0, ScanLines, psurf->SurfObj.sizlBitmap.cx); srcPoint.x = 0; @@ -987,7 +918,7 @@ if(pDC) DC_UnlockDc(pDC); if(psurf) SURFACE_ShareUnlockSurface(psurf); - if(pbmci) DIB_FreeConvertedBitmapInfo(Info, (BITMAPINFO*)pbmci); + if(pbmci) DIB_FreeConvertedBitmapInfo(Info, (BITMAPINFO*)pbmci, Usage); return ScanLines; } @@ -1926,10 +1857,51 @@ /* Frees a BITMAPINFO created with DIB_ConvertBitmapInfo */ VOID FASTCALL -DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig) -{ - if(converted != orig) +DIB_FreeConvertedBitmapInfo(BITMAPINFO* converted, BITMAPINFO* orig, DWORD usage) +{ + BITMAPCOREINFO* pbmci; + if(converted == orig) + return; + + if(usage == -1) + { + /* Caller don't want any conversion */ ExFreePoolWithTag(converted, TAG_DIB); + return; + } + + /* Perform inverse conversion */ + pbmci = (BITMAPCOREINFO*)orig; + + ASSERT(pbmci->bmciHeader.bcSize == sizeof(BITMAPCOREHEADER)); + pbmci->bmciHeader.bcBitCount = converted->bmiHeader.biBitCount; + pbmci->bmciHeader.bcWidth = converted->bmiHeader.biWidth; + pbmci->bmciHeader.bcHeight = converted->bmiHeader.biHeight; + pbmci->bmciHeader.bcPlanes = converted->bmiHeader.biPlanes; + + if(pbmci->bmciHeader.bcBitCount <= 8) + { + UINT numColors = converted->bmiHeader.biClrUsed; + if(!numColors) numColors = 1 << pbmci->bmciHeader.bcBitCount; + if(usage == DIB_PAL_COLORS) + { + RtlZeroMemory(pbmci->bmciColors, (1 << pbmci->bmciHeader.bcBitCount) * sizeof(WORD)); + RtlCopyMemory(pbmci->bmciColors, converted->bmiColors, numColors * sizeof(WORD)); + } + else + { + UINT i; + RtlZeroMemory(pbmci->bmciColors, (1 << pbmci->bmciHeader.bcBitCount) * sizeof(RGBTRIPLE)); + for(i=0; i<numColors; i++) + { + pbmci->bmciColors[i].rgbtRed = converted->bmiColors[i].rgbRed; + pbmci->bmciColors[i].rgbtGreen = converted->bmiColors[i].rgbGreen; + pbmci->bmciColors[i].rgbtBlue = converted->bmiColors[i].rgbBlue; + } + } + } + /* Now free it, it's not needed anymore */ + ExFreePoolWithTag(converted, TAG_DIB); } /* EOF */ Modified: trunk/reactos/win32ss/user/ntuser/clipboard.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/clipboard.c?rev=57691&r1=57690&r2=57691&view=diff ============================================================================== --- trunk/reactos/win32ss/user/ntuser/clipboard.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/clipboard.c [iso-8859-1] Thu Nov 8 12:40:41 2012 @@ -276,7 +276,7 @@ UserReleaseDC(NULL, hdc, FALSE); if (pConvertedBmi) - DIB_FreeConvertedBitmapInfo(pConvertedBmi, pBmi); + DIB_FreeConvertedBitmapInfo(pConvertedBmi, pBmi, -1); } VOID static NTAPI Modified: trunk/reactos/win32ss/user/ntuser/misc/file.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/misc/file.c?rev=57691&r1=57690&r2=57691&view=diff ============================================================================== --- trunk/reactos/win32ss/user/ntuser/misc/file.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/misc/file.c [iso-8859-1] Thu Nov 8 12:40:41 2012 @@ -233,7 +233,7 @@ 0); NtGdiDeleteObjectApp(hdc); - DIB_FreeConvertedBitmapInfo(pConvertedInfo, pbmi); + DIB_FreeConvertedBitmapInfo(pConvertedInfo, pbmi, -1); } else {