}
-VOID
+LONG
FASTCALL
UnsafeGetBitmapBits(
PSURFACE psurf,
{
PUCHAR pjDst, pjSrc;
LONG lDeltaDst, lDeltaSrc;
- ULONG nWidth, nHeight, cBitsPixel;
+ ULONG Y, iSrc, iDst, cbSrc, cbDst, nWidth, nHeight, cBitsPixel;
nWidth = psurf->SurfObj.sizlBitmap.cx;
- nHeight = psurf->SurfObj.sizlBitmap.cy;
+ nHeight = labs(psurf->SurfObj.sizlBitmap.cy);
cBitsPixel = BitsPerFormat(psurf->SurfObj.iBitmapFormat);
/* Get pointers */
pjDst = pvBits;
lDeltaSrc = psurf->SurfObj.lDelta;
lDeltaDst = WIDTH_BYTES_ALIGN16(nWidth, cBitsPixel);
+ NT_ASSERT(labs(lDeltaSrc) >= lDeltaDst);
+
+ cbSrc = nHeight * labs(lDeltaSrc);
+ cbDst = nHeight * lDeltaDst;
+ Bytes = min(Bytes, cbDst);
- while (nHeight--)
+ 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 */
RtlCopyMemory(pjDst, pjSrc, lDeltaDst);
pjSrc += lDeltaSrc;
pjDst += lDeltaDst;
+ iSrc += labs(lDeltaSrc);
+ iDst += lDeltaDst;
}
+
+ return iDst;
}
LONG
_SEH2_TRY
{
ProbeForWrite(pUnsafeBits, cjBuffer, 1);
- UnsafeGetBitmapBits(psurf, cjBuffer, pUnsafeBits);
- ret = cjBuffer;
+ ret = UnsafeGetBitmapBits(psurf, cjBuffer, pUnsafeBits);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{