- Started the use of DC_ATTR. Created dcutil.c to handle xfers. I choose XForms this time and still trouble shooting it. If anyone wants to join in and help. Optimize syncing the data packets, add more, etc. Don't be shy!

- Removed NtGdiGetWorldTransform from w32ksvc.db and updated ntgdibad.h.
- Implemented GetTransform redirect to NtGdiGetTransform.
- Connected the gdi32 parts.


svn path=/trunk/; revision=28442
This commit is contained in:
James Tabor 2007-08-21 05:01:00 +00:00
parent e2e96c6bc8
commit e308fab607
11 changed files with 127 additions and 77 deletions

View file

@ -453,13 +453,13 @@ GetTextFaceW@12
GetTextFaceAliasW@12 GetTextFaceAliasW@12
GetTextMetricsA@8 GetTextMetricsA@8
GetTextMetricsW@8 GetTextMetricsW@8
GetTransform@12 GetTransform@12=NtGdiGetTransform@12
GetViewportExtEx@8 GetViewportExtEx@8
GetViewportOrgEx@8 GetViewportOrgEx@8
GetWinMetaFileBits@20 GetWinMetaFileBits@20
GetWindowExtEx@8 GetWindowExtEx@8
GetWindowOrgEx@8 GetWindowOrgEx@8
GetWorldTransform@8=NtGdiGetWorldTransform@8 GetWorldTransform@8
HT_Get8BPPFormatPalette@16 HT_Get8BPPFormatPalette@16
HT_Get8BPPMaskPalette@24 HT_Get8BPPMaskPalette@24
IntersectClipRect@20=NtGdiIntersectClipRect@20 IntersectClipRect@20=NtGdiIntersectClipRect@20

View file

@ -1869,18 +1869,6 @@ GetTextFaceAliasW(HDC hdc,int cChar,LPWSTR pszOut)
return 0; return 0;
} }
/*
* @unimplemented
*/
BOOL
STDCALL
GetTransform(HDC hdc, DWORD iXform, LPXFORM pxf)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
/* /*
* @unimplemented * @unimplemented
*/ */

View file

@ -103,7 +103,7 @@ DPtoLP ( HDC hDC, LPPOINT Points, INT Count )
if (Dc_Attr->flXform & ( DEVICE_TO_WORLD_INVALID | // Force a full recalibration! if (Dc_Attr->flXform & ( DEVICE_TO_WORLD_INVALID | // Force a full recalibration!
PAGE_XLATE_CHANGED | // Changes or Updates have been made, PAGE_XLATE_CHANGED | // Changes or Updates have been made,
PAGE_EXTENTS_CHANGED | // do processing in kernel space. PAGE_EXTENTS_CHANGED | // do processing in kernel space.
WORLD_XFORM_CHANGED ) WORLD_XFORM_CHANGED ))
#endif #endif
return NtGdiTransformPoints( hDC, Points, Points, Count, GdiDpToLp); // DPtoLP mode. return NtGdiTransformPoints( hDC, Points, Points, Count, GdiDpToLp); // DPtoLP mode.
#if 0 #if 0
@ -121,7 +121,7 @@ BOOL
STDCALL STDCALL
LPtoDP ( HDC hDC, LPPOINT Points, INT Count ) LPtoDP ( HDC hDC, LPPOINT Points, INT Count )
{ {
#if 0 //#if 0
INT i; INT i;
PDC_ATTR Dc_Attr; PDC_ATTR Dc_Attr;
@ -129,17 +129,25 @@ LPtoDP ( HDC hDC, LPPOINT Points, INT Count )
if (Dc_Attr->flXform & ( PAGE_XLATE_CHANGED | // Check for Changes and Updates if (Dc_Attr->flXform & ( PAGE_XLATE_CHANGED | // Check for Changes and Updates
PAGE_EXTENTS_CHANGED | PAGE_EXTENTS_CHANGED |
WORLD_XFORM_CHANGED ) WORLD_XFORM_CHANGED ))
#endif //#endif
return NtGdiTransformPoints( hDC, Points, Points, Count, GdiLpToDp); // LPtoDP mode return NtGdiTransformPoints( hDC, Points, Points, Count, GdiLpToDp); // LPtoDP mode
#if 0 //#if 0
else else
{ {
for ( i = 0; i < Count; i++ ) for ( i = 0; i < Count; i++ )
CoordCnvP ( &Dc_Attr->mxWorldToDevice, &Points[i] ); CoordCnvP ( &Dc_Attr->mxWorldToDevice, &Points[i] );
} }
return TRUE; return TRUE;
#endif //#endif
}
BOOL
STDCALL
GetWorldTransform( HDC hDC, LPXFORM lpXform )
{
return NtGdiGetTransform( hDC, GdiWorldSpaceToPageSpace, lpXform);
} }

View file

@ -465,14 +465,6 @@ BOOL STDCALL NtGdiGetWindowExtEx(HDC hDC, LPSIZE windowExt);
/* Needs to be done in user-mode. */ /* Needs to be done in user-mode. */
BOOL STDCALL NtGdiGetWindowOrgEx(HDC hDC, LPPOINT windowOrg); BOOL STDCALL NtGdiGetWindowOrgEx(HDC hDC, LPPOINT windowOrg);
/* Use NtGdiGetTransform with GdiWorldSpaceToPageSpace */
BOOL
STDCALL
NtGdiGetWorldTransform (
HDC hDC,
LPXFORM Xform
);
/* Needs to be done in user-mode. */ /* Needs to be done in user-mode. */
BOOL BOOL
STDCALL STDCALL

View file

@ -153,6 +153,8 @@ VOID FASTCALL DC_SetOwnership(HDC DC, PEPROCESS Owner);
VOID FASTCALL DC_UpdateXforms(PDC dc); VOID FASTCALL DC_UpdateXforms(PDC dc);
BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest); BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
BOOL FASTCALL DCU_UpdateUserXForms(PDC, ULONG);
VOID FASTCALL IntGetViewportExtEx(PDC dc, LPSIZE pt); VOID FASTCALL IntGetViewportExtEx(PDC dc, LPSIZE pt);
VOID FASTCALL IntGetViewportOrgEx(PDC dc, LPPOINT pt); VOID FASTCALL IntGetViewportOrgEx(PDC dc, LPPOINT pt);
VOID FASTCALL IntGetWindowExtEx(PDC dc, LPSIZE pt); VOID FASTCALL IntGetWindowExtEx(PDC dc, LPSIZE pt);

View file

@ -194,7 +194,6 @@ IntGdiModifyWorldTransform(PDC pDc,
case MWT_MAX+1: // Must be MWT_SET???? case MWT_MAX+1: // Must be MWT_SET????
pDc->w.xformWorld2Wnd = *lpXForm; // Do it like Wine. pDc->w.xformWorld2Wnd = *lpXForm; // Do it like Wine.
DC_UpdateXforms(pDc); // Good wine port here too.
break; break;
default: default:
@ -203,7 +202,6 @@ IntGdiModifyWorldTransform(PDC pDc,
} }
DC_UpdateXforms(pDc); DC_UpdateXforms(pDc);
DC_UnlockDc(pDc);
return TRUE; return TRUE;
} }
@ -229,8 +227,9 @@ NtGdiGetGraphicsMode ( HDC hDC )
BOOL BOOL
STDCALL STDCALL
NtGdiGetWorldTransform(HDC hDC, NtGdiGetTransform(HDC hDC,
LPXFORM XForm) DWORD iXform,
LPXFORM XForm)
{ {
PDC dc; PDC dc;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
@ -253,7 +252,14 @@ NtGdiGetWorldTransform(HDC hDC,
ProbeForWrite(XForm, ProbeForWrite(XForm,
sizeof(XFORM), sizeof(XFORM),
1); 1);
*XForm = dc->w.xformWorld2Wnd; switch(iXform)
{
case GdiWorldSpaceToPageSpace:
*XForm = dc->w.xformWorld2Wnd;
break;
default:
break;
}
} }
_SEH_HANDLE _SEH_HANDLE
{ {
@ -403,7 +409,10 @@ NtGdiTransformPoints( HDC hDC,
SetLastNtError(Status); SetLastNtError(Status);
return FALSE; return FALSE;
} }
//
// If we are getting called that means User XForms is a mess!
//
DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
DC_UnlockDc(dc); DC_UnlockDc(dc);
ExFreePool(Points); ExFreePool(Points);
return TRUE; return TRUE;
@ -436,7 +445,7 @@ NtGdiModifyWorldTransform(HDC hDC,
{ {
ProbeForRead(UnsafeXForm, sizeof(XFORM), 1); ProbeForRead(UnsafeXForm, sizeof(XFORM), 1);
RtlCopyMemory(&SafeXForm, UnsafeXForm, sizeof(XFORM)); RtlCopyMemory(&SafeXForm, UnsafeXForm, sizeof(XFORM));
Ret = IntGdiModifyWorldTransform(dc, &SafeXForm, Mode); Ret = IntGdiModifyWorldTransform(dc, &SafeXForm, Mode);
} }
_SEH_HANDLE _SEH_HANDLE
@ -493,7 +502,7 @@ NtGdiOffsetViewportOrgEx(HDC hDC,
dc->Dc_Attr.ptlViewportOrg.x += XOffset; dc->Dc_Attr.ptlViewportOrg.x += XOffset;
dc->Dc_Attr.ptlViewportOrg.y += YOffset; dc->Dc_Attr.ptlViewportOrg.y += YOffset;
DC_UpdateXforms(dc); DC_UpdateXforms(dc);
DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
DC_UnlockDc(dc); DC_UnlockDc(dc);
return TRUE; return TRUE;
} }
@ -544,6 +553,7 @@ NtGdiOffsetWindowOrgEx(HDC hDC,
dc->Dc_Attr.ptlWindowOrg.y += YOffset; dc->Dc_Attr.ptlWindowOrg.y += YOffset;
DC_UpdateXforms(dc); DC_UpdateXforms(dc);
DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
DC_UnlockDc(dc); DC_UnlockDc(dc);
return TRUE; return TRUE;
@ -680,6 +690,7 @@ NtGdiSetMapMode(HDC hDC,
} }
DC_UpdateXforms(dc); DC_UpdateXforms(dc);
DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
} }
DC_UnlockDc(dc); DC_UnlockDc(dc);
@ -732,7 +743,7 @@ NtGdiSetViewportExtEx(HDC hDC,
Size->cx = dc->Dc_Attr.szlViewportExt.cx; Size->cx = dc->Dc_Attr.szlViewportExt.cx;
Size->cy = dc->Dc_Attr.szlViewportExt.cy; Size->cy = dc->Dc_Attr.szlViewportExt.cy;
dc->Dc_Attr.szlViewportExt.cx = XExtent; dc->Dc_Attr.szlViewportExt.cx = XExtent;
dc->Dc_Attr.szlViewportExt.cy = YExtent; dc->Dc_Attr.szlViewportExt.cy = YExtent;
if (dc->Dc_Attr.iMapMode == MM_ISOTROPIC) if (dc->Dc_Attr.iMapMode == MM_ISOTROPIC)
@ -754,6 +765,7 @@ NtGdiSetViewportExtEx(HDC hDC,
DC_UpdateXforms(dc); DC_UpdateXforms(dc);
DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
DC_UnlockDc(dc); DC_UnlockDc(dc);
return TRUE; return TRUE;
@ -805,6 +817,7 @@ NtGdiSetViewportOrgEx(HDC hDC,
dc->Dc_Attr.ptlViewportOrg.y = Y; dc->Dc_Attr.ptlViewportOrg.y = Y;
DC_UpdateXforms(dc); DC_UpdateXforms(dc);
DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
DC_UnlockDc(dc); DC_UnlockDc(dc);
return TRUE; return TRUE;
@ -868,6 +881,7 @@ NtGdiSetWindowExtEx(HDC hDC,
dc->Dc_Attr.szlWindowExt.cy = YExtent; dc->Dc_Attr.szlWindowExt.cy = YExtent;
DC_UpdateXforms(dc); DC_UpdateXforms(dc);
DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
DC_UnlockDc(dc); DC_UnlockDc(dc);
return TRUE; return TRUE;
@ -919,6 +933,7 @@ NtGdiSetWindowOrgEx(HDC hDC,
dc->Dc_Attr.ptlWindowOrg.y = Y; dc->Dc_Attr.ptlWindowOrg.y = Y;
DC_UpdateXforms(dc); DC_UpdateXforms(dc);
DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
DC_UnlockDc(dc); DC_UnlockDc(dc);
return TRUE; return TRUE;

View file

@ -1327,6 +1327,7 @@ IntGdiGetDCState(HDC hDC)
newdc->w.xformWorld2Vport = dc->w.xformWorld2Vport; newdc->w.xformWorld2Vport = dc->w.xformWorld2Vport;
newdc->w.xformVport2World = dc->w.xformVport2World; newdc->w.xformVport2World = dc->w.xformVport2World;
newdc->w.vport2WorldValid = dc->w.vport2WorldValid; newdc->w.vport2WorldValid = dc->w.vport2WorldValid;
DCU_UpdateUserXForms(newdc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
newdc->Dc_Attr.ptlWindowOrg.x = dc->Dc_Attr.ptlWindowOrg.x; newdc->Dc_Attr.ptlWindowOrg.x = dc->Dc_Attr.ptlWindowOrg.x;
newdc->Dc_Attr.ptlWindowOrg.y = dc->Dc_Attr.ptlWindowOrg.y; newdc->Dc_Attr.ptlWindowOrg.y = dc->Dc_Attr.ptlWindowOrg.y;
newdc->Dc_Attr.szlWindowExt.cx = dc->Dc_Attr.szlWindowExt.cx; newdc->Dc_Attr.szlWindowExt.cx = dc->Dc_Attr.szlWindowExt.cx;
@ -1409,7 +1410,7 @@ IntGdiSetDCState ( HDC hDC, HDC hDCSave )
dc->w.xformWorld2Vport = dcs->w.xformWorld2Vport; dc->w.xformWorld2Vport = dcs->w.xformWorld2Vport;
dc->w.xformVport2World = dcs->w.xformVport2World; dc->w.xformVport2World = dcs->w.xformVport2World;
dc->w.vport2WorldValid = dcs->w.vport2WorldValid; dc->w.vport2WorldValid = dcs->w.vport2WorldValid;
DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED );
dc->Dc_Attr.ptlWindowOrg.x = dcs->Dc_Attr.ptlWindowOrg.x; dc->Dc_Attr.ptlWindowOrg.x = dcs->Dc_Attr.ptlWindowOrg.x;
dc->Dc_Attr.ptlWindowOrg.y = dcs->Dc_Attr.ptlWindowOrg.y; dc->Dc_Attr.ptlWindowOrg.y = dcs->Dc_Attr.ptlWindowOrg.y;
dc->Dc_Attr.szlWindowExt.cx = dcs->Dc_Attr.szlWindowExt.cx; dc->Dc_Attr.szlWindowExt.cx = dcs->Dc_Attr.szlWindowExt.cx;
@ -2327,7 +2328,7 @@ DC_AllocDC(PUNICODE_STRING Driver)
PDC NewDC; PDC NewDC;
HDC hDC; HDC hDC;
PWSTR Buf = NULL; PWSTR Buf = NULL;
// PDC_ATTR DC_Attr = NULL; PDC_ATTR DC_Attr = NULL;
if (Driver != NULL) if (Driver != NULL)
{ {
@ -2348,7 +2349,7 @@ DC_AllocDC(PUNICODE_STRING Driver)
} }
return NULL; return NULL;
} }
#if 0 //#if 0
PVOID NewMem = NULL; PVOID NewMem = NULL;
ULONG MemSize = sizeof(DC_ATTR); //PAGE_SIZE it will allocate that size ULONG MemSize = sizeof(DC_ATTR); //PAGE_SIZE it will allocate that size
NTSTATUS Status = ZwAllocateVirtualMemory(NtCurrentProcess(), NTSTATUS Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
@ -2374,69 +2375,66 @@ DC_AllocDC(PUNICODE_STRING Driver)
} }
} }
KeLeaveCriticalRegion(); KeLeaveCriticalRegion();
#endif //#endif
NewDC = DC_LockDc(hDC); NewDC = DC_LockDc(hDC);
/* FIXME - Handle NewDC == NULL! */ /* FIXME - Handle NewDC == NULL! */
#if 0 //#if 0
if(NewMem) if(NewMem)
{ {
NewDC->pDc_Attr = NewMem; // Store pointer NewDC->pDc_Attr = NewMem; // Store pointer
DC_Attr = NewMem; DC_Attr = NewMem;
} }
#endif //#endif
if (Driver != NULL) if (Driver != NULL)
{ {
RtlCopyMemory(&NewDC->DriverName, Driver, sizeof(UNICODE_STRING)); RtlCopyMemory(&NewDC->DriverName, Driver, sizeof(UNICODE_STRING));
NewDC->DriverName.Buffer = Buf; NewDC->DriverName.Buffer = Buf;
} }
// gxf_long a;
// a.f = 1.0f;
NewDC->w.xformWorld2Wnd.eM11 = 1.0f; NewDC->w.xformWorld2Wnd.eM11 = 1.0f;
// DC_Attr->mxWorldToPage.efM11.lExp = XFPEXP(a); NewDC->w.xformWorld2Wnd.eM12 = 0.0f;
// DC_Attr->mxWorldToPage.efM11.lMant = XFPMANT(a);
NewDC->w.xformWorld2Wnd.eM12 = 0.0f; //Already Zero!
NewDC->w.xformWorld2Wnd.eM21 = 0.0f; NewDC->w.xformWorld2Wnd.eM21 = 0.0f;
NewDC->w.xformWorld2Wnd.eM22 = 1.0f; NewDC->w.xformWorld2Wnd.eM22 = 1.0f;
// DC_Attr->mxWorldToPage.efM22.lExp = XFPEXP(a); NewDC->w.xformWorld2Wnd.eDx = 0.0f;
// DC_Attr->mxWorldToPage.efM22.lMant = XFPMANT(a);
NewDC->w.xformWorld2Wnd.eDx = 0.0f; //Already Zero!
NewDC->w.xformWorld2Wnd.eDy = 0.0f; NewDC->w.xformWorld2Wnd.eDy = 0.0f;
NewDC->w.xformWorld2Vport = NewDC->w.xformWorld2Wnd; NewDC->w.xformWorld2Vport = NewDC->w.xformWorld2Wnd;
// DC_Attr->mxWorldToDevice = DC_Attr->mxWorldToPage;
NewDC->w.xformVport2World = NewDC->w.xformWorld2Wnd; NewDC->w.xformVport2World = NewDC->w.xformWorld2Wnd;
// DC_Attr->mxDevicetoWorld = DC_Attr->mxWorldToPage;
NewDC->w.vport2WorldValid = TRUE; NewDC->w.vport2WorldValid = TRUE;
// DC_Attr->flXform = DEVICE_TO_PAGE_INVALID; // More research.
XForm2MatrixS( &DC_Attr->mxWorldToDevice, &NewDC->w.xformWorld2Vport);
XForm2MatrixS( &DC_Attr->mxDevicetoWorld, &NewDC->w.xformVport2World);
XForm2MatrixS( &DC_Attr->mxWorldToPage, &NewDC->w.xformWorld2Wnd);
// Setup syncing bits for the dcattr data packets.
NewDC->Dc_Attr.flXform = DEVICE_TO_PAGE_INVALID;
DC_Attr->flXform = NewDC->Dc_Attr.flXform;
NewDC->Dc_Attr.ulDirty_ = 0; // Server side
DC_Attr->ulDirty_ = 0; // Client side
NewDC->Dc_Attr.iMapMode = MM_TEXT; NewDC->Dc_Attr.iMapMode = MM_TEXT;
// DC_Attr->iMapMode = MM_TEXT; DC_Attr->iMapMode = MM_TEXT;
NewDC->Dc_Attr.szlWindowExt.cx = 1; // Float to Int,,, WRONG!
NewDC->Dc_Attr.szlWindowExt.cy = 1;
NewDC->Dc_Attr.szlViewportExt.cx = 1;
NewDC->Dc_Attr.szlViewportExt.cy = 1;
DC_Attr->szlWindowExt.cx = 1;
DC_Attr->szlWindowExt.cy = 1;
DC_Attr->szlViewportExt.cx = 1;
DC_Attr->szlViewportExt.cy = 1;
//// HELP! FLOAT to INT !!!!!!!!!
NewDC->Dc_Attr.szlWindowExt.cx = 1.0f;
NewDC->Dc_Attr.szlWindowExt.cy = 1.0f;
NewDC->Dc_Attr.szlViewportExt.cx = 1.0f;
NewDC->Dc_Attr.szlViewportExt.cy = 1.0f;
NewDC->Dc_Attr.crForegroundClr = 0; NewDC->Dc_Attr.crForegroundClr = 0;
// NewDC->pDc_Attr->ulForegroundClr = 0; // Already Zero NewDC->Dc_Attr.ulForegroundClr = 0;
// NewDC->pDc_Attr->crForegroundClr = 0;
NewDC->Dc_Attr.ulBackgroundClr = 0xffffff;
NewDC->Dc_Attr.crBackgroundClr = 0xffffff; NewDC->Dc_Attr.crBackgroundClr = 0xffffff;
// DC_Attr->ulBackgroundClr = 0xffffff; DC_Attr->ulBackgroundClr = 0xffffff;
// DC_Attr->crBackgroundClr = 0xffffff; DC_Attr->crBackgroundClr = 0xffffff;
NewDC->Dc_Attr.hlfntNew = NtGdiGetStockObject(SYSTEM_FONT); NewDC->Dc_Attr.hlfntNew = NtGdiGetStockObject(SYSTEM_FONT);
DC_Attr->hlfntNew = NewDC->Dc_Attr.hlfntNew; // It's a service to the user.
TextIntRealizeFont(NewDC->Dc_Attr.hlfntNew); TextIntRealizeFont(NewDC->Dc_Attr.hlfntNew);
// DC_Attr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT);
NewDC->w.hPalette = NtGdiGetStockObject(DEFAULT_PALETTE); NewDC->w.hPalette = NtGdiGetStockObject(DEFAULT_PALETTE);
@ -2475,7 +2473,7 @@ DC_InitDC(HDC DCHandle)
VOID FASTCALL VOID FASTCALL
DC_FreeDC(HDC DCToFree) DC_FreeDC(HDC DCToFree)
{ {
#if 0 //#if 0
KeEnterCriticalRegion(); KeEnterCriticalRegion();
{ {
INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)DCToFree); INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)DCToFree);
@ -2495,7 +2493,7 @@ DC_FreeDC(HDC DCToFree)
} }
} }
KeLeaveCriticalRegion(); KeLeaveCriticalRegion();
#endif //#endif
if (!GDIOBJ_FreeObj(GdiHandleTable, DCToFree, GDI_OBJECT_TYPE_DC)) if (!GDIOBJ_FreeObj(GdiHandleTable, DCToFree, GDI_OBJECT_TYPE_DC))
{ {
DPRINT("DC_FreeDC failed\n"); DPRINT("DC_FreeDC failed\n");

View file

@ -0,0 +1,47 @@
#include <w32k.h>
#define NDEBUG
#include <debug.h>
BOOL
FASTCALL
DCU_UpdateUserXForms(PDC pDC, ULONG uMask)
{
PDC_ATTR DC_Attr = pDC->pDc_Attr;
if (!uMask) return FALSE;
if (!DC_Attr) return FALSE;
else
{
NTSTATUS Status = STATUS_SUCCESS;
_SEH_TRY
{
ProbeForWrite(DC_Attr,
sizeof(DC_ATTR),
1);
if (uMask & WORLD_XFORM_CHANGED)
XForm2MatrixS( &DC_Attr->mxWorldToDevice, &pDC->w.xformWorld2Vport);
if (uMask & DEVICE_TO_WORLD_INVALID)
XForm2MatrixS( &DC_Attr->mxDevicetoWorld, &pDC->w.xformVport2World);
if (uMask & WORLD_TO_PAGE_IDENTITY)
XForm2MatrixS( &DC_Attr->mxWorldToPage, &pDC->w.xformWorld2Wnd);
}
_SEH_HANDLE
{
Status = _SEH_GetExceptionCode();
}
_SEH_END;
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
return FALSE;
}
}
return TRUE;
}

View file

@ -424,7 +424,7 @@ PATH_FillPath( PDC dc, GdiPath *pPath )
* tests show that resetting the graphics mode to GM_COMPATIBLE does * tests show that resetting the graphics mode to GM_COMPATIBLE does
* not reset the world transform. * not reset the world transform.
*/ */
NtGdiGetWorldTransform( dc->hSelf, &xform ); NtGdiGetTransform( dc->hSelf, GdiWorldSpaceToPageSpace, &xform );
/* Set MM_TEXT */ /* Set MM_TEXT */
NtGdiSetMapMode( dc->hSelf, MM_TEXT ); NtGdiSetMapMode( dc->hSelf, MM_TEXT );

View file

@ -214,7 +214,7 @@ NtGdiGetTextExtent 5
NtGdiGetTextExtentExW 8 NtGdiGetTextExtentExW 8
NtGdiGetTextFaceW 4 NtGdiGetTextFaceW 4
NtGdiGetTextMetricsW 3 NtGdiGetTextMetricsW 3
# NtGdiGetTransform 3 NtGdiGetTransform 3
# NtGdiGetUFI 6 # NtGdiGetUFI 6
# NtGdiGetEmbUFI 7 # NtGdiGetEmbUFI 7
# NtGdiGetUFIPathname 10 # NtGdiGetUFIPathname 10
@ -806,7 +806,6 @@ NtGdiGetSystemPaletteEntries 4
NtGdiGetTextAlign 1 NtGdiGetTextAlign 1
NtGdiGetTextColor 1 NtGdiGetTextColor 1
NtGdiGetTextExtentPoint32 4 NtGdiGetTextExtentPoint32 4
NtGdiGetWorldTransform 2
NtGdiMoveToEx 4 NtGdiMoveToEx 4
NtGdiOffsetViewportOrgEx 4 NtGdiOffsetViewportOrgEx 4
NtGdiOffsetWindowOrgEx 4 NtGdiOffsetWindowOrgEx 4

View file

@ -140,6 +140,7 @@
<file>color.c</file> <file>color.c</file>
<file>coord.c</file> <file>coord.c</file>
<file>dc.c</file> <file>dc.c</file>
<file>dcutil.c</file>
<file>dibobj.c</file> <file>dibobj.c</file>
<file>fillshap.c</file> <file>fillshap.c</file>
<file>gdiobj.c</file> <file>gdiobj.c</file>