Use mapped sections for fonts instead of paged pool memory. Modified: trunk/reactos/subsys/win32k/objects/text.c _____
Modified: trunk/reactos/subsys/win32k/objects/text.c --- trunk/reactos/subsys/win32k/objects/text.c 2005-08-02 20:17:01 UTC (rev 16976) +++ trunk/reactos/subsys/win32k/objects/text.c 2005-08-02 20:33:33 UTC (rev 16977) @@ -256,22 +256,24 @@
HANDLE FileHandle; OBJECT_ATTRIBUTES ObjectAttributes; FILE_STANDARD_INFORMATION FileStdInfo; - PVOID Buffer; + PVOID Buffer = NULL; IO_STATUS_BLOCK Iosb; INT Error; FT_Face Face; ANSI_STRING AnsiFaceName; PFONT_ENTRY Entry; + PSECTION_OBJECT SectionObject; + ULONG ViewSize = 0;
/* Open the font file */
InitializeObjectAttributes(&ObjectAttributes, FileName, 0, NULL, NULL); Status = ZwOpenFile( &FileHandle, - GENERIC_READ | SYNCHRONIZE, + FILE_GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, &Iosb, - 0, + FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status)) @@ -280,59 +282,25 @@ return 0; }
- /* Get the size of the file */ - - Status = ZwQueryInformationFile( - FileHandle, - &Iosb, - &FileStdInfo, - sizeof(FileStdInfo), - FileStandardInformation); - + Status = MmCreateSection(&SectionObject, SECTION_ALL_ACCESS, + NULL, NULL, PAGE_READONLY, + 0, FileHandle, NULL); if (!NT_SUCCESS(Status)) { - DPRINT("Could not get file size\n"); + DPRINT("Could not map file: %wZ\n", FileName); ZwClose(FileHandle); return 0; }
- /* Allocate pageable memory for the font */ + ZwClose(FileHandle);
- Buffer = ExAllocatePoolWithTag( - PagedPool, - FileStdInfo.EndOfFile.u.LowPart, - TAG_FNTFILE); - - if (Buffer == NULL) - { - DPRINT("Could not allocate memory for font"); - ZwClose(FileHandle); - return 0; - } - - /* Load the font into memory chunk */ - - Status = ZwReadFile( - FileHandle, - NULL, - NULL, - NULL, - &Iosb, - Buffer, - FileStdInfo.EndOfFile.u.LowPart, - NULL, - NULL); - + Status = MmMapViewInSystemSpace(SectionObject, &Buffer, &ViewSize); if (!NT_SUCCESS(Status)) { - DPRINT("Could not read the font file into memory"); - ExFreePool(Buffer); - ZwClose(FileHandle); - return 0; + DPRINT("Could not map file: %wZ\n", FileName); + return Status; }
- ZwClose(FileHandle); - IntLockFreeType; Error = FT_New_Memory_Face( library, @@ -348,7 +316,7 @@ DPRINT("Unknown font file format\n"); else DPRINT("Error reading font file (error code: %u)\n", Error); - ExFreePool(Buffer); + ObDereferenceObject(SectionObject); return 0; }
@@ -356,7 +324,7 @@ if (!Entry) { FT_Done_Face(Face); - ExFreePool(Buffer); + ObDereferenceObject(SectionObject); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return 0; } @@ -365,7 +333,7 @@ if(FontGDI == NULL) { FT_Done_Face(Face); - ExFreePool(Buffer); + ObDereferenceObject(SectionObject); ExFreePool(Entry); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return 0; @@ -1559,7 +1527,7 @@ } }
- BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); + BitmapObj = BITMAPOBJ_LockBitmap(DC_BITMAP(dc)); if ( !BitmapObj ) { goto fail; @@ -1574,7 +1542,7 @@ YStart = Start.y + dc->w.DCOrgY;
/* Create the brushes */ - PalDestGDI = PALETTE_LockPalette(dc->w.hPalette); + PalDestGDI = PALETTE_LockPalette(DC_PALETTE(dc)); if ( !PalDestGDI ) Mode = PAL_RGB; else @@ -1582,7 +1550,7 @@ Mode = PalDestGDI->Mode; PALETTE_UnlockPalette(PalDestGDI); } - XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, DC_PALETTE(dc), NULL); if ( !XlateObj ) { goto fail; @@ -1612,7 +1580,7 @@ } IntGdiInitBrushInstance(&BrushBgInst, BrushBg, NULL); } - XlateObj2 = (XLATEOBJ*)IntEngCreateXlate(PAL_RGB, Mode, NULL, dc->w.hPalette); + XlateObj2 = (XLATEOBJ*)IntEngCreateXlate(PAL_RGB, Mode, NULL, DC_PALETTE(dc)); if ( !XlateObj2 ) { goto fail;