[ros-diffs] [jimtabor] 28797: - 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.
jimtabor at svn.reactos.org
jimtabor at svn.reactos.org
Mon Sep 3 05:43:22 CEST 2007
Author: jimtabor
Date: Mon Sep 3 07:43:21 2007
New Revision: 28797
URL: http://svn.reactos.org/svn/reactos?rev=28797&view=rev
Log:
- 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.
Modified:
trunk/reactos/dll/win32/gdi32/gdi32.def
trunk/reactos/dll/win32/gdi32/misc/hacks.c
trunk/reactos/dll/win32/gdi32/objects/dc.c
trunk/reactos/dll/win32/gdi32/objects/palette.c
trunk/reactos/subsystems/win32/win32k/objects/dc.c
trunk/reactos/subsystems/win32/win32k/objects/dcutil.c
Modified: trunk/reactos/dll/win32/gdi32/gdi32.def
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/gdi32.def?rev=28797&r1=28796&r2=28797&view=diff
==============================================================================
--- trunk/reactos/dll/win32/gdi32/gdi32.def (original)
+++ trunk/reactos/dll/win32/gdi32/gdi32.def Mon Sep 3 07:43:21 2007
@@ -520,7 +520,7 @@
PtInRegion at 12=NtGdiPtInRegion at 12
PtVisible at 12=NtGdiPtVisible at 12
QueryFontAssocStatus at 0
-RealizePalette at 4=NtGdiRealizePalette at 4
+RealizePalette at 4
RectInRegion at 8=NtGdiRectInRegion at 8
RectVisible at 8=NtGdiRectVisible at 8
Rectangle at 20
@@ -588,7 +588,7 @@
SetSystemPaletteUse at 8
SetTextAlign at 8=NtGdiSetTextAlign at 8
SetTextCharacterExtra at 8
-SetTextColor at 8=NtGdiSetTextColor at 8
+SetTextColor at 8
SetTextJustification at 12
SetViewportExtEx at 16=NtGdiSetViewportExtEx at 16
SetViewportOrgEx at 16=NtGdiSetViewportOrgEx at 16
Modified: trunk/reactos/dll/win32/gdi32/misc/hacks.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/misc/hacks.c?rev=28797&r1=28796&r2=28797&view=diff
==============================================================================
--- trunk/reactos/dll/win32/gdi32/misc/hacks.c (original)
+++ trunk/reactos/dll/win32/gdi32/misc/hacks.c Mon Sep 3 07:43:21 2007
@@ -108,18 +108,6 @@
* @implemented
*
*/
-COLORREF
-STDCALL
-SetBkColor(HDC hdc,
- COLORREF crColor)
-{
- return NtGdiSetBkColor(hdc,crColor);
-}
-
-/*
- * @implemented
- *
- */
HGDIOBJ
STDCALL
SelectObject(HDC hdc,
Modified: trunk/reactos/dll/win32/gdi32/objects/dc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/objects/dc.c?rev=28797&r1=28796&r2=28797&view=diff
==============================================================================
--- trunk/reactos/dll/win32/gdi32/objects/dc.c (original)
+++ trunk/reactos/dll/win32/gdi32/objects/dc.c Mon Sep 3 07:43:21 2007
@@ -320,13 +320,13 @@
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 @@
}
return hGO;
}
-#endif
+//#endif
return NtGdiGetDCObject( hDC, iType );
}
@@ -691,12 +691,12 @@
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 @@
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 @@
COLORREF crColor
)
{
-#if 0
+//#if 0
PDC_ATTR Dc_Attr;
COLORREF OldColor = CLR_INVALID;
@@ -745,7 +745,7 @@
}
}
return OldColor;
-#endif
+//#endif
return NtUserSetDCBrushColor(hdc, crColor);
}
@@ -759,27 +759,122 @@
COLORREF crColor
)
{
+//#if 0
+ PDC_ATTR Dc_Attr;
+ COLORREF OldColor = CLR_INVALID;
+
+ if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return OldColor;
+ else
+ {
+ OldColor = (COLORREF) Dc_Attr->ulPenClr;
+ Dc_Attr->ulPenClr = (ULONG) crColor;
+
+ if ( Dc_Attr->crPenClr != crColor )
+ {
+ Dc_Attr->ulDirty_ |= DIRTY_LINE;
+ Dc_Attr->crPenClr = crColor;
+ }
+ }
+ return OldColor;
+//#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;
- else
- {
- OldColor = (COLORREF) Dc_Attr->ulPenClr;
- Dc_Attr->ulPenClr = (ULONG) crColor;
-
- if ( Dc_Attr->crPenClr != crColor )
- {
- Dc_Attr->ulDirty_ |= DIRTY_LINE;
- Dc_Attr->crPenClr = crColor;
- }
+#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 NtUserSetDCPenColor(hdc, crColor);
-}
-
+ 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
Modified: trunk/reactos/dll/win32/gdi32/objects/palette.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/objects/palette.c?rev=28797&r1=28796&r2=28797&view=diff
==============================================================================
--- trunk/reactos/dll/win32/gdi32/objects/palette.c (original)
+++ trunk/reactos/dll/win32/gdi32/objects/palette.c Mon Sep 3 07:43:21 2007
@@ -66,6 +66,36 @@
/*
* @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
+ */
UINT
WINAPI
SetDIBColorTable(HDC hDC,
Modified: trunk/reactos/subsystems/win32/win32k/objects/dc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/dc.c?rev=28797&r1=28796&r2=28797&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/dc.c (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/dc.c Mon Sep 3 07:43:21 2007
@@ -252,6 +252,7 @@
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 @@
NtGdiDeleteObject(hVisRgn);
DC_InitDC(hNewDC);
+ DCU_SynchDcAttrtoUser(hNewDC, -1);
return hNewDC;
}
@@ -933,9 +935,17 @@
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 @@
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 @@
default:
break;
}
+ DCU_SyncDcAttrtoUser(dc, -1);
DC_UnlockDc( dc );
return objOrg;
}
@@ -2335,7 +2347,6 @@
PDC NewDC;
HDC hDC;
PWSTR Buf = NULL;
-// PDC_ATTR DC_Attr = NULL;
if (Driver != NULL)
{
@@ -2356,7 +2367,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(),
@@ -2382,16 +2393,15 @@
}
}
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 @@
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 @@
*/
}
-VOID FASTCALL
-DC_FreeDC(HDC DCToFree)
-{
-#if 0
+VOID
+FASTCALL
+DC_FreeDcAttr(HDC DCToFree)
+{
KeEnterCriticalRegion();
{
INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)DCToFree);
@@ -2500,7 +2502,14 @@
}
}
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");
Modified: trunk/reactos/subsystems/win32/win32k/objects/dcutil.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/dcutil.c?rev=28797&r1=28796&r2=28797&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/dcutil.c (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/dcutil.c Mon Sep 3 07:43:21 2007
@@ -8,7 +8,6 @@
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,9 +66,17 @@
}
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;
}
}
@@ -133,6 +140,7 @@
else
{
NTSTATUS Status = STATUS_SUCCESS;
+ KeEnterCriticalRegion();
_SEH_TRY
{
ProbeForWrite(DC_Attr,
@@ -152,6 +160,7 @@
Status = _SEH_GetExceptionCode();
}
_SEH_END;
+ KeLeaveCriticalRegion();
if(!NT_SUCCESS(Status))
{
SetLastNtError(Status);
@@ -173,6 +182,7 @@
else
{
NTSTATUS Status = STATUS_SUCCESS;
+ KeEnterCriticalRegion();
_SEH_TRY
{
ProbeForWrite(Dc_Attr,
@@ -185,14 +195,9 @@
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 @@
else
{
NTSTATUS Status = STATUS_SUCCESS;
+ KeEnterCriticalRegion();
_SEH_TRY
{
ProbeForRead(Dc_Attr,
@@ -230,14 +236,9 @@
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;
}
More information about the Ros-diffs
mailing list