mirror of
https://github.com/reactos/reactos.git
synced 2025-07-23 03:23:42 +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;
|
||||
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);
|
||||
|
||||
|
|
|
@ -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);
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue