mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 07:42:59 +00:00
[WIN32SS][NTGDI] Improve UnsafeGetBitmapBits and NtGdiGetBitmapBits (#1308)
CORE-15657
This commit is contained in:
parent
0aa21c3366
commit
29795a2d72
1 changed files with 24 additions and 6 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue