mirror of
https://github.com/reactos/reactos.git
synced 2025-07-25 12:54:02 +00:00
[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:
parent
06ad53455e
commit
01f84db1d4
8 changed files with 98 additions and 55 deletions
|
@ -1540,7 +1540,7 @@ SelectObject(HDC hDC,
|
||||||
PDC_ATTR pDc_Attr;
|
PDC_ATTR pDc_Attr;
|
||||||
HGDIOBJ hOldObj = NULL;
|
HGDIOBJ hOldObj = NULL;
|
||||||
UINT uType;
|
UINT uType;
|
||||||
// PTEB pTeb;
|
PTEB pTeb;
|
||||||
|
|
||||||
if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
|
if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
|
||||||
{
|
{
|
||||||
|
@ -1582,7 +1582,6 @@ SelectObject(HDC hDC,
|
||||||
case GDI_OBJECT_TYPE_FONT:
|
case GDI_OBJECT_TYPE_FONT:
|
||||||
hOldObj = pDc_Attr->hlfntNew;
|
hOldObj = pDc_Attr->hlfntNew;
|
||||||
if (hOldObj == hGdiObj) return hOldObj;
|
if (hOldObj == hGdiObj) return hOldObj;
|
||||||
#if 0
|
|
||||||
pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
|
pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
|
||||||
pDc_Attr->ulDirty_ |= DIRTY_CHARSET;
|
pDc_Attr->ulDirty_ |= DIRTY_CHARSET;
|
||||||
pDc_Attr->hlfntNew = hGdiObj;
|
pDc_Attr->hlfntNew = hGdiObj;
|
||||||
|
@ -1604,7 +1603,6 @@ SelectObject(HDC hDC,
|
||||||
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
|
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
|
||||||
return hOldObj;
|
return hOldObj;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
// default for select object font
|
// default for select object font
|
||||||
return NtGdiSelectFont(hDC, hGdiObj);
|
return NtGdiSelectFont(hDC, hGdiObj);
|
||||||
|
|
||||||
|
|
|
@ -18,4 +18,6 @@ IntGdiModifyWorldTransform(PDC pDc,
|
||||||
DWORD Mode);
|
DWORD Mode);
|
||||||
|
|
||||||
VOID FASTCALL IntMirrorWindowOrg(PDC);
|
VOID FASTCALL IntMirrorWindowOrg(PDC);
|
||||||
void FASTCALL IntFixIsotropicMapping(PDC dc);
|
void FASTCALL IntFixIsotropicMapping(PDC);
|
||||||
|
LONG FASTCALL IntCalcFillOrigin(PDC);
|
||||||
|
PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG);
|
|
@ -131,3 +131,6 @@ GDIOBJ_IncrementShareCount(POBJ Object)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE);
|
INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE);
|
||||||
|
|
||||||
|
#define GDIOBJ_GetKernelObj(Handle) \
|
||||||
|
((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData
|
||||||
|
|
|
@ -709,6 +709,7 @@ NtGdiSetBrushOrg(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point)
|
||||||
|
|
||||||
pdcattr->ptlBrushOrigin.x = XOrg;
|
pdcattr->ptlBrushOrigin.x = XOrg;
|
||||||
pdcattr->ptlBrushOrigin.y = YOrg;
|
pdcattr->ptlBrushOrigin.y = YOrg;
|
||||||
|
IntptlBrushOrigin(dc, XOrg, YOrg );
|
||||||
DC_UnlockDc(dc);
|
DC_UnlockDc(dc);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -1133,6 +1133,16 @@ IntCalcFillOrigin(PDC pdc)
|
||||||
return pdc->ptlFillOrigin.y;
|
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
|
VOID
|
||||||
APIENTRY
|
APIENTRY
|
||||||
GdiSetDCOrg(HDC hDC, LONG Left, LONG Top, PRECTL prc)
|
GdiSetDCOrg(HDC hDC, LONG Left, LONG Top, PRECTL prc)
|
||||||
|
|
|
@ -119,6 +119,8 @@ DC_AllocDC(PUNICODE_STRING Driver)
|
||||||
|
|
||||||
pdcattr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT);
|
pdcattr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT);
|
||||||
TextIntRealizeFont(pdcattr->hlfntNew,NULL);
|
TextIntRealizeFont(pdcattr->hlfntNew,NULL);
|
||||||
|
NewDC->hlfntCur = pdcattr->hlfntNew;
|
||||||
|
NewDC->dclevel.plfnt = GDIOBJ_GetKernelObj(pdcattr->hlfntNew);
|
||||||
|
|
||||||
NewDC->dclevel.hpal = NtGdiGetStockObject(DEFAULT_PALETTE);
|
NewDC->dclevel.hpal = NtGdiGetStockObject(DEFAULT_PALETTE);
|
||||||
NewDC->dclevel.ppal = PALETTE_ShareLockPalette(NewDC->dclevel.hpal);
|
NewDC->dclevel.ppal = PALETTE_ShareLockPalette(NewDC->dclevel.hpal);
|
||||||
|
@ -763,33 +765,15 @@ BOOL
|
||||||
APIENTRY
|
APIENTRY
|
||||||
NtGdiDeleteObjectApp(HANDLE DCHandle)
|
NtGdiDeleteObjectApp(HANDLE DCHandle)
|
||||||
{
|
{
|
||||||
|
GDIOBJTYPE ObjType;
|
||||||
|
|
||||||
/* Complete all pending operations */
|
/* Complete all pending operations */
|
||||||
NtGdiFlushUserBatch();
|
NtGdiFlushUserBatch();
|
||||||
|
|
||||||
if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE;
|
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 (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;
|
|
||||||
|
|
||||||
if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE;
|
|
||||||
|
|
||||||
ObjType = GDI_HANDLE_GET_TYPE(DCHandle) >> GDI_ENTRY_UPPER_SHIFT;
|
ObjType = GDI_HANDLE_GET_TYPE(DCHandle) >> GDI_ENTRY_UPPER_SHIFT;
|
||||||
|
|
||||||
if (GreGetObjectOwner( DCHandle, ObjType))
|
if (GreGetObjectOwner( DCHandle, ObjType))
|
||||||
|
|
|
@ -251,6 +251,49 @@ RealizeFontInit(HFONT hFont)
|
||||||
return pTextObj;
|
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 ******************************************************************/
|
/** Functions ******************************************************************/
|
||||||
|
|
||||||
INT
|
INT
|
||||||
|
@ -933,30 +976,7 @@ NtGdiSelectFont(
|
||||||
IN HDC hDC,
|
IN HDC hDC,
|
||||||
IN HFONT hFont)
|
IN HFONT hFont)
|
||||||
{
|
{
|
||||||
PDC pDC;
|
return GreSelectFont(hDC, hFont);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -106,9 +106,10 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
|
||||||
case GdiBCSetBrushOrg:
|
case GdiBCSetBrushOrg:
|
||||||
{
|
{
|
||||||
PGDIBSSETBRHORG pgSBO;
|
PGDIBSSETBRHORG pgSBO;
|
||||||
if(!dc) break;
|
if (!dc) break;
|
||||||
pgSBO = (PGDIBSSETBRHORG) pHdr;
|
pgSBO = (PGDIBSSETBRHORG) pHdr;
|
||||||
pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin;
|
pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin;
|
||||||
|
IntptlBrushOrigin(dc, pgSBO->ptlBrushOrigin.x, pgSBO->ptlBrushOrigin.y);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GdiBCExtSelClipRgn:
|
case GdiBCExtSelClipRgn:
|
||||||
|
@ -116,10 +117,34 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
|
||||||
case GdiBCSelObj:
|
case GdiBCSelObj:
|
||||||
{
|
{
|
||||||
PGDIBSOBJECT pgO;
|
PGDIBSOBJECT pgO;
|
||||||
if(!dc) break;
|
PTEXTOBJ pOrgFnt, pNewFnt = NULL;
|
||||||
|
HFONT hOrgFont = NULL;
|
||||||
|
|
||||||
|
if (!dc) break;
|
||||||
pgO = (PGDIBSOBJECT) pHdr;
|
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:
|
case GdiBCDelRgn:
|
||||||
DPRINT("Delete Region Object!\n");
|
DPRINT("Delete Region Object!\n");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue