Author: jimtabor Date: Tue Aug 21 09:01:00 2007 New Revision: 28442
URL: http://svn.reactos.org/svn/reactos?rev=28442&view=rev Log: - 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.
Added: trunk/reactos/subsystems/win32/win32k/objects/dcutil.c - copied, changed from r28441, trunk/reactos/subsystems/win32/win32k/objects/font.c Modified: trunk/reactos/dll/win32/gdi32/gdi32.def trunk/reactos/dll/win32/gdi32/misc/stubs.c trunk/reactos/dll/win32/gdi32/objects/coord.c trunk/reactos/include/reactos/win32k/ntgdibad.h trunk/reactos/subsystems/win32/win32k/include/dc.h trunk/reactos/subsystems/win32/win32k/objects/coord.c trunk/reactos/subsystems/win32/win32k/objects/dc.c trunk/reactos/subsystems/win32/win32k/objects/path.c trunk/reactos/subsystems/win32/win32k/w32ksvc.db trunk/reactos/subsystems/win32/win32k/win32k.rbuild
Modified: trunk/reactos/dll/win32/gdi32/gdi32.def URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/gdi32.def?r... ============================================================================== --- trunk/reactos/dll/win32/gdi32/gdi32.def (original) +++ trunk/reactos/dll/win32/gdi32/gdi32.def Tue Aug 21 09:01:00 2007 @@ -453,13 +453,13 @@ GetTextFaceAliasW@12 GetTextMetricsA@8 GetTextMetricsW@8 -GetTransform@12 +GetTransform@12=NtGdiGetTransform@12 GetViewportExtEx@8 GetViewportOrgEx@8 GetWinMetaFileBits@20 GetWindowExtEx@8 GetWindowOrgEx@8 -GetWorldTransform@8=NtGdiGetWorldTransform@8 +GetWorldTransform@8 HT_Get8BPPFormatPalette@16 HT_Get8BPPMaskPalette@24 IntersectClipRect@20=NtGdiIntersectClipRect@20
Modified: trunk/reactos/dll/win32/gdi32/misc/stubs.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/misc/stubs.... ============================================================================== --- trunk/reactos/dll/win32/gdi32/misc/stubs.c (original) +++ trunk/reactos/dll/win32/gdi32/misc/stubs.c Tue Aug 21 09:01:00 2007 @@ -1863,18 +1863,6 @@ int STDCALL GetTextFaceAliasW(HDC hdc,int cChar,LPWSTR pszOut) -{ - UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -BOOL -STDCALL -GetTransform(HDC hdc, DWORD iXform, LPXFORM pxf) { UNIMPLEMENTED; SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Modified: trunk/reactos/dll/win32/gdi32/objects/coord.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/objects/coo... ============================================================================== --- trunk/reactos/dll/win32/gdi32/objects/coord.c (original) +++ trunk/reactos/dll/win32/gdi32/objects/coord.c Tue Aug 21 09:01:00 2007 @@ -103,7 +103,7 @@ if (Dc_Attr->flXform & ( DEVICE_TO_WORLD_INVALID | // Force a full recalibration! PAGE_XLATE_CHANGED | // Changes or Updates have been made, PAGE_EXTENTS_CHANGED | // do processing in kernel space. - WORLD_XFORM_CHANGED ) + WORLD_XFORM_CHANGED )) #endif return NtGdiTransformPoints( hDC, Points, Points, Count, GdiDpToLp); // DPtoLP mode. #if 0 @@ -121,7 +121,7 @@ STDCALL LPtoDP ( HDC hDC, LPPOINT Points, INT Count ) { -#if 0 +//#if 0 INT i; PDC_ATTR Dc_Attr;
@@ -129,17 +129,25 @@
if (Dc_Attr->flXform & ( PAGE_XLATE_CHANGED | // Check for Changes and Updates PAGE_EXTENTS_CHANGED | - WORLD_XFORM_CHANGED ) -#endif + WORLD_XFORM_CHANGED )) +//#endif return NtGdiTransformPoints( hDC, Points, Points, Count, GdiLpToDp); // LPtoDP mode -#if 0 +//#if 0 else { for ( i = 0; i < Count; i++ ) CoordCnvP ( &Dc_Attr->mxWorldToDevice, &Points[i] ); } return TRUE; -#endif +//#endif +} + + +BOOL +STDCALL +GetWorldTransform( HDC hDC, LPXFORM lpXform ) +{ + return NtGdiGetTransform( hDC, GdiWorldSpaceToPageSpace, lpXform); }
Modified: trunk/reactos/include/reactos/win32k/ntgdibad.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntgd... ============================================================================== --- trunk/reactos/include/reactos/win32k/ntgdibad.h (original) +++ trunk/reactos/include/reactos/win32k/ntgdibad.h Tue Aug 21 09:01:00 2007 @@ -465,14 +465,6 @@ /* Needs to be done in user-mode. */ 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. */ BOOL STDCALL
Modified: trunk/reactos/subsystems/win32/win32k/include/dc.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/dc.h (original) +++ trunk/reactos/subsystems/win32/win32k/include/dc.h Tue Aug 21 09:01:00 2007 @@ -153,6 +153,8 @@ VOID FASTCALL DC_UpdateXforms(PDC dc); BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
+BOOL FASTCALL DCU_UpdateUserXForms(PDC, ULONG); + VOID FASTCALL IntGetViewportExtEx(PDC dc, LPSIZE pt); VOID FASTCALL IntGetViewportOrgEx(PDC dc, LPPOINT pt); VOID FASTCALL IntGetWindowExtEx(PDC dc, LPSIZE pt);
Modified: trunk/reactos/subsystems/win32/win32k/objects/coord.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/coord.c (original) +++ trunk/reactos/subsystems/win32/win32k/objects/coord.c Tue Aug 21 09:01:00 2007 @@ -194,7 +194,6 @@
case MWT_MAX+1: // Must be MWT_SET???? pDc->w.xformWorld2Wnd = *lpXForm; // Do it like Wine. - DC_UpdateXforms(pDc); // Good wine port here too. break;
default: @@ -203,7 +202,6 @@ }
DC_UpdateXforms(pDc); - DC_UnlockDc(pDc); return TRUE; }
@@ -229,8 +227,9 @@
BOOL STDCALL -NtGdiGetWorldTransform(HDC hDC, - LPXFORM XForm) +NtGdiGetTransform(HDC hDC, + DWORD iXform, + LPXFORM XForm) { PDC dc; NTSTATUS Status = STATUS_SUCCESS; @@ -253,7 +252,14 @@ ProbeForWrite(XForm, sizeof(XFORM), 1); - *XForm = dc->w.xformWorld2Wnd; + switch(iXform) + { + case GdiWorldSpaceToPageSpace: + *XForm = dc->w.xformWorld2Wnd; + break; + default: + break; + } } _SEH_HANDLE { @@ -403,7 +409,10 @@ SetLastNtError(Status); 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); ExFreePool(Points); return TRUE; @@ -436,7 +445,7 @@ { ProbeForRead(UnsafeXForm, sizeof(XFORM), 1); RtlCopyMemory(&SafeXForm, UnsafeXForm, sizeof(XFORM)); - + Ret = IntGdiModifyWorldTransform(dc, &SafeXForm, Mode); } _SEH_HANDLE @@ -493,7 +502,7 @@ dc->Dc_Attr.ptlViewportOrg.x += XOffset; dc->Dc_Attr.ptlViewportOrg.y += YOffset; DC_UpdateXforms(dc); - + DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED ); DC_UnlockDc(dc); return TRUE; } @@ -544,6 +553,7 @@ dc->Dc_Attr.ptlWindowOrg.y += YOffset;
DC_UpdateXforms(dc); + DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED ); DC_UnlockDc(dc);
return TRUE; @@ -680,6 +690,7 @@ }
DC_UpdateXforms(dc); + DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED ); }
DC_UnlockDc(dc); @@ -732,7 +743,7 @@ Size->cx = dc->Dc_Attr.szlViewportExt.cx; 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;
if (dc->Dc_Attr.iMapMode == MM_ISOTROPIC) @@ -754,6 +765,7 @@
DC_UpdateXforms(dc); + DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED ); DC_UnlockDc(dc);
return TRUE; @@ -805,6 +817,7 @@ dc->Dc_Attr.ptlViewportOrg.y = Y;
DC_UpdateXforms(dc); + DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED ); DC_UnlockDc(dc);
return TRUE; @@ -868,6 +881,7 @@ dc->Dc_Attr.szlWindowExt.cy = YExtent;
DC_UpdateXforms(dc); + DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED ); DC_UnlockDc(dc);
return TRUE; @@ -919,6 +933,7 @@ dc->Dc_Attr.ptlWindowOrg.y = Y;
DC_UpdateXforms(dc); + DCU_UpdateUserXForms(dc, WORLD_TO_PAGE_IDENTITY|DEVICE_TO_WORLD_INVALID|WORLD_XFORM_CHANGED ); DC_UnlockDc(dc);
return TRUE;
Modified: trunk/reactos/subsystems/win32/win32k/objects/dc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/dc.c (original) +++ trunk/reactos/subsystems/win32/win32k/objects/dc.c Tue Aug 21 09:01:00 2007 @@ -1327,6 +1327,7 @@ newdc->w.xformWorld2Vport = dc->w.xformWorld2Vport; newdc->w.xformVport2World = dc->w.xformVport2World; 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.y = dc->Dc_Attr.ptlWindowOrg.y; newdc->Dc_Attr.szlWindowExt.cx = dc->Dc_Attr.szlWindowExt.cx; @@ -1409,7 +1410,7 @@ dc->w.xformWorld2Vport = dcs->w.xformWorld2Vport; dc->w.xformVport2World = dcs->w.xformVport2World; 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.y = dcs->Dc_Attr.ptlWindowOrg.y; dc->Dc_Attr.szlWindowExt.cx = dcs->Dc_Attr.szlWindowExt.cx; @@ -2327,7 +2328,7 @@ PDC NewDC; HDC hDC; PWSTR Buf = NULL; -// PDC_ATTR DC_Attr = NULL; + PDC_ATTR DC_Attr = NULL;
if (Driver != NULL) { @@ -2348,7 +2349,7 @@ } return NULL; } -#if 0 +//#if 0 PVOID NewMem = NULL; ULONG MemSize = sizeof(DC_ATTR); //PAGE_SIZE it will allocate that size NTSTATUS Status = ZwAllocateVirtualMemory(NtCurrentProcess(), @@ -2374,69 +2375,66 @@ } } KeLeaveCriticalRegion(); -#endif +//#endif NewDC = DC_LockDc(hDC); /* FIXME - Handle NewDC == NULL! */ -#if 0 +//#if 0 if(NewMem) { NewDC->pDc_Attr = NewMem; // Store pointer DC_Attr = NewMem; } -#endif +//#endif if (Driver != NULL) { RtlCopyMemory(&NewDC->DriverName, Driver, sizeof(UNICODE_STRING)); NewDC->DriverName.Buffer = Buf; }
-// gxf_long a; -// a.f = 1.0f; - NewDC->w.xformWorld2Wnd.eM11 = 1.0f; -// DC_Attr->mxWorldToPage.efM11.lExp = XFPEXP(a); -// DC_Attr->mxWorldToPage.efM11.lMant = XFPMANT(a); - - NewDC->w.xformWorld2Wnd.eM12 = 0.0f; //Already Zero! + NewDC->w.xformWorld2Wnd.eM12 = 0.0f; NewDC->w.xformWorld2Wnd.eM21 = 0.0f; - NewDC->w.xformWorld2Wnd.eM22 = 1.0f; -// DC_Attr->mxWorldToPage.efM22.lExp = XFPEXP(a); -// DC_Attr->mxWorldToPage.efM22.lMant = XFPMANT(a); - - NewDC->w.xformWorld2Wnd.eDx = 0.0f; //Already Zero! + NewDC->w.xformWorld2Wnd.eDx = 0.0f; NewDC->w.xformWorld2Wnd.eDy = 0.0f; - NewDC->w.xformWorld2Vport = NewDC->w.xformWorld2Wnd; -// DC_Attr->mxWorldToDevice = DC_Attr->mxWorldToPage; - NewDC->w.xformVport2World = NewDC->w.xformWorld2Wnd; -// DC_Attr->mxDevicetoWorld = DC_Attr->mxWorldToPage; - 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; -// DC_Attr->iMapMode = MM_TEXT; - - -//// 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; + 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; +
NewDC->Dc_Attr.crForegroundClr = 0; -// NewDC->pDc_Attr->ulForegroundClr = 0; // Already Zero -// NewDC->pDc_Attr->crForegroundClr = 0; - + NewDC->Dc_Attr.ulForegroundClr = 0; + + NewDC->Dc_Attr.ulBackgroundClr = 0xffffff; NewDC->Dc_Attr.crBackgroundClr = 0xffffff; -// DC_Attr->ulBackgroundClr = 0xffffff; -// DC_Attr->crBackgroundClr = 0xffffff; + DC_Attr->ulBackgroundClr = 0xffffff; + DC_Attr->crBackgroundClr = 0xffffff;
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); -// DC_Attr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT);
NewDC->w.hPalette = NtGdiGetStockObject(DEFAULT_PALETTE);
@@ -2475,7 +2473,7 @@ VOID FASTCALL DC_FreeDC(HDC DCToFree) { -#if 0 +//#if 0 KeEnterCriticalRegion(); { INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)DCToFree); @@ -2495,7 +2493,7 @@ } } KeLeaveCriticalRegion(); -#endif +//#endif if (!GDIOBJ_FreeObj(GdiHandleTable, DCToFree, GDI_OBJECT_TYPE_DC)) { DPRINT("DC_FreeDC failed\n");
Copied: trunk/reactos/subsystems/win32/win32k/objects/dcutil.c (from r28441, trunk/reactos/subsystems/win32/win32k/objects/font.c) URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/font.c (original) +++ trunk/reactos/subsystems/win32/win32k/objects/dcutil.c Tue Aug 21 09:01:00 2007 @@ -1,2 +1,47 @@ -/* EMPTY FOR NOW */ -/* Hope I didn't delete existing defs!! Check CVS version of this file.. */ + +#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; +} +
Modified: trunk/reactos/subsystems/win32/win32k/objects/path.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/path.c (original) +++ trunk/reactos/subsystems/win32/win32k/objects/path.c Tue Aug 21 09:01:00 2007 @@ -424,7 +424,7 @@ * tests show that resetting the graphics mode to GM_COMPATIBLE does * not reset the world transform. */ - NtGdiGetWorldTransform( dc->hSelf, &xform ); + NtGdiGetTransform( dc->hSelf, GdiWorldSpaceToPageSpace, &xform );
/* Set MM_TEXT */ NtGdiSetMapMode( dc->hSelf, MM_TEXT );
Modified: trunk/reactos/subsystems/win32/win32k/w32ksvc.db URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/w32... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/w32ksvc.db (original) +++ trunk/reactos/subsystems/win32/win32k/w32ksvc.db Tue Aug 21 09:01:00 2007 @@ -214,7 +214,7 @@ NtGdiGetTextExtentExW 8 NtGdiGetTextFaceW 4 NtGdiGetTextMetricsW 3 -# NtGdiGetTransform 3 +NtGdiGetTransform 3 # NtGdiGetUFI 6 # NtGdiGetEmbUFI 7 # NtGdiGetUFIPathname 10 @@ -806,7 +806,6 @@ NtGdiGetTextAlign 1 NtGdiGetTextColor 1 NtGdiGetTextExtentPoint32 4 -NtGdiGetWorldTransform 2 NtGdiMoveToEx 4 NtGdiOffsetViewportOrgEx 4 NtGdiOffsetWindowOrgEx 4
Modified: trunk/reactos/subsystems/win32/win32k/win32k.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/win... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/win32k.rbuild (original) +++ trunk/reactos/subsystems/win32/win32k/win32k.rbuild Tue Aug 21 09:01:00 2007 @@ -140,6 +140,7 @@ <file>color.c</file> <file>coord.c</file> <file>dc.c</file> + <file>dcutil.c</file> <file>dibobj.c</file> <file>fillshap.c</file> <file>gdiobj.c</file>