[WIN32SS][NTGDI] Optimize UnsafeGetBitmapBits/UnsafeSetBitmapBits

This commit is contained in:
Katayama Hirofumi MZ 2019-01-29 12:04:46 +09:00
parent 06d4fce5ee
commit 1cd2f5438c

View file

@ -52,7 +52,7 @@ UnsafeSetBitmapBits(
{ {
PUCHAR pjDst; PUCHAR pjDst;
const UCHAR *pjSrc; const UCHAR *pjSrc;
LONG lDeltaDst, lDeltaSrc; LONG lDeltaDst, lDeltaSrc, lDeltaDstAbs;
ULONG Y, iSrc, iDst, cbSrc, cbDst, nWidth, nHeight, cBitsPixel; ULONG Y, iSrc, iDst, cbSrc, cbDst, nWidth, nHeight, cBitsPixel;
NT_ASSERT(psurf->flags & API_BITMAP); NT_ASSERT(psurf->flags & API_BITMAP);
@ -65,17 +65,18 @@ UnsafeSetBitmapBits(
pjDst = psurf->SurfObj.pvScan0; pjDst = psurf->SurfObj.pvScan0;
pjSrc = pvBits; pjSrc = pvBits;
lDeltaDst = psurf->SurfObj.lDelta; lDeltaDst = psurf->SurfObj.lDelta;
lDeltaDstAbs = labs(lDeltaDst);
lDeltaSrc = WIDTH_BYTES_ALIGN16(nWidth, cBitsPixel); lDeltaSrc = WIDTH_BYTES_ALIGN16(nWidth, cBitsPixel);
NT_ASSERT(lDeltaSrc <= labs(lDeltaDst)); NT_ASSERT(lDeltaSrc <= lDeltaDstAbs);
cbDst = labs(lDeltaDst) * nHeight; cbDst = lDeltaDstAbs * nHeight;
cbSrc = lDeltaSrc * nHeight; cbSrc = lDeltaSrc * nHeight;
cjBits = min(cjBits, cbSrc); cjBits = min(cjBits, cbSrc);
iSrc = iDst = 0; iSrc = iDst = 0;
for (Y = 0; Y < nHeight; Y++) for (Y = 0; Y < nHeight; Y++)
{ {
if (iSrc + lDeltaSrc > cjBits || iDst + labs(lDeltaDst) > cbDst) if (iSrc + lDeltaSrc > cjBits || iDst + lDeltaDstAbs > cbDst)
{ {
LONG lDelta = min(cjBits - iSrc, cbDst - iDst); LONG lDelta = min(cjBits - iSrc, cbDst - iDst);
NT_ASSERT(lDelta >= 0); NT_ASSERT(lDelta >= 0);
@ -89,7 +90,7 @@ UnsafeSetBitmapBits(
pjSrc += lDeltaSrc; pjSrc += lDeltaSrc;
pjDst += lDeltaDst; pjDst += lDeltaDst;
iSrc += lDeltaSrc; iSrc += lDeltaSrc;
iDst += labs(lDeltaDst); iDst += lDeltaDstAbs;
} }
return iSrc; return iSrc;
@ -504,7 +505,7 @@ UnsafeGetBitmapBits(
OUT PBYTE pvBits) OUT PBYTE pvBits)
{ {
PUCHAR pjDst, pjSrc; PUCHAR pjDst, pjSrc;
LONG lDeltaDst, lDeltaSrc; LONG lDeltaDst, lDeltaSrc, lDeltaSrcAbs;
ULONG Y, iSrc, iDst, cbSrc, cbDst, nWidth, nHeight, cBitsPixel; ULONG Y, iSrc, iDst, cbSrc, cbDst, nWidth, nHeight, cBitsPixel;
nWidth = psurf->SurfObj.sizlBitmap.cx; nWidth = psurf->SurfObj.sizlBitmap.cx;
@ -515,17 +516,18 @@ UnsafeGetBitmapBits(
pjSrc = psurf->SurfObj.pvScan0; pjSrc = psurf->SurfObj.pvScan0;
pjDst = pvBits; pjDst = pvBits;
lDeltaSrc = psurf->SurfObj.lDelta; lDeltaSrc = psurf->SurfObj.lDelta;
lDeltaSrcAbs = labs(lDeltaSrc);
lDeltaDst = WIDTH_BYTES_ALIGN16(nWidth, cBitsPixel); lDeltaDst = WIDTH_BYTES_ALIGN16(nWidth, cBitsPixel);
NT_ASSERT(labs(lDeltaSrc) >= lDeltaDst); NT_ASSERT(lDeltaSrcAbs >= lDeltaDst);
cbSrc = nHeight * labs(lDeltaSrc); cbSrc = nHeight * lDeltaSrcAbs;
cbDst = nHeight * lDeltaDst; cbDst = nHeight * lDeltaDst;
Bytes = min(Bytes, cbDst); Bytes = min(Bytes, cbDst);
iSrc = iDst = 0; iSrc = iDst = 0;
for (Y = 0; Y < nHeight; Y++) for (Y = 0; Y < nHeight; Y++)
{ {
if (iSrc + labs(lDeltaSrc) > cbSrc || iDst + lDeltaDst > Bytes) if (iSrc + lDeltaSrcAbs > cbSrc || iDst + lDeltaDst > Bytes)
{ {
LONG lDelta = min(cbSrc - iSrc, Bytes - iDst); LONG lDelta = min(cbSrc - iSrc, Bytes - iDst);
NT_ASSERT(lDelta >= 0); NT_ASSERT(lDelta >= 0);
@ -538,7 +540,7 @@ UnsafeGetBitmapBits(
RtlCopyMemory(pjDst, pjSrc, lDeltaDst); RtlCopyMemory(pjDst, pjSrc, lDeltaDst);
pjSrc += lDeltaSrc; pjSrc += lDeltaSrc;
pjDst += lDeltaDst; pjDst += lDeltaDst;
iSrc += labs(lDeltaSrc); iSrc += lDeltaSrcAbs;
iDst += lDeltaDst; iDst += lDeltaDst;
} }