如何新建字库的源代码。
刚才在直播间看了一下游戏的字体,说实在的楷体很好看,还有黑体,新宋体,幼圆。
这里还是有些不满足,因为英文字体在楷体中不太美感,是楷体的一种演变。但是英文的楷体英文不是最好看的字体。
我们可以把字体混合着崁进来,因为了解过早期的源码,而早期字库是点阵字库,压缩字库也只是压缩的是国标花字体。
当然还有字库的点阵放大。
字库的汉字,单独一个字是以点阵的形式出来的。
首先要了解汉字的单一汉字点阵的读取,然后是装载,还有保存。
矩形域图形装载:
屏幕上的像点:
ix=(row/4)*80+(row%4)*8192+(col/8)
row,col------整形变量
m,n------整形变量,列数行数(row,[col/8]*8),[n/8]*8+8。
fn------ 字符串指针。
hgc2ld.c:
#include "math.h" #include "stdio.h" #include "stdlib.h" void hgc2_load(row,col,m,n,fn) char *fn; int row,col,m,n; { int i,j; long int kk,ix,l; char *buf; FILE *fp; char far *ptr=(char far *)0xB8000000; kk=(long)m*(long)(n/8); buf=malloc(kk*sizeof(char)); if ((fp=fopen(fn,"r+b"))==NULL) { printf("cannot open this file !"); exit(0); } fread (buf,sizeof(char),kk,fp); l=0L; for (i=0;i<=m-1;i++) { ix=(long)((row+i)/4)*80L+(long)(row+i)%4)*8192L+(long)(col/8); for (j=0;j<=n-1;j=j+8) { *(ptr+ix)=buf[l]; l=l+1L; ix=ix+1L; } free(buf);fclose(fp); return; }
矩形图形的保存:
变量定义同上。
vgal3sv.c
#include "dos.h" #include "stdio.h" #include "stdlib.h" void vgal3_save(row,col,m,n,fn) char *fn; int row,col,m,n; { int i,j; long int kk,ix,ii,l; char *buf; FILE *buf; char far *ptr=(char far *)0xA000000; kk=(long)m*(long)n; buf=malloc(kk*sizeof(char)); if ((fp=open(fn,"w+b"))==NULL) { printf(("cannot open this file !"); exit (0); } l=0L; ix=(long)row*320L+(long)col; for (i=1;i<=m;i++) { ii=ix; for (j=0;j<=n-1;j=j+1) { buf[l]=*(ptr+ii);l=l+1L; ii=ii+1L; } ix=ix+320L; } fwrite (buf,sizeof(char),kk,fp); free(buf); close(fp); return; }
代码例子:(汉字的重建)
#include "dos.h" #include "stdio.h" #include "ommode.c" #include "hgclset.c" #include "hgclpt.c" #include "hgclcs.c" #include "hgclcp.c" #include "hgclsv.c" #include "hgclld.c" #include "hgclhz.c" #include "hgclbx.c" main() { union REGS r; static int a[4]={0,1,2,3}; int hgcl_point(); void ommode(),hgcl_cls(),hgcl_copy(); void hgcl_save(),hgcl_set(); void hgcl_load(),hgcl_hz(),hgcl_box(); FILE *fp; hgcl_set(); if ((fp=fopen("cclibb","r+b"))==NULL) { printf("cannot open cclibb ! \n"); exit (0); } col=0; for (i=0;i<=639;i++) { for (k=0;k<=349;k++) hgcl_point(k,col,1,0); col=col+1; } hgcl_cls(0,0,100,639); hgcl_box(0,136,100,320,1); for (i=0;i<=3;i++) { code=a[i]; hgcl_hz(2,10,160+24*i,code,4,fp,1); } hgcl_copy(10,160,35,320,40,160); hgcl_save(40,160,24,96,"hanzi.dat"); hgcl_load(70,160,24,96,"hanzi.dat"); r.h.ah=0;int86(22,&r,&r); ommode(7);fclose(fp); }
字库的四个字为“数据结构“这四个字。字库文件是"cclibb",这个字库可以用以前DOS下的金山汉字系统字库,类似名。24X24点阵字库。
hgc_set() 初始化图形模式
hgcl_point() 显示像点。
hgcl_cls()清除屏幕矩形区
hgcl_box() 填充像素
hgcz_hz() 显示汉字”数据结构“
hgcl_copy() 复制矩形区的汉字
hgcl_save() 保存汉字点阵到文件hanzi.dat。
hgcl_load() 显示汉字点阵文件hanzi.dat的数据内容。