mirror of
https://github.com/reactos/reactos.git
synced 2025-08-07 01:33:01 +00:00
parent
53abbb06b5
commit
0aa21c3366
2 changed files with 25 additions and 19 deletions
|
@ -3,7 +3,8 @@
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* PURPOSE: Bitmap functions
|
* PURPOSE: Bitmap functions
|
||||||
* FILE: win32ss/gdi/ntgdi/bitmaps.c
|
* FILE: win32ss/gdi/ntgdi/bitmaps.c
|
||||||
* PROGRAMER: Timo Kreuzer <timo.kreuzer@reactos.org>
|
* PROGRAMERS: Timo Kreuzer <timo.kreuzer@reactos.org>
|
||||||
|
* Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <win32k.h>
|
#include <win32k.h>
|
||||||
|
@ -42,7 +43,7 @@ GreSetBitmapOwner(
|
||||||
return GreSetObjectOwner(hbmp, ulOwner);
|
return GreSetObjectOwner(hbmp, ulOwner);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
LONG
|
||||||
NTAPI
|
NTAPI
|
||||||
UnsafeSetBitmapBits(
|
UnsafeSetBitmapBits(
|
||||||
_Inout_ PSURFACE psurf,
|
_Inout_ PSURFACE psurf,
|
||||||
|
@ -52,34 +53,46 @@ UnsafeSetBitmapBits(
|
||||||
PUCHAR pjDst;
|
PUCHAR pjDst;
|
||||||
const UCHAR *pjSrc;
|
const UCHAR *pjSrc;
|
||||||
LONG lDeltaDst, lDeltaSrc;
|
LONG lDeltaDst, lDeltaSrc;
|
||||||
ULONG nWidth, nHeight, cBitsPixel;
|
ULONG Y, iSrc, iDst, cbSrc, cbDst, nWidth, nHeight, cBitsPixel;
|
||||||
|
|
||||||
NT_ASSERT(psurf->flags & API_BITMAP);
|
NT_ASSERT(psurf->flags & API_BITMAP);
|
||||||
NT_ASSERT(psurf->SurfObj.iBitmapFormat <= BMF_32BPP);
|
NT_ASSERT(psurf->SurfObj.iBitmapFormat <= BMF_32BPP);
|
||||||
|
|
||||||
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 */
|
|
||||||
pjDst = psurf->SurfObj.pvScan0;
|
pjDst = psurf->SurfObj.pvScan0;
|
||||||
pjSrc = pvBits;
|
pjSrc = pvBits;
|
||||||
lDeltaDst = psurf->SurfObj.lDelta;
|
lDeltaDst = psurf->SurfObj.lDelta;
|
||||||
lDeltaSrc = WIDTH_BYTES_ALIGN16(nWidth, cBitsPixel);
|
lDeltaSrc = WIDTH_BYTES_ALIGN16(nWidth, cBitsPixel);
|
||||||
NT_ASSERT(lDeltaSrc <= abs(lDeltaDst));
|
NT_ASSERT(lDeltaSrc <= labs(lDeltaDst));
|
||||||
|
|
||||||
/* Make sure the buffer is large enough*/
|
cbDst = labs(lDeltaDst) * nHeight;
|
||||||
if (cjBits < (lDeltaSrc * nHeight))
|
cbSrc = lDeltaSrc * nHeight;
|
||||||
return FALSE;
|
cjBits = min(cjBits, cbSrc);
|
||||||
|
|
||||||
while (nHeight--)
|
iSrc = iDst = 0;
|
||||||
|
for (Y = 0; Y < nHeight; Y++)
|
||||||
{
|
{
|
||||||
|
if (iSrc + lDeltaSrc > cjBits || iDst + labs(lDeltaDst) > cbDst)
|
||||||
|
{
|
||||||
|
LONG lDelta = min(cjBits - iSrc, cbDst - iDst);
|
||||||
|
NT_ASSERT(lDelta >= 0);
|
||||||
|
RtlCopyMemory(pjDst, pjSrc, lDelta);
|
||||||
|
iSrc += lDelta;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Copy one line */
|
/* Copy one line */
|
||||||
memcpy(pjDst, pjSrc, lDeltaSrc);
|
RtlCopyMemory(pjDst, pjSrc, lDeltaSrc);
|
||||||
pjSrc += lDeltaSrc;
|
pjSrc += lDeltaSrc;
|
||||||
pjDst += lDeltaDst;
|
pjDst += lDeltaDst;
|
||||||
|
iSrc += lDeltaSrc;
|
||||||
|
iDst += labs(lDeltaDst);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return iSrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
HBITMAP
|
HBITMAP
|
||||||
|
|
|
@ -44,13 +44,6 @@ GreCreateDIBitmapInternal(
|
||||||
IN UINT cjMaxBits,
|
IN UINT cjMaxBits,
|
||||||
IN HANDLE hcmXform);
|
IN HANDLE hcmXform);
|
||||||
|
|
||||||
BOOL
|
|
||||||
NTAPI
|
|
||||||
UnsafeSetBitmapBits(
|
|
||||||
_Inout_ PSURFACE psurf,
|
|
||||||
_In_ ULONG cjBits,
|
|
||||||
_In_ const VOID *pvBits);
|
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
NTAPI
|
NTAPI
|
||||||
GreGetBitmapDimension(
|
GreGetBitmapDimension(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue