[WIN32SS][NTGDI] Improve UnsafeGetBitmapBits and NtGdiGetBitmapBits (#1308)

CORE-15657
This commit is contained in:
Katayama Hirofumi MZ 2019-01-27 15:51:33 +09:00 committed by GitHub
parent 0aa21c3366
commit 29795a2d72
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -496,7 +496,7 @@ NtGdiGetBitmapDimension(
} }
VOID LONG
FASTCALL FASTCALL
UnsafeGetBitmapBits( UnsafeGetBitmapBits(
PSURFACE psurf, PSURFACE psurf,
@ -505,10 +505,10 @@ UnsafeGetBitmapBits(
{ {
PUCHAR pjDst, pjSrc; PUCHAR pjDst, pjSrc;
LONG lDeltaDst, lDeltaSrc; LONG lDeltaDst, lDeltaSrc;
ULONG nWidth, nHeight, cBitsPixel; ULONG Y, iSrc, iDst, cbSrc, cbDst, nWidth, nHeight, cBitsPixel;
nWidth = psurf->SurfObj.sizlBitmap.cx; nWidth = psurf->SurfObj.sizlBitmap.cx;
nHeight = psurf->SurfObj.sizlBitmap.cy; nHeight = labs(psurf->SurfObj.sizlBitmap.cy);
cBitsPixel = BitsPerFormat(psurf->SurfObj.iBitmapFormat); cBitsPixel = BitsPerFormat(psurf->SurfObj.iBitmapFormat);
/* Get pointers */ /* Get pointers */
@ -516,14 +516,33 @@ UnsafeGetBitmapBits(
pjDst = pvBits; pjDst = pvBits;
lDeltaSrc = psurf->SurfObj.lDelta; lDeltaSrc = psurf->SurfObj.lDelta;
lDeltaDst = WIDTH_BYTES_ALIGN16(nWidth, cBitsPixel); lDeltaDst = WIDTH_BYTES_ALIGN16(nWidth, cBitsPixel);
NT_ASSERT(labs(lDeltaSrc) >= lDeltaDst);
while (nHeight--) cbSrc = nHeight * labs(lDeltaSrc);
cbDst = nHeight * lDeltaDst;
Bytes = min(Bytes, cbDst);
iSrc = iDst = 0;
for (Y = 0; Y < nHeight; Y++)
{ {
if (iSrc + labs(lDeltaSrc) > cbSrc || iDst + lDeltaDst > Bytes)
{
LONG lDelta = min(cbSrc - iSrc, Bytes - iDst);
NT_ASSERT(lDelta >= 0);
RtlCopyMemory(pjDst, pjSrc, lDelta);
iDst += lDelta;
break;
}
/* Copy one line */ /* Copy one line */
RtlCopyMemory(pjDst, pjSrc, lDeltaDst); RtlCopyMemory(pjDst, pjSrc, lDeltaDst);
pjSrc += lDeltaSrc; pjSrc += lDeltaSrc;
pjDst += lDeltaDst; pjDst += lDeltaDst;
iSrc += labs(lDeltaSrc);
iDst += lDeltaDst;
} }
return iDst;
} }
LONG LONG
@ -570,8 +589,7 @@ NtGdiGetBitmapBits(
_SEH2_TRY _SEH2_TRY
{ {
ProbeForWrite(pUnsafeBits, cjBuffer, 1); ProbeForWrite(pUnsafeBits, cjBuffer, 1);
UnsafeGetBitmapBits(psurf, cjBuffer, pUnsafeBits); ret = UnsafeGetBitmapBits(psurf, cjBuffer, pUnsafeBits);
ret = cjBuffer;
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {