mirror of
https://github.com/reactos/reactos.git
synced 2024-06-30 09:50:07 +00:00
- Move each VGA font file to a new "media/vgafonts" directory and convert all PSF fonts to BIN files.
- Add a line to the autogenerated Makefile for Boot-CDs, which creates a "vgafonts.cab" file from the binary fonts at build time. - Change blue.sys to read the fonts from the "vgafonts.cab" file instead of the "vgafont.bin" (ZIP format) file. I dropped support for PSF fonts in blue.sys, because with the vgafontedit app, we can easily convert PSF fonts to BIN fonts now. If someone still needs this format in blue.sys, I can reimplement it. svn path=/trunk/; revision=32145
This commit is contained in:
parent
54409710c6
commit
8de349c343
|
@ -8,8 +8,6 @@
|
|||
|
||||
/* DEFINITIONS ***************************************************************/
|
||||
|
||||
#define BUFFER_SIZE 260
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -20,20 +18,34 @@
|
|||
|
||||
#define TAG_BLUE TAG('B', 'L', 'U', 'E')
|
||||
|
||||
#include <pshpack1.h>
|
||||
typedef struct {
|
||||
short Version;
|
||||
short GeneralPurposeBitFlag;
|
||||
short CompressionMethod;
|
||||
short LastModFileTime;
|
||||
short LastModFileDate;
|
||||
int CRC32;
|
||||
int CompressedSize;
|
||||
int UncompressedSize;
|
||||
short FileNameLength;
|
||||
short ExtraFieldLength;
|
||||
} ZIP_LOCAL_HEADER;
|
||||
#include <poppack.h>
|
||||
typedef struct _CFHEADER
|
||||
{
|
||||
ULONG Signature; // File signature 'MSCF' (CAB_SIGNATURE)
|
||||
ULONG Reserved1; // Reserved field
|
||||
ULONG CabinetSize; // Cabinet file size
|
||||
ULONG Reserved2; // Reserved field
|
||||
ULONG FileTableOffset; // Offset of first CFFILE
|
||||
ULONG Reserved3; // Reserved field
|
||||
USHORT Version; // Cabinet version (CAB_VERSION)
|
||||
USHORT FolderCount; // Number of folders
|
||||
USHORT FileCount; // Number of files
|
||||
USHORT Flags; // Cabinet flags (CAB_FLAG_*)
|
||||
USHORT SetID; // Cabinet set id
|
||||
USHORT CabinetNumber; // Zero-based cabinet number
|
||||
} CFHEADER, *PCFHEADER;
|
||||
|
||||
typedef struct _CFFILE
|
||||
{
|
||||
ULONG FileSize; // Uncompressed file size in bytes
|
||||
ULONG FileOffset; // Uncompressed offset of file in the folder
|
||||
USHORT FileControlID; // File control ID (CAB_FILE_*)
|
||||
USHORT FileDate; // File date stamp, as used by DOS
|
||||
USHORT FileTime; // File time stamp, as used by DOS
|
||||
USHORT Attributes; // File attributes (CAB_ATTRIB_*)
|
||||
/* After this is the NULL terminated filename */
|
||||
} CFFILE, *PCFFILE;
|
||||
|
||||
#define CAB_SIGNATURE 0x4643534D // "MSCF"
|
||||
|
||||
#define VIDMEM_BASE 0xb8000
|
||||
#define BITPLANE_BASE 0xa0000
|
||||
|
|
|
@ -43,7 +43,7 @@ ScrLoadFontTable(UINT CodePage)
|
|||
Status = ExtractFont(CodePage, FontBitfield);
|
||||
if (NT_SUCCESS(Status))
|
||||
LoadFont(Bitplane, FontBitfield);
|
||||
|
||||
|
||||
MmUnmapIoSpace(Bitplane, 0xFFFF);
|
||||
ExFreePool(FontBitfield);
|
||||
|
||||
|
@ -56,27 +56,22 @@ ScrLoadFontTable(UINT CodePage)
|
|||
|
||||
NTSTATUS ExtractFont(UINT CodePage, PUCHAR FontBitField)
|
||||
{
|
||||
BOOLEAN bFoundFile = FALSE;
|
||||
HANDLE Handle;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
CHAR FileHeader[5];
|
||||
CHAR Header[5];
|
||||
CHAR PsfHeader[3];
|
||||
CHAR FileName[BUFFER_SIZE];
|
||||
ULONG Length;
|
||||
NTSTATUS Status;
|
||||
CHAR FileName[20];
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
UNICODE_STRING LinkName;
|
||||
UNICODE_STRING SourceName;
|
||||
ZIP_LOCAL_HEADER LocalHeader;
|
||||
CFHEADER CabFileHeader;
|
||||
CFFILE CabFile;
|
||||
ULONG CabFileOffset = 0;
|
||||
LARGE_INTEGER ByteOffset;
|
||||
WCHAR SourceBuffer[MAX_PATH] = {L'\0'};
|
||||
|
||||
if(KeGetCurrentIrql() != PASSIVE_LEVEL)
|
||||
return STATUS_INVALID_DEVICE_STATE;
|
||||
|
||||
RtlZeroMemory(FileHeader, sizeof(FileHeader));
|
||||
RtlZeroMemory(Header, sizeof(Header));
|
||||
RtlZeroMemory(PsfHeader, sizeof(PsfHeader));
|
||||
return STATUS_INVALID_DEVICE_STATE;
|
||||
|
||||
RtlInitUnicodeString(&LinkName,
|
||||
L"\\SystemRoot");
|
||||
|
@ -100,10 +95,10 @@ NTSTATUS ExtractFont(UINT CodePage, PUCHAR FontBitField)
|
|||
|
||||
Status = ZwQuerySymbolicLinkObject(Handle,
|
||||
&SourceName,
|
||||
&Length);
|
||||
NULL);
|
||||
ZwClose(Handle);
|
||||
|
||||
Status = RtlAppendUnicodeToString(&SourceName, L"\\vgafont.bin");
|
||||
Status = RtlAppendUnicodeToString(&SourceName, L"\\vgafonts.cab");
|
||||
InitializeObjectAttributes(&ObjectAttributes, &SourceName,
|
||||
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
|
||||
NULL, NULL);
|
||||
|
@ -118,82 +113,78 @@ NTSTATUS ExtractFont(UINT CodePage, PUCHAR FontBitField)
|
|||
NULL, 0);
|
||||
|
||||
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);
|
||||
ByteOffset.LowPart += 4;
|
||||
&CabFileHeader, sizeof(CabFileHeader), &ByteOffset, NULL);
|
||||
|
||||
if(NT_SUCCESS(Status))
|
||||
{
|
||||
while(strcmp(FileHeader, Header) == 0)
|
||||
if(CabFileHeader.Signature == CAB_SIGNATURE)
|
||||
{
|
||||
Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock,
|
||||
&LocalHeader, sizeof(ZIP_LOCAL_HEADER), &ByteOffset, NULL);
|
||||
ByteOffset.LowPart += sizeof(ZIP_LOCAL_HEADER);
|
||||
/* DbgPrint("%ld\n", LocalHeader.FileNameLength); */
|
||||
if (LocalHeader.FileNameLength < BUFFER_SIZE)
|
||||
// We have a valid CAB file!
|
||||
// Read the file table now and decrement the file count on every file. When it's zero, we read the complete table.
|
||||
ByteOffset.LowPart = CabFileHeader.FileTableOffset;
|
||||
|
||||
while(CabFileHeader.FileCount)
|
||||
{
|
||||
RtlZeroMemory(FileName, BUFFER_SIZE);
|
||||
Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock,
|
||||
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)
|
||||
&CabFile, sizeof(CabFile), &ByteOffset, NULL);
|
||||
|
||||
if(NT_SUCCESS(Status))
|
||||
{
|
||||
/* we got it, raw font */
|
||||
ByteOffset.LowPart += sizeof(CabFile);
|
||||
|
||||
// We assume here that the file name is max. 19 characters (+ 1 NULL character) long.
|
||||
// This should be enough for our purpose.
|
||||
Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock,
|
||||
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)
|
||||
FileName, sizeof(FileName), &ByteOffset, NULL);
|
||||
|
||||
if(NT_SUCCESS(Status))
|
||||
{
|
||||
/* only load fonts with a size of 8
|
||||
and filemode 0 (256 characters, no unicode_data)
|
||||
or filemode 2 (256 characters, unicode_data is skipped) */
|
||||
if ((FileHeader[3] == 8) && ((FileHeader[4] == 0) || (FileHeader[4] == 2)))
|
||||
if(!bFoundFile && atoi(FileName) == CodePage)
|
||||
{
|
||||
Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock,
|
||||
FontBitField, 2048, &ByteOffset, NULL);
|
||||
ZwClose(Handle);
|
||||
return STATUS_SUCCESS;
|
||||
// We got the correct file.
|
||||
// Save the offset and loop through the rest of the file table to find the position, where the actual data starts.
|
||||
CabFileOffset = CabFile.FileOffset;
|
||||
bFoundFile = TRUE;
|
||||
}
|
||||
else
|
||||
DbgPrint("Wrong fontsize or too many characters");
|
||||
|
||||
ByteOffset.LowPart += strlen(FileName) + 1;
|
||||
}
|
||||
}
|
||||
/* invalid data */
|
||||
ZwClose(Handle);
|
||||
return STATUS_NO_MATCH;
|
||||
|
||||
CabFileHeader.FileCount--;
|
||||
}
|
||||
ByteOffset.LowPart += LocalHeader.CompressedSize;
|
||||
|
||||
// 8 = Size of a CFFOLDER structure (see cabman). As we don't need the values of that structure, just increase the offset here.
|
||||
ByteOffset.LowPart += 8;
|
||||
ByteOffset.LowPart += CabFileOffset;
|
||||
|
||||
// ByteOffset now contains the offset of the actual data, so we can read the RAW font
|
||||
Status = ZwReadFile(Handle, NULL, NULL, NULL, &IoStatusBlock,
|
||||
FileHeader, 4, &ByteOffset, NULL);
|
||||
ByteOffset.LowPart += 4;
|
||||
/* DbgPrint("%s\n", FileHeader); */
|
||||
FontBitField, 2048, &ByteOffset, NULL);
|
||||
ZwClose(Handle);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1("Error: CAB signature is missing!\n");
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
}
|
||||
else
|
||||
DPRINT1("Error: Cannot read from file\n");
|
||||
|
||||
ZwClose(Handle);
|
||||
return Status;
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgPrint("Error: Can not open vgafont.bin\n");
|
||||
DPRINT1("Error: Cannot open vgafonts.cab\n");
|
||||
return Status;
|
||||
}
|
||||
return STATUS_NO_MATCH;
|
||||
}
|
||||
|
||||
/* Font-load specific funcs */
|
||||
|
|
|
@ -13,7 +13,4 @@
|
|||
<directory name="nls">
|
||||
<xi:include href="nls/nls.rbuild" />
|
||||
</directory>
|
||||
<directory name="vgafont">
|
||||
<xi:include href="vgafont/vgafont.rbuild" />
|
||||
</directory>
|
||||
</group>
|
||||
|
|
Binary file not shown.
|
@ -1,5 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
|
||||
<group>
|
||||
<cdfile installbase="$(CDOUTPUT)">vgafont.bin</cdfile>
|
||||
</group>
|
BIN
reactos/media/vgafonts/737-8x8.bin
Normal file
BIN
reactos/media/vgafonts/737-8x8.bin
Normal file
Binary file not shown.
BIN
reactos/media/vgafonts/775-8x8.bin
Normal file
BIN
reactos/media/vgafonts/775-8x8.bin
Normal file
Binary file not shown.
BIN
reactos/media/vgafonts/850-8x8.bin
Normal file
BIN
reactos/media/vgafonts/850-8x8.bin
Normal file
Binary file not shown.
BIN
reactos/media/vgafonts/852-8x8.bin
Normal file
BIN
reactos/media/vgafonts/852-8x8.bin
Normal file
Binary file not shown.
BIN
reactos/media/vgafonts/865-8x8.bin
Normal file
BIN
reactos/media/vgafonts/865-8x8.bin
Normal file
Binary file not shown.
BIN
reactos/media/vgafonts/866-8x8.bin
Normal file
BIN
reactos/media/vgafonts/866-8x8.bin
Normal file
Binary file not shown.
|
@ -3851,6 +3851,13 @@ MingwIsoModuleHandler::GenerateIsoModuleTarget ()
|
|||
FileLocation reactosInf ( bootcdReactos.directory,
|
||||
bootcdReactos.relative_path,
|
||||
"reactos.inf" );
|
||||
FileLocation vgafontsCab( bootcdReactos.directory,
|
||||
bootcdReactos.relative_path,
|
||||
"vgafonts.cab");
|
||||
FileLocation vgafontsDir( SourceDirectory,
|
||||
"media" + sSep + "vgafonts",
|
||||
"" );
|
||||
|
||||
vSourceFiles.push_back ( reactosDff );
|
||||
|
||||
string IsoName;
|
||||
|
@ -3879,6 +3886,10 @@ MingwIsoModuleHandler::GenerateIsoModuleTarget ()
|
|||
cdFiles.c_str (),
|
||||
cdDirectories.c_str () );
|
||||
fprintf ( fMakefile, "\t$(ECHO_CABMAN)\n" );
|
||||
fprintf ( fMakefile,
|
||||
"\t$(Q)$(CABMAN_TARGET) -M raw -S %s %s\\*.bin\n", // Escape the asterisk for Make
|
||||
backend->GetFullName ( vgafontsCab ).c_str (),
|
||||
backend->GetFullName ( vgafontsDir ).c_str ());
|
||||
fprintf ( fMakefile,
|
||||
"\t$(Q)$(CABMAN_TARGET) -C %s -L %s -I -P $(OUTPUT)\n",
|
||||
backend->GetFullName ( reactosDff ).c_str (),
|
||||
|
|
Loading…
Reference in a new issue