REGION_AllocUserRgnWithHandle(INT nRgn)
{
PROSRGNDATA pRgn;
- INT Index;
PGDI_TABLE_ENTRY Entry;
pRgn = REGION_AllocRgnWithHandle(nRgn);
if (pRgn)
{
- Index = GDI_HANDLE_GET_INDEX(pRgn->BaseObject.hHmgr);
- Entry = &GdiHandleTable->Entries[Index];
+ Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, pRgn->BaseObject.hHmgr);
Entry->UserData = AllocateObjectAttr();
}
return pRgn;
FASTCALL
RGNOBJAPI_Lock(HRGN hRgn, PRGN_ATTR *ppRgn_Attr)
{
- INT Index;
PGDI_TABLE_ENTRY Entry;
- PROSRGNDATA pRgn;
PRGN_ATTR pRgn_Attr;
- HANDLE pid;
+ PROSRGNDATA pRgn = NULL;
pRgn = REGION_LockRgn(hRgn);
- if (pRgn)
+ if (pRgn && GDIOBJ_OwnedByCurrentProcess(hRgn))
{
- Index = GDI_HANDLE_GET_INDEX(hRgn);
- Entry = &GdiHandleTable->Entries[Index];
+ Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, hRgn);
pRgn_Attr = Entry->UserData;
- pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1);
- if ( pid == NtCurrentTeb()->ClientId.UniqueProcess &&
- pRgn_Attr )
+ if ( pRgn_Attr )
{
_SEH2_TRY
{
FASTCALL
RGNOBJAPI_Unlock(PROSRGNDATA pRgn)
{
- INT Index;
PGDI_TABLE_ENTRY Entry;
PRGN_ATTR pRgn_Attr;
- HANDLE pid;
- if (pRgn)
+ if (pRgn && GDIOBJ_OwnedByCurrentProcess(pRgn->BaseObject.hHmgr))
{
- Index = GDI_HANDLE_GET_INDEX(pRgn->BaseObject.hHmgr);
- Entry = &GdiHandleTable->Entries[Index];
+ Entry = GDI_HANDLE_GET_ENTRY(GdiHandleTable, pRgn->BaseObject.hHmgr);
pRgn_Attr = Entry->UserData;
- pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1);
- if ( pid == NtCurrentTeb()->ClientId.UniqueProcess &&
- pRgn_Attr )
+ if ( pRgn_Attr )
{
_SEH2_TRY
{
DWORD dwSize = 0;
NTSTATUS Status = STATUS_SUCCESS;
MATRIX matrix;
+ XFORMOBJ xo;
DPRINT("NtGdiExtCreateRegion\n");
_SEH2_TRY
/* Init the XFORMOBJ from the Xform struct */
Status = STATUS_INVALID_PARAMETER;
- ret = XFORMOBJ_iSetXform((XFORMOBJ*)&matrix, (XFORML*)Xform);
+ XFORMOBJ_vInit(&xo, &matrix);
+ ret = XFORMOBJ_iSetXform(&xo, (XFORML*)Xform);
/* Check for error, also no scale and shear allowed */
if (ret != DDI_ERROR && ret != GX_GENERAL)
{
/* Apply the coordinate transformation on the rects */
- if (XFORMOBJ_bApplyXform((XFORMOBJ*)&matrix,
+ if (XFORMOBJ_bApplyXform(&xo,
XF_LTOL,
nCount * 2,
RgnData->Buffer,
}
-/* See wine, msdn, osr and Feng Yuan - Windows Graphics Programming Win32 Gdi And Directdraw
-
- 1st: http://www.codeproject.com/gdi/cliprgnguide.asp is wrong!
-
- The intersection of the clip with the meta region is not Rao it's API!
- Go back and read 7.2 Clipping pages 418-19:
- Rao = API & Vis:
- 1) The Rao region is the intersection of the API region and the system region,
- named after the Microsoft engineer who initially proposed it.
- 2) The Rao region can be calculated from the API region and the system region.
-
- API:
- API region is the intersection of the meta region and the clipping region,
- clearly named after the fact that it is controlled by GDI API calls.
-*/
-INT APIENTRY
-NtGdiGetRandomRgn(
- HDC hDC,
- HRGN hDest,
- INT iCode
-)
-{
- INT ret = 0;
- PDC pDC;
- HRGN hSrc = NULL;
- POINT org;
-
- pDC = DC_LockDc(hDC);
- if (pDC == NULL)
- {
- EngSetLastError(ERROR_INVALID_HANDLE);
- return -1;
- }
-
- switch (iCode)
- {
- case CLIPRGN:
- hSrc = pDC->rosdc.hClipRgn;
-// if (pDC->dclevel.prgnClip) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnClip)->BaseObject.hHmgr;
- break;
- case METARGN:
- if (pDC->dclevel.prgnMeta) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnMeta)->BaseObject.hHmgr;
- break;
- case APIRGN:
- if (pDC->prgnAPI) hSrc = ((PROSRGNDATA)pDC->prgnAPI)->BaseObject.hHmgr;
-// else if (pDC->dclevel.prgnClip) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnClip)->BaseObject.hHmgr;
- else if (pDC->rosdc.hClipRgn) hSrc = pDC->rosdc.hClipRgn;
- else if (pDC->dclevel.prgnMeta) hSrc = ((PROSRGNDATA)pDC->dclevel.prgnMeta)->BaseObject.hHmgr;
- break;
- case SYSRGN:
- if (pDC->prgnVis) hSrc = pDC->prgnVis->BaseObject.hHmgr;
- break;
- default:
- hSrc = 0;
- }
- if (hSrc)
- {
- if (NtGdiCombineRgn(hDest, hSrc, 0, RGN_COPY) == ERROR)
- {
- ret = -1;
- }
- else
- {
- ret = 1;
- }
- }
- if (iCode == SYSRGN)
- {
- IntGdiGetDCOrg(pDC, &org);
- NtGdiOffsetRgn(hDest, org.x, org.y );
- }
-
- DC_UnlockDc(pDC);
-
- return ret;
-}
-
INT APIENTRY
NtGdiGetRgnBox(
HRGN hRgn,