diff --git a/reactos/include/defines.h b/reactos/include/defines.h index 4753564949f..0754f62d346 100644 --- a/reactos/include/defines.h +++ b/reactos/include/defines.h @@ -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) diff --git a/reactos/include/napi/win32.h b/reactos/include/napi/win32.h index ed89fb2b58e..77850211837 100644 --- a/reactos/include/napi/win32.h +++ b/reactos/include/napi/win32.h @@ -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; diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index 0ef0e4ef26b..7cb86dede6e 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.c @@ -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) diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index a7b2704084d..6b9ffba45c8 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -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 #include +#include #include #include #include @@ -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); - ExAcquireFastMutex(&FontListLock); - InsertTailList(&FontListHead, &entry->ListEntry); - FontsLoaded++; - ExReleaseFastMutex(&FontListLock); + 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); @@ -1384,7 +1421,8 @@ 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);