From 7901f352e62b3b1e96c68a39600e38b5f42ddedf Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Tue, 22 Jan 2008 09:42:37 +0000 Subject: [PATCH] add support for loading the PSF font-file-format as understood by version 0.94 and above of the Linux console utilities ('kbd') svn path=/trunk/; revision=31939 --- reactos/drivers/setup/blue/font.c | 51 +++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/setup/blue/font.c b/reactos/drivers/setup/blue/font.c index a081abfff53..d6cfe7c2f56 100644 --- a/reactos/drivers/setup/blue/font.c +++ b/reactos/drivers/setup/blue/font.c @@ -60,6 +60,7 @@ NTSTATUS ExtractFont(UINT CodePage, PUCHAR FontBitField) NTSTATUS Status = STATUS_SUCCESS; CHAR FileHeader[5]; CHAR Header[5]; + CHAR PsfHeader[3]; CHAR FileName[BUFFER_SIZE]; ULONG Length; IO_STATUS_BLOCK IoStatusBlock; @@ -75,6 +76,7 @@ NTSTATUS ExtractFont(UINT CodePage, PUCHAR FontBitField) RtlZeroMemory(FileHeader, sizeof(FileHeader)); RtlZeroMemory(Header, sizeof(Header)); + RtlZeroMemory(PsfHeader, sizeof(PsfHeader)); RtlInitUnicodeString(&LinkName, L"\\SystemRoot"); @@ -114,40 +116,71 @@ NTSTATUS ExtractFont(UINT CodePage, PUCHAR FontBitField) FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); - if(NT_SUCCESS(Status)) { + + ByteOffset.LowPart = ByteOffset.HighPart = 0; + if(NT_SUCCESS(Status)) + { sprintf(Header, "PK%c%c", 3, 4); - Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, - FileHeader, 4, &ByteOffset, NULL); + FileHeader, 4, &ByteOffset, NULL); ByteOffset.LowPart += 4; - if(NT_SUCCESS(Status)) { while(strcmp(FileHeader, Header) == 0) { Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, - &LocalHeader, sizeof(ZIP_LOCAL_HEADER), &ByteOffset, NULL); + &LocalHeader, sizeof(ZIP_LOCAL_HEADER), &ByteOffset, NULL); ByteOffset.LowPart += sizeof(ZIP_LOCAL_HEADER); + /* DbgPrint("%ld\n", LocalHeader.FileNameLength); */ if (LocalHeader.FileNameLength < BUFFER_SIZE) { RtlZeroMemory(FileName, BUFFER_SIZE); Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, - FileName, LocalHeader.FileNameLength, &ByteOffset, NULL); + FileName, LocalHeader.FileNameLength, &ByteOffset, NULL); } ByteOffset.LowPart += LocalHeader.FileNameLength; + /* DbgPrint("%s\n", FileName); */ if (LocalHeader.ExtraFieldLength > 0) ByteOffset.LowPart += LocalHeader.ExtraFieldLength; if (atoi(FileName) == CodePage) { if (LocalHeader.CompressedSize == 2048) + { + /* we got it, raw font */ Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, - FontBitField, LocalHeader.CompressedSize, &ByteOffset, NULL); + FontBitField, LocalHeader.CompressedSize, &ByteOffset, NULL); + ZwClose(Handle); + return STATUS_SUCCESS; + } + else if (LocalHeader.CompressedSize > 2048) + { + sprintf(PsfHeader, "%c%c", 0x36, 0x04); + /* maybe linux psf format */ + Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, + FileHeader, 4, &ByteOffset, NULL); + ByteOffset.LowPart += 4; + if(strncmp(FileHeader, PsfHeader, 2) == 0) + { + /* only load fonts with a size of 8 + and filemode 0 (256 characters, no unicode_data) */ + if ((FileHeader[3] == 8) && (FileHeader[4] == 0)) + { + Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, + FontBitField, 2048, &ByteOffset, NULL); + ZwClose(Handle); + return STATUS_SUCCESS; + } + else + DbgPrint("Wrong fontsize or too many characters"); + } + } + /* invalid data */ ZwClose(Handle); - return STATUS_SUCCESS; + return STATUS_NO_MATCH; } ByteOffset.LowPart += LocalHeader.CompressedSize; Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock, - FileHeader, 4, &ByteOffset, NULL); + FileHeader, 4, &ByteOffset, NULL); ByteOffset.LowPart += 4; DbgPrint("%s\n", FileHeader); }