mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 20:47:21 +00:00
- 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:
parent
bed3b885b4
commit
53586450b4
7 changed files with 80 additions and 40 deletions
|
@ -1535,7 +1535,7 @@ SelectObject(HDC hDC,
|
|||
HGDIOBJ hGdiObj)
|
||||
{
|
||||
PDC_ATTR pDc_Attr;
|
||||
// HGDIOBJ hOldObj = NULL;
|
||||
HGDIOBJ hOldObj = NULL;
|
||||
// PTEB pTeb;
|
||||
|
||||
if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
|
||||
|
@ -1580,10 +1580,15 @@ SelectObject(HDC hDC,
|
|||
return NtGdiSelectPen(hDC, hGdiObj);
|
||||
|
||||
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;
|
||||
pTeb = NtCurrentTeb();
|
||||
if (((pTeb->GdiTebBatch.HDC == 0) ||
|
||||
(pTeb->GdiTebBatch.HDC == (ULONG)hDC)) &&
|
||||
(pTeb->GdiTebBatch.HDC == hDC)) &&
|
||||
((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) &&
|
||||
(!(pDc_Attr->ulDirty_ & DC_DIBSECTION)))
|
||||
{
|
||||
|
@ -1594,14 +1599,15 @@ SelectObject(HDC hDC,
|
|||
pgO->hgdiobj = hGdiObj;
|
||||
|
||||
pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
|
||||
pTeb->GdiTebBatch.HDC = (ULONG)hDC;
|
||||
pTeb->GdiTebBatch.HDC = hDC;
|
||||
pTeb->GdiBatchCount++;
|
||||
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
|
||||
return pDc_Attr->hlfntNew;
|
||||
return hOldObj;
|
||||
}
|
||||
#endif
|
||||
// default for select object font
|
||||
return NtGdiSelectFont(hDC, hGdiObj);
|
||||
|
||||
#if 0
|
||||
case GDI_OBJECT_TYPE_METADC:
|
||||
return MFDRV_SelectObject( hDC, hGdiObj);
|
||||
|
|
|
@ -54,6 +54,8 @@ typedef struct _STRGDI
|
|||
ULONG acFaceNameGlyphs[8];
|
||||
} STRGDI, *PSTRGDI;
|
||||
|
||||
#define TEXTOBJECT_INIT 0x00010000
|
||||
|
||||
/* GDI logical font object */
|
||||
typedef struct
|
||||
{
|
||||
|
@ -62,9 +64,13 @@ typedef struct
|
|||
BASEOBJECT BaseObject;
|
||||
LFTYPE lft;
|
||||
FLONG fl;
|
||||
ENUMLOGFONTEXDVW logfont; //LOGFONTW logfont;
|
||||
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;
|
||||
|
||||
/* Internal interface */
|
||||
|
@ -76,7 +82,8 @@ typedef struct
|
|||
#define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT))
|
||||
#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);
|
||||
BOOL FASTCALL InitFontSupport(VOID);
|
||||
BOOL FASTCALL IntIsFontRenderingEnabled(VOID);
|
||||
|
|
|
@ -2216,7 +2216,7 @@ NtGdiSelectFont(
|
|||
if(!pDc_Attr) pDc_Attr = &pDC->Dc_Attr;
|
||||
|
||||
/* FIXME: what if not successful? */
|
||||
if(NT_SUCCESS(TextIntRealizeFont((HFONT)hFont)))
|
||||
if(NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL)))
|
||||
{
|
||||
hOrgFont = pDc_Attr->hlfntNew;
|
||||
pDc_Attr->hlfntNew = hFont;
|
||||
|
@ -2668,7 +2668,7 @@ DC_AllocDC(PUNICODE_STRING Driver)
|
|||
Dc_Attr->hpen = NtGdiGetStockObject( BLACK_PEN );
|
||||
////
|
||||
Dc_Attr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT);
|
||||
TextIntRealizeFont(Dc_Attr->hlfntNew);
|
||||
TextIntRealizeFont(Dc_Attr->hlfntNew,NULL);
|
||||
|
||||
NewDC->DcLevel.hpal = NtGdiGetStockObject(DEFAULT_PALETTE);
|
||||
NewDC->DcLevel.laPath.eMiterLimit = 10.0;
|
||||
|
|
|
@ -55,6 +55,27 @@ FontGetObject(PTEXTOBJ TFont, INT Count, PVOID Buffer)
|
|||
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 ******************************************************************/
|
||||
|
||||
INT
|
||||
|
@ -146,7 +167,7 @@ NtGdiGetFontData(
|
|||
if(!Dc_Attr) Dc_Attr = &Dc->Dc_Attr;
|
||||
|
||||
hFont = Dc_Attr->hlfntNew;
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
TextObj = RealizeFontInit(hFont);
|
||||
DC_UnlockDc(Dc);
|
||||
|
||||
if (TextObj == NULL)
|
||||
|
@ -193,7 +214,7 @@ NtGdiGetFontUnicodeRanges(
|
|||
if(!Dc_Attr) Dc_Attr = &pDc->Dc_Attr;
|
||||
|
||||
hFont = Dc_Attr->hlfntNew;
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
TextObj = RealizeFontInit(hFont);
|
||||
|
||||
if ( TextObj == NULL)
|
||||
{
|
||||
|
@ -363,7 +384,7 @@ NtGdiGetOutlineTextMetricsInternalW (HDC hDC,
|
|||
Dc_Attr = dc->pDc_Attr;
|
||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
||||
hFont = Dc_Attr->hlfntNew;
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
TextObj = RealizeFontInit(hFont);
|
||||
DC_UnlockDc(dc);
|
||||
if (TextObj == NULL)
|
||||
{
|
||||
|
@ -543,7 +564,7 @@ NtGdiHfontCreate(
|
|||
}
|
||||
hNewFont = TextObj->BaseObject.hHmgr;
|
||||
|
||||
TextObj->lft = cjElfw;
|
||||
TextObj->lft = lft;
|
||||
TextObj->fl = fl;
|
||||
RtlCopyMemory (&TextObj->logfont, &SafeLogfont, sizeof(ENUMLOGFONTEXDVW));
|
||||
|
||||
|
|
|
@ -1488,7 +1488,7 @@ ftGdiGetGlyphOutline(
|
|||
eM11 = xForm.eM11;
|
||||
|
||||
hFont = Dc_Attr->hlfntNew;
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
TextObj = RealizeFontInit(hFont);
|
||||
|
||||
if (!TextObj)
|
||||
{
|
||||
|
@ -2249,7 +2249,7 @@ ftGdiGetTextCharsetInfo(
|
|||
Dc_Attr = Dc->pDc_Attr;
|
||||
if(!Dc_Attr) Dc_Attr = &Dc->Dc_Attr;
|
||||
hFont = Dc_Attr->hlfntNew;
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
TextObj = RealizeFontInit(hFont);
|
||||
|
||||
if ( TextObj == NULL)
|
||||
{
|
||||
|
@ -2465,7 +2465,7 @@ ftGdiGetTextMetricsW(
|
|||
}
|
||||
Dc_Attr = dc->pDc_Attr;
|
||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
||||
TextObj = TEXTOBJ_LockText(Dc_Attr->hlfntNew);
|
||||
TextObj = RealizeFontInit(Dc_Attr->hlfntNew);
|
||||
if (NULL != TextObj)
|
||||
{
|
||||
FontGDI = ObjToGDI(TextObj->Font, FONT);
|
||||
|
@ -2743,7 +2743,7 @@ IntFontType(PFONTGDI Font)
|
|||
|
||||
NTSTATUS
|
||||
FASTCALL
|
||||
TextIntRealizeFont(HFONT FontHandle)
|
||||
TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj)
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
PTEXTOBJ TextObj;
|
||||
|
@ -2751,21 +2751,26 @@ TextIntRealizeFont(HFONT FontHandle)
|
|||
PW32PROCESS Win32Process;
|
||||
UINT MatchScore;
|
||||
|
||||
TextObj = TEXTOBJ_LockText(FontHandle);
|
||||
if (NULL == TextObj)
|
||||
{
|
||||
return STATUS_INVALID_HANDLE;
|
||||
}
|
||||
if (!pTextObj)
|
||||
{
|
||||
TextObj = TEXTOBJ_LockText(FontHandle);
|
||||
if (NULL == TextObj)
|
||||
{
|
||||
return STATUS_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if (TextObj->Initialized)
|
||||
{
|
||||
TEXTOBJ_UnlockText(TextObj);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
if (TextObj->fl & TEXTOBJECT_INIT)
|
||||
{
|
||||
TEXTOBJ_UnlockText(TextObj);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
else
|
||||
TextObj = pTextObj;
|
||||
|
||||
if (! RtlCreateUnicodeString(&FaceName, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName))
|
||||
{
|
||||
TEXTOBJ_UnlockText(TextObj);
|
||||
if (!pTextObj) TEXTOBJ_UnlockText(TextObj);
|
||||
return STATUS_NO_MEMORY;
|
||||
}
|
||||
SubstituteFontFamily(&FaceName, 0);
|
||||
|
@ -2803,12 +2808,12 @@ TextIntRealizeFont(HFONT FontHandle)
|
|||
FontGdi->flRealizedType = 0;
|
||||
FontGdi->Underline = TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfUnderline ? 0xff : 0;
|
||||
FontGdi->StrikeOut = TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfStrikeOut ? 0xff : 0;
|
||||
TextObj->Initialized = TRUE;
|
||||
TextObj->fl |= TEXTOBJECT_INIT;
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
RtlFreeUnicodeString(&FaceName);
|
||||
TEXTOBJ_UnlockText(TextObj);
|
||||
if (!pTextObj) TEXTOBJ_UnlockText(TextObj);
|
||||
|
||||
ASSERT((NT_SUCCESS(Status) ^ (NULL == TextObj->Font)) != 0);
|
||||
|
||||
|
@ -3040,7 +3045,7 @@ ftGdiGetKerningPairs( PFONTGDI Font,
|
|||
}
|
||||
|
||||
|
||||
////////////////
|
||||
//////////////////
|
||||
//
|
||||
// Functions needing sorting.
|
||||
//
|
||||
|
@ -3343,7 +3348,7 @@ NtGdiExtTextOutW(
|
|||
}
|
||||
}
|
||||
|
||||
TextObj = TEXTOBJ_LockText(Dc_Attr->hlfntNew);
|
||||
TextObj = RealizeFontInit(Dc_Attr->hlfntNew);
|
||||
if(TextObj == NULL)
|
||||
{
|
||||
goto fail;
|
||||
|
@ -3796,7 +3801,7 @@ NtGdiGetCharABCWidthsW(
|
|||
Dc_Attr = dc->pDc_Attr;
|
||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
||||
hFont = Dc_Attr->hlfntNew;
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
TextObj = RealizeFontInit(hFont);
|
||||
DC_UnlockDc(dc);
|
||||
|
||||
if (TextObj == NULL)
|
||||
|
@ -3964,7 +3969,7 @@ NtGdiGetCharWidthW(
|
|||
Dc_Attr = dc->pDc_Attr;
|
||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
||||
hFont = Dc_Attr->hlfntNew;
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
TextObj = RealizeFontInit(hFont);
|
||||
DC_UnlockDc(dc);
|
||||
|
||||
if (TextObj == NULL)
|
||||
|
@ -4076,7 +4081,7 @@ NtGdiGetGlyphIndicesW(
|
|||
Dc_Attr = dc->pDc_Attr;
|
||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
||||
hFont = Dc_Attr->hlfntNew;
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
TextObj = RealizeFontInit(hFont);
|
||||
DC_UnlockDc(dc);
|
||||
if (!TextObj)
|
||||
{
|
||||
|
|
|
@ -64,6 +64,7 @@ FASTCALL
|
|||
GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
|
||||
{
|
||||
PDC_ATTR Dc_Attr = NULL;
|
||||
UserEnterExclusive();
|
||||
if (dc)
|
||||
{
|
||||
Dc_Attr = dc->pDc_Attr;
|
||||
|
@ -95,8 +96,8 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
|
|||
PGDIBSOBJECT pgO;
|
||||
if(!dc) break;
|
||||
pgO = (PGDIBSOBJECT) pHdr;
|
||||
if(NT_SUCCESS(TextIntRealizeFont((HFONT) pgO->hgdiobj)))
|
||||
Dc_Attr->hlfntNew = (HFONT) pgO->hgdiobj;
|
||||
TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL);
|
||||
Dc_Attr->ulDirty_ &= ~(DIRTY_CHARSET);
|
||||
}
|
||||
case GdiBCDelObj:
|
||||
case GdiBCDelRgn:
|
||||
|
@ -108,7 +109,7 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
|
|||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
UserLeave();
|
||||
return pHdr->Size; // Return the full size of the structure.
|
||||
}
|
||||
|
||||
|
|
|
@ -209,7 +209,7 @@ NtGdiGetTextExtentExW(
|
|||
}
|
||||
Dc_Attr = dc->pDc_Attr;
|
||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
||||
TextObj = TEXTOBJ_LockText(Dc_Attr->hlfntNew);
|
||||
TextObj = RealizeFontInit(Dc_Attr->hlfntNew);
|
||||
if ( TextObj )
|
||||
{
|
||||
Result = TextIntGetTextExtentPoint(dc, TextObj, String, Count, MaxExtent,
|
||||
|
@ -339,7 +339,7 @@ NtGdiGetTextFaceW(
|
|||
hFont = Dc_Attr->hlfntNew;
|
||||
DC_UnlockDc(Dc);
|
||||
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
TextObj = RealizeFontInit(hFont);
|
||||
ASSERT(TextObj != NULL);
|
||||
Count = min(Count, wcslen(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName));
|
||||
Status = MmCopyToCaller(FaceName, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName, Count * sizeof(WCHAR));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue