- Start the implementation and support for dc attribute dirty bits. See bug 3863.

svn path=/trunk/; revision=37346
This commit is contained in:
James Tabor 2008-11-13 23:12:42 +00:00
parent 122723ef7d
commit 02456c2f68
5 changed files with 155 additions and 109 deletions

View file

@ -268,6 +268,8 @@ VOID FASTCALL IntGdiUnreferencePdev(PGDIDEVICE pPDev, DWORD CleanUpType);
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC); HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
BOOL FASTCALL IntGdiCleanDC(HDC hDC); BOOL FASTCALL IntGdiCleanDC(HDC hDC);
VOID FASTCALL IntvGetDeviceCaps(PGDIDEVICE, PDEVCAPS); VOID FASTCALL IntvGetDeviceCaps(PGDIDEVICE, PDEVCAPS);
HPEN FASTCALL IntGdiSelectPen(PDC,HPEN);
HBRUSH FASTCALL IntGdiSelectBrush(PDC,HBRUSH);
extern PGDIDEVICE pPrimarySurface; extern PGDIDEVICE pPrimarySurface;

View file

@ -199,6 +199,7 @@ IntGdiArcInternal(
int YEndArc) int YEndArc)
{ {
BOOL Ret; BOOL Ret;
PDC_ATTR pDc_Attr;
DPRINT("StartX: %d, StartY: %d, EndX: %d, EndY: %d\n", DPRINT("StartX: %d, StartY: %d, EndX: %d, EndY: %d\n",
XStartArc,YStartArc,XEndArc,YEndArc); XStartArc,YStartArc,XEndArc,YEndArc);
@ -221,6 +222,15 @@ IntGdiArcInternal(
arctype); arctype);
} }
pDc_Attr = dc->pDc_Attr;
if (!pDc_Attr) pDc_Attr = &dc->Dc_Attr;
if (pDc_Attr->ulDirty_ & DC_BRUSH_DIRTY)
IntGdiSelectBrush(dc,pDc_Attr->hbrush);
if (pDc_Attr->ulDirty_ & DC_PEN_DIRTY)
IntGdiSelectPen(dc,pDc_Attr->hpen);
if (arctype == GdiTypeArcTo) if (arctype == GdiTypeArcTo)
{ {
if (dc->DcLevel.flPath & DCPATH_CLOCKWISE) if (dc->DcLevel.flPath & DCPATH_CLOCKWISE)

View file

@ -509,6 +509,52 @@ IntGdiCreateNullBrush(VOID)
return hBrush; return hBrush;
} }
HBRUSH
FASTCALL
IntGdiSelectBrush(
PDC pDC,
HBRUSH hBrush)
{
PDC_ATTR pDc_Attr;
HBRUSH hOrgBrush;
PGDIBRUSHOBJ pBrush;
XLATEOBJ *XlateObj;
BOOLEAN bFailed;
if (pDC == NULL || hBrush == NULL) return NULL;
pDc_Attr = pDC->pDc_Attr;
if(!pDc_Attr) pDc_Attr = &pDC->Dc_Attr;
pBrush = BRUSHOBJ_LockBrush(hBrush);
if (pBrush == NULL)
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
return NULL;
}
XlateObj = IntGdiCreateBrushXlate(pDC, pBrush, &bFailed);
BRUSHOBJ_UnlockBrush(pBrush);
if(bFailed)
{
return NULL;
}
hOrgBrush = pDc_Attr->hbrush;
pDc_Attr->hbrush = hBrush;
if (pDC->XlateBrush != NULL)
{
EngDeleteXlate(pDC->XlateBrush);
}
pDC->XlateBrush = XlateObj;
pDc_Attr->ulDirty_ &= ~DC_BRUSH_DIRTY;
return hOrgBrush;
}
/* PUBLIC FUNCTIONS ***********************************************************/ /* PUBLIC FUNCTIONS ***********************************************************/
HBRUSH STDCALL HBRUSH STDCALL
@ -656,4 +702,31 @@ IntGdiSetSolidBrushColor(HBRUSH hBrush, COLORREF Color)
BRUSHOBJ_UnlockBrush(BrushObject); BRUSHOBJ_UnlockBrush(BrushObject);
} }
/*
* @implemented
*/
HBRUSH
APIENTRY
NtGdiSelectBrush(
IN HDC hDC,
IN HBRUSH hBrush)
{
PDC pDC;
HBRUSH hOrgBrush;
if (hDC == NULL || hBrush == NULL) return NULL;
pDC = DC_LockDc(hDC);
if (!pDC)
{
return NULL;
}
hOrgBrush = IntGdiSelectBrush(pDC,hBrush);
DC_UnlockDc(pDC);
return hOrgBrush;
}
/* EOF */ /* EOF */

View file

@ -2139,61 +2139,6 @@ NtGdiSelectBitmap(
return hOrgBmp; return hOrgBmp;
} }
/*
* @implemented
*/
HBRUSH
APIENTRY
NtGdiSelectBrush(
IN HDC hDC,
IN HBRUSH hBrush)
{
PDC pDC;
PDC_ATTR pDc_Attr;
HBRUSH hOrgBrush;
PGDIBRUSHOBJ pBrush;
XLATEOBJ *XlateObj;
BOOLEAN bFailed;
if (hDC == NULL || hBrush == NULL) return NULL;
pDC = DC_LockDc(hDC);
if (!pDC)
{
return NULL;
}
pDc_Attr = pDC->pDc_Attr;
if(!pDc_Attr) pDc_Attr = &pDC->Dc_Attr;
pBrush = BRUSHOBJ_LockBrush(hBrush);
if (pBrush == NULL)
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
DC_UnlockDc(pDC);
return NULL;
}
XlateObj = IntGdiCreateBrushXlate(pDC, pBrush, &bFailed);
BRUSHOBJ_UnlockBrush(pBrush);
if(bFailed)
{
DC_UnlockDc(pDC);
return NULL;
}
hOrgBrush = pDc_Attr->hbrush;
pDc_Attr->hbrush = hBrush;
if (pDC->XlateBrush != NULL)
{
EngDeleteXlate(pDC->XlateBrush);
}
pDC->XlateBrush = XlateObj;
DC_UnlockDc(pDC);
return hOrgBrush;
}
/* /*
* @implemented * @implemented
*/ */
@ -2230,60 +2175,6 @@ NtGdiSelectFont(
return hOrgFont; return hOrgFont;
} }
/*
* @implemented
*/
HPEN
APIENTRY
NtGdiSelectPen(
IN HDC hDC,
IN HPEN hPen)
{
PDC pDC;
PDC_ATTR pDc_Attr;
HPEN hOrgPen = NULL;
PGDIBRUSHOBJ pPen;
XLATEOBJ *XlateObj;
BOOLEAN bFailed;
if (hDC == NULL || hPen == NULL) return NULL;
pDC = DC_LockDc(hDC);
if (!pDC)
{
return NULL;
}
pDc_Attr = pDC->pDc_Attr;
if(!pDc_Attr) pDc_Attr = &pDC->Dc_Attr;
pPen = PENOBJ_LockPen(hPen);
if (pPen == NULL)
{
return NULL;
}
XlateObj = IntGdiCreateBrushXlate(pDC, pPen, &bFailed);
PENOBJ_UnlockPen(pPen);
if (bFailed)
{
SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
return NULL;
}
hOrgPen = pDc_Attr->hpen;
pDc_Attr->hpen = hPen;
if (pDC->XlatePen != NULL)
{
EngDeleteXlate(pDC->XlatePen);
}
pDC->XlatePen = XlateObj;
DC_UnlockDc(pDC);
return hOrgPen;
}
HPALETTE HPALETTE
FASTCALL FASTCALL
GdiSelectPalette(HDC hDC, GdiSelectPalette(HDC hDC,

View file

@ -247,6 +247,50 @@ PEN_GetObject(PGDIBRUSHOBJ pPenObject, INT cbCount, PLOGPEN pBuffer)
return cbRetCount; return cbRetCount;
} }
HPEN
FASTCALL
IntGdiSelectPen(
PDC pDC,
HPEN hPen)
{
PDC_ATTR pDc_Attr;
HPEN hOrgPen = NULL;
PGDIBRUSHOBJ pPen;
XLATEOBJ *XlateObj;
BOOLEAN bFailed;
pDc_Attr = pDC->pDc_Attr;
if(!pDc_Attr) pDc_Attr = &pDC->Dc_Attr;
pPen = PENOBJ_LockPen(hPen);
if (pPen == NULL)
{
return NULL;
}
XlateObj = IntGdiCreateBrushXlate(pDC, pPen, &bFailed);
PENOBJ_UnlockPen(pPen);
if (bFailed)
{
SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
return NULL;
}
hOrgPen = pDc_Attr->hpen;
pDc_Attr->hpen = hPen;
if (pDC->XlatePen != NULL)
{
EngDeleteXlate(pDC->XlatePen);
}
pDc_Attr->ulDirty_ &= ~DC_PEN_DIRTY;
pDC->XlatePen = XlateObj;
return hOrgPen;
}
/* PUBLIC FUNCTIONS ***********************************************************/ /* PUBLIC FUNCTIONS ***********************************************************/
HPEN STDCALL HPEN STDCALL
@ -346,5 +390,31 @@ NtGdiExtCreatePen(
return hPen; return hPen;
} }
/*
* @implemented
*/
HPEN
APIENTRY
NtGdiSelectPen(
IN HDC hDC,
IN HPEN hPen)
{
PDC pDC;
HPEN hOrgPen;
if (hDC == NULL || hPen == NULL) return NULL;
pDC = DC_LockDc(hDC);
if (!pDC)
{
return NULL;
}
hOrgPen = IntGdiSelectPen(pDC,hPen);
DC_UnlockDc(pDC);
return hOrgPen;
}
/* EOF */ /* EOF */