一个点阵汉字库的应用
今年情人节那天,为了让女友开心开心,没有买别的东西送给她,所以就写了这个程序,当是自己的一点心意。自我感觉起来是比较丑陋的,幸好她没有嫌弃,真的是很不错了。这里贴出来跟大家一起交流!~
1 // test1.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5
6 void test16(const unsigned char *str, FILE *pOut);
7 void just16(const unsigned char*, unsigned char *mat); // 对16*16字库中一些符号进行处理
8 void test32(const unsigned char *str, FILE *pOut);
9 void just32(const unsigned char*, unsigned char *mat); // 对32*32字库中一些符号进行处理
10 void WriteOut(FILE*, const char*);
11 void memset(void *s, int n, size_t t);
12
13 int main(int argc, char* argv[])
14 {
15 unsigned char str1[] = "我";
16 FILE *pOut1, *pOut2;
17 pOut1 = fopen("wo1.txt", "w+");
18 test16(str1, pOut1);
19 test32(str1, pOut1);
20 return 0;
21 }
22
23 void test16(const unsigned char *str, FILE *pOut)
24 {
25 FILE *pFile;
26 if((pFile=fopen("hzk16", "rb")) == NULL)
27 {
28 return;
29 }
30
31 unsigned char pStr[3]; // 用来存放一个汉字
32 int pos = 0;
33 while(str[pos] != 0)
34 {
35 pStr[0] = str[pos++];
36 pStr[1] = str[pos++];
37
38 unsigned char mat[16][2];
39 // 从内码转换到区位号
40 int i = pStr[0] - 0xa0; // 16*16字库是直接从汉字库开始的
41 int j = pStr[1] - 0xa0;
42 fseek(pFile, (94*(i-1)+(j-1))*32l, SEEK_SET);
43 fread(mat, 32, 1, pFile);
44
45 just16(pStr, &mat[0][0]); // 调整特殊字符的字模信息
46
47 for(i=0; i<16; i++)
48 {
49 for(j=0; j<2; j++)
50 {
51 for(int k=0; k<8; k++)
52 {
53 if(mat[i][j] & (0x80>>k))
54 {
55 WriteOut(pOut, "1");
56 }
57 else
58 {
59 WriteOut(pOut, "0");
60 }
61 }
62 }
63 WriteOut(pOut, "\n");
64 }
65 WriteOut(pOut, "\n\n");
66 }
67 }
68
69 void just16(const unsigned char* str, unsigned char* mat)
70 {
71 const unsigned char filterStr[] = " ,!";
72 int i = 0;
73 while(filterStr[i] != NULL)
74 {
75 if(str[0] == filterStr[i])
76 {
77 if(str[1] == filterStr[i+1])
78 {
79 memset(mat, 0, 32);
80 return;
81 } else {
82 i += 2;
83 }
84 }
85 else
86 {
87 i += 2;
88 }
89 }
90 return;
91 }
92
93 void test32(const unsigned char *str, FILE *pOut)
94 {
95 FILE *pFile;
96 if((pFile=fopen("hzk24s", "rb")) == NULL)
97 {
98 return;
99 }
100
101 unsigned char pStr[3]; // 用来存放一个汉字
102 unsigned char mat[24][3]; // 用来存放字模信息
103 int pos = 0;
104 int i, j; // 存放区号:i,位号:j,k用来计数
105 while(str[pos] != 0)
106 {
107 pStr[0] = str[pos++];
108 pStr[1] = str[pos++];
109
110 // 从内码转换到区位号
111 i = pStr[0] - 15 - 0xa0; // 32*32字库前有15个区的特殊符号
112 j = pStr[1] - 0xa0;
113 fseek(pFile, (94*(i-1)+(j-1))*3*24l, SEEK_SET);
114 fread(mat, 24*3, 1, pFile);
115
116 just32(pStr, &mat[0][0]); // 调整特殊字符的字模信息
117
118 for(i=0; i<24; i++) // 与16*16不同,要进行转置
119 {
120 for(j=0; j<24; j++)
121 {
122 if(mat[j][i/8] & (0x80>>(i%8)))
123 {
124 WriteOut(pOut, "1");
125 }
126 else
127 {
128 WriteOut(pOut, "0");
129 }
130 }
131 WriteOut(pOut, "\n");
132 }
133
134 WriteOut(pOut, "\n\n");
135 }
136 }
137
138 void just32(const unsigned char *str, unsigned char* mat)
139 {
140 const unsigned char filterStr[] = " ,!";
141 int i = 0;
142 while(filterStr[i] != NULL)
143 {
144 if(str[0] == filterStr[i])
145 {
146 if(str[1] == filterStr[i+1])
147 {
148 memset(mat, 0, 24*3);
149 return;
150 } else {
151 i += 2;
152 }
153 }
154 else
155 {
156 i += 2;
157 }
158 }
159 }
160
161 void WriteOut(FILE *pOut, const char* str)
162 {
163 if(pOut != NULL)
164 {
165 fprintf(pOut, str);
166 }
167 else
168 {
169 printf(str);
170 }
171 }
172
173 void memset(void *s, int n, size_t t)
174 {
175 unsigned char *p = (unsigned char*)s;
176 size_t i = 0;
177 while(i < t)
178 {
179 *p = (unsigned char) n;
180 p++;
181 i++;
182 }
183 return;
184 }
不足之处还有很多,希望能一起讨论。
附件内容:https://files.cnblogs.com/tanzek/UCDOS_%E6%B1%89%E5%AD%97%E5%AD%97%E5%BA%93%E6%96%87%E4%BB%B6.zip
参考网页:
[1] 根据DOS汉字字库在图形模式下绘制汉字,hoodlum1980,http://bbs.bccn.net/viewthread.php?tid=203624
[2] 阵汉字显示,吴进,http://dev.gameres.com/Program/Control/fontDOS.htm
浙公网安备 33010602011771号