中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS汉化世界 & 中文系统 (中文化室) » 关于矢量字库的读取及其算法...
作者:
标题: 关于矢量字库的读取及其算法... 上一主题 | 下一主题
charlieko
初级用户





积分 94
发帖 9
注册 2005-7-17
状态 离线
『楼 主』:  关于矢量字库的读取及其算法...

很长时间了,就想弄懂矢量字库(如 UCDOS\FNT\)  下的矢量字库的读取方法以及怎样用算法实现他们的显示?还有,怎样才能有如UCDOS一般的极速显示中文汉字?前提必须是在DOS环境下.用C或者是QuickBasic 7.1写成的(源)程序.跪地求解!!望各位高手给予指点或者介绍相关的书籍!!!谢谢!!!

2005-7-17 18:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
JonePeng
金牌会员

D◎$ Fαп


积分 4562
发帖 1883
注册 2004-1-19
来自 广东广州
状态 离线
『第 2 楼』:  

你的问题使我想起我的高中时代。

我读高一时(那时是1999年),在校图书馆借了一本C语言应用的程序(书名和出版社已记不请了,只记得书名有个“应用”一词),这本书非常棒!虽然书不大也不厚,但有读取 UCDOS 的各种矢量字体并作字体变形、旋转、填充、空心字等效果的源程序,还有读取并显示BMP图片实例程序以及扫雷游戏程序!这些程序都是在 Turbo C 2.0 下开发的源程序!这本书我只借了一次,也在电脑上输入几个珍贵的源程序,后来就把书还了。谁知一年后我的电脑染上了可恶的病毒,硬盘分区表破坏了,硬盘内部的资料也受病毒改写,不得不忍痛割爱、重新分区、格式化,宝贵的源程序都灰飞烟灭……还书以后,就再也找不到这本书了。那图书馆比较小,藏书不多,用电脑查找该书,结果显示仅有一本。每次去图书馆我都经常去寻找这本宝典,还与图书管理员联系、帮忙,直至高三毕业了,仍寻而无果,我猜该书以丢失了,而市面上也没有一本C语言应用的书籍能与之媲美,这给我的高中时代留下一大遗憾

上了大学,开始接触互联网,感受到现在已经是VB、VC等Windows编程统领的时代,DOS 下的QB 和 C 编程已是明日黄花,研究和利用的价值已经贬得很低了,况且,受我选的专业的限制,我再也没花心机去研究编程。

好了,说了这么多,虽然书很难找,但我想这些程序应该可以在ProgramFan、QB 等论坛上找的到,楼主加油吧!



----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
  
2005-7-17 22:35
查看资料  发送邮件  发短消息 网志  OICQ (373343541)  编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 3 楼』:  

好像UCDOS安装的时候提供了例程

2005-7-25 18:35
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
JonePeng
金牌会员

D◎$ Fαп


积分 4562
发帖 1883
注册 2004-1-19
来自 广东广州
状态 离线
『第 4 楼』:  

UCDOS 提供的例程好像只是点阵字体的吧,好像没有矢量字体的应用。我好久没用过UCDOS了……



----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
  
2005-7-25 23:15
查看资料  发送邮件  发短消息 网志  OICQ (373343541)  编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 5 楼』:  [转贴]ucdos矢量字库算法


/*****来自[url]http://www.moon-soft.com/program/doc/docelite1257.htm[/url]****/

/* 请问ucdos矢量字库算法 */
/* 矢量汉字的读取和显示 */
#include <stdio.h>

#include <graphics.h>

#define HZNUM(0xf7 - 0xaf) * (0xfe - 0xa0) /* 除前16区外的所有汉字 */
#define HZKSIZE 128 /* 汉字的大小 */
#define START_X 0
#define START_Y 0
#define VIEW_H 256 /* 显示汉字的高度 */
#define VIEW_W 256 /* 显示汉字的宽度 */
FILE * fp;
struct hz_struct {
  unsigned long shift; /* 偏移量 */
  unsigned int size; /* 大小 */
}
HZ_Index[HZNUM]; /* 汉字索引 */
unsigned char buf[1024];
unsigned char dotbuf[1024];
main() {
  long ioffset;
  int i, j;
  char ch;
  int gdriver = DETECT;
  int gmode;
  if ((fp = fopen("hzksly1j", "rb")) == NULL) {
    printf("cano't open the HZlib!");
    exit(1);
  }
  fread(HZ_Index, sizeof(struct hz_struct), HZNUM, fp);
  //if (registerbgidriver(EGAVGA_driver) < 0)
  exit(1);
  initgraph( & gdriver, & gmode, "");
  cleardevice();
  setcolor(LIGHTGRAY);
  for (i = 0; i < HZNUM; i++) {
    Disp_HZ(HZ_Index[i].size, HZ_Index[i].shift);
    rectangle(START_X, START_Y, START_X + 256, START_Y + 256);
    ch = getch();
    cleardevice();
    if (ch == 'q')
      break;
  }
  closegraph();
  fclose(fp);
}

/* 显示汉字 */
Disp_HZ(int length, long posi) {
  int i, j, k;
  int x0, y0, x1, y1;
  int hzsize;
  union utype {
    unsigned short size;
    unsigned char str[2];
  }
  BH;
  if ((fseek(fp, posi, 0)) != 0) {
    printf("seek\"clib\"error!\n");
    exit(0);
  }
  memset(buf, 0, 1024);
  fread(buf, length, 1, fp);
  hzsize = decode(buf, length);
  k = 0;
  for (i = 0; i < hzsize; i++) {
    BH.str[0] = dotbuf[k++];
    BH.str[1] = dotbuf[k++];
    if (BH.size == 0)
      break; /* 每个汉字以0结束 */
    x0 = START_X + (dotbuf[k++] * VIEW_W) / HZKSIZE;
    y0 = START_Y + (dotbuf[k++] * VIEW_H) / HZKSIZE;
    //x0 = START_X + dotbuf[k++];
    //y0 = START_Y + dotbuf[k++];
    moveto(x0, y0);
    for (j = 0; j < BH.size - 1; j++) {
      x1 = START_X + (dotbuf[k++] * VIEW_W) / HZKSIZE;
      y1 = START_Y + (dotbuf[k++] * VIEW_W) / HZKSIZE;
      //x1 = START_X + dotbuf[k++];
      //y1 = START_Y + dotbuf[k++];
      lineto(x1, y1);
    }
    lineto(x0, y0);
  }
}

/*
* 汉字字形还原
*/
decode(p, length)
unsigned char * p;
int length; {
  int k;
  int i, count, lposi, xsum, ysum;
  unsigned char b60;
  char dxfh, dyfh;
  char x0, dx, dy;
  lposi = 0;
  k = 2;
  while ((p - buf) <= length) {
    b60 = * p & 0xc0;
    switch (b60) {
    case 0xc0:
      if (k != 2) {
        dotbuf[lposi] = (k - lposi - 2) / 2;
        dotbuf[lposi + 1] = 0;
        lposi = k++;
        k++;
      }
      x0 = ( * p & 0x3f) << 1;
      dx = ( * (p + 1) >> 7) & 0x01;
      dx = dx + x0;
      p++;
      dy = * p++ & 0x7f;
      dotbuf[k++] = xsum = dx;
      dotbuf[k++] = ysum = dy;
      break;
    case 0x80:
      dxfh = dyfh = 1;
      switch ( * p & 0x30) {
      case 0x00:
        if ( * p & 0x08)
          dxfh = -1;
        dx = * p & 0x07;
        p++;
        if ( * p & 0x80)
          dyfh = -1;
        dy = * p & 0x7f;
        break;
      case 0x10:
        if ( * p & 0x08)
          dyfh = -1;
        dy = * p & 0x07;
        p++;
        if ( * p & 0x80)
          dxfh = -1;
        dx = * p & 0x7f;
        break;
      case 0x20:
      case 0x30:
        p++;
        if ( * p & 0x80)
          dxfh = -1;
        dx = * p & 0x7f;
        p++;
        if ( * p & 0x80)
          dyfh = -1;
        dy = * p & 0x7f;
        break;
      }
      p++;
      xsum += dx * dxfh;
      ysum += dy * dyfh;
      dotbuf[k++] = xsum;
      dotbuf[k++] = ysum;
      break;
    case 0x40:
      dxfh = * p & 0x30;
      if (dxfh == 0) {
        dxfh = 1;
        dyfh = 1;
      } else if (dxfh == 0x10) {
        dxfh = -1;
        dyfh = 1;
      } else if (dxfh == 0x20) {
        dxfh = -1;
        dyfh = -1;
      } else if (dxfh == 0x30) {
        dxfh = 1;
        dyfh = -1;
      }
      count = * p++ & 0x0f;
      for (i = 0; i < count; i++) {
        dx = * p >> 4;
        dy = * p & 0x0f;
        xsum += dxfh * dx;
        ysum += dyfh * dy;
        dotbuf[k++] = xsum;
        dotbuf[k++] = ysum;
        p++;
      }
      break;
    case 00:
      count = * p++ & 0x3f;
      for (i = 0; i < count; i++) {
        if ( * p & 0x80)
          dxfh = -1;
        else
          dxfh = 1;
        if ( * p & 0x08)
          dyfh = -1;
        else
          dyfh = 1;
        dx = ( * p & 0x70) >> 4;
        dy = ( * p & 0x07);
        xsum += dx * dxfh;
        ysum += dy * dyfh;
        dotbuf[k++] = xsum;
        dotbuf[k++] = ysum;
        p++;
      }
    }
  }
  dotbuf[k++] = 0;
  dotbuf[k++] = 0;
  dotbuf[lposi] = (k - lposi - 2 - 2) / 2;
  dotbuf[lposi + 1] = 0;
  return k;
}
-- edit by AlexZhang: code formatting

2005-9-8 16:56
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
charlieko
初级用户





积分 94
发帖 9
注册 2005-7-17
状态 离线
『第 6 楼』:  谢谢!

UCDOS下的例程用的是他自己的特显功能来完成的.这样的话就无法掌控这一技术.所以要求自己能掌握这一技术.以免受制于人啊.
谢谢Firstsail提供的算法.COPY下来后等会儿再试试.

2005-10-18 10:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
charlieko
初级用户





积分 94
发帖 9
注册 2005-7-17
状态 离线
『第 7 楼』:  那极速显示汉字呢?

那应该怎样才能极速显示汉字呢??请赐教!!

2005-10-18 11:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
stockghost
中级用户





积分 215
发帖 105
注册 2007-6-2
状态 离线
『第 8 楼』:  

多谢,已经下载!

2008-11-18 13:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: