- Add new function for locking text font objects when realized. This is for batching support.

- Batching works for selected fonts, due to a system initialization bug this is disabled.
- Miscellaneous changes and updates.


svn path=/trunk/; revision=37159
This commit is contained in:
James Tabor 2008-11-03 05:38:02 +00:00
parent bed3b885b4
commit 53586450b4
7 changed files with 80 additions and 40 deletions

View file

@ -1535,7 +1535,7 @@ SelectObject(HDC hDC,
HGDIOBJ hGdiObj) HGDIOBJ hGdiObj)
{ {
PDC_ATTR pDc_Attr; PDC_ATTR pDc_Attr;
// HGDIOBJ hOldObj = NULL; HGDIOBJ hOldObj = NULL;
// PTEB pTeb; // PTEB pTeb;
if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
@ -1580,10 +1580,15 @@ SelectObject(HDC hDC,
return NtGdiSelectPen(hDC, hGdiObj); return NtGdiSelectPen(hDC, hGdiObj);
case GDI_OBJECT_TYPE_FONT: case GDI_OBJECT_TYPE_FONT:
hOldObj = pDc_Attr->hlfntNew;
if (hOldObj == hGdiObj) return hOldObj;
#if 0 #if 0
pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
pDc_Attr->ulDirty_ |= DIRTY_CHARSET;
pDc_Attr->hlfntNew = hGdiObj;
pTeb = NtCurrentTeb(); pTeb = NtCurrentTeb();
if (((pTeb->GdiTebBatch.HDC == 0) || if (((pTeb->GdiTebBatch.HDC == 0) ||
(pTeb->GdiTebBatch.HDC == (ULONG)hDC)) && (pTeb->GdiTebBatch.HDC == hDC)) &&
((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) && ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) &&
(!(pDc_Attr->ulDirty_ & DC_DIBSECTION))) (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)))
{ {
@ -1594,14 +1599,15 @@ SelectObject(HDC hDC,
pgO->hgdiobj = hGdiObj; pgO->hgdiobj = hGdiObj;
pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT); pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
pTeb->GdiTebBatch.HDC = (ULONG)hDC; pTeb->GdiTebBatch.HDC = hDC;
pTeb->GdiBatchCount++; pTeb->GdiBatchCount++;
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
return pDc_Attr->hlfntNew; return hOldObj;
} }
#endif #endif
// default for select object font // default for select object font
return NtGdiSelectFont(hDC, hGdiObj); return NtGdiSelectFont(hDC, hGdiObj);
#if 0 #if 0
case GDI_OBJECT_TYPE_METADC: case GDI_OBJECT_TYPE_METADC:
return MFDRV_SelectObject( hDC, hGdiObj); return MFDRV_SelectObject( hDC, hGdiObj);

View file

@ -54,6 +54,8 @@ typedef struct _STRGDI
ULONG acFaceNameGlyphs[8]; ULONG acFaceNameGlyphs[8];
} STRGDI, *PSTRGDI; } STRGDI, *PSTRGDI;
#define TEXTOBJECT_INIT 0x00010000
/* GDI logical font object */ /* GDI logical font object */
typedef struct typedef struct
{ {
@ -62,9 +64,13 @@ typedef struct
BASEOBJECT BaseObject; BASEOBJECT BaseObject;
LFTYPE lft; LFTYPE lft;
FLONG fl; FLONG fl;
ENUMLOGFONTEXDVW logfont; //LOGFONTW logfont;
FONTOBJ *Font; FONTOBJ *Font;
BOOLEAN Initialized; /* Don't reinitialize for each DC */ WCHAR FullName[LF_FULLFACESIZE];
WCHAR Style[LF_FACESIZE];
WCHAR FaceName[LF_FACESIZE];
DWORD dwOffsetEndArray;
// Fixed:
ENUMLOGFONTEXDVW logfont;
} TEXTOBJ, *PTEXTOBJ; } TEXTOBJ, *PTEXTOBJ;
/* Internal interface */ /* Internal interface */
@ -76,7 +82,8 @@ typedef struct
#define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT)) #define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT))
#define TEXTOBJ_UnlockText(pBMObj) GDIOBJ_UnlockObjByPtr ((POBJ)pBMObj) #define TEXTOBJ_UnlockText(pBMObj) GDIOBJ_UnlockObjByPtr ((POBJ)pBMObj)
NTSTATUS FASTCALL TextIntRealizeFont(HFONT FontHandle); PTEXTOBJ FASTCALL RealizeFontInit(HFONT);
NTSTATUS FASTCALL TextIntRealizeFont(HFONT,PTEXTOBJ);
NTSTATUS FASTCALL TextIntCreateFontIndirect(CONST LPLOGFONTW lf, HFONT *NewFont); NTSTATUS FASTCALL TextIntCreateFontIndirect(CONST LPLOGFONTW lf, HFONT *NewFont);
BOOL FASTCALL InitFontSupport(VOID); BOOL FASTCALL InitFontSupport(VOID);
BOOL FASTCALL IntIsFontRenderingEnabled(VOID); BOOL FASTCALL IntIsFontRenderingEnabled(VOID);

View file

@ -2216,7 +2216,7 @@ NtGdiSelectFont(
if(!pDc_Attr) pDc_Attr = &pDC->Dc_Attr; if(!pDc_Attr) pDc_Attr = &pDC->Dc_Attr;
/* FIXME: what if not successful? */ /* FIXME: what if not successful? */
if(NT_SUCCESS(TextIntRealizeFont((HFONT)hFont))) if(NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL)))
{ {
hOrgFont = pDc_Attr->hlfntNew; hOrgFont = pDc_Attr->hlfntNew;
pDc_Attr->hlfntNew = hFont; pDc_Attr->hlfntNew = hFont;
@ -2668,7 +2668,7 @@ DC_AllocDC(PUNICODE_STRING Driver)
Dc_Attr->hpen = NtGdiGetStockObject( BLACK_PEN ); Dc_Attr->hpen = NtGdiGetStockObject( BLACK_PEN );
//// ////
Dc_Attr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT); Dc_Attr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT);
TextIntRealizeFont(Dc_Attr->hlfntNew); TextIntRealizeFont(Dc_Attr->hlfntNew,NULL);
NewDC->DcLevel.hpal = NtGdiGetStockObject(DEFAULT_PALETTE); NewDC->DcLevel.hpal = NtGdiGetStockObject(DEFAULT_PALETTE);
NewDC->DcLevel.laPath.eMiterLimit = 10.0; NewDC->DcLevel.laPath.eMiterLimit = 10.0;

View file

@ -55,6 +55,27 @@ FontGetObject(PTEXTOBJ TFont, INT Count, PVOID Buffer)
return Count; return Count;
} }
PTEXTOBJ
FASTCALL
RealizeFontInit(HFONT hFont)
{
NTSTATUS Status = STATUS_SUCCESS;
PTEXTOBJ pTextObj;
pTextObj = TEXTOBJ_LockText(hFont);
if ( pTextObj && !pTextObj->fl & TEXTOBJECT_INIT)
{
Status = TextIntRealizeFont(hFont, pTextObj);
if (!NT_SUCCESS(Status))
{
TEXTOBJ_UnlockText(pTextObj);
return NULL;
}
}
return pTextObj;
}
/** Functions ******************************************************************/ /** Functions ******************************************************************/
INT INT
@ -146,7 +167,7 @@ NtGdiGetFontData(
if(!Dc_Attr) Dc_Attr = &Dc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &Dc->Dc_Attr;
hFont = Dc_Attr->hlfntNew; hFont = Dc_Attr->hlfntNew;
TextObj = TEXTOBJ_LockText(hFont); TextObj = RealizeFontInit(hFont);
DC_UnlockDc(Dc); DC_UnlockDc(Dc);
if (TextObj == NULL) if (TextObj == NULL)
@ -193,7 +214,7 @@ NtGdiGetFontUnicodeRanges(
if(!Dc_Attr) Dc_Attr = &pDc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &pDc->Dc_Attr;
hFont = Dc_Attr->hlfntNew; hFont = Dc_Attr->hlfntNew;
TextObj = TEXTOBJ_LockText(hFont); TextObj = RealizeFontInit(hFont);
if ( TextObj == NULL) if ( TextObj == NULL)
{ {
@ -363,7 +384,7 @@ NtGdiGetOutlineTextMetricsInternalW (HDC hDC,
Dc_Attr = dc->pDc_Attr; Dc_Attr = dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
hFont = Dc_Attr->hlfntNew; hFont = Dc_Attr->hlfntNew;
TextObj = TEXTOBJ_LockText(hFont); TextObj = RealizeFontInit(hFont);
DC_UnlockDc(dc); DC_UnlockDc(dc);
if (TextObj == NULL) if (TextObj == NULL)
{ {
@ -543,7 +564,7 @@ NtGdiHfontCreate(
} }
hNewFont = TextObj->BaseObject.hHmgr; hNewFont = TextObj->BaseObject.hHmgr;
TextObj->lft = cjElfw; TextObj->lft = lft;
TextObj->fl = fl; TextObj->fl = fl;
RtlCopyMemory (&TextObj->logfont, &SafeLogfont, sizeof(ENUMLOGFONTEXDVW)); RtlCopyMemory (&TextObj->logfont, &SafeLogfont, sizeof(ENUMLOGFONTEXDVW));

View file

@ -1488,7 +1488,7 @@ ftGdiGetGlyphOutline(
eM11 = xForm.eM11; eM11 = xForm.eM11;
hFont = Dc_Attr->hlfntNew; hFont = Dc_Attr->hlfntNew;
TextObj = TEXTOBJ_LockText(hFont); TextObj = RealizeFontInit(hFont);
if (!TextObj) if (!TextObj)
{ {
@ -2249,7 +2249,7 @@ ftGdiGetTextCharsetInfo(
Dc_Attr = Dc->pDc_Attr; Dc_Attr = Dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &Dc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &Dc->Dc_Attr;
hFont = Dc_Attr->hlfntNew; hFont = Dc_Attr->hlfntNew;
TextObj = TEXTOBJ_LockText(hFont); TextObj = RealizeFontInit(hFont);
if ( TextObj == NULL) if ( TextObj == NULL)
{ {
@ -2465,7 +2465,7 @@ ftGdiGetTextMetricsW(
} }
Dc_Attr = dc->pDc_Attr; Dc_Attr = dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
TextObj = TEXTOBJ_LockText(Dc_Attr->hlfntNew); TextObj = RealizeFontInit(Dc_Attr->hlfntNew);
if (NULL != TextObj) if (NULL != TextObj)
{ {
FontGDI = ObjToGDI(TextObj->Font, FONT); FontGDI = ObjToGDI(TextObj->Font, FONT);
@ -2743,7 +2743,7 @@ IntFontType(PFONTGDI Font)
NTSTATUS NTSTATUS
FASTCALL FASTCALL
TextIntRealizeFont(HFONT FontHandle) TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PTEXTOBJ TextObj; PTEXTOBJ TextObj;
@ -2751,21 +2751,26 @@ TextIntRealizeFont(HFONT FontHandle)
PW32PROCESS Win32Process; PW32PROCESS Win32Process;
UINT MatchScore; UINT MatchScore;
TextObj = TEXTOBJ_LockText(FontHandle); if (!pTextObj)
if (NULL == TextObj) {
{ TextObj = TEXTOBJ_LockText(FontHandle);
return STATUS_INVALID_HANDLE; if (NULL == TextObj)
} {
return STATUS_INVALID_HANDLE;
}
if (TextObj->Initialized) if (TextObj->fl & TEXTOBJECT_INIT)
{ {
TEXTOBJ_UnlockText(TextObj); TEXTOBJ_UnlockText(TextObj);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
}
else
TextObj = pTextObj;
if (! RtlCreateUnicodeString(&FaceName, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName)) if (! RtlCreateUnicodeString(&FaceName, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName))
{ {
TEXTOBJ_UnlockText(TextObj); if (!pTextObj) TEXTOBJ_UnlockText(TextObj);
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
} }
SubstituteFontFamily(&FaceName, 0); SubstituteFontFamily(&FaceName, 0);
@ -2803,12 +2808,12 @@ TextIntRealizeFont(HFONT FontHandle)
FontGdi->flRealizedType = 0; FontGdi->flRealizedType = 0;
FontGdi->Underline = TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfUnderline ? 0xff : 0; FontGdi->Underline = TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfUnderline ? 0xff : 0;
FontGdi->StrikeOut = TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfStrikeOut ? 0xff : 0; FontGdi->StrikeOut = TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfStrikeOut ? 0xff : 0;
TextObj->Initialized = TRUE; TextObj->fl |= TEXTOBJECT_INIT;
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
} }
RtlFreeUnicodeString(&FaceName); RtlFreeUnicodeString(&FaceName);
TEXTOBJ_UnlockText(TextObj); if (!pTextObj) TEXTOBJ_UnlockText(TextObj);
ASSERT((NT_SUCCESS(Status) ^ (NULL == TextObj->Font)) != 0); ASSERT((NT_SUCCESS(Status) ^ (NULL == TextObj->Font)) != 0);
@ -3040,7 +3045,7 @@ ftGdiGetKerningPairs( PFONTGDI Font,
} }
//////////////// //////////////////
// //
// Functions needing sorting. // Functions needing sorting.
// //
@ -3343,7 +3348,7 @@ NtGdiExtTextOutW(
} }
} }
TextObj = TEXTOBJ_LockText(Dc_Attr->hlfntNew); TextObj = RealizeFontInit(Dc_Attr->hlfntNew);
if(TextObj == NULL) if(TextObj == NULL)
{ {
goto fail; goto fail;
@ -3796,7 +3801,7 @@ NtGdiGetCharABCWidthsW(
Dc_Attr = dc->pDc_Attr; Dc_Attr = dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
hFont = Dc_Attr->hlfntNew; hFont = Dc_Attr->hlfntNew;
TextObj = TEXTOBJ_LockText(hFont); TextObj = RealizeFontInit(hFont);
DC_UnlockDc(dc); DC_UnlockDc(dc);
if (TextObj == NULL) if (TextObj == NULL)
@ -3964,7 +3969,7 @@ NtGdiGetCharWidthW(
Dc_Attr = dc->pDc_Attr; Dc_Attr = dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
hFont = Dc_Attr->hlfntNew; hFont = Dc_Attr->hlfntNew;
TextObj = TEXTOBJ_LockText(hFont); TextObj = RealizeFontInit(hFont);
DC_UnlockDc(dc); DC_UnlockDc(dc);
if (TextObj == NULL) if (TextObj == NULL)
@ -4076,7 +4081,7 @@ NtGdiGetGlyphIndicesW(
Dc_Attr = dc->pDc_Attr; Dc_Attr = dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
hFont = Dc_Attr->hlfntNew; hFont = Dc_Attr->hlfntNew;
TextObj = TEXTOBJ_LockText(hFont); TextObj = RealizeFontInit(hFont);
DC_UnlockDc(dc); DC_UnlockDc(dc);
if (!TextObj) if (!TextObj)
{ {

View file

@ -64,6 +64,7 @@ FASTCALL
GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
{ {
PDC_ATTR Dc_Attr = NULL; PDC_ATTR Dc_Attr = NULL;
UserEnterExclusive();
if (dc) if (dc)
{ {
Dc_Attr = dc->pDc_Attr; Dc_Attr = dc->pDc_Attr;
@ -95,8 +96,8 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
PGDIBSOBJECT pgO; PGDIBSOBJECT pgO;
if(!dc) break; if(!dc) break;
pgO = (PGDIBSOBJECT) pHdr; pgO = (PGDIBSOBJECT) pHdr;
if(NT_SUCCESS(TextIntRealizeFont((HFONT) pgO->hgdiobj))) TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL);
Dc_Attr->hlfntNew = (HFONT) pgO->hgdiobj; Dc_Attr->ulDirty_ &= ~(DIRTY_CHARSET);
} }
case GdiBCDelObj: case GdiBCDelObj:
case GdiBCDelRgn: case GdiBCDelRgn:
@ -108,7 +109,7 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
default: default:
break; break;
} }
UserLeave();
return pHdr->Size; // Return the full size of the structure. return pHdr->Size; // Return the full size of the structure.
} }

View file

@ -209,7 +209,7 @@ NtGdiGetTextExtentExW(
} }
Dc_Attr = dc->pDc_Attr; Dc_Attr = dc->pDc_Attr;
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr; if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
TextObj = TEXTOBJ_LockText(Dc_Attr->hlfntNew); TextObj = RealizeFontInit(Dc_Attr->hlfntNew);
if ( TextObj ) if ( TextObj )
{ {
Result = TextIntGetTextExtentPoint(dc, TextObj, String, Count, MaxExtent, Result = TextIntGetTextExtentPoint(dc, TextObj, String, Count, MaxExtent,
@ -339,7 +339,7 @@ NtGdiGetTextFaceW(
hFont = Dc_Attr->hlfntNew; hFont = Dc_Attr->hlfntNew;
DC_UnlockDc(Dc); DC_UnlockDc(Dc);
TextObj = TEXTOBJ_LockText(hFont); TextObj = RealizeFontInit(hFont);
ASSERT(TextObj != NULL); ASSERT(TextObj != NULL);
Count = min(Count, wcslen(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName)); Count = min(Count, wcslen(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName));
Status = MmCopyToCaller(FaceName, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName, Count * sizeof(WCHAR)); Status = MmCopyToCaller(FaceName, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName, Count * sizeof(WCHAR));