added support for the FR_PRIVATE and FR_NOT_ENUM flags for AddFontResourceEx()

svn path=/trunk/; revision=6983
This commit is contained in:
Thomas Bluemel 2003-12-12 23:49:48 +00:00
parent c3fedb7f0b
commit 0d6a146059
4 changed files with 62 additions and 14 deletions

View file

@ -143,6 +143,11 @@ extern "C" {
#define KLF_REPLACELANG (16)
#define KLF_SUBSTITUTE_OK (2)
/* AddFontResourceEx */
#define FR_PRIVATE (0x10)
#define FR_NOT_ENUM (0x20)
/* AppendMenu */
#define MF_BITMAP (0x4L)
#define MF_DISABLED (0x2L)

View file

@ -17,6 +17,8 @@ typedef struct _W32PROCESS
LIST_ENTRY ClassListHead;
FAST_MUTEX MenuListLock;
LIST_ENTRY MenuListHead;
FAST_MUTEX PrivateFontListLock;
LIST_ENTRY PrivateFontListHead;
struct _KBDTABLES* KeyboardLayout;
struct _WINSTATION_OBJECT* WindowStation;
WORD GDIObjects;

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: dllmain.c,v 1.60 2003/12/12 14:22:37 gvg Exp $
/* $Id: dllmain.c,v 1.61 2003/12/12 23:49:48 weiden Exp $
*
* Entry Point for win32k.sys
*/
@ -76,6 +76,9 @@ Win32kProcessCallback (struct _EPROCESS *Process,
InitializeListHead(&Win32Process->MenuListHead);
ExInitializeFastMutex(&Win32Process->MenuListLock);
InitializeListHead(&Win32Process->PrivateFontListHead);
ExInitializeFastMutex(&Win32Process->PrivateFontListLock);
Win32Process->KeyboardLayout = W32kGetDefaultKeyLayout();
Win32Process->WindowStation = NULL;
if (Process->Win32WindowStation != NULL)

View file

@ -16,12 +16,13 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: text.c,v 1.59 2003/12/12 22:57:26 weiden Exp $ */
/* $Id: text.c,v 1.60 2003/12/12 23:49:48 weiden Exp $ */
#undef WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <ddk/ntddk.h>
#include <napi/win32.h>
#include <internal/safe.h>
#include <win32k/brush.h>
#include <win32k/dc.h>
@ -48,12 +49,12 @@ typedef struct _FONT_ENTRY {
LIST_ENTRY ListEntry;
HFONT hFont;
UNICODE_STRING FaceName;
BYTE CanEnum;
BYTE NotEnum;
} FONT_ENTRY, *PFONT_ENTRY;
static LIST_ENTRY FontListHead;
static FAST_MUTEX FontListLock;
static INT FontsLoaded = 0;
static INT FontsLoaded = 0; /* number of all fonts loaded (including private fonts */
int FASTCALL
IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl)
@ -163,14 +164,26 @@ IntGdiAddFontResource(PUNICODE_STRING Filename, DWORD fl)
// Add this font resource to the font table
entry->hFont = NewFont;
entry->NotEnum = (fl & FR_NOT_ENUM);
RtlInitAnsiString(&StringA, (LPSTR)face->family_name);
RtlAnsiStringToUnicodeString(&entry->FaceName, &StringA, TRUE);
if(fl & FR_PRIVATE)
{
PW32PROCESS Win32Process = PsGetWin32Process();
ExAcquireFastMutex(&Win32Process->PrivateFontListLock);
InsertTailList(&Win32Process->PrivateFontListHead, &entry->ListEntry);
FontsLoaded++;
ExReleaseFastMutex(&Win32Process->PrivateFontListLock);
}
else
{
ExAcquireFastMutex(&FontListLock);
InsertTailList(&FontListHead, &entry->ListEntry);
FontsLoaded++;
ExReleaseFastMutex(&FontListLock);
}
return 1;
}
@ -1361,8 +1374,10 @@ TextIntRealizeFont(HFONT FontHandle)
NTSTATUS Status = STATUS_SUCCESS;
PTEXTOBJ TextObj;
UNICODE_STRING FaceName;
PLIST_ENTRY Entry;
PLIST_ENTRY Entry, List;
PFONT_ENTRY CurrentEntry;
PW32PROCESS Win32Process;
BOOL Private = FALSE;
TextObj = TEXTOBJ_LockText(FontHandle);
ASSERT(TextObj);
@ -1370,10 +1385,32 @@ TextIntRealizeFont(HFONT FontHandle)
{
RtlInitUnicodeString(&FaceName, TextObj->logfont.lfFaceName);
/* find font in private fonts */
Win32Process = PsGetWin32Process();
ExAcquireFastMutex(&Win32Process->PrivateFontListLock);
Entry = Win32Process->PrivateFontListHead.Flink;
while(Entry != &Win32Process->PrivateFontListHead)
{
CurrentEntry = (PFONT_ENTRY)CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry);
if (0 == RtlCompareUnicodeString(&CurrentEntry->FaceName, &FaceName, TRUE))
{
TextObj->GDIFontHandle = CurrentEntry->hFont;
Private = TRUE;
goto check;
}
Entry = Entry->Flink;
}
ExReleaseFastMutex(&Win32Process->PrivateFontListLock);
/* find font in system fonts */
ExAcquireFastMutex(&FontListLock);
Entry = FontListHead.Flink;
while(Entry != &FontListHead)
Entry = (Private ? Win32Process->PrivateFontListHead.Flink : FontListHead.Flink);
List = (Private ? &Win32Process->PrivateFontListHead : &FontListHead);
while(Entry != List)
{
CurrentEntry = (PFONT_ENTRY)CONTAINING_RECORD(Entry, FONT_ENTRY, ListEntry);
@ -1385,6 +1422,7 @@ TextIntRealizeFont(HFONT FontHandle)
Entry = Entry->Flink;
}
check:
if (NULL == TextObj->GDIFontHandle)
{
Entry = FontListHead.Flink;
@ -1404,7 +1442,7 @@ TextIntRealizeFont(HFONT FontHandle)
}
ExReleaseFastMutex(&FontListLock);
ExReleaseFastMutex((Private ? &Win32Process->PrivateFontListLock : &FontListLock));
ASSERT(! NT_SUCCESS(Status) || NULL != TextObj->GDIFontHandle);