Make fnt2bdf produce correct fonts.

This commit is contained in:
Dmitry Timoshkov 2000-07-25 12:25:40 +00:00 committed by Alexandre Julliard
parent e58bd1bae6
commit fef718655d
3 changed files with 59 additions and 92 deletions

View File

@ -112,6 +112,7 @@ typedef struct
LONG dfBitsPointer; LONG dfBitsPointer;
LONG dfBitsOffset; LONG dfBitsOffset;
CHAR dfReserved; CHAR dfReserved;
/* Fields, introduced for Windows 3.x fonts */
LONG dfFlags; LONG dfFlags;
INT16 dfAspace; INT16 dfAspace;
INT16 dfBspace; INT16 dfBspace;

View File

@ -14,29 +14,25 @@
#endif #endif
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include "windef.h"
#include "wingdi.h"
#include "winuser.h"
#include "fnt2bdf.h" #include "fnt2bdf.h"
#include "neexe.h" #include "neexe.h"
#include "module.h" #include "module.h"
#define MAP_BEG 118
extern char* g_lpstrFileName;
extern char* g_lpstrCharSet;
#define FILE_ERROR 0 #define FILE_ERROR 0
#define FILE_DLL 1 #define FILE_DLL 1
#define FILE_FNT 2 #define FILE_FNT 2
/* global options */ /* global options */
int dump_bdf( fnt_fontS* cpe_font_struct, unsigned char* file_buffer);
int dump_bdf_hdr(FILE* fs, fnt_fontS* cpe_font_struct, unsigned char* file_buffer);
char* g_lpstrFileName = NULL; char* g_lpstrFileName = NULL;
char* g_lpstrCharSet = NULL; char* g_lpstrCharSet = NULL;
char* g_lpstrInputFile = NULL; char* g_lpstrInputFile = NULL;
@ -63,7 +59,7 @@ void usage(void)
exit(-1); exit(-1);
} }
/* convert big-endian value to the local format */ /* convert little-endian value to the local format */
int return_data_value(enum data_types dtype, void * pChr) int return_data_value(enum data_types dtype, void * pChr)
{ {
@ -95,13 +91,13 @@ int ret_val = 0;
int make_bdf_filename(char* name, fnt_fontS* cpe_font_struct, unsigned char* file_buffer) int make_bdf_filename(char* name, fnt_fontS* cpe_font_struct, unsigned char* file_buffer)
{ {
int l_nameoffset = return_data_value(dfLong, cpe_font_struct->hdr.dfFace); long l_nameoffset = return_data_value(dfLong, &cpe_font_struct->hdr.fi.dfFace);
char* lpChar; char* lpChar;
if( !g_lpstrFileName ) if( !g_lpstrFileName )
{ {
if( !l_nameoffset || if( !l_nameoffset ||
l_nameoffset > return_data_value(dfLong, cpe_font_struct->hdr.dfSize) + 1 ) l_nameoffset > return_data_value(dfLong, &cpe_font_struct->hdr.dfSize) + 1 )
return ERROR_DATA; return ERROR_DATA;
lpChar = (char*)(file_buffer + l_nameoffset); lpChar = (char*)(file_buffer + l_nameoffset);
} }
@ -114,13 +110,13 @@ char* lpChar;
/* construct a filename from the font typeface, slant, weight, and size */ /* construct a filename from the font typeface, slant, weight, and size */
if( cpe_font_struct->hdr.dfItalic[0] ) strcat(name, "_i" ); if( cpe_font_struct->hdr.fi.dfItalic ) strcat(name, "_i" );
else strcat(name, "_r" ); else strcat(name, "_r" );
lpChar = name + strlen( name ); lpChar = name + strlen( name );
sprintf(lpChar, "%d-%d.bdf", return_data_value(dfShort, cpe_font_struct->hdr.dfWeight), sprintf(lpChar, "%d-%d.bdf", return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfWeight),
(g_outputPoints) ? return_data_value(dfShort, cpe_font_struct->hdr.dfPoints) (g_outputPoints) ? return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfPoints)
: return_data_value(dfShort, cpe_font_struct->hdr.dfPixHeight) ); : return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfPixHeight) );
return 0; return 0;
} }
@ -135,18 +131,23 @@ int parse_fnt_data(unsigned char* file_buffer, int length)
/* check font header */ /* check font header */
t = return_data_value(dfShort, cpe_font_struct.hdr.dfVersion); t = return_data_value(dfShort, &cpe_font_struct.hdr.dfVersion);
if( t != 0x300 && t != 0x200) return ERROR_VERSION; if( t != 0x300 && t != 0x200) return ERROR_VERSION;
t = return_data_value(dfLong, cpe_font_struct.hdr.dfSize); t = return_data_value(dfLong, &cpe_font_struct.hdr.dfSize);
if( t > length ) return ERROR_SIZE; if( t > length ) return ERROR_SIZE;
else else
{ {
/* set up the charWidth/charOffset structure pairs (dfCharTable)... */ /* set up the charWidth/charOffset structure pairs (dfCharTable)... */
int l_fchar = return_data_value(dfChar, cpe_font_struct.hdr.dfFirstChar), int l_fchar = return_data_value(dfChar, &cpe_font_struct.hdr.fi.dfFirstChar),
l_lchar = return_data_value(dfChar, cpe_font_struct.hdr.dfLastChar); l_lchar = return_data_value(dfChar, &cpe_font_struct.hdr.fi.dfLastChar);
int l_len = l_lchar - l_fchar + 1, l_ptr = MAP_BEG; int l_len = l_lchar - l_fchar + 1;
int l_ptr = sizeof(fnt_hdrS);
/* some fields were introduced for Windows 3.x fonts */
if( return_data_value(dfShort, &cpe_font_struct.hdr.dfVersion) == 0x200 )
l_ptr -= 30;
/* malloc size = (# chars) * sizeof(WinCharS) */ /* malloc size = (# chars) * sizeof(WinCharS) */
@ -160,7 +161,7 @@ int parse_fnt_data(unsigned char* file_buffer, int length)
l_ptr += 2; /* bump by sizeof(short) */ l_ptr += 2; /* bump by sizeof(short) */
if( return_data_value(dfShort, cpe_font_struct.hdr.dfVersion) == 0x200) { if( return_data_value(dfShort, &cpe_font_struct.hdr.dfVersion) == 0x200) {
cpe_font_struct.dfCharTable[ic].charOffset = cpe_font_struct.dfCharTable[ic].charOffset =
return_data_value(dfShort, &file_buffer[l_ptr]); return_data_value(dfShort, &file_buffer[l_ptr]);
l_ptr += 2; /* bump by sizeof(long) */ l_ptr += 2; /* bump by sizeof(long) */
@ -181,12 +182,12 @@ int dump_bdf( fnt_fontS* cpe_font_struct, unsigned char* file_buffer)
{ {
FILE* fp; FILE* fp;
int ic; int ic;
int l_fchar = return_data_value(dfChar, cpe_font_struct->hdr.dfFirstChar), int l_fchar = return_data_value(dfChar, &cpe_font_struct->hdr.fi.dfFirstChar),
l_lchar = return_data_value(dfChar, cpe_font_struct->hdr.dfLastChar); l_lchar = return_data_value(dfChar, &cpe_font_struct->hdr.fi.dfLastChar);
int l_len = l_lchar-l_fchar + 1, int l_len = l_lchar-l_fchar + 1,
l_hgt = return_data_value(dfChar, cpe_font_struct->hdr.dfPixHeight); l_hgt = return_data_value(dfChar, &cpe_font_struct->hdr.fi.dfPixHeight);
int l_ascent = return_data_value(dfShort, cpe_font_struct->hdr.dfAscent); int l_ascent = return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfAscent);
char l_filename[256]; char l_filename[256];
if( (ic = make_bdf_filename(l_filename, cpe_font_struct, file_buffer)) ) if( (ic = make_bdf_filename(l_filename, cpe_font_struct, file_buffer)) )
@ -288,23 +289,23 @@ return 0;
int dump_bdf_hdr(FILE* fs, fnt_fontS* cpe_font_struct, unsigned char* file_buffer) int dump_bdf_hdr(FILE* fs, fnt_fontS* cpe_font_struct, unsigned char* file_buffer)
{ {
int l_fchar = return_data_value(dfChar, cpe_font_struct->hdr.dfFirstChar), int l_fchar = return_data_value(dfChar, &cpe_font_struct->hdr.fi.dfFirstChar),
l_lchar = return_data_value(dfChar, cpe_font_struct->hdr.dfLastChar); l_lchar = return_data_value(dfChar, &cpe_font_struct->hdr.fi.dfLastChar);
int l_len = l_lchar - l_fchar + 1; int l_len = l_lchar - l_fchar + 1;
int l_nameoffset = return_data_value(dfLong, cpe_font_struct->hdr.dfFace); long l_nameoffset = return_data_value(dfLong, &cpe_font_struct->hdr.fi.dfFace);
int l_cellheight = return_data_value(dfShort, cpe_font_struct->hdr.dfPixHeight); int l_cellheight = return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfPixHeight);
int l_ascent = return_data_value(dfShort, cpe_font_struct->hdr.dfAscent); int l_ascent = return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfAscent);
fprintf(fs, "STARTFONT 2.1\n"); fprintf(fs, "STARTFONT 2.1\n");
/* Compose font name */ /* Compose font name */
if( l_nameoffset && if( l_nameoffset &&
l_nameoffset < return_data_value(dfLong, cpe_font_struct->hdr.dfSize) ) l_nameoffset < return_data_value(dfLong, &cpe_font_struct->hdr.dfSize) )
{ {
int dpi, point_size; int dpi, point_size;
char* lpFace = (char*)(file_buffer + l_nameoffset), *lpChar; char* lpFace = (char*)(file_buffer + l_nameoffset), *lpChar;
short tmWeight = return_data_value(dfShort, cpe_font_struct->hdr.dfWeight); short tmWeight = return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfWeight);
while((lpChar = strchr(lpFace, '-')) ) while((lpChar = strchr(lpFace, '-')) )
*lpChar = ' '; *lpChar = ' ';
@ -323,19 +324,19 @@ int l_ascent = return_data_value(dfShort, cpe_font_struct->hdr.dfAscent);
fputs("bold-", fs); fputs("bold-", fs);
else fputs("black-", fs); else fputs("black-", fs);
if( cpe_font_struct->hdr.dfItalic[0] ) /* slant */ if( cpe_font_struct->hdr.fi.dfItalic ) /* slant */
fputs("i-", fs); fputs("i-", fs);
else fputs("r-", fs); else fputs("r-", fs);
/* style */ /* style */
if( (cpe_font_struct->hdr.dfPitchAndFamily[0] & 0xF0) == FF_SWISS ) if( (cpe_font_struct->hdr.fi.dfPitchAndFamily & 0xF0) == FF_SWISS )
fputs("normal-sans-", fs); fputs("normal-sans-", fs);
else fputs("normal--", fs); /* still can be -sans */ else fputs("normal--", fs); /* still can be -sans */
/* y extents */ /* y extents */
point_size = 10 * return_data_value(dfShort, cpe_font_struct->hdr.dfPoints ); point_size = 10 * return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfPoints );
dpi = (l_cellheight * 720) / point_size; dpi = (l_cellheight * 720) / point_size;
fprintf(fs, "%d-%d-%d-%d-", l_cellheight, 10*l_cellheight, 72, 72); fprintf(fs, "%d-%d-%d-%d-", l_cellheight, 10*l_cellheight, 72, 72);
@ -343,18 +344,18 @@ int l_ascent = return_data_value(dfShort, cpe_font_struct->hdr.dfAscent);
/* spacing */ /* spacing */
if( return_data_value(dfShort, cpe_font_struct->hdr.dfPixWidth) ) fputs("c-", fs); if( return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfPixWidth) ) fputs("c-", fs);
else fputs("p-", fs); else fputs("p-", fs);
/* average width */ /* average width */
fprintf( fs, "%d-", 10 * return_data_value(dfShort, cpe_font_struct->hdr.dfAvgWidth) ); fprintf( fs, "%d-", 10 * return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfAvgWidth) );
/* charset */ /* charset */
if( g_lpstrCharSet ) fprintf(fs, "%s\n", g_lpstrCharSet); if( g_lpstrCharSet ) fprintf(fs, "%s\n", g_lpstrCharSet);
else else
switch( cpe_font_struct->hdr.dfCharSet[0] ) switch( cpe_font_struct->hdr.fi.dfCharSet )
{ {
/* Microsoft just had to invent its own charsets! */ /* Microsoft just had to invent its own charsets! */
@ -380,12 +381,12 @@ int l_ascent = return_data_value(dfShort, cpe_font_struct->hdr.dfAscent);
fprintf(fs, "SIZE %d %d %d\n", fprintf(fs, "SIZE %d %d %d\n",
l_cellheight, l_cellheight,
return_data_value(dfShort, cpe_font_struct->hdr.dfHorizRes), return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfHorizRes),
return_data_value(dfShort, cpe_font_struct->hdr.dfVertRes)); /* dfVertRes[2] */ return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfVertRes)); /* dfVertRes[2] */
fprintf(fs, "FONTBOUNDINGBOX %d %d %d %d\n", fprintf(fs, "FONTBOUNDINGBOX %d %d %d %d\n",
return_data_value(dfShort, cpe_font_struct->hdr.dfMaxWidth), return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfMaxWidth),
return_data_value(dfChar, cpe_font_struct->hdr.dfPixHeight), return_data_value(dfChar, &cpe_font_struct->hdr.fi.dfPixHeight),
0, l_ascent - l_cellheight ); 0, l_ascent - l_cellheight );
fprintf(fs, "STARTPROPERTIES 4\n"); fprintf(fs, "STARTPROPERTIES 4\n");
@ -393,8 +394,8 @@ int l_ascent = return_data_value(dfShort, cpe_font_struct->hdr.dfAscent);
fprintf(fs, "FONT_ASCENT %d\n", l_ascent ); /* dfAscent[2] */ fprintf(fs, "FONT_ASCENT %d\n", l_ascent ); /* dfAscent[2] */
fprintf(fs, "FONT_DESCENT %d\n", l_cellheight - l_ascent ); fprintf(fs, "FONT_DESCENT %d\n", l_cellheight - l_ascent );
fprintf(fs, "CAP_HEIGHT %d\n", l_ascent - fprintf(fs, "CAP_HEIGHT %d\n", l_ascent -
return_data_value(dfShort, cpe_font_struct->hdr.dfInternalLeading)); return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfInternalLeading));
fprintf(fs, "DEFAULT_CHAR %d\n", return_data_value(dfShort, cpe_font_struct->hdr.dfDefaultChar)); fprintf(fs, "DEFAULT_CHAR %d\n", return_data_value(dfShort, &cpe_font_struct->hdr.fi.dfDefaultChar));
fprintf(fs, "ENDPROPERTIES\n"); fprintf(fs, "ENDPROPERTIES\n");
@ -457,8 +458,8 @@ int get_resource_table(int fd, unsigned char** lpdata, int fsize)
{ {
IMAGE_DOS_HEADER mz_header; IMAGE_DOS_HEADER mz_header;
IMAGE_OS2_HEADER ne_header; IMAGE_OS2_HEADER ne_header;
short s, offset, size, retval; long s, offset, size;
int retval;
lseek( fd, 0, SEEK_SET ); lseek( fd, 0, SEEK_SET );
@ -497,7 +498,7 @@ int get_resource_table(int fd, unsigned char** lpdata, int fsize)
} }
else if( s == 0x300 || s == 0x200 ) /* maybe .fnt ? */ else if( s == 0x300 || s == 0x200 ) /* maybe .fnt ? */
{ {
size = return_data_value(dfLong, (char*)&mz_header+2); size = return_data_value(dfLong, &((fnt_hdrS *)&mz_header)->dfSize);
if( size != fsize ) return FILE_ERROR; if( size != fsize ) return FILE_ERROR;
offset = 0; offset = 0;
@ -550,6 +551,7 @@ int main(int argc, char **argv)
{ {
count = j; count = j;
pFontStorage = (NE_NAMEINFO*)(pTInfo + 1); pFontStorage = (NE_NAMEINFO*)(pTInfo + 1);
break; /* found one */
} }
pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1) + j*sizeof(NE_NAMEINFO)); pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1) + j*sizeof(NE_NAMEINFO));

View File

@ -1,4 +1,6 @@
#include <stdio.h> #include "wine/wingdi16.h"
#include "pshpack1.h"
enum data_types {dfChar, dfShort, dfLong, dfString}; enum data_types {dfChar, dfShort, dfLong, dfString};
@ -10,48 +12,16 @@ enum data_types {dfChar, dfShort, dfLong, dfString};
typedef struct tagFontHeader typedef struct tagFontHeader
{ {
unsigned char dfVersion[2]; /* Version (always 0x3000) */ short dfVersion; /* Version */
unsigned char dfSize[4]; /* Total File Size */ long dfSize; /* Total File Size */
unsigned char dfCopyright[60]; /* Copyright notice */ char dfCopyright[60]; /* Copyright notice */
unsigned char dfType[2]; /* Vector or bitmap font */ FONTINFO16 fi; /* FONTINFO structure */
unsigned char dfPoints[2]; /* Nominal point size */
unsigned char dfVertRes[2]; /* Vertical Resolution */
unsigned char dfHorizRes[2]; /* Horizontal Resolutionchar */
unsigned char dfAscent[2]; /* Character ascent in pixels */
unsigned char dfInternalLeading[2]; /* Leading included in character defn */
unsigned char dfExternalLeading[2]; /* Leading to be added by Windows */
unsigned char dfItalic[1]; /* 1=Italic font */
unsigned char dfUnderline[1]; /* 1=underlined font */
unsigned char dfStrikeOut[1]; /* 1=strike-out font */
unsigned char dfWeight[2]; /* Weight: 400=normal */
unsigned char dfCharSet[1]; /* Character Set for this font */
unsigned char dfPixWidth[2]; /* Character width (0 for proportional) */
unsigned char dfPixHeight[2]; /* Character height */
unsigned char dfPitchAndFamily[1]; /* Font Pitch and family */
unsigned char dfAvgWidth[2]; /* Average character width */
unsigned char dfMaxWidth[2]; /* Maximum character width */
unsigned char dfFirstChar[1]; /* Firwst character of the font */
unsigned char dfLastChar[1]; /* Last character of the font */
unsigned char dfDefaultChar[1]; /* Missing character */
unsigned char dfBreakChar[1]; /* Character to indicate word breaks */
unsigned char dfWidthBytes[2]; /* Number of bytes in each row */
unsigned char dfDevice[4]; /* Offset to device name */
unsigned char dfFace[4]; /* Offset to type face name */
unsigned char dfBitsPointer[4];
unsigned char dfBitsOffset[4]; /* Offset to bitmaps */
unsigned char dfReserved[1];
unsigned char dfFlags[4]; /* Bitmapped flags */
unsigned char dfAspace[2];
unsigned char dfBspace[2];
unsigned char dfCspace[2];
unsigned char dfColorTable[2]; /* Offset to Color table */
unsigned char dfReserved1[4];
} fnt_hdrS; } fnt_hdrS;
typedef struct WinCharStruct typedef struct WinCharStruct
{ {
unsigned int charWidth; unsigned int charWidth;
unsigned int charOffset; long charOffset;
} WinCharS; } WinCharS;
typedef struct fntFontStruct typedef struct fntFontStruct
@ -65,10 +35,4 @@ typedef struct fntFontStruct
short *dfColorTableP; short *dfColorTableP;
} fnt_fontS; } fnt_fontS;
extern int return_data_value(enum data_types, void *); #include "poppack.h"
extern int dump_bdf(fnt_fontS*, unsigned char* );
extern int dump_bdf_hdr(FILE* fp,fnt_fontS*, unsigned char* );
extern int parse_fnt_data(unsigned char* file_buffer, int length);