From bb300c02592a11dd3251c5bf1ed3a8ece5fcde0d Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 3 Sep 2007 03:43:21 +0000 Subject: [PATCH] - Win32k: DC_ATTR: Moved to it. - We need to decide how to optimize the syncing. CreateD/IC/CompatibleDC, GetDCState and SelectObject use the sync in one form. This can become ugly. Some DC handles do not belong to the current process. We need to reorder the mess in dc.c and clean it up. - Gdi32: The only ones using it are GetCurrentObject and with out updates Get/SetDCBrush/PenColor. - Implemented an example of RealizePalette. Moved SetBk/TextColor into dc.c, don't use them. - Update gdi32.def. svn path=/trunk/; revision=28797 --- reactos/dll/win32/gdi32/gdi32.def | 4 +- reactos/dll/win32/gdi32/misc/hacks.c | 12 -- reactos/dll/win32/gdi32/objects/dc.c | 117 ++++++++++++++++-- reactos/dll/win32/gdi32/objects/palette.c | 30 +++++ reactos/subsystems/win32/win32k/objects/dc.c | 63 ++++++---- .../subsystems/win32/win32k/objects/dcutil.c | 39 +++--- 6 files changed, 194 insertions(+), 71 deletions(-) diff --git a/reactos/dll/win32/gdi32/gdi32.def b/reactos/dll/win32/gdi32/gdi32.def index ea3353f4f1e..28a460ebab3 100644 --- a/reactos/dll/win32/gdi32/gdi32.def +++ b/reactos/dll/win32/gdi32/gdi32.def @@ -520,7 +520,7 @@ PolylineTo@12 PtInRegion@12=NtGdiPtInRegion@12 PtVisible@12=NtGdiPtVisible@12 QueryFontAssocStatus@0 -RealizePalette@4=NtGdiRealizePalette@4 +RealizePalette@4 RectInRegion@8=NtGdiRectInRegion@8 RectVisible@8=NtGdiRectVisible@8 Rectangle@20 @@ -588,7 +588,7 @@ SetStretchBltMode@8=NtGdiSetStretchBltMode@8 SetSystemPaletteUse@8 SetTextAlign@8=NtGdiSetTextAlign@8 SetTextCharacterExtra@8 -SetTextColor@8=NtGdiSetTextColor@8 +SetTextColor@8 SetTextJustification@12 SetViewportExtEx@16=NtGdiSetViewportExtEx@16 SetViewportOrgEx@16=NtGdiSetViewportOrgEx@16 diff --git a/reactos/dll/win32/gdi32/misc/hacks.c b/reactos/dll/win32/gdi32/misc/hacks.c index 1e90e99e9ed..246d7e86227 100644 --- a/reactos/dll/win32/gdi32/misc/hacks.c +++ b/reactos/dll/win32/gdi32/misc/hacks.c @@ -104,18 +104,6 @@ SetBkMode(HDC hdc, return NtGdiSetBkMode(hdc,iBkMode); } -/* - * @implemented - * - */ -COLORREF -STDCALL -SetBkColor(HDC hdc, - COLORREF crColor) -{ - return NtGdiSetBkColor(hdc,crColor); -} - /* * @implemented * diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index 35dd882bd21..936364d619e 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -320,13 +320,13 @@ HGDIOBJ STDCALL GetDCObject( HDC hDC, INT iType) { -#if 0 +//#if 0 if((iType == GDI_OBJECT_TYPE_BRUSH) || (iType == GDI_OBJECT_TYPE_EXTPEN)|| (iType == GDI_OBJECT_TYPE_PEN) || (iType == GDI_OBJECT_TYPE_COLORSPACE)) { - HGDIOBJ hGO; + HGDIOBJ hGO = NULL; PDC_ATTR Dc_Attr; if (!GdiGetHandleUserData((HGDIOBJ) hDC, (PVOID) &Dc_Attr)) return NULL; @@ -348,7 +348,7 @@ GetDCObject( HDC hDC, INT iType) } return hGO; } -#endif +//#endif return NtGdiGetDCObject( hDC, iType ); } @@ -691,12 +691,12 @@ GetDCBrushColor( HDC hdc ) { -#if 0 +//#if 0 PDC_ATTR Dc_Attr; if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return CLR_INVALID; return (COLORREF) Dc_Attr->ulPenClr; -#endif +//#endif return NtUserGetDCBrushColor(hdc); } @@ -709,12 +709,12 @@ GetDCPenColor( HDC hdc ) { -#if 0 +//#if 0 PDC_ATTR Dc_Attr; if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return CLR_INVALID; return (COLORREF) Dc_Attr->ulPenClr; -#endif +//#endif return NtUserGetDCPenColor(hdc); } @@ -728,7 +728,7 @@ SetDCBrushColor( COLORREF crColor ) { -#if 0 +//#if 0 PDC_ATTR Dc_Attr; COLORREF OldColor = CLR_INVALID; @@ -745,7 +745,7 @@ SetDCBrushColor( } } return OldColor; -#endif +//#endif return NtUserSetDCBrushColor(hdc, crColor); } @@ -759,7 +759,7 @@ SetDCPenColor( COLORREF crColor ) { -#if 0 +//#if 0 PDC_ATTR Dc_Attr; COLORREF OldColor = CLR_INVALID; @@ -776,10 +776,105 @@ SetDCPenColor( } } return OldColor; -#endif +//#endif return NtUserSetDCPenColor(hdc, crColor); } +/* + * @implemented + */ +COLORREF +STDCALL +SetTextColor( + HDC hdc, + COLORREF crColor +) +{ +#if 0 + PDC_ATTR Dc_Attr; + COLORREF OldColor = CLR_INVALID; + + if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return OldColor; +#if 0 + if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC) + { + if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC) + return MFDRV_SetTextColor( hDC, crColor ); + else + { + PLDC pLDC = Dc_Attr->pvLDC; + if ( !pLDC ) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + if (pLDC->iType == LDC_EMFLDC) + { + if return EMFDRV_SetTextColor( hDC, crColor ); + } + } + } +#endif + OldColor = (COLORREF) Dc_Attr->ulForegroundClr; + Dc_Attr->ulForegroundClr = (ULONG) crColor; + + if ( Dc_Attr->crForegroundClr != crColor ) + { + Dc_Attr->ulDirty_ |= DIRTY_TEXT; + Dc_Attr->crForegroundClr = crColor; + } + return OldColor; +#endif + return NtGdiSetTextColor(hdc, crColor); +} + +/* + * @implemented + */ +COLORREF +STDCALL +SetBkColor( + HDC hdc, + COLORREF crColor +) +{ +#if 0 + PDC_ATTR Dc_Attr; + COLORREF OldColor = CLR_INVALID; + + if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return OldColor; +#if 0 + if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC) + { + if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC) + return MFDRV_SetBkColor( hDC, crColor ); + else + { + PLDC pLDC = Dc_Attr->pvLDC; + if ( !pLDC ) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + if (pLDC->iType == LDC_EMFLDC) + { + if return EMFDRV_SetBkColor( hDC, crColor ); + } + } + } +#endif + OldColor = (COLORREF) Dc_Attr->ulBackgroundClr; + Dc_Attr->ulBackgroundClr = (ULONG) crColor; + + if ( Dc_Attr->crBackgroundClr != crColor ) + { + Dc_Attr->ulDirty_ |= DIRTY_LINE; + Dc_Attr->crBackgroundClr = crColor; + } + return OldColor; +#endif + return NtGdiSetBkColor(hdc, crColor); +} /* * @implemented diff --git a/reactos/dll/win32/gdi32/objects/palette.c b/reactos/dll/win32/gdi32/objects/palette.c index 52ebc229619..2c62a4092a0 100644 --- a/reactos/dll/win32/gdi32/objects/palette.c +++ b/reactos/dll/win32/gdi32/objects/palette.c @@ -63,6 +63,36 @@ GetDIBColorTable(HDC hDC, return NtGdiDoPalette(hDC, iStartIndex, cEntries, pColors, GdiPalGetColorTable, FALSE); } +/* + * @implemented + */ +UINT +WINAPI +RealizePalette(HDC hDC) /* [in] Handle of device context */ +{ +#if 0 +// Handle something other than a normal dc object. + if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC) + { + if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC) + return MFDRV_(hDC); + else + { + HPALETTE Pal = GetDCObject(hDC, GDI_OBJECT_TYPE_PALETTE); + PLDC pLDC = GdiGetLDC((HDC) Pal); + if ( !pLDC ) return FALSE; + if (pLDC->iType == LDC_EMFLDC) return EMFDRV_(Pal); + return FALSE; + } + } +#endif +// return UserRealizePalette(hDC); + +//HACK!!!!! + return NtGdiRealizePalette(hDC); +} + + /* * @implemented */ diff --git a/reactos/subsystems/win32/win32k/objects/dc.c b/reactos/subsystems/win32/win32k/objects/dc.c index 7d9b7af8f9a..681eacb095e 100644 --- a/reactos/subsystems/win32/win32k/objects/dc.c +++ b/reactos/subsystems/win32/win32k/objects/dc.c @@ -252,6 +252,7 @@ NtGdiCreateCompatibleDC(HDC hDC) NewDC->Dc_Attr.crBackgroundClr = OrigDC->Dc_Attr.crBackgroundClr; NewDC->Dc_Attr.jBkMode = OrigDC->Dc_Attr.jBkMode; NewDC->Dc_Attr.jROP2 = OrigDC->Dc_Attr.jROP2; + DC_UnlockDc(NewDC); DC_UnlockDc(OrigDC); if (NULL != DisplayDC) @@ -264,6 +265,7 @@ NtGdiCreateCompatibleDC(HDC hDC) NtGdiDeleteObject(hVisRgn); DC_InitDC(hNewDC); + DCU_SynchDcAttrtoUser(hNewDC, -1); return hNewDC; } @@ -933,9 +935,17 @@ IntGdiCreateDC(PUNICODE_STRING Driver, NtGdiSetTextAlign(hNewDC, TA_TOP); NtGdiSetBkColor(hNewDC, RGB(255, 255, 255)); NtGdiSetBkMode(hNewDC, OPAQUE); + DCU_SynchDcAttrtoUser(hNewDC, -1); } else { + /* From MSDN2: + The CreateIC function creates an information context for the specified device. + The information context provides a fast way to get information about the + device without creating a device context (DC). However, GDI drawing functions + cannot accept a handle to an information context. + */ + NewDC->DC_Type = DC_TYPE_INFO; DC_UnlockDc( NewDC ); } @@ -1360,6 +1370,7 @@ IntGdiGetDCState(HDC hDC) newdc->w.hClipRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); NtGdiCombineRgn( newdc->w.hClipRgn, dc->w.hClipRgn, 0, RGN_COPY ); } + DCU_SyncDcAttrtoUser(newdc, -1); DC_UnlockDc( newdc ); DC_UnlockDc( dc ); return hnewdc; @@ -2101,6 +2112,7 @@ NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj) default: break; } + DCU_SyncDcAttrtoUser(dc, -1); DC_UnlockDc( dc ); return objOrg; } @@ -2335,7 +2347,6 @@ DC_AllocDC(PUNICODE_STRING Driver) PDC NewDC; HDC hDC; PWSTR Buf = NULL; -// PDC_ATTR DC_Attr = NULL; if (Driver != NULL) { @@ -2356,7 +2367,7 @@ DC_AllocDC(PUNICODE_STRING Driver) } 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(), @@ -2382,16 +2393,15 @@ DC_AllocDC(PUNICODE_STRING Driver) } } 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)); @@ -2408,39 +2418,31 @@ DC_AllocDC(PUNICODE_STRING Driver) NewDC->w.xformVport2World = NewDC->w.xformWorld2Wnd; NewDC->w.vport2WorldValid = TRUE; -// 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.flXform = DEVICE_TO_PAGE_INVALID; + + NewDC->Dc_Attr.ulDirty_ = 0; // Server side NewDC->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; - NewDC->Dc_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; + + NewDC->Dc_Attr.ulPenClr = RGB( 0, 0, 0 ); + NewDC->Dc_Attr.crPenClr = RGB( 0, 0, 0 ); + + NewDC->Dc_Attr.ulBrushClr = RGB( 255, 255, 255 ); // Do this way too. + NewDC->Dc_Attr.crBrushClr = RGB( 255, 255, 255 ); 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); NewDC->w.hPalette = NtGdiGetStockObject(DEFAULT_PALETTE); @@ -2477,10 +2479,10 @@ DC_InitDC(HDC DCHandle) */ } -VOID FASTCALL -DC_FreeDC(HDC DCToFree) +VOID +FASTCALL +DC_FreeDcAttr(HDC DCToFree) { -#if 0 KeEnterCriticalRegion(); { INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)DCToFree); @@ -2500,7 +2502,14 @@ DC_FreeDC(HDC DCToFree) } } KeLeaveCriticalRegion(); -#endif +} + +VOID FASTCALL +DC_FreeDC(HDC DCToFree) +{ +//#if 0 + DC_FreeDcAttr(DCToFree); +//#endif if (!GDIOBJ_FreeObj(GdiHandleTable, DCToFree, GDI_OBJECT_TYPE_DC)) { DPRINT("DC_FreeDC failed\n"); diff --git a/reactos/subsystems/win32/win32k/objects/dcutil.c b/reactos/subsystems/win32/win32k/objects/dcutil.c index 95aee9795df..a918ffbb610 100644 --- a/reactos/subsystems/win32/win32k/objects/dcutil.c +++ b/reactos/subsystems/win32/win32k/objects/dcutil.c @@ -8,7 +8,6 @@ static VOID CopytoUserDcAttr(PDC dc, PDC_ATTR Dc_Attr, FLONG Dirty) { - Dc_Attr->hpen = dc->Dc_Attr.hpen; Dc_Attr->hbrush = dc->Dc_Attr.hbrush; Dc_Attr->hColorSpace = dc->Dc_Attr.hColorSpace; @@ -67,10 +66,18 @@ CopyFromUserDcAttr(PDC dc, PDC_ATTR Dc_Attr, FLONG Dirty) } if ( Dirty & DIRTY_LINE || (Dc_Attr->ulDirty_ & DIRTY_LINE)) { - dc->Dc_Attr.ulPenClr = Dc_Attr->ulPenClr; - dc->Dc_Attr.crPenClr = Dc_Attr->crPenClr; + dc->Dc_Attr.crBackgroundClr = Dc_Attr->crBackgroundClr; + dc->Dc_Attr.ulBackgroundClr = Dc_Attr->ulBackgroundClr; + dc->Dc_Attr.ulPenClr = Dc_Attr->ulPenClr; + dc->Dc_Attr.crPenClr = Dc_Attr->crPenClr; Dc_Attr->ulDirty_ &= ~DIRTY_LINE; } + if ( Dirty & DIRTY_TEXT || (Dc_Attr->ulDirty_ & DIRTY_TEXT)) + { + dc->Dc_Attr.crForegroundClr = Dc_Attr->crForegroundClr; + dc->Dc_Attr.ulForegroundClr = Dc_Attr->ulForegroundClr; + Dc_Attr->ulDirty_ &= ~DIRTY_TEXT; + } } static @@ -133,6 +140,7 @@ DCU_UpdateUserXForms(PDC pDC, ULONG uMask) else { NTSTATUS Status = STATUS_SUCCESS; + KeEnterCriticalRegion(); _SEH_TRY { ProbeForWrite(DC_Attr, @@ -152,6 +160,7 @@ DCU_UpdateUserXForms(PDC pDC, ULONG uMask) Status = _SEH_GetExceptionCode(); } _SEH_END; + KeLeaveCriticalRegion(); if(!NT_SUCCESS(Status)) { SetLastNtError(Status); @@ -173,6 +182,7 @@ DCU_SyncDcAttrtoUser(PDC dc, FLONG Dirty) else { NTSTATUS Status = STATUS_SUCCESS; + KeEnterCriticalRegion(); _SEH_TRY { ProbeForWrite(Dc_Attr, @@ -185,14 +195,9 @@ DCU_SyncDcAttrtoUser(PDC dc, FLONG Dirty) Status = _SEH_GetExceptionCode(); } _SEH_END; - if(!NT_SUCCESS(Status)) - { - TryHarder = TRUE; - } - if (TryHarder) - { - return ReadWriteVMDcAttr( dc, Dirty, TRUE); - } + KeLeaveCriticalRegion(); + if(!NT_SUCCESS(Status)) TryHarder = TRUE; + if (TryHarder) return ReadWriteVMDcAttr( dc, Dirty, TRUE); } return TRUE; } @@ -218,6 +223,7 @@ DCU_SyncDcAttrtoW32k(PDC dc, FLONG Dirty) else { NTSTATUS Status = STATUS_SUCCESS; + KeEnterCriticalRegion(); _SEH_TRY { ProbeForRead(Dc_Attr, @@ -230,14 +236,9 @@ DCU_SyncDcAttrtoW32k(PDC dc, FLONG Dirty) Status = _SEH_GetExceptionCode(); } _SEH_END; - if(!NT_SUCCESS(Status)) - { - TryHarder = TRUE; - } - if (TryHarder) - { - return ReadWriteVMDcAttr( dc, Dirty, FALSE); - } + KeLeaveCriticalRegion(); + if(!NT_SUCCESS(Status)) TryHarder = TRUE; + if (TryHarder) return ReadWriteVMDcAttr( dc, Dirty, FALSE); } return TRUE; }