mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-05 06:00:33 -04:00
181 lines
3.3 KiB
C
181 lines
3.3 KiB
C
#include <skeldal_win.h>
|
||
#include <stdio.h>
|
||
#include <mem.h>
|
||
#include "types.h"
|
||
#include "pcx.h"
|
||
#include "memman.h"
|
||
|
||
int xs,ys;
|
||
char *pic;
|
||
|
||
char font_buffer[65536];
|
||
word font_p=0;
|
||
word char_table[256];
|
||
|
||
int top_line;
|
||
int bott_line;
|
||
int base_line;
|
||
int top_ofs;
|
||
|
||
char znaky[]="0123456789A<EFBFBD>BC€D…E<EFBFBD>‰FGHI‹JKLŠœMN¥O•PQRžS›T†U—¦VWXY<EFBFBD>Z’"
|
||
"a bc‡dƒe‚ˆfghi¡jkl<EFBFBD>Œmn¤o¢pqr©s¨tŸu£–vwxy˜z‘"
|
||
"~!@#$%^&*()_+|-=\\[]{};':,./<>?";
|
||
|
||
void load_font_pic(char *filename)
|
||
{
|
||
open_pcx(filename,A_8BIT_NOPAL,&pic);
|
||
memcpy(&xs,pic,2);
|
||
memcpy(&ys,pic+2,2);
|
||
top_line=0;
|
||
base_line=0;
|
||
bott_line=-1;
|
||
}
|
||
|
||
char get_point(int x,int y)
|
||
{
|
||
return *(pic+xs*y+x+6);
|
||
}
|
||
|
||
int find_lead(int last)
|
||
{
|
||
last++;
|
||
while (last<ys) if (get_point(0,last)!=255) return last;else last++;
|
||
return -1;
|
||
}
|
||
|
||
int follow_lead(int y)
|
||
{
|
||
int x=0;
|
||
while (get_point(x,y)!=255) x++;
|
||
return x;
|
||
}
|
||
|
||
int get_top_extend(int lead,int last_top) //vraci nejhorejsi souradnici
|
||
{
|
||
int x;
|
||
last_top++;
|
||
while (last_top<lead)
|
||
{
|
||
for(x=0;x<xs;x++) if (get_point(x,last_top)==0) return last_top;
|
||
last_top++;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
int get_bott_extend(int lead) //vraci nejspodnejsi souradnici
|
||
{
|
||
int x,y,ok;
|
||
y=lead;ok=1;
|
||
while (ok)
|
||
{
|
||
ok=0;
|
||
for(x=0;x<xs;x++) if (get_point(x,y)==0) ok=1;
|
||
y+=ok;
|
||
}
|
||
return y;
|
||
}
|
||
|
||
char write_accl(char *where,int accl)
|
||
{
|
||
if (accl==0) return 0;
|
||
if (accl==1) *where=0;else *where=accl+6;
|
||
return 1;
|
||
}
|
||
|
||
void lead_up_line(int *x,int *y)
|
||
{
|
||
base_line=find_lead(base_line);
|
||
if (base_line==-1) return;
|
||
*x=follow_lead(base_line);
|
||
top_line=get_top_extend(base_line,bott_line);
|
||
bott_line=get_bott_extend(base_line);
|
||
*y=base_line;
|
||
}
|
||
|
||
int find_next_char(int x,int top,int bott)
|
||
{
|
||
int y;
|
||
|
||
while (x<xs)
|
||
{
|
||
for (y=top;y<bott;y++) if (get_point(x,y)==0) return x;
|
||
x++;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
char *read_char(char *pos,int *x,int top,int bott)
|
||
{
|
||
char accl=0;
|
||
char *xinfo;
|
||
char space=0;
|
||
int y;
|
||
|
||
xinfo=pos++;*xinfo=0;
|
||
*pos++=bott-top+1;
|
||
do
|
||
{
|
||
space=1;
|
||
for (y=top;y<=bott;y++)
|
||
{
|
||
if (get_point(*x,y)==255) accl++;
|
||
else pos+=write_accl(pos,accl),*pos++=2,space=accl=0;
|
||
}
|
||
xinfo[0]++;
|
||
x[0]++;
|
||
}
|
||
while (!space);
|
||
*pos++=255;
|
||
return pos;
|
||
}
|
||
|
||
word recognize()
|
||
{
|
||
char *zn=znaky;
|
||
int x,y;
|
||
char *fp;
|
||
|
||
memset(char_table,0,sizeof(char_table));
|
||
fp=font_buffer;
|
||
lead_up_line(&x,&y);
|
||
while (base_line>=0)
|
||
{
|
||
x=base_line-top_line;
|
||
if (x>top_ofs) top_ofs=x;
|
||
lead_up_line(&x,&y);
|
||
}
|
||
base_line=0;bott_line=-1;
|
||
do
|
||
{
|
||
lead_up_line(&x,&y);
|
||
top_line=base_line-top_ofs;
|
||
if ((x=find_next_char(x,top_line,bott_line))==-1) return fp-font_buffer;
|
||
while (*zn!=0 && x>0)
|
||
{
|
||
char_table[*zn]=(fp-font_buffer)+sizeof(char_table);
|
||
fp=read_char(fp,&x,top_line,bott_line);
|
||
x=find_next_char(x,top_line,bott_line);
|
||
zn++;
|
||
}
|
||
}
|
||
while (*zn);
|
||
return fp-font_buffer;
|
||
}
|
||
|
||
void save_font(char *filename,word bufsiz)
|
||
{
|
||
FILE *f;
|
||
|
||
f=fopen(filename,"wb");
|
||
fwrite(char_table,sizeof(char_table),1,f);
|
||
fwrite(font_buffer,bufsiz,1,f);
|
||
fclose(f);
|
||
}
|
||
|
||
void main()
|
||
{
|
||
word s;
|
||
load_font_pic("..\\font\\timese2.pcx");
|
||
s=recognize();
|
||
save_font("..\\font\\timese2.fon",s);
|
||
}
|