mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
Working Dc_Attr support, tested and it worked. Will plugin the rest later.
svn path=/trunk/; revision=28756
This commit is contained in:
parent
108ae6fb76
commit
4a7979cd3e
2 changed files with 212 additions and 1 deletions
|
@ -145,6 +145,7 @@ HDC FASTCALL DC_AllocDC(PUNICODE_STRING Driver);
|
|||
VOID FASTCALL DC_InitDC(HDC DCToInit);
|
||||
HDC FASTCALL DC_FindOpenDC(PUNICODE_STRING Driver);
|
||||
VOID FASTCALL DC_FreeDC(HDC DCToFree);
|
||||
VOID FASTCALL DC_FreeDcAttr(HDC);
|
||||
BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
|
||||
HDC FASTCALL DC_GetNextDC (PDC pDC);
|
||||
VOID FASTCALL DC_SetNextDC (PDC pDC, HDC hNextDC);
|
||||
|
@ -154,6 +155,10 @@ VOID FASTCALL DC_UpdateXforms(PDC dc);
|
|||
BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
|
||||
|
||||
BOOL FASTCALL DCU_UpdateUserXForms(PDC, ULONG);
|
||||
BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC, FLONG);
|
||||
BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC, FLONG);
|
||||
BOOL FASTCALL DCU_SyncDcAttrtoW32k(PDC, FLONG);
|
||||
BOOL FASTCALL DCU_SynchDcAttrtoW32k(HDC, FLONG);
|
||||
|
||||
VOID FASTCALL IntGetViewportExtEx(PDC dc, LPSIZE pt);
|
||||
VOID FASTCALL IntGetViewportOrgEx(PDC dc, LPPOINT pt);
|
||||
|
|
|
@ -4,6 +4,121 @@
|
|||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
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;
|
||||
Dc_Attr->hlfntNew = dc->Dc_Attr.hlfntNew;
|
||||
|
||||
Dc_Attr->jROP2 = dc->Dc_Attr.jROP2;
|
||||
Dc_Attr->jFillMode = dc->Dc_Attr.jFillMode;
|
||||
Dc_Attr->jStretchBltMode = dc->Dc_Attr.jStretchBltMode;
|
||||
Dc_Attr->lRelAbs = dc->Dc_Attr.lRelAbs;
|
||||
Dc_Attr->jBkMode = dc->Dc_Attr.jBkMode;
|
||||
|
||||
Dc_Attr->crBackgroundClr = dc->Dc_Attr.crBackgroundClr;
|
||||
Dc_Attr->ulBackgroundClr = dc->Dc_Attr.ulBackgroundClr;
|
||||
Dc_Attr->crForegroundClr = dc->Dc_Attr.crForegroundClr;
|
||||
Dc_Attr->ulForegroundClr = dc->Dc_Attr.ulForegroundClr;
|
||||
|
||||
Dc_Attr->ulBrushClr = dc->Dc_Attr.ulBrushClr;
|
||||
Dc_Attr->crBrushClr = dc->Dc_Attr.crBrushClr;
|
||||
|
||||
Dc_Attr->ulPenClr = dc->Dc_Attr.ulPenClr;
|
||||
Dc_Attr->crPenClr = dc->Dc_Attr.crPenClr;
|
||||
|
||||
Dc_Attr->ptlBrushOrigin.x = dc->Dc_Attr.ptlBrushOrigin.x;
|
||||
Dc_Attr->ptlBrushOrigin.y = dc->Dc_Attr.ptlBrushOrigin.y;
|
||||
|
||||
Dc_Attr->lTextAlign = dc->Dc_Attr.lTextAlign;
|
||||
Dc_Attr->lTextExtra = dc->Dc_Attr.lTextExtra;
|
||||
Dc_Attr->cBreak = dc->Dc_Attr.cBreak;
|
||||
Dc_Attr->lBreakExtra = dc->Dc_Attr.lBreakExtra;
|
||||
Dc_Attr->iMapMode = dc->Dc_Attr.iMapMode;
|
||||
Dc_Attr->iGraphicsMode = dc->Dc_Attr.iGraphicsMode;
|
||||
|
||||
Dc_Attr->ptlCurrent.x = dc->Dc_Attr.ptlCurrent.x;
|
||||
Dc_Attr->ptlCurrent.y = dc->Dc_Attr.ptlCurrent.y;
|
||||
Dc_Attr->ptlWindowOrg.x = dc->Dc_Attr.ptlWindowOrg.x;
|
||||
Dc_Attr->ptlWindowOrg.y = dc->Dc_Attr.ptlWindowOrg.y;
|
||||
Dc_Attr->szlWindowExt.cx = dc->Dc_Attr.szlWindowExt.cx;
|
||||
Dc_Attr->szlWindowExt.cy = dc->Dc_Attr.szlWindowExt.cy;
|
||||
Dc_Attr->ptlViewportOrg.x = dc->Dc_Attr.ptlViewportOrg.x;
|
||||
Dc_Attr->ptlViewportOrg.y = dc->Dc_Attr.ptlViewportOrg.y;
|
||||
Dc_Attr->szlViewportExt.cx = dc->Dc_Attr.szlViewportExt.cx;
|
||||
Dc_Attr->szlViewportExt.cy = dc->Dc_Attr.szlViewportExt.cy;
|
||||
|
||||
Dc_Attr->ulDirty_ = 0; // Force to Zero!
|
||||
}
|
||||
|
||||
static
|
||||
VOID
|
||||
CopyFromUserDcAttr(PDC dc, PDC_ATTR Dc_Attr, FLONG Dirty)
|
||||
{
|
||||
if ( (Dirty & DIRTY_FILL) || (Dc_Attr->ulDirty_ & DIRTY_FILL))
|
||||
{
|
||||
dc->Dc_Attr.ulBrushClr = Dc_Attr->ulBrushClr;
|
||||
dc->Dc_Attr.crBrushClr = Dc_Attr->crBrushClr;
|
||||
Dc_Attr->ulDirty_ &= ~DIRTY_FILL;
|
||||
}
|
||||
if ( Dirty & DIRTY_LINE || (Dc_Attr->ulDirty_ & DIRTY_LINE))
|
||||
{
|
||||
dc->Dc_Attr.ulPenClr = Dc_Attr->ulPenClr;
|
||||
dc->Dc_Attr.crPenClr = Dc_Attr->crPenClr;
|
||||
Dc_Attr->ulDirty_ &= ~DIRTY_LINE;
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
BOOL
|
||||
ReadWriteVMDcAttr(PDC dc, FLONG Dirty, BOOL Write)
|
||||
{
|
||||
BOOL Ret = FALSE;
|
||||
KeEnterCriticalRegion();
|
||||
{
|
||||
INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)dc->hSelf);
|
||||
PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index];
|
||||
HANDLE ProcessId = (HANDLE)(((ULONG_PTR)(Entry->ProcessId)) & 0x0000ffff);
|
||||
DC_ATTR lDc_AttrData;
|
||||
|
||||
if(Entry->UserData)
|
||||
{
|
||||
NTSTATUS Status = ZwReadVirtualMemory ( ProcessId,
|
||||
&(Entry->UserData),
|
||||
&lDc_AttrData,
|
||||
sizeof(DC_ATTR),
|
||||
NULL );
|
||||
if (Write)
|
||||
{
|
||||
if (NT_SUCCESS(Status)) CopytoUserDcAttr(dc, &lDc_AttrData, Dirty);
|
||||
Ret = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (NT_SUCCESS(Status)) CopyFromUserDcAttr(dc, &lDc_AttrData, Dirty);
|
||||
Ret = TRUE;
|
||||
}
|
||||
if (Write)
|
||||
Status = ZwWriteVirtualMemory ( ProcessId,
|
||||
&(Entry->UserData),
|
||||
&lDc_AttrData,
|
||||
sizeof(DC_ATTR),
|
||||
NULL );
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastNtError(Status);
|
||||
Ret = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
KeLeaveCriticalRegion();
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
FASTCALL
|
||||
|
@ -47,6 +162,97 @@ DCU_UpdateUserXForms(PDC pDC, ULONG uMask)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
FASTCALL
|
||||
DCU_SyncDcAttrtoUser(PDC dc, FLONG Dirty)
|
||||
{
|
||||
BOOL TryHarder = FALSE;
|
||||
PDC_ATTR Dc_Attr = dc->pDc_Attr;
|
||||
if (!Dirty) return FALSE;
|
||||
if (!Dc_Attr) return FALSE;
|
||||
else
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
_SEH_TRY
|
||||
{
|
||||
ProbeForWrite(Dc_Attr,
|
||||
sizeof(DC_ATTR),
|
||||
1);
|
||||
CopytoUserDcAttr( dc, Dc_Attr, Dirty);
|
||||
}
|
||||
_SEH_HANDLE
|
||||
{
|
||||
Status = _SEH_GetExceptionCode();
|
||||
}
|
||||
_SEH_END;
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
TryHarder = TRUE;
|
||||
}
|
||||
if (TryHarder)
|
||||
{
|
||||
return ReadWriteVMDcAttr( dc, Dirty, TRUE);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
FASTCALL
|
||||
DCU_SynchDcAttrtoUser(HDC hDC, FLONG Dirty)
|
||||
{
|
||||
PDC pDC = DC_LockDc ( hDC );
|
||||
BOOL Ret = DCU_SyncDcAttrtoUser(pDC, Dirty);
|
||||
DC_UnlockDc( pDC );
|
||||
return Ret;
|
||||
}
|
||||
|
||||
BOOL
|
||||
FASTCALL
|
||||
DCU_SyncDcAttrtoW32k(PDC dc, FLONG Dirty)
|
||||
{
|
||||
BOOL TryHarder = FALSE;
|
||||
PDC_ATTR Dc_Attr = dc->pDc_Attr;
|
||||
if (!Dirty) return FALSE;
|
||||
if (!Dc_Attr) return FALSE;
|
||||
else
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
_SEH_TRY
|
||||
{
|
||||
ProbeForRead(Dc_Attr,
|
||||
sizeof(DC_ATTR),
|
||||
1);
|
||||
CopyFromUserDcAttr( dc, Dc_Attr, Dirty);
|
||||
}
|
||||
_SEH_HANDLE
|
||||
{
|
||||
Status = _SEH_GetExceptionCode();
|
||||
}
|
||||
_SEH_END;
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
TryHarder = TRUE;
|
||||
}
|
||||
if (TryHarder)
|
||||
{
|
||||
return ReadWriteVMDcAttr( dc, Dirty, FALSE);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
FASTCALL
|
||||
DCU_SynchDcAttrtoW32k(HDC hDC, FLONG Dirty)
|
||||
{
|
||||
PDC pDC = DC_LockDc ( hDC );
|
||||
BOOL Ret = DCU_SyncDcAttrtoW32k(pDC, Dirty);
|
||||
DC_UnlockDc( pDC );
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
APIENTRY
|
||||
|
|
Loading…
Reference in a new issue