当前位置:首页 > 我的程序 > 正文内容

如何新建字库的源代码。

Peirre3年前 (2022-11-20)我的程序293

刚才在直播间看了一下游戏的字体,说实在的楷体很好看,还有黑体,新宋体,幼圆。

这里还是有些不满足,因为英文字体在楷体中不太美感,是楷体的一种演变。但是英文的楷体英文不是最好看的字体。

我们可以把字体混合着崁进来,因为了解过早期的源码,而早期字库是点阵字库,压缩字库也只是压缩的是国标花字体。

当然还有字库的点阵放大。

字库的汉字,单独一个字是以点阵的形式出来的。

首先要了解汉字的单一汉字点阵的读取,然后是装载,还有保存。

矩形域图形装载:

屏幕上的像点:

                       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的数据内容。

123456.jpg


分享给朋友:

相关文章

随手写的时间设置程序,主要是防止系统时间无故修改。

随手写的时间设置程序,主要是防止系统时间无故修改。

程序说明:测试版程序功能。同步系统时间数据可选月历,手工输入可自动识别时间修改,修改后一分钟报警。测试版没有恢复时间功能。以后会增加。欢迎下载的朋友帮助我找程序问题,没有花多少功夫,请多多原谅。这个程...

Radasm 编辑器配置VC2010下的Opencv 环境。

Radasm 编辑器配置VC2010下的Opencv 环境。

Opencv 下载地址:https://opencv.org/releases.html备用下载地址1:https://blog.csdn.net/yanzi1225627/article/detai...

关于 Cannot enable. Maybe the USB cable is bad? 这个问题。

关于 Cannot enable. Maybe the USB cable is bad? 这个问题。

经常摆弄电脑,那USB接口也是插进,拔出多少次。有一天发生了这个问题,什么问题呢?见图:只要是linux 新内核,都会出现这个问题,虚拟机USB功能,DOSBOX等USB功能不可识别。在网上查看了一些...

关于ch341驱动,联动3D打印机USB串口通讯.

关于ch341驱动,联动3D打印机USB串口通讯.

手上有个3D打印机,搬家的原因,好久没用.天气热了,打印温度很适合,正好可以使用.又过了一年.发现linux 版本内核已经升级,和原来的系统不一样了. 按照3D打印机的说明,和寻找它的程序,原来的方法...

关于DOSBOX的简单说明。

关于DOSBOX的简单说明。

linux 下的共享软件DOSBOX 在有些版本的linux 中不能使用鼠标。网上说明要换声卡地址和中断,连接鼠标端口才可以使用。 曾经设置过,可以使用参数不记得。有个解决方法。这是软件问题。 先卸载...

linux 下的《仙剑奇侠传》

linux 下的《仙剑奇侠传》

以前的DOS游戏《仙剑奇侠传》是炙制人口的一个很容易上手的游戏。这个游戏流行了很多年。很多人在玩过多年以后,重温旧梦,回味游戏之中的情感。这个游戏再版了很多次了。现在linux 下也可以直接玩这个游戏...