windows-nt/Source/XPSP1/NT/base/boot/bootfont/genfont/genfont.c
2020-09-26 16:20:57 +08:00

196 lines
5.1 KiB
C

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include "..\..\lib\i386\bootfont.h"
#include "fonttable.h"
int
__cdecl
main(
IN int argc,
IN char *argv[]
)
{
HANDLE hFile;
DWORD BytesWritten;
BOOL b;
BOOTFONTBIN_HEADER Header;
unsigned u;
unsigned char SBCSBuffer[MAX_SBCS_BYTES+2];
unsigned char DBCSBuffer[MAX_DBCS_BYTES+2];
if(argc != 2) {
fprintf(stderr,"Usage: %s <outputfile>\n",argv[0]);
return(1);
}
//
// Fill in the header.
//
Header.Signature = BOOTFONTBIN_SIGNATURE;
Header.LanguageId = LANGUAGE_ID;
Header.NumSbcsChars = MAX_SBCS_NUM;
Header.NumDbcsChars = MAX_DBCS_NUM;
// Add 2 bytes for each entry for our unicode appendage
Header.SbcsEntriesTotalSize = (MAX_SBCS_BYTES + 2) * MAX_SBCS_NUM;
Header.DbcsEntriesTotalSize = (MAX_DBCS_BYTES + 2) * MAX_DBCS_NUM;
ZeroMemory(Header.DbcsLeadTable,sizeof(Header.DbcsLeadTable));
MoveMemory(Header.DbcsLeadTable,LeadByteTable,sizeof(LeadByteTable));
Header.CharacterImageHeight = 16;
Header.CharacterTopPad = 1;
Header.CharacterBottomPad = 2;
Header.CharacterImageSbcsWidth = 8;
Header.CharacterImageDbcsWidth = 16;
Header.SbcsOffset = sizeof(BOOTFONTBIN_HEADER);
Header.DbcsOffset = Header.SbcsOffset + Header.SbcsEntriesTotalSize;
//
// Create the output file.
//
hFile = CreateFile(
argv[1],
FILE_GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
0,
NULL
);
if(hFile == INVALID_HANDLE_VALUE) {
printf("Unable to create output file (%u)\n",GetLastError());
return(1);
}
//
// Write the header.
//
b = WriteFile(hFile,&Header,sizeof(BOOTFONTBIN_HEADER),&BytesWritten,NULL);
if(!b) {
printf("Error writing output file (%u)\n",GetLastError());
CloseHandle(hFile);
return(1);
}
//
// We're about to convert SBCS and DBCS characters into
// unicode, so we need to figure out what to set our
// locale to, so that mbtowc will work correctly.
//
if( _tsetlocale(LC_ALL, LocaleString) == NULL ) {
printf( "_tsetlocale failed!\n" );
return(0);
}
//
// Write the sbcs images.
//
for(u=0; u<MAX_SBCS_NUM; u++) {
//
// Copy the SBCSImage info into our SBCSBuffer, append our
// unicode encoding onto the last 2 bytes of SBCSImage, then
// write it out.
//
RtlCopyMemory( SBCSBuffer, SBCSImage[u], MAX_SBCS_BYTES );
//
// We must use MultiByteToWideChar to convert from SBCS to unicode.
//
// MultiByteToWideChar doesn't seem to work when converting
// from DBCS to unicode, so there we use mbtowc.
//
#if 0
if( !mbtowc( (WCHAR *)&SBCSBuffer[MAX_SBCS_BYTES], SBCSBuffer, 1 ) ) {
#else
if( !MultiByteToWideChar( CP_OEMCP,
MB_ERR_INVALID_CHARS,
SBCSBuffer,
1,
(WCHAR *)&SBCSBuffer[MAX_SBCS_BYTES],
sizeof(WCHAR) ) ) {
#endif
SBCSBuffer[MAX_SBCS_BYTES] = 0;
SBCSBuffer[MAX_SBCS_BYTES+1] = 0x3F;
}
b = WriteFile(hFile,SBCSBuffer,MAX_SBCS_BYTES+2,&BytesWritten,NULL);
if(!b) {
printf("Error writing output file (%u)\n",GetLastError());
CloseHandle(hFile);
return(1);
}
}
//
// Write the dbcs images.
//
for(u=0; u<MAX_DBCS_NUM; u++) {
//
// Copy the DBCSImage info into our DBCSBuffer, append our
// unicode encoding onto the last 2 bytes of DBCSImage, then
// write it out.
//
RtlCopyMemory( DBCSBuffer, DBCSImage[u], MAX_DBCS_BYTES );
//
// We must use mbtowc to convert from DBCS to unicode.
//
// Whereas, mbtowc doesn't seem to work when converting
// from SBCS to unicode, so there we use MultiByteToWideChar.
//
#if 0
if( !mbtowc( (WCHAR *)&DBCSBuffer[MAX_DBCS_BYTES], DBCSBuffer, 2 ) ) {
#else
if( !MultiByteToWideChar( CP_OEMCP,
MB_ERR_INVALID_CHARS,
DBCSBuffer,
2,
(WCHAR *)&DBCSBuffer[MAX_DBCS_BYTES],
sizeof(WCHAR) ) ) {
#endif
DBCSBuffer[MAX_DBCS_BYTES] = 0;
DBCSBuffer[MAX_DBCS_BYTES+1] = 0x3F;
}
b = WriteFile(hFile,DBCSBuffer,MAX_DBCS_BYTES+2,&BytesWritten,NULL);
if(!b) {
printf("Error writing output file (%u)\n",GetLastError());
CloseHandle(hFile);
return(1);
}
}
// restore the local to the one the system is using.
_tsetlocale(LC_ALL, "");
//
// Done.
//
CloseHandle(hFile);
printf("Output file sucessfully generated\n");
return(0);
}