diff --git a/reactos/win32ss/gdi/ntgdi/font.c b/reactos/win32ss/gdi/ntgdi/font.c index 43183f60e19..a03c36f3730 100644 --- a/reactos/win32ss/gdi/ntgdi/font.c +++ b/reactos/win32ss/gdi/ntgdi/font.c @@ -1056,7 +1056,7 @@ NtGdiHfontCreate( { ENUMLOGFONTEXDVW SafeLogfont; HFONT hNewFont; - PTEXTOBJ TextObj; + PLFONT plfont; NTSTATUS Status = STATUS_SUCCESS; /* Silence GCC warnings */ @@ -1084,25 +1084,26 @@ NtGdiHfontCreate( return NULL; } - TextObj = TEXTOBJ_AllocTextWithHandle(); - if (!TextObj) + plfont = LFONT_AllocFontWithHandle(); + if (!plfont) { return NULL; } - hNewFont = TextObj->BaseObject.hHmgr; + hNewFont = plfont->BaseObject.hHmgr; - TextObj->lft = lft; - TextObj->fl = fl; - RtlCopyMemory (&TextObj->logfont, &SafeLogfont, sizeof(ENUMLOGFONTEXDVW)); + plfont->lft = lft; + plfont->fl = fl; + RtlCopyMemory (&plfont->logfont, &SafeLogfont, sizeof(ENUMLOGFONTEXDVW)); + ExInitializePushLock(&plfont->lock); if (SafeLogfont.elfEnumLogfontEx.elfLogFont.lfEscapement != SafeLogfont.elfEnumLogfontEx.elfLogFont.lfOrientation) { /* This should really depend on whether GM_ADVANCED is set */ - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation = - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement; + plfont->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation = + plfont->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement; } - TEXTOBJ_UnlockText(TextObj); + LFONT_UnlockFont(plfont); if (pvCliData && hNewFont) { diff --git a/reactos/win32ss/gdi/ntgdi/freetype.c b/reactos/win32ss/gdi/ntgdi/freetype.c index 201cb9bd197..14a0afa2c11 100644 --- a/reactos/win32ss/gdi/ntgdi/freetype.c +++ b/reactos/win32ss/gdi/ntgdi/freetype.c @@ -447,23 +447,24 @@ IntGetFontRenderMode(LOGFONTW *logfont) NTSTATUS FASTCALL TextIntCreateFontIndirect(CONST LPLOGFONTW lf, HFONT *NewFont) { - PTEXTOBJ TextObj; + PLFONT plfont; - TextObj = TEXTOBJ_AllocTextWithHandle(); - if (!TextObj) + plfont = LFONT_AllocFontWithHandle(); + if (!plfont) { return STATUS_NO_MEMORY; } - *NewFont = TextObj->BaseObject.hHmgr; - RtlCopyMemory(&TextObj->logfont.elfEnumLogfontEx.elfLogFont, lf, sizeof(LOGFONTW)); + ExInitializePushLock(&plfont->lock); + *NewFont = plfont->BaseObject.hHmgr; + RtlCopyMemory(&plfont->logfont.elfEnumLogfontEx.elfLogFont, lf, sizeof(LOGFONTW)); if (lf->lfEscapement != lf->lfOrientation) { /* This should really depend on whether GM_ADVANCED is set */ - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation = - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement; + plfont->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation = + plfont->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement; } - TEXTOBJ_UnlockText(TextObj); + LFONT_UnlockFont(plfont); return STATUS_SUCCESS; } diff --git a/reactos/win32ss/gdi/ntgdi/gdiobj.c b/reactos/win32ss/gdi/ntgdi/gdiobj.c index 2ce8783ea0c..4584ef3a471 100644 --- a/reactos/win32ss/gdi/ntgdi/gdiobj.c +++ b/reactos/win32ss/gdi/ntgdi/gdiobj.c @@ -51,8 +51,7 @@ (objt) == GDIObjType_BRUSH_TYPE) #define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt) \ ASSERT((objt) == GDIObjType_DC_TYPE || \ - (objt) == GDIObjType_RGN_TYPE || \ - (objt) == GDIObjType_LFONT_TYPE) + (objt) == GDIObjType_RGN_TYPE) #else #define DBG_INCREASE_LOCK_COUNT(ppi, hobj) #define DBG_DECREASE_LOCK_COUNT(x, y) diff --git a/reactos/win32ss/gdi/ntgdi/text.h b/reactos/win32ss/gdi/ntgdi/text.h index 12cdef95f2e..2dfdcd14fd5 100644 --- a/reactos/win32ss/gdi/ntgdi/text.h +++ b/reactos/win32ss/gdi/ntgdi/text.h @@ -56,7 +56,7 @@ typedef struct _STRGDI #define TEXTOBJECT_INIT 0x00010000 /* GDI logical font object */ -typedef struct +typedef struct _LFONT { /* Header for all gdi objects in the handle table. Do not (re)move this. */ @@ -70,16 +70,33 @@ typedef struct DWORD dwOffsetEndArray; // Fixed: ENUMLOGFONTEXDVW logfont; -} TEXTOBJ, *PTEXTOBJ; + EX_PUSH_LOCK lock; +} TEXTOBJ, *PTEXTOBJ, LFONT, *PLFONT; /* Internal interface */ -#define TEXTOBJ_AllocText() ((PTEXTOBJ) GDIOBJ_AllocObj(GDIObjType_LFONT_TYPE)) -#define TEXTOBJ_AllocTextWithHandle() ((PTEXTOBJ) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ))) -#define TEXTOBJ_FreeText(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDILoObjType_LO_FONT_TYPE) -#define TEXTOBJ_FreeTextByHandle(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT) -#define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObject((HGDIOBJ) hBMObj, GDIObjType_LFONT_TYPE)) -#define TEXTOBJ_UnlockText(pBMObj) GDIOBJ_vUnlockObject ((POBJ)pBMObj) +#define LFONT_AllocFontWithHandle() ((PLFONT)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ))) +#define LFONT_ShareLockFont(hfont) (PLFONT)GDIOBJ_ReferenceObjectByHandle(hfont, GDIObjType_LFONT_TYPE) +#define LFONT_ShareUnlockFont(plfnt) GDIOBJ_vDereferenceObject((POBJ)plfnt) +#define LFONT_UnlockFont(plfnt) GDIOBJ_vUnlockObject((POBJ)plfnt) + +PTEXTOBJ +FORCEINLINE +TEXTOBJ_LockText(HFONT hfont) +{ + PLFONT plfnt = LFONT_ShareLockFont(hfont); + ExAcquirePushLockExclusive(&plfnt->lock); + return plfnt; +} + +VOID +FORCEINLINE +TEXTOBJ_UnlockText(PLFONT plfnt) +{ + ExReleasePushLockExclusive(&plfnt->lock); + LFONT_ShareUnlockFont(plfnt); +} + PTEXTOBJ FASTCALL RealizeFontInit(HFONT); NTSTATUS FASTCALL TextIntRealizeFont(HFONT,PTEXTOBJ);