}
/* Get a pointer to the source bitmap object */
- psurf = SURFACE_LockSurface(hBitmap);
+ psurf = SURFACE_ShareLockSurface(hBitmap);
if (psurf == NULL)
{
ScanLines = 0;
goto done ;
}
- psurfDest = SURFACE_LockSurface(hBmpDest);
+ psurfDest = SURFACE_ShareLockSurface(hBmpDest);
rcDest.left = 0;
rcDest.top = 0;
srcPoint.y = height < 0 ?
psurf->SurfObj.sizlBitmap.cy - (StartScan + ScanLines) : StartScan;
- EXLATEOBJ_vInitialize(&exlo, psurf->ppal, psurfDest->ppal, 0, 0, 0);
+ EXLATEOBJ_vInitialize(&exlo, psurf->ppal, psurfDest->ppal, 0xffffff, 0xffffff, 0);
ret = IntEngCopyBits(&psurfDest->SurfObj,
&psurf->SurfObj,
&rcDest,
&srcPoint);
+ SURFACE_ShareUnlockSurface(psurfDest);
+
if(!ret)
ScanLines = 0;
else
done:
if(pDC) DC_UnlockDc(pDC);
- if(psurf) SURFACE_UnlockSurface(psurf);
+ if(psurf) SURFACE_ShareUnlockSurface(psurf);
if(pbmci) DIB_FreeConvertedBitmapInfo(Info, (BITMAPINFO*)pbmci);
return ScanLines;
return 0;
}
- if (!(pdc = DC_LockDc(hDC)))
- {
- ExFreePoolWithTag(safeBits, TAG_DIB);
- EngSetLastError(ERROR_INVALID_HANDLE);
- return 0;
- }
-
_SEH2_TRY
{
ProbeForRead(BitsInfo, cjMaxInfo, 1);
hBitmap = NtGdiGetDCObject(hDC, OBJ_BITMAP);
+ if (!(pdc = DC_LockDc(hDC)))
+ {
+ ExFreePoolWithTag(safeBits, TAG_DIB);
+ EngSetLastError(ERROR_INVALID_HANDLE);
+ return 0;
+ }
+
if (XDest == 0 && YDest == 0 && XSrc == 0 && XSrc == 0 &&
DestWidth == SrcWidth && DestHeight == SrcHeight &&
compr == BI_RGB &&
{
/* fast path */
ret = IntSetDIBits(pdc, hBitmap, 0, height, safeBits, BitsInfo, Usage);
+ DC_UnlockDc(pdc);
goto cleanup;
}
}
/* slow path - need to use StretchBlt */
- hdcMem = NtGdiCreateCompatibleDC(hDC);
hBitmap = DIB_CreateDIBSection(pdc, BitsInfo, Usage, &pvBits, NULL, 0, 0);
+ DC_UnlockDc(pdc);
+
if(!hBitmap)
{
DPRINT1("Error, failed to create a DIB section\n");
- NtGdiDeleteObjectApp(hdcMem);
goto cleanup;
}
+ hdcMem = NtGdiCreateCompatibleDC(hDC);
+
RtlCopyMemory(pvBits, safeBits, cjMaxBits);
hOldBitmap = NtGdiSelectBitmap(hdcMem, hBitmap);
cleanup:
ExFreePoolWithTag(safeBits, TAG_DIB);
- DC_UnlockDc(pdc);
return ret;
}
else if (bmi->bmiHeader.biCompression == BI_BITFIELDS)
{
paletteType = PAL_BITFIELDS;
- RedMask = pdwColors[0];
- GreenMask = pdwColors[1];
- BlueMask = pdwColors[2];
+ if (bmi->bmiHeader.biSize >= sizeof(BITMAPV4HEADER))
+ {
+ PBITMAPV4HEADER pV4Header = (PBITMAPV4HEADER)&bmi->bmiHeader;
+ RedMask = pV4Header->bV4RedMask;
+ GreenMask = pV4Header->bV4GreenMask;
+ BlueMask = pV4Header->bV4BlueMask;
+ }
+ else
+ {
+ RedMask = pdwColors[0];
+ GreenMask = pdwColors[1];
+ BlueMask = pdwColors[2];
+ }
}
else
{
paletteType = PAL_BITFIELDS;
switch (bits)
{
- case 15:
+ case 16:
paletteType |= PAL_RGB16_555;
RedMask = 0x7C00;
GreenMask = 0x03E0;
BlueMask = 0x001F;
break;
- case 16:
- paletteType |= PAL_RGB16_565;
- RedMask = 0xF800;
- GreenMask = 0x07E0;
- BlueMask = 0x001F;
- break;
-
case 24:
case 32:
paletteType |= PAL_BGR;