summaryrefslogtreecommitdiff
path: root/setedit/fonts/convpcf1.cc
diff options
context:
space:
mode:
Diffstat (limited to 'setedit/fonts/convpcf1.cc')
-rw-r--r--setedit/fonts/convpcf1.cc937
1 files changed, 0 insertions, 937 deletions
diff --git a/setedit/fonts/convpcf1.cc b/setedit/fonts/convpcf1.cc
deleted file mode 100644
index 77b4383..0000000
--- a/setedit/fonts/convpcf1.cc
+++ /dev/null
@@ -1,937 +0,0 @@
-/**[txh]********************************************************************
-
- Copyright (c) 2002 by Salvador E. Tropea
- Covered by the GPL License
-
- Description:
- This program was used to generate .sft files from .pcf font files (XFree86
-uses this format).@*
- The code is a hack, I don't even bothered looking for the PCF format, I
-just figured out where is located what I need. It works for the fonts I have
-and isn't really generic. In fact I solve some missing symbols using
-knowledge about the fonts it converts.@*
- If you successfully convert another fonts to the SFT format please
-consider contributing them to the Turbo Vision and SETEdit projects.@*
- This code compiles and runs under Linux and most probably is ok for other
-POSIX systems. I used gcc specific extensions. The code assumes gzip is
-available and uses it to uncompress .gz files, at least in Debian all X
-fonts are compressed using gzip.
-
-***************************************************************************/
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-// Linux stdlib defines LITTLE_ENDIAN
-#define MY_LITTLE_ENDIAN
-//#define MY_BIG_ENDIAN
-typedef unsigned char u8;
-typedef unsigned short u16;
-typedef unsigned u32;
-
-#include "intcode.h"
-
-void SaveChar(int v, FILE *d);
-void DrawChar(int v);
-
-const u32 PCF1Magic=0x70636601,typeShapes=8,typeUnicodes=0x20,typeInfo=1;
-static FILE *f;
-u32 offShapes=0,offUnicode=0,numUnicodes,numShapes,fontW=0,fontH=0,fontWb=0;
-u16 *unicodeTable;
-int verboseLevel=1,buggyHalfs=0,useForUnknown=-1;
-unsigned sizeChar;
-typedef struct
-{
- int first, last, lines;
- int width;
-} Font;
-
-char *Signature="SET's editor font\x1A";
-char Name[512];
-
-#ifdef MY_BIG_ENDIAN
-inline
-void Swap(u32 *val)
-{
- u8 *p=(u8 *)val;
- unsigned aux;
- aux=p[3];
- p[3]=p[0];
- p[0]=aux;
- aux=p[2];
- p[2]=p[1];
- p[1]=aux;
-}
-#else
-inline
-void Swap(u32 *)
-{
-}
-#endif
-
-u32 ReadU32()
-{
- u32 val;
- fread(&val,4,1,f);
- //printf("0x%08X\n",val);
- Swap(&val);
- return val;
-}
-
-void GetName(char *dest, u32 offset)
-{
- fseek(f,offset,SEEK_SET);
- int i=0;
- while (i<255)
- {
- dest[i]=fgetc(f);
- if (dest[i]==0) return;
- i++;
- }
- dest[i]=0;
-}
-
-void WriteBlank(int l, FILE *d)
-{
- int i,c=l*fontWb;
- for (i=0; i<c; i++)
- fputc(0,d);
-}
-
-void WriteFull(FILE *d)
-{
- int c=fontW;
- while (c>8)
- {
- fputc(0xFF,d);
- c-=8;
- }
- unsigned mask=0x80,acc=0;
- while (c)
- {
- acc|=mask;
- mask>>=1;
- c--;
- }
- fputc(acc,d);
-}
-
-void CopyLines(unsigned h, FILE *d)
-{
- unsigned i,j,mask,mask2,val,vres;
- u8 c[4];
-
- for (j=0; j<h; j++)
- {
- fread(c,4,1,f);
- for (i=0; i<fontWb; i++)
- {
- val=c[i];
- vres=0;
- for (mask=1,mask2=0x80; mask2; mask<<=1, mask2>>=1)
- if (val & mask)
- vres|=mask2;
- fputc(vres,d);
- }
- }
-}
-
-void CopyLinesLeft(unsigned h, unsigned cut, FILE *d)
-{
- unsigned i,j,mask,mask2,vres,k,val;
- u8 c[4];
- //printf("CopyLinesLeft(h=%d,cut=%d)\n",h,cut);
-
- for (j=0; j<h; j++)
- {
- fread(c,4,1,f);
- if (!c[0])
- {
- fwrite(c,fontWb,1,d);
- //fputc(j,d);
- //fputc(j,d);
- //printf("%d) Writing %d %d fontWb=%d",j,c[0],c[1],fontWb);
- }
- else
- for (k=0, i=0; i<fontWb; i++)
- {
- val=c[i];
- vres=0;
- for (mask=1,mask2=0x80; mask2; k++, mask<<=1, mask2>>=1)
- if (k<cut && (val & mask))
- vres|=mask2;
- fputc(vres,d);
- //printf("%d) Wrinting 0x%02X ",j,vres);
- }
- //printf("\n");
- }
-}
-
-void CopyLinesRight(unsigned h, unsigned cut, FILE *d)
-{
- unsigned i,j,mask,mask2,vres,k,val;
- u8 c[4];
-
- for (j=0; j<h; j++)
- {
- fread(c,4,1,f);
- if (!c[0])
- fwrite(c,fontWb,1,d);
- else
- for (k=0, i=0; i<fontWb; i++)
- {
- val=c[i];
- vres=0;
- for (mask=1,mask2=0x80; mask2; k++, mask<<=1, mask2>>=1)
- if (k>=cut && (val & mask))
- vres|=mask2;
- fputc(vres,d);
- }
- }
-}
-
-u32 VerifyAvailable(int uni, int replace, FILE *d)
-{
- if (uni>=numUnicodes)
- {
- printf("Missing U%04X 1\n",replace);
- SaveChar(0,d);
- return 0;
- }
- u32 val=unicodeTable[uni];
- if (val==0xFFFF)
- {
- printf("Missing U%04X 2\n",replace);
- SaveChar(0,d);
- return 0;
- }
- return val;
-}
-
-void SeekChar(unsigned val)
-{
- fseek(f,offShapes+val*sizeChar,SEEK_SET);
-}
-
-void GenerateF801(FILE *d)
-{
- unsigned val;
- if (!(val=VerifyAvailable(0x2500,0xF801,d))) return;
- int prev=fontH/4,rest=fontH-prev;
- fseek(f,offShapes+val*sizeChar+prev*4,SEEK_SET);
- printf("Generating a replacement for UF801\n");
- CopyLines(rest,d);
- u8 c[4];
- memset(c,0,4);
- int i;
- for (i=0; i<prev; i++)
- fwrite(c,fontWb,1,d);
-}
-
-void GenerateF803(FILE *d)
-{
- unsigned val;
- if (!(val=VerifyAvailable(0x2500,0xF803,d))) return;
- int prev=fontH/4,rest=fontH-prev;
- fseek(f,offShapes+val*sizeChar,SEEK_SET);
- printf("Generating a replacement for UF803\n");
- int i;
- u8 c[4];
- memset(c,0,4);
- for (i=0; i<prev; i++)
- fwrite(c,fontWb,1,d);
- CopyLines(rest,d);
-}
-
-// BOX DRAWINGS LIGHT LEFT
-void Generate2574(FILE *d)
-{
- unsigned val;
- if (!(val=VerifyAvailable(0x2500,0x2574,d))) return;
- fseek(f,offShapes+val*sizeChar,SEEK_SET);
- printf("Generating a replacement for U2574\n");
- CopyLinesLeft(fontH,fontW/2,d);
-}
-
-// BOX DRAWINGS LIGHT RIGHT
-void Generate2576(FILE *d)
-{
- unsigned val;
- if (!(val=VerifyAvailable(0x2500,0x2576,d))) return;
- fseek(f,offShapes+val*sizeChar,SEEK_SET);
- printf("Generating a replacement for U2576\n");
- CopyLinesRight(fontH,fontW/2,d);
-}
-
-// BOX DRAWINGS LIGHT UP
-void Generate2575(FILE *d)
-{
- unsigned val;
- if (!(val=VerifyAvailable(0x2502,0x2575,d))) return;
- int prev=fontH/2,rest=fontH-prev;
- fseek(f,offShapes+val*sizeChar,SEEK_SET);
- printf("Generating a replacement for U2575\n");
- CopyLines(prev,d);
- int i;
- u8 c[4];
- memset(c,0,4);
- for (i=0; i<rest; i++)
- fwrite(c,fontWb,1,d);
-}
-
-// BOX DRAWINGS LIGHT DOWN
-void Generate2577(FILE *d)
-{
- unsigned val;
- if (!(val=VerifyAvailable(0x2502,0x2577,d))) return;
- int prev=fontH/2,rest=fontH-prev;
- fseek(f,offShapes+val*sizeChar,SEEK_SET);
- printf("Generating a replacement for U2577\n");
- int i;
- u8 c[4];
- memset(c,0,4);
- for (i=0; i<rest; i++)
- fwrite(c,fontWb,1,d);
- CopyLines(prev,d);
-}
-
-int MeassureVert(unsigned val)
-{
- SeekChar(val);
- u8 c[4];
- fread(c,4,1,f);
- unsigned i,j=0,mask,mask2;
- int start=-1,end=-1;
- for (i=0; i<fontWb; i++)
- {
- val=c[i];
- for (mask=1,mask2=0x80; mask2; j++, mask<<=1, mask2>>=1)
- if (val & mask)
- {
- if (start==-1) start=j;
- }
- else
- {
- if (start!=-1 && end==-1) end=j;
- }
- }
- return end-start;
-}
-
-// [s,e)
-void MeassureHoriz2(unsigned val, int &s, int &e)
-{
- fseek(f,offShapes+val*sizeChar,SEEK_SET);
- u8 c[4];
- s=0;
- fread(c,4,1,f);
- while (!c[0])
- {
- s++;
- fread(c,4,1,f);
- }
- while (c[0])
- {
- s++;
- fread(c,4,1,f);
- }
- e=s;
- while (!c[0])
- {
- e++;
- fread(c,4,1,f);
- }
-}
-
-// [start;end)
-void CreateV(u8 *c, int start, int end)
-{
- unsigned i,mask2,vres,k;
- memset(c,0,4);
-
- for (k=0, i=0; i<fontWb; i++)
- {
- vres=0;
- for (mask2=0x80; mask2; k++, mask2>>=1)
- if (k>=start && k<end)
- vres|=mask2;
- c[i]=vres;
- }
-}
-
-// BOX DRAWINGS HEAVY LEFT, but Linux uses *DOUBLE*
-void GenerateFake2578(FILE *d)
-{
- unsigned valV,valH2;
- if (!(valH2=VerifyAvailable(0x2550,0x2578,d))) return;
- if (!(valV=VerifyAvailable(0x2502,0x2578,d))) return;
- int w=MeassureVert(valV);
- int s,e;
- MeassureHoriz2(valH2,s,e);
- printf("Generating a replacement for U2578 Width: %d [%d;%d)\n",w,s,e);
- SeekChar(valH2);
- u8 c[4];
- u32 half=fontW/2,i;
- CreateV(c,half-w,half);
- CopyLinesLeft(s,half,d);
- for (i=s; i<e; i++)
- {
- //printf("%d) Writing %d %d fontWb=%d\n",i,c[0],c[1],fontWb);
- fwrite(c,fontWb,1,d);
- }
- fseek(f,(e-s)*4,SEEK_CUR);
- CopyLinesLeft(fontH-e,half,d);
-}
-
-// BOX DRAWINGS HEAVY RIGHT, but Linux uses *DOUBLE*
-void GenerateFake257A(FILE *d)
-{
- unsigned valV,valH2;
- if (!(valH2=VerifyAvailable(0x2550,0x257A,d))) return;
- if (!(valV=VerifyAvailable(0x2502,0x257A,d))) return;
- int w=MeassureVert(valV);
- int s,e;
- MeassureHoriz2(valH2,s,e);
- printf("Generating a replacement for U257A Width: %d [%d;%d)\n",w,s,e);
- SeekChar(valH2);
- u8 c[4];
- u32 half=fontW/2,i;
- CreateV(c,half,half+w);
- CopyLinesRight(s,half,d);
- for (i=s; i<e; i++)
- fwrite(c,fontWb,1,d);
- fseek(f,(e-s)*4,SEEK_CUR);
- CopyLinesRight(fontH-e,half,d);
-}
-
-int MeassureHoriz(unsigned val, FILE *d)
-{
- SeekChar(val);
- u8 c[4];
- fread(c,4,1,f);
- while (!c[0]) fread(c,4,1,f);
- int h=0;
- while (c[0])
- {
- h++;
- fread(c,4,1,f);
- }
- return h;
-}
-
-void MeassureVert2(unsigned val, int &s, int &e)
-{
- SeekChar(val);
- u8 c[4];
- fread(c,4,1,f);
-
- unsigned i,mask2,k,v,end=0;
- s=e=-1;
- for (k=0, i=0; i<fontWb; i++)
- {
- v=c[i];
- for (mask2=1; mask2; k++, mask2<<=1)
- if (mask2 & v)
- {
- if (s==-1) s=k;
- if (e!=-1) end=e=k;
- }
- else
- {
- if (s!=-1 && e==-1) e=k;
- if (end)
- {
- e=k;
- return;
- }
- }
- }
-}
-
-// BOX DRAWINGS HEAVY UP, but Linux uses *DOUBLE*
-void GenerateFake2579(FILE *d)
-{
- unsigned valV2,valH;
- if (!(valV2=VerifyAvailable(0x2551,0x2579,d))) return;
- if (!(valH=VerifyAvailable(0x2500,0x2579,d))) return;
- int h=MeassureHoriz(valH,d);
- int s,e;
- MeassureVert2(valV2,s,e);
- printf("Generating a replacement for U2579 Height: %d [%d;%d)\n",h,s,e);
- SeekChar(valV2);
- u8 c[4];
- u32 half=fontH/2,rest=fontH-half,i;
- CreateV(c,s,e);
- CopyLines(half-h,d);
- for (i=0; i<h; i++)
- fwrite(c,fontWb,1,d);
- memset(c,0,4);
- for (i=0; i<rest; i++)
- fwrite(c,fontWb,1,d);
-}
-
-// BOX DRAWINGS HEAVY DOWN, but Linux uses *DOUBLE*
-void GenerateFake257B(FILE *d)
-{
- unsigned valV2,valH;
- if (!(valV2=VerifyAvailable(0x2551,0x257B,d))) return;
- if (!(valH=VerifyAvailable(0x2500,0x257B,d))) return;
- int h=MeassureHoriz(valH,d);
- int s,e;
- MeassureVert2(valV2,s,e);
- printf("Generating a replacement for U257B Height: %d [%d;%d)\n",h,s,e);
- SeekChar(valV2);
- u8 c[4];
- u32 half=fontH/2,rest=fontH-half-h,i;
- memset(c,0,4);
- for (i=0; i<half; i++)
- fwrite(c,fontWb,1,d);
- CreateV(c,s,e);
- for (i=0; i<h; i++)
- fwrite(c,fontWb,1,d);
- CopyLines(rest,d);
-}
-
-u8 *LoadChar(int v)
-{
- SeekChar(v);
- u8 *ch=new u8[fontH*fontW];
- u8 c[4],*d;
- unsigned i,j,mask,mask2,val,vres,k;
-
- for (d=ch, j=0; j<fontH; j++)
- {
- fread(c,4,1,f);
- for (k=0, i=0; i<4 && k<fontW; i++)
- {
- val=c[i];
- for (mask=1; mask<0x100 && k<fontW; d++, k++, mask<<=1)
- {
- if (val & mask)
- *d=1;
- else
- *d=0;
- }
- }
- }
- return ch;
-}
-
-void FillRect(unsigned x1, unsigned y1, unsigned x2, unsigned y2, u8 val, u8 *dest)
-{
- unsigned x,y;
- u8 *d=dest+y1*fontW;
- for (y=y1; y<=y2; d+=fontW, y++)
- for (x=x1; x<=x2; x++)
- d[x]=val;
-}
-
-void SaveChar(u8 *c, FILE *d)
-{
- unsigned h,w,mask,vres,x;
-
- for (h=0; h<fontH; c+=fontW, h++)
- for (x=0, w=0; w<fontWb; w++)
- {
- for (vres=0, mask=0x80; mask && x<fontW; x++, mask>>=1)
- if (c[x]) vres|=mask;
- fputc(vres,d);
- }
-}
-
-void Generate21B5(FILE *df)
-{
- unsigned val,valV;
- if (!(val=VerifyAvailable(0x2190,0x21B5,df))) return;
- if (!(valV=VerifyAvailable(0x2502,0x21B5,df))) return;
- int w=MeassureVert(valV);
- unsigned halfW=fontW*3/4-1,qH=fontH/4;
- u8 *c=LoadChar(val);
- int h;
- u8 *d=c;
- for (h=0; h<fontH; d+=fontW, h++)
- if (d[halfW]) break;
- for (; h<fontH; d+=fontW, h++)
- if (!d[halfW]) break;
- printf("Generating a replacement for U21B5 Width: %d [%d;%d)\n",w,qH,h);
-
- FillRect(halfW,0,fontW-1,fontH-1,0,c);
- FillRect(halfW,qH,halfW+w-1,h-1,1,c);
- SaveChar(c,df);
-}
-
-void SaveChar(int v, FILE *d)
-{
- if (v==0xF801)
- {
- GenerateF801(d);
- return;
- }
- if (v==0xF803)
- {
- GenerateF803(d);
- return;
- }
- // Terminus have wrong 0x2574-0x2577, BTW: it also have wrong 0x2578-0x257B
- // they aren't the Unicode shapes nor the Linux ones.
- if (buggyHalfs && v==unicodeTable[0x2574])
- {
- Generate2574(d);
- return;
- }
- if (buggyHalfs && v==unicodeTable[0x2575])
- {
- Generate2575(d);
- return;
- }
- if (buggyHalfs && v==unicodeTable[0x2576])
- {
- Generate2576(d);
- return;
- }
- if (buggyHalfs && v==unicodeTable[0x2577])
- {
- Generate2577(d);
- return;
- }
- // What we call 0x2578-0x257B isn't really unicode, just a crazy idea used
- // in Linux console fonts.
- if (v && v==unicodeTable[0x2578])
- {
- GenerateFake2578(d);
- return;
- }
- if (v && v==unicodeTable[0x2579])
- {
- GenerateFake2579(d);
- return;
- }
- if (v && v==unicodeTable[0x257A])
- {
- GenerateFake257A(d);
- return;
- }
- if (v && v==unicodeTable[0x257B])
- {
- GenerateFake257B(d);
- return;
- }
-
- fseek(f,offShapes+v*sizeChar,SEEK_SET);
- CopyLines(fontH,d);
-}
-
-void GenSFT(const char *name, bool append)
-{
- FILE *d;
- if (append)
- {
- d=fopen(name,"r+b");
- if (!d)
- {
- printf("Unable to open %s\n",name);
- return;
- }
- fseek(d,strlen(Signature)+4,SEEK_SET);
- u32 cant=1;
- fread(&cant,4,1,d);
- cant++;
- fseek(d,strlen(Signature)+4,SEEK_SET);
- fwrite(&cant,4,1,d);
- fseek(d,0,SEEK_END);
- }
- else
- {
- d=fopen(name,"wb");
- if (!d)
- {
- printf("Unable to create %s\n",name);
- return;
- }
- fwrite(Signature,strlen(Signature),1,d);
- u32 version=2;
- fwrite(&version,4,1,d);
- u32 cant=1;
- fwrite(&cant,4,1,d);
- u16 len=strlen(Name)+1;
- fwrite(&len,2,1,d);
- fputs(Name,d);
- }
-
- Font fnt={0,InternalMap[providedUnicodes-1].code,fontH,fontW};
- fwrite(&fnt,sizeof(fnt),1,d);
-
- int ant=-1,uni,code,i,tryNext=0;
- for (i=0; i<providedUnicodes; i++)
- {
- code=InternalMap[i].code;
- if (code==ant && !tryNext) continue;
- if (code!=ant+1 && !tryNext) printf("%d\n",code);
- tryNext=0;
- ant=code;
- uni=InternalMap[i].unicode;
- if (uni>=numUnicodes)
- {
- if (uni==0xF801 || uni==0xF803)
- SaveChar(uni,d);
- else
- {
- if (useForUnknown==-1)
- SaveChar(0,d);
- else
- SaveChar(useForUnknown,d);
- printf("Missing U%04X\n",uni);
- }
- }
- else
- {
- int val=unicodeTable[uni];
- if (val==0xFFFF)
- {
- if (code==InternalMap[i+1].code)
- tryNext=1;
- else
- {
- if (uni==0xF801 || uni==0xF803)
- SaveChar(uni,d);
- else if (uni==0x21B5)
- {
- Generate21B5(d);
- }
- else
- {
- SaveChar(0,d);
- printf("Missing U%04X\n",uni);
- }
- }
- }
- else
- SaveChar(val,d);
- }
- }
- fclose(d);
- #if 0
- // Terminus font bug
- printf("U2502 %d\n",unicodeTable[0x2502]);
- DrawChar(unicodeTable[0x2502]);
- printf("U2574 %d\n",unicodeTable[0x2574]);
- DrawChar(unicodeTable[0x2574]);
- printf("U2575 %d\n",unicodeTable[0x2575]);
- DrawChar(unicodeTable[0x2575]);
- printf("U2576 %d\n",unicodeTable[0x2576]);
- DrawChar(unicodeTable[0x2576]);
- printf("U2577 %d\n",unicodeTable[0x2577]);
- DrawChar(unicodeTable[0x2577]);
- #endif
-}
-
-void DrawChar(int v)
-{
- SeekChar(v);
- u8 c[4];
- unsigned i,j,mask,mask2,val,vres,k;
-
- for (j=0; j<fontH; j++)
- {
- fread(c,4,1,f);
- for (k=0, i=0; i<4; i++)
- {
- val=c[i];
- for (mask=1; mask<0x100; k++, mask<<=1)
- {
- if (val & mask)
- printf("X");
- else
- if (k<fontW)
- printf(".");
- }
- }
- printf("\n");
- }
-}
-
-
-const char *tempName="/tmp/.pcf1tempo.pcf";
-
-int ReadPCF(const char *s, const char *sft, bool append)
-{
- if (strstr(s,".pcf.gz"))
- {
- char b[64+strlen(s)];
- sprintf(b,"gzip -dc %s > %s",s,tempName);
- system(b);
- s=tempName;
- }
- f=fopen(s,"rb");
- if (!f)
- {
- printf("Error opening %d\n",s);
- return -1;
- }
- u32 magic=ReadU32();
- if (magic!=PCF1Magic)
- {
- printf("Not a PCF1 file (0x%08X)\n",magic);
- return 2;
- }
- u32 sections=ReadU32();
- if (verboseLevel>1)
- printf("Contains %d sections\n");
- u32 i,type,flags,size,offset;
- u32 offInfo;
- for (i=0; i<sections; i++)
- {
- type=ReadU32();
- flags=ReadU32();
- size=ReadU32();
- offset=ReadU32();
- if (verboseLevel>1)
- printf("%d) type 0x%08X flags 0x%08X size 0x%08X offset 0x%08X\n",i,type,flags,size,offset);
- if (type==typeShapes)
- offShapes=offset;
- if (type==typeUnicodes)
- {
- offUnicode=offset;
- numUnicodes=size/2;
- }
- if (type==typeInfo)
- offInfo=offset;
- }
- // Information about the font
- fseek(f,offInfo,SEEK_SET);
- flags=ReadU32();
- u32 numDefs=ReadU32();
- // Each definition is 9 bytes, 4 for the flags, 4 for the number of defs and
- // 4 for the lenght of the strings. Then pad it to be in a 32 bits pos.
- u32 offNames=(offInfo+numDefs*9+4+8+3)&(~3);
- if (verboseLevel>1)
- printf("%u Attributes (0x%08X)\n",numDefs,offNames);
- char buf[256];
- Name[0]=0;
- int copy,name;
- for (i=0; i<numDefs; i++)
- {
- u32 offName,Val,pos;
- u8 Type;
-
- offName=ReadU32();
- Type=fgetc(f);
- Val=ReadU32();
- pos=ftell(f);
-
- GetName(buf,offNames+offName);
- //printf("0x%08X\n",offNames+offName);
- if (verboseLevel>1) printf("%s: ",buf);
- if (Type)
- {// Is another string
- copy=!strcmp(buf,"COPYRIGHT");
- name=!strncmp(buf,"FAMILY",6) || !strcmp(buf,"WEIGHT_NAME");
- GetName(buf,offNames+Val);
- if (verboseLevel>1)
- printf("%s\n",buf);
- else
- if (copy && verboseLevel)
- printf("Copyright: %s\n",buf);
- if (name)
- {
- if (*Name)
- {
- strcat(Name," ");
- strcat(Name,buf);
- }
- else
- strcpy(Name,buf);
- }
- }
- else
- {// Is an integer
- if (verboseLevel>1) printf("%d\n",Val);
- if (!strcmp(buf,"PIXEL_SIZE")) fontH=Val;
- if (!strcmp(buf,"QUAD_WIDTH"))
- {
- fontW=Val;
- fontWb=(fontW+7)/8;
- }
- }
- fseek(f,pos,SEEK_SET);
- //printf("%d) %d %u(%x) %u(%x)\n",i+1,v,v1,v1,v2,v2);
- }
- if (!fontH || !fontW)
- {
- printf("Unable to find font size\n");
- return 6;
- }
- if (verboseLevel)
- printf("Font size %ux%u\n",fontW,fontH);
- sizeChar=4*fontH;
- // Find the number of shapes:
- if (!offShapes)
- {
- printf("Unable to find the shapes\n");
- return 3;
- }
- fseek(f,offShapes,SEEK_SET);
- flags=ReadU32();
- numShapes=ReadU32();
- offShapes+=8+numShapes*4+16;
- if (verboseLevel)
- printf("Found %u shapes\n",numShapes);
- // Load the unicode table
- if (!offUnicode)
- {
- printf("Unable to find unicode table\n");
- return 4;
- }
- unicodeTable=new u16[numUnicodes];
- fseek(f,offUnicode+4+10,SEEK_SET);
- if (fread(unicodeTable,2,numUnicodes,f)!=numUnicodes)
- {
- printf("Error reading unicode table\n");
- return 5;
- }
- if (verboseLevel)
- printf("Loaded unicode table with %u values\n",numUnicodes);
- // Print them
- if (verboseLevel>1)
- {
- DrawChar(unicodeTable['a']);
- DrawChar(unicodeTable['A']);
- }
- GenSFT(sft,append);
- fclose(f);
- delete[] unicodeTable;
- unlink(tempName);
-}
-
-
-int main(int argc, char *argv[])
-{
- #if 1
- useForUnknown=4251;
- buggyHalfs=0;
- ReadPCF("10x20.pcf.gz","XFont.sft",false);
- ReadPCF("9x18.pcf.gz","XFont.sft",true);
- ReadPCF("9x15.pcf.gz","XFont.sft",true);
- ReadPCF("7x13.pcf.gz","XFont.sft",true);
- ReadPCF("6x13.pcf.gz","XFont.sft",true);
- ReadPCF("6x10.pcf.gz","XFont.sft",true);
- ReadPCF("5x8.pcf.gz","XFont.sft",true);
- ReadPCF("5x7.pcf.gz","XFont.sft",true);
- #endif
-
- #if 1
- // Terminus Bold
- useForUnknown=-1;
- buggyHalfs=1;
- ReadPCF("ter-u14b.pcf.gz","BTerminus.sft",false);
- ReadPCF("ter-u16b.pcf.gz","BTerminus.sft",true);
- ReadPCF("ter-u20b.pcf.gz","BTerminus.sft",true);
- // Terminus Regular
- ReadPCF("ter-u14n.pcf.gz","Terminus.sft",false);
- ReadPCF("ter-u16n.pcf.gz","Terminus.sft",true);
- ReadPCF("ter-u20n.pcf.gz","Terminus.sft",true);
- #endif
- return 0;
-}