mirror of
https://github.com/reactos/reactos.git
synced 2024-07-12 07:35:10 +00:00
Fixed: locking GDI objects twice when running wm_paint test.
svn path=/trunk/; revision=4062
This commit is contained in:
parent
4b0f9d9631
commit
2f26431f71
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: mouse.c,v 1.15 2002/11/01 11:29:57 dwelch Exp $
|
/* $Id: mouse.c,v 1.16 2003/01/24 23:25:34 ei Exp $
|
||||||
*
|
*
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* PURPOSE: Mouse
|
* PURPOSE: Mouse
|
||||||
|
@ -43,76 +43,76 @@ static LONG mouse_x, mouse_y;
|
||||||
static UINT mouse_width = 0, mouse_height = 0;
|
static UINT mouse_width = 0, mouse_height = 0;
|
||||||
|
|
||||||
static UCHAR DefaultCursor[256] = {
|
static UCHAR DefaultCursor[256] = {
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0xC0, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0xC0, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x01, 0x80, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x01, 0x80, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x03, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x43, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00,
|
||||||
0x66, 0x00, 0x00, 0x00,
|
0x00, 0xC0, 0x00, 0x00,
|
||||||
0x76, 0x00, 0x00, 0x00,
|
0x00, 0xC0, 0x00, 0x00,
|
||||||
0x7E, 0x00, 0x00, 0x00,
|
0x01, 0x80, 0x00, 0x00,
|
||||||
0x7F, 0xC0, 0x00, 0x00,
|
0x01, 0x80, 0x00, 0x00,
|
||||||
0x7F, 0x80, 0x00, 0x00,
|
0x03, 0x00, 0x00, 0x00,
|
||||||
0x7F, 0x00, 0x00, 0x00,
|
0x43, 0x00, 0x00, 0x00,
|
||||||
0x7E, 0x00, 0x00, 0x00,
|
0x66, 0x00, 0x00, 0x00,
|
||||||
0x7C, 0x00, 0x00, 0x00,
|
0x76, 0x00, 0x00, 0x00,
|
||||||
0x78, 0x00, 0x00, 0x00,
|
0x7E, 0x00, 0x00, 0x00,
|
||||||
0x70, 0x00, 0x00, 0x00,
|
0x7F, 0xC0, 0x00, 0x00,
|
||||||
0x60, 0x00, 0x00, 0x00,
|
0x7F, 0x80, 0x00, 0x00,
|
||||||
0x40, 0x00, 0x00, 0x00,
|
0x7F, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00,
|
0x7E, 0x00, 0x00, 0x00,
|
||||||
|
0x7C, 0x00, 0x00, 0x00,
|
||||||
|
0x78, 0x00, 0x00, 0x00,
|
||||||
|
0x70, 0x00, 0x00, 0x00,
|
||||||
|
0x60, 0x00, 0x00, 0x00,
|
||||||
|
0x40, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0xFF, 0xFF, 0xFF,
|
0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
0xFF, 0x3F, 0xFF, 0xFF,
|
0xFF, 0x3F, 0xFF, 0xFF,
|
||||||
0xFE, 0x1F, 0xFF, 0xFF,
|
0xFE, 0x1F, 0xFF, 0xFF,
|
||||||
0xFE, 0x1F, 0xFF, 0xFF,
|
0xFE, 0x1F, 0xFF, 0xFF,
|
||||||
0xFC, 0x3F, 0xFF, 0xFF,
|
0xFC, 0x3F, 0xFF, 0xFF,
|
||||||
0x7C, 0x3F, 0xFF, 0xFF,
|
0x7C, 0x3F, 0xFF, 0xFF,
|
||||||
0x38, 0x7F, 0xFF, 0xFF,
|
0x38, 0x7F, 0xFF, 0xFF,
|
||||||
0x18, 0x7F, 0xFF, 0xFF,
|
0x18, 0x7F, 0xFF, 0xFF,
|
||||||
0x00, 0xFF, 0xFF, 0xFF,
|
0x00, 0xFF, 0xFF, 0xFF,
|
||||||
0x00, 0xFF, 0xFF, 0xFF,
|
0x00, 0xFF, 0xFF, 0xFF,
|
||||||
0x00, 0x0F, 0xFF, 0xFF,
|
0x00, 0x0F, 0xFF, 0xFF,
|
||||||
0x00, 0x1F, 0xFF, 0xFF,
|
0x00, 0x1F, 0xFF, 0xFF,
|
||||||
0x00, 0x3F, 0xFF, 0xFF,
|
0x00, 0x3F, 0xFF, 0xFF,
|
||||||
0x00, 0x7F, 0xFF, 0xFF,
|
0x00, 0x7F, 0xFF, 0xFF,
|
||||||
0x00, 0xFF, 0xFF, 0xFF,
|
0x00, 0xFF, 0xFF, 0xFF,
|
||||||
0x01, 0xFF, 0xFF, 0xFF,
|
0x01, 0xFF, 0xFF, 0xFF,
|
||||||
0x03, 0xFF, 0xFF, 0xFF,
|
0x03, 0xFF, 0xFF, 0xFF,
|
||||||
0x07, 0xFF, 0xFF, 0xFF,
|
0x07, 0xFF, 0xFF, 0xFF,
|
||||||
0x0F, 0xFF, 0xFF, 0xFF,
|
0x0F, 0xFF, 0xFF, 0xFF,
|
||||||
0x1F, 0xFF, 0xFF, 0xFF,
|
0x1F, 0xFF, 0xFF, 0xFF,
|
||||||
0x3F, 0xFF, 0xFF, 0xFF};
|
0x3F, 0xFF, 0xFF, 0xFF};
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
INT
|
INT
|
||||||
MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
|
MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
|
||||||
LONG HazardY1, LONG HazardX2, LONG HazardY2)
|
LONG HazardY1, LONG HazardX2, LONG HazardY2)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Notify the mouse driver that drawing is about to begin in
|
* FUNCTION: Notify the mouse driver that drawing is about to begin in
|
||||||
|
@ -122,23 +122,23 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
|
||||||
RECTL MouseRect;
|
RECTL MouseRect;
|
||||||
LONG tmp;
|
LONG tmp;
|
||||||
|
|
||||||
if (SurfObj == NULL)
|
if (SurfObj == NULL)
|
||||||
{
|
{
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
|
if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
|
||||||
{
|
{
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HazardX1 > HazardX2)
|
if (HazardX1 > HazardX2)
|
||||||
{
|
{
|
||||||
tmp = HazardX2; HazardX2 = HazardX1; HazardX1 = tmp;
|
tmp = HazardX2; HazardX2 = HazardX1; HazardX1 = tmp;
|
||||||
}
|
}
|
||||||
if (HazardY1 > HazardY2)
|
if (HazardY1 > HazardY2)
|
||||||
{
|
{
|
||||||
tmp = HazardY2; HazardY2 = HazardY1; HazardY1 = tmp;
|
tmp = HazardY2; HazardY2 = HazardY1; HazardY1 = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((mouse_x + mouse_width) >= HazardX1) && (mouse_x <= HazardX2) &&
|
if (((mouse_x + mouse_width) >= HazardX1) && (mouse_x <= HazardX2) &&
|
||||||
|
@ -154,7 +154,7 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
INT
|
INT
|
||||||
MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
|
MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Notify the mouse driver that drawing has finished on a surface.
|
* FUNCTION: Notify the mouse driver that drawing has finished on a surface.
|
||||||
|
@ -162,12 +162,12 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
|
||||||
{
|
{
|
||||||
RECTL MouseRect;
|
RECTL MouseRect;
|
||||||
|
|
||||||
if (SurfObj == NULL)
|
if (SurfObj == NULL)
|
||||||
{
|
{
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
|
if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
|
||||||
{
|
{
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -177,7 +177,7 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
|
||||||
SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
|
SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
|
||||||
SafetySwitch = FALSE;
|
SafetySwitch = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
SafetySwitch2 = FALSE;
|
SafetySwitch2 = FALSE;
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
|
@ -195,13 +195,13 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
|
||||||
PDC dc;
|
PDC dc;
|
||||||
PSURFOBJ SurfObj;
|
PSURFOBJ SurfObj;
|
||||||
PSURFGDI SurfGDI;
|
PSURFGDI SurfGDI;
|
||||||
RECTL MouseRect;
|
RECTL MouseRect;
|
||||||
MSG Msg;
|
MSG Msg;
|
||||||
ULONG j;
|
ULONG j;
|
||||||
LARGE_INTEGER LargeTickCount;
|
LARGE_INTEGER LargeTickCount;
|
||||||
ULONG TickCount;
|
ULONG TickCount;
|
||||||
static ULONG ButtonsDown = 0;
|
static ULONG ButtonsDown = 0;
|
||||||
const UINT MouseButtonDownMessage[3] =
|
const UINT MouseButtonDownMessage[3] =
|
||||||
{WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONDOWN};
|
{WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONDOWN};
|
||||||
const UINT MouseButtonUpMessage[3] =
|
const UINT MouseButtonUpMessage[3] =
|
||||||
{WM_RBUTTONUP, WM_MBUTTONUP, WM_LBUTTONUP};
|
{WM_RBUTTONUP, WM_MBUTTONUP, WM_LBUTTONUP};
|
||||||
|
@ -218,7 +218,8 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
|
||||||
dc = DC_HandleToPtr(hDC);
|
dc = DC_HandleToPtr(hDC);
|
||||||
SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
|
SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
|
||||||
SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
|
SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
|
||||||
|
DC_ReleasePtr( hDC );
|
||||||
|
|
||||||
/* Compile the total mouse movement change and dispatch button events. */
|
/* Compile the total mouse movement change and dispatch button events. */
|
||||||
for (i = 0; i < InputCount; i++)
|
for (i = 0; i < InputCount; i++)
|
||||||
{
|
{
|
||||||
|
@ -232,7 +233,7 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
|
||||||
Msg.pt.x = mouse_x + mouse_cx;
|
Msg.pt.x = mouse_x + mouse_cx;
|
||||||
Msg.pt.y = mouse_y + mouse_cy;
|
Msg.pt.y = mouse_y + mouse_cy;
|
||||||
MsqInsertSystemMessage(&Msg);
|
MsqInsertSystemMessage(&Msg);
|
||||||
|
|
||||||
for (j = 0; j < 3; j++)
|
for (j = 0; j < 3; j++)
|
||||||
{
|
{
|
||||||
ULONG Flag = MouseButtonFlag[j];
|
ULONG Flag = MouseButtonFlag[j];
|
||||||
|
@ -245,8 +246,8 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
|
||||||
MsqInsertSystemMessage(&Msg);
|
MsqInsertSystemMessage(&Msg);
|
||||||
}
|
}
|
||||||
if (!(Data[i].ButtonData & (1 << j)) && (ButtonsDown & Flag))
|
if (!(Data[i].ButtonData & (1 << j)) && (ButtonsDown & Flag))
|
||||||
{
|
{
|
||||||
ButtonsDown &= ~Flag;
|
ButtonsDown &= ~Flag;
|
||||||
|
|
||||||
Msg.wParam = ButtonsDown;
|
Msg.wParam = ButtonsDown;
|
||||||
Msg.message = MouseButtonUpMessage[j];
|
Msg.message = MouseButtonUpMessage[j];
|
||||||
|
@ -257,9 +258,9 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
|
||||||
|
|
||||||
/* If the mouse moved then move the pointer. */
|
/* If the mouse moved then move the pointer. */
|
||||||
if (mouse_cx != 0 || mouse_cy != 0)
|
if (mouse_cx != 0 || mouse_cy != 0)
|
||||||
{
|
{
|
||||||
mouse_x += mouse_cx;
|
mouse_x += mouse_cx;
|
||||||
mouse_y += mouse_cy;
|
mouse_y += mouse_cy;
|
||||||
|
|
||||||
mouse_x = max(mouse_x, 0);
|
mouse_x = max(mouse_x, 0);
|
||||||
mouse_y = max(mouse_y, 0);
|
mouse_y = max(mouse_y, 0);
|
||||||
|
@ -268,36 +269,46 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
|
||||||
|
|
||||||
if (SafetySwitch == FALSE && SafetySwitch2 == FALSE)
|
if (SafetySwitch == FALSE && SafetySwitch2 == FALSE)
|
||||||
{
|
{
|
||||||
SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
|
SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EnableMouse(HDC hDisplayDC)
|
EnableMouse(HDC hDisplayDC)
|
||||||
{
|
{
|
||||||
PDC dc = DC_HandleToPtr(hDisplayDC);
|
PDC dc;
|
||||||
PSURFOBJ SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
|
PSURFOBJ SurfObj;
|
||||||
PSURFGDI SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
|
PSURFGDI SurfGDI;
|
||||||
HBITMAP hMouseSurf;
|
HBITMAP hMouseSurf;
|
||||||
PSURFOBJ MouseSurf;
|
PSURFOBJ MouseSurf;
|
||||||
SIZEL MouseSize;
|
SIZEL MouseSize;
|
||||||
RECTL MouseRect;
|
RECTL MouseRect;
|
||||||
|
|
||||||
/* Create the default mouse cursor. */
|
dc = DC_HandleToPtr(hDisplayDC);
|
||||||
mouse_width = 32;
|
if( dc ){
|
||||||
mouse_height = 32;
|
SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
|
||||||
MouseSize.cx = 32;
|
SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
|
||||||
MouseSize.cy = 64;
|
DC_ReleasePtr( hDisplayDC );
|
||||||
hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, 0, DefaultCursor);
|
|
||||||
MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
|
|
||||||
|
|
||||||
/* Tell the display driver to set the pointer shape. */
|
/* Create the default mouse cursor. */
|
||||||
SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL, 0, 0, 320, 240,
|
mouse_width = 32;
|
||||||
&MouseRect, 0);
|
mouse_height = 32;
|
||||||
|
MouseSize.cx = 32;
|
||||||
|
MouseSize.cy = 64;
|
||||||
|
hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, 0, DefaultCursor);
|
||||||
|
MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
|
||||||
|
|
||||||
mouse_x = 320;
|
/* Tell the display driver to set the pointer shape. */
|
||||||
mouse_y = 240;
|
SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL, 0, 0, 320, 240,
|
||||||
MouseEnabled = TRUE;
|
&MouseRect, 0);
|
||||||
|
|
||||||
|
mouse_x = 320;
|
||||||
|
mouse_y = 240;
|
||||||
|
MouseEnabled = TRUE;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
MouseEnabled = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -314,35 +314,23 @@ empty:
|
||||||
*/
|
*/
|
||||||
HRGN REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt)
|
HRGN REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt)
|
||||||
{
|
{
|
||||||
PROSRGNDATA objSrc = RGNDATA_LockRgn(hSrc);
|
PROSRGNDATA objSrc, rgnDst;
|
||||||
HRGN hNewDst;
|
HRGN hNewDst, hRet = NULL;
|
||||||
|
GDIMULTILOCK Lock[2] = {{hDst, 0, GO_REGION_MAGIC}, {hSrc, 0, GO_REGION_MAGIC}};
|
||||||
|
|
||||||
if(objSrc)
|
if( !hDst ){
|
||||||
{
|
|
||||||
PROSRGNDATA rgnDst;
|
|
||||||
|
|
||||||
if(hDst)
|
|
||||||
{
|
|
||||||
if(!(rgnDst = RGNDATA_LockRgn(hDst)))
|
|
||||||
{
|
|
||||||
hDst = 0;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if( !( hNewDst = RGNDATA_AllocRgn(1) ) ){
|
if( !( hNewDst = RGNDATA_AllocRgn(1) ) ){
|
||||||
RGNDATA_UnlockRgn( hSrc );
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Lock[0].hObj = hNewDst;
|
||||||
|
}
|
||||||
|
|
||||||
if(!(rgnDst = RGNDATA_LockRgn(hNewDst)))
|
GDIOBJ_LockMultipleObj( &Lock, 2 );
|
||||||
{
|
rgnDst = Lock[0].pObj;
|
||||||
RGNDATA_FreeRgn( hNewDst );
|
objSrc = Lock[1].pObj;
|
||||||
RGNDATA_UnlockRgn( hSrc );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if( objSrc && rgnDst )
|
||||||
|
{
|
||||||
if(rgnDst)
|
if(rgnDst)
|
||||||
{
|
{
|
||||||
POINT pt = { 0, 0 };
|
POINT pt = { 0, 0 };
|
||||||
|
@ -352,32 +340,15 @@ HRGN REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt)
|
||||||
|
|
||||||
if(REGION_CropAndOffsetRegion(lpPt, lpRect, objSrc, rgnDst) == FALSE)
|
if(REGION_CropAndOffsetRegion(lpPt, lpRect, objSrc, rgnDst) == FALSE)
|
||||||
{ // ve failed cleanup and return
|
{ // ve failed cleanup and return
|
||||||
RGNDATA_UnlockRgn( hSrc );
|
hRet = NULL;
|
||||||
|
|
||||||
if(hDst) // unlock new region if allocated
|
|
||||||
RGNDATA_UnlockRgn( hDst );
|
|
||||||
else
|
|
||||||
RGNDATA_UnlockRgn( hNewDst );
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
else{ // ve are fine. unlock the correct pointer and return correct handle
|
else{ // ve are fine. unlock the correct pointer and return correct handle
|
||||||
RGNDATA_UnlockRgn( hSrc );
|
hRet = Lock[0].hObj;
|
||||||
|
|
||||||
if(hDst == 0){
|
|
||||||
RGNDATA_UnlockRgn( hNewDst );
|
|
||||||
return hNewDst;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
RGNDATA_UnlockRgn( hDst );
|
|
||||||
return hDst;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
done:
|
|
||||||
RGNDATA_UnlockRgn( hSrc );
|
|
||||||
}
|
}
|
||||||
return 0;
|
GDIOBJ_UnlockMultipleObj( &Lock, 2 );
|
||||||
|
return hRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
Loading…
Reference in a new issue