[Win32k|Gdi32]

- Enable font batch and fixed setting brush origion. Use the new delete object functions in win32k.

svn path=/trunk/; revision=46758
This commit is contained in:
James Tabor 2010-04-07 00:46:16 +00:00
parent 06ad53455e
commit 01f84db1d4
8 changed files with 98 additions and 55 deletions

View file

@ -1540,7 +1540,7 @@ SelectObject(HDC hDC,
PDC_ATTR pDc_Attr;
HGDIOBJ hOldObj = NULL;
UINT uType;
// PTEB pTeb;
PTEB pTeb;
if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
{
@ -1582,7 +1582,6 @@ SelectObject(HDC hDC,
case GDI_OBJECT_TYPE_FONT:
hOldObj = pDc_Attr->hlfntNew;
if (hOldObj == hGdiObj) return hOldObj;
#if 0
pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
pDc_Attr->ulDirty_ |= DIRTY_CHARSET;
pDc_Attr->hlfntNew = hGdiObj;
@ -1604,7 +1603,6 @@ SelectObject(HDC hDC,
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
return hOldObj;
}
#endif
// default for select object font
return NtGdiSelectFont(hDC, hGdiObj);

View file

@ -18,4 +18,6 @@ IntGdiModifyWorldTransform(PDC pDc,
DWORD Mode);
VOID FASTCALL IntMirrorWindowOrg(PDC);
void FASTCALL IntFixIsotropicMapping(PDC dc);
void FASTCALL IntFixIsotropicMapping(PDC);
LONG FASTCALL IntCalcFillOrigin(PDC);
PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG);

View file

@ -131,3 +131,6 @@ GDIOBJ_IncrementShareCount(POBJ Object)
#endif
INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE);
#define GDIOBJ_GetKernelObj(Handle) \
((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData

View file

@ -709,6 +709,7 @@ NtGdiSetBrushOrg(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point)
pdcattr->ptlBrushOrigin.x = XOrg;
pdcattr->ptlBrushOrigin.y = YOrg;
IntptlBrushOrigin(dc, XOrg, YOrg );
DC_UnlockDc(dc);
return TRUE;

View file

@ -1133,6 +1133,16 @@ IntCalcFillOrigin(PDC pdc)
return pdc->ptlFillOrigin.y;
}
PPOINTL
FASTCALL
IntptlBrushOrigin(PDC pdc, LONG x, LONG y )
{
pdc->dclevel.ptlBrushOrigin.x = x;
pdc->dclevel.ptlBrushOrigin.y = y;
IntCalcFillOrigin(pdc);
return &pdc->dclevel.ptlBrushOrigin;
}
VOID
APIENTRY
GdiSetDCOrg(HDC hDC, LONG Left, LONG Top, PRECTL prc)

View file

@ -119,6 +119,8 @@ DC_AllocDC(PUNICODE_STRING Driver)
pdcattr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT);
TextIntRealizeFont(pdcattr->hlfntNew,NULL);
NewDC->hlfntCur = pdcattr->hlfntNew;
NewDC->dclevel.plfnt = GDIOBJ_GetKernelObj(pdcattr->hlfntNew);
NewDC->dclevel.hpal = NtGdiGetStockObject(DEFAULT_PALETTE);
NewDC->dclevel.ppal = PALETTE_ShareLockPalette(NewDC->dclevel.hpal);
@ -762,34 +764,16 @@ NtGdiCreateCompatibleDC(HDC hDC)
BOOL
APIENTRY
NtGdiDeleteObjectApp(HANDLE DCHandle)
{
/* Complete all pending operations */
NtGdiFlushUserBatch();
if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE;
if (GDI_HANDLE_GET_TYPE(DCHandle) != GDI_OBJECT_TYPE_DC)
return GreDeleteObject((HGDIOBJ) DCHandle);
if (IsObjectDead((HGDIOBJ)DCHandle)) return TRUE;
if (!GDIOBJ_OwnedByCurrentProcess(DCHandle))
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
return FALSE;
}
return IntGdiDeleteDC(DCHandle, FALSE);
}
BOOL
APIENTRY
NewNtGdiDeleteObjectApp(HANDLE DCHandle)
{
GDIOBJTYPE ObjType;
/* Complete all pending operations */
NtGdiFlushUserBatch();
if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE;
if (IsObjectDead((HGDIOBJ)DCHandle)) return TRUE;
ObjType = GDI_HANDLE_GET_TYPE(DCHandle) >> GDI_ENTRY_UPPER_SHIFT;
if (GreGetObjectOwner( DCHandle, ObjType))

View file

@ -251,6 +251,49 @@ RealizeFontInit(HFONT hFont)
return pTextObj;
}
HFONT
FASTCALL
GreSelectFont( HDC hDC, HFONT hFont)
{
PDC pdc;
PDC_ATTR pdcattr;
PTEXTOBJ pOrgFnt, pNewFnt = NULL;
HFONT hOrgFont = NULL;
if (!hDC || !hFont) return NULL;
pdc = DC_LockDc(hDC);
if (!pdc)
{
return NULL;
}
if (NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL)))
{
/* LFONTOBJ use share and locking. */
pNewFnt = TEXTOBJ_LockText(hFont);
pdcattr = pdc->pdcattr;
pOrgFnt = pdc->dclevel.plfnt;
if (pOrgFnt)
{
hOrgFont = pOrgFnt->BaseObject.hHmgr;
}
else
{
hOrgFont = pdcattr->hlfntNew;
}
pdc->dclevel.plfnt = pNewFnt;
pdc->hlfntCur = hFont;
pdcattr->hlfntNew = hFont;
pdcattr->ulDirty_ |= DIRTY_CHARSET;
pdcattr->ulDirty_ &= ~SLOW_WIDTHS;
}
if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt);
DC_UnlockDc(pdc);
return hOrgFont;
}
/** Functions ******************************************************************/
INT
@ -933,30 +976,7 @@ NtGdiSelectFont(
IN HDC hDC,
IN HFONT hFont)
{
PDC pDC;
PDC_ATTR pdcattr;
HFONT hOrgFont = NULL;
if (hDC == NULL || hFont == NULL) return NULL;
pDC = DC_LockDc(hDC);
if (!pDC)
{
return NULL;
}
pdcattr = pDC->pdcattr;
/* FIXME: what if not successful? */
if(NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL)))
{
hOrgFont = pdcattr->hlfntNew;
pdcattr->hlfntNew = hFont;
}
DC_UnlockDc(pDC);
return hOrgFont;
return GreSelectFont(hDC, hFont);
}

View file

@ -106,9 +106,10 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
case GdiBCSetBrushOrg:
{
PGDIBSSETBRHORG pgSBO;
if(!dc) break;
if (!dc) break;
pgSBO = (PGDIBSSETBRHORG) pHdr;
pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin;
IntptlBrushOrigin(dc, pgSBO->ptlBrushOrigin.x, pgSBO->ptlBrushOrigin.y);
break;
}
case GdiBCExtSelClipRgn:
@ -116,10 +117,34 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
case GdiBCSelObj:
{
PGDIBSOBJECT pgO;
if(!dc) break;
PTEXTOBJ pOrgFnt, pNewFnt = NULL;
HFONT hOrgFont = NULL;
if (!dc) break;
pgO = (PGDIBSOBJECT) pHdr;
TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL);
pdcattr->ulDirty_ &= ~(DIRTY_CHARSET);
if (NT_SUCCESS(TextIntRealizeFont((HFONT)pgO->hgdiobj,NULL)))
{
/* LFONTOBJ use share and locking. */
pNewFnt = TEXTOBJ_LockText(pgO->hgdiobj);
pOrgFnt = dc->dclevel.plfnt;
if (pOrgFnt)
{
hOrgFont = pOrgFnt->BaseObject.hHmgr;
}
else
{
hOrgFont = pdcattr->hlfntNew;
}
dc->dclevel.plfnt = pNewFnt;
dc->hlfntCur = pgO->hgdiobj;
pdcattr->hlfntNew = pgO->hgdiobj;
pdcattr->ulDirty_ |= DIRTY_CHARSET;
pdcattr->ulDirty_ &= ~SLOW_WIDTHS;
}
if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt);
break;
}
case GdiBCDelRgn:
DPRINT("Delete Region Object!\n");