mirror of
https://github.com/reactos/reactos.git
synced 2024-10-05 17:06:29 +00:00
[GDI32]
In GetDIBits convert a BITMAPCOREHEADER to a BITMAPINFOHEADER before calling win32k, like done in other places. Convert it back after. This allows to simplify NtGdiGetDIBitsInternal (not done yet) svn path=/trunk/; revision=50918
This commit is contained in:
parent
3a61fab955
commit
6c10c052af
|
@ -410,6 +410,33 @@ CreateCompatibleBitmap(
|
|||
return CreateDIBSection(hDC, (CONST BITMAPINFO *)&dibs.dsBmih, 0, NULL, NULL, 0);
|
||||
}
|
||||
|
||||
void
|
||||
ConvertBackBitmapInfo(PBITMAPINFO pbmi, PBITMAPINFO pbmiConverted)
|
||||
{
|
||||
/* Check if we converted from PBITMAPCOREINFO */
|
||||
if (pbmiConverted != pbmi)
|
||||
{
|
||||
PBITMAPCOREINFO pbci = (PBITMAPCOREINFO)pbmi;
|
||||
|
||||
/* Convert back header */
|
||||
pbci->bmciHeader.biSize = sizeof(BITMAPCOREHEADER);
|
||||
pbci->bmciHeader.bcWidth = pbmiConverted->bmiHeader.biWidth;
|
||||
pbci->bmciHeader.bcHeight = pbmiConverted->bmiHeader.biHeight;
|
||||
pbci->bmciHeader.bcPlanes = 1;
|
||||
pbci->bmciHeader.bcBitCount = pbmiConverted->bmiHeader.biBitCount;
|
||||
|
||||
/* Convert back colors */
|
||||
for (i = 0; i < pbmiConverted->bmiHeader.biClrUsed; i++)
|
||||
{
|
||||
pbci->bmciColors.rgbtRed = pbmiConverted->bmiColors.rgbRed;
|
||||
pbci->bmciColors.rgbtGreen = pbmiConverted->bmiColors.rgbGreen;
|
||||
pbci->bmciColors.rgbtBlue = pbmiConverted->bmiColors.rgbBlue;
|
||||
}
|
||||
|
||||
/* Free memory */
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, pbmiConverted);
|
||||
}
|
||||
}
|
||||
|
||||
INT
|
||||
WINAPI
|
||||
|
@ -422,8 +449,9 @@ GetDIBits(
|
|||
LPBITMAPINFO lpbmi,
|
||||
UINT uUsage)
|
||||
{
|
||||
UINT cjBmpScanSize;
|
||||
UINT cjInfoSize;
|
||||
PBITMAPINFO pbmiConverted;
|
||||
UINT cjBmpScanSize, cjInfoSize;
|
||||
INT iResult;
|
||||
|
||||
if (!hDC || !GdiIsHandleValid((HGDIOBJ)hDC) || !lpbmi)
|
||||
{
|
||||
|
@ -431,15 +459,22 @@ GetDIBits(
|
|||
return 0;
|
||||
}
|
||||
|
||||
cjBmpScanSize = DIB_BitmapMaxBitsSize(lpbmi, cScanLines);
|
||||
cjInfoSize = DIB_BitmapInfoSize(lpbmi, uUsage);
|
||||
|
||||
if ( lpvBits )
|
||||
/* Convert BITMAPINFO to a proper format */
|
||||
pbmiConverted = ConvertBitmapInfo(lpbmi, uUsage, &cjInfoSize, FALSE);
|
||||
if (!pbmiConverted)
|
||||
{
|
||||
if ( lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
|
||||
GdiSetLastError(ERROR_INVALID_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
|
||||
cjBmpScanSize = DIB_BitmapMaxBitsSize(lpbmi, cScanLines);
|
||||
|
||||
if (lpvBits)
|
||||
{
|
||||
if (lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER))
|
||||
{
|
||||
if ( lpbmi->bmiHeader.biCompression == BI_JPEG ||
|
||||
lpbmi->bmiHeader.biCompression == BI_PNG )
|
||||
if (lpbmi->bmiHeader.biCompression == BI_JPEG ||
|
||||
lpbmi->bmiHeader.biCompression == BI_PNG)
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return 0;
|
||||
|
@ -447,17 +482,22 @@ GetDIBits(
|
|||
}
|
||||
}
|
||||
|
||||
return NtGdiGetDIBitsInternal(hDC,
|
||||
hbmp,
|
||||
uStartScan,
|
||||
cScanLines,
|
||||
lpvBits,
|
||||
lpbmi,
|
||||
uUsage,
|
||||
cjBmpScanSize,
|
||||
cjInfoSize);
|
||||
iResult = NtGdiGetDIBitsInternal(hDC,
|
||||
hbmp,
|
||||
uStartScan,
|
||||
cScanLines,
|
||||
lpvBits,
|
||||
pbmiConverted,
|
||||
uUsage,
|
||||
cjBmpScanSize,
|
||||
cjInfoSize);
|
||||
|
||||
ConvertBackBitmapInfo(lpbmi, pbmiConverted);
|
||||
|
||||
return iResult;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue