|
- #include <stdio.h>
- #include "zm_liangbiao.h"
- #include "juzheng.h"
- //取字模時應(yīng)該選擇全角輸入字符否則不能正確取字模
- class quzimo
- {
- int ZKBJ;//字庫標(biāo)記:8=8*8,16=16*16,32=32*32,48=48*48
- int ZMCD;//字模長度根據(jù)字庫標(biāo)記計算
- int QMFX;//取字模方向
- void qumo_1616(char zf[2],char zm[32]);//取字符的16*16點陣字模
- void qumo(char zf[2],char zm[300]);//根據(jù)字庫類型標(biāo)記取一個字符的點陣字模并添加到緩存鏈表
- public:
- zm_liangbiao *zmlb,*zmlb_xz;//創(chuàng)建一個字模數(shù)據(jù)鏈表
- quzimo(int zk,int fx){zmlb=new zm_liangbiao;zmlb_xz=new zm_liangbiao;ZKBJ=zk;QMFX=fx;ZMCD=ZKBJ*ZKBJ/8;}//初始化
- void zmlb_add(char zf[2]);//添加一個字符的字模到字模鏈表
- void zmlb_add_shougong(char zm[300]);//手工添加一個字模數(shù)據(jù)到鏈表
- void zmlb_print_c51(int x,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[]);//將字模鏈表組合成C51格式輸出到一個緩存區(qū)
- void zmlb_print_asm(int h,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[]);//將字模鏈表組合成asm格式輸出到一個緩存區(qū)
- void qmfx(int QMFX);//根據(jù)取模方向重新組合字模數(shù)據(jù)
- void print_zm(char hcq[300]);//輸出鏈表尾部的一個沒有格式化的字模數(shù)據(jù)
- void print_lb();//調(diào)試用輸出鏈表數(shù)據(jù)
- };
- void quzimo::qumo_1616(char zf[2],char zm[32])
- {
- //取字符的16*16點陣字模
- FILE *fp_hzk;
- char ZM[32];
- unsigned long offset;//字模在16*16字庫中的偏移地址
- offset=(((unsigned char)zf[0]-0xa1)*94+((unsigned char)zf[1]-0xa1))*32; //根據(jù)內(nèi)碼找出漢字在HZK16中的偏移位置,第一個字節(jié)是區(qū)碼第二個字節(jié)是位碼
- if((fp_hzk=fopen("c:\\vc\\HZK16","rb"))==NULL) return; //打開字庫文件
- fseek(fp_hzk,offset,SEEK_SET); //文件指針偏移到要找的漢字處
- fread(ZM,32,1,fp_hzk);//讀取該漢字的字模
- memcpy(zm,ZM,sizeof(char)*32);//返回獲取的字模數(shù)據(jù)
- }
- void quzimo::qmfx(int QMFX)
- {
- //根據(jù)取模方向重新組合字模數(shù)據(jù)
- int xz[48][48];
- int xz1[48][48];
- char zm[300];
- Node *q;
- q=zmlb->head;
- int y,x,k;
- //遍歷鏈表根據(jù)取模方向重組字模數(shù)據(jù)
- while(q){
- ////////////////////
- //讀字模數(shù)據(jù)到數(shù)組
- k=0;
- for(y=0;y<ZKBJ;y++)
- for(x=0;x<ZKBJ;x+=8)
- {
- zjtodz_z(q->zm[k],&xz[y][x]);
- k++;
- }
- /////////////////////
- //數(shù)組向右旋轉(zhuǎn)90度
- for(y=0;y<ZKBJ;y++)
- {
- for(x=0;x<ZKBJ;x++)
- {
- xz1[x][y]=xz[ZKBJ-1-y][x];//直接順時針旋轉(zhuǎn)90度
- }
- }
- /////////////////////
- switch(QMFX)
- {
- case 2:
- {
- ///////////////////////
- //縱向ACBD方式重組字模
- k=0;
- for(y=0;y<ZKBJ;y++)
- {
- for(x=ZKBJ-8;x>=0;x-=8)
- {
- zm[k]=dztozj_y(&xz1[y][x]); //讀8位顯存數(shù)據(jù)合成為一個字節(jié)
- k++;
- }
- }
- ///////////////////////////
- break;
- }
- case 3:
- {
- ///////////////////////
- //縱向BDAC方式重組字模
- k=0;
- for(y=ZKBJ-1;y>=0;y--)
- {
- for(x=ZKBJ-8;x>=0;x-=8)
- {
- zm[k]=dztozj_y(&xz1[y][x]); //讀8位顯存數(shù)據(jù)合成為一個字節(jié)
- k++;
- }
- }
- ///////////////////////////
- break;
- }
- case 0:
- {
- //橫向ABCD方式重組字模
- k=0;
- for(y=0;y<ZKBJ;y++)
- {
- for(x=0;x<ZKBJ;x+=8)
- {
- zm[k]=dztozj_z(&xz[y][x]); //讀8位顯存數(shù)據(jù)合成為一個字節(jié)
- k++;
- }
- }
- /////////////////////////
- break;
- }
- case 1:
- {
- ///////////////////////////
- //橫向BADC方式重組字模
- k=0;
- for(y=0;y<ZKBJ;y++)
- {
- for(x=ZKBJ-8;x>=0;x-=8)
- {
- zm[k]=dztozj_y(&xz[y][x]); //讀8位顯存數(shù)據(jù)合成為一個字節(jié)
- k++;
- }
- }
- /////////////////////////
- break;
- }
- }
- zmlb_xz->add(q->ZKBJ,q->zf,zm);//重組后的字模數(shù)據(jù)鏈表
- q=q->next;
- }
-
- }
- void quzimo::qumo(char zf[2],char zm[300])
- {
- //根據(jù)字庫類型標(biāo)記取一個字符的點陣字模
- switch(ZKBJ)
- {
- case 8:
- //暫不支持待擴展
- break;
- case 16:
- qumo_1616(zf,zm);//取字符的16*16點陣字模
- break;
- case 32:
- //暫不支持待擴展
- break;
- case 48:
- //暫不支持待擴展
- break;
- }
- }
- void quzimo::zmlb_add(char zf[2])
- {
- //添加一個字符的字模到字模鏈表
- char ZM[300];//字模數(shù)據(jù)緩存區(qū)
- qumo(zf,ZM);//取字模
- zmlb->add(ZKBJ,zf,ZM);//添加一個字符數(shù)據(jù)
- }
- void quzimo::zmlb_add_shougong(char zm[300])
- {
- //添加一個手工繪制的字模到字模鏈表
- char *zf="000";//手工繪制標(biāo)記
- zmlb->add(ZKBJ,zf,zm);//添加一個字符數(shù)據(jù)
- }
- void quzimo::zmlb_print_c51(int x,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[])
- {
- qmfx(QMFX);//根據(jù)取模方向重組字模數(shù)據(jù)
- //將字模鏈表組合成C51格式輸出到一個緩存區(qū) x=1格式為0xaa否則格式為0XAA;
- char QZ[20];//前綴不能超過19字節(jié)
- char HZ[20];//后綴不能超過19字節(jié)
- char ZM[1500];//字模數(shù)據(jù)1字節(jié)格式化后需要5字節(jié)存儲空間
- char ZS[]="//字符: 的點陣字模\r\n"; //字符注釋信息
- char ZS_0[]=" \r\n";//注釋信息為空
- //char zm_c51[1100];//一條c51格式的完整字模信息
- char zfcend[]=" ";//字符串結(jié)束向緩存區(qū)輸出一個0x00的字符串結(jié)尾標(biāo)記避免緩存區(qū)輸出后面沒有準(zhǔn)確數(shù)據(jù)的亂碼
- int i=0;//輸出緩存區(qū)位置標(biāo)記
- int k=0;//字模格式化緩存區(qū)位置標(biāo)記
- ////////////////////////////
- //避免緩存區(qū)區(qū)溢出所以必須限定前后綴字符串輸入的長度
- int QZCD,HZCD;
- if(qzcd<20)
- {
- QZCD=qzcd;
- }else
- {
- QZCD=19;
- }
- if(hzcd<20)
- {
- HZCD=hzcd;
- }else
- {
- HZCD=19;
- }
- memcpy(QZ,qz,QZCD);
- memcpy(HZ,hz,HZCD);
- ////////////////////////////
- Node *q;
- q=zmlb_xz->head;//輸出重組后的字模數(shù)據(jù)
- /////////////////////////////////////////
- //遍歷字模數(shù)據(jù)鏈表并向緩存區(qū)輸出格式化后的鏈表數(shù)據(jù)
- while(q){
- //////////////////////////////////////////
- //格式化字模數(shù)據(jù)
- k=0;//字模緩存區(qū)指針清零
- for(int j=0;j<ZMCD;j++)
- {
- if(x==1)
- {
- sprintf(ZM+k,"0X%02X,",(unsigned char)q->zm[j]);
- k+=5;
- //大寫X
- }else
- {
- sprintf(ZM+k,"0x%02x,",(unsigned char)q->zm[j]);
- k+=5;
- //小寫x
- }
- }
- memcpy(ZS+7,q->zf,sizeof(char)*2);//格式化注釋信息+7的偏移是為了將原字符信息添加到注釋里面
- ///////////////////////////////////////////
- //向緩存區(qū)輸出格式化的字符串 -1是為了消除沒個單獨字符串的結(jié)尾標(biāo)記,否則格式后的字符串將不能完全顯示或亂碼
- memcpy(hcq+i,QZ,QZCD-1);i+=QZCD-1;//輸出前綴字符串
- memcpy(hcq+i,ZM,sizeof(char)*(ZMCD*5));i+=(ZMCD*5)-1;//輸出字模數(shù)據(jù)字符串,這里的指針偏移-1是為了消除數(shù)組尾部一個多余的','號
- memcpy(hcq+i,HZ,HZCD-1);i+=HZCD-1;//輸出后綴字符串
- if(jzs==1)
- {
- memcpy(hcq+i,ZS,sizeof(ZS)-1);i+=sizeof(ZS)-1;//輸出注釋信息字符串
- }else{
- memcpy(hcq+i,ZS_0,sizeof(ZS_0)-1);i+=sizeof(ZS_0)-1;//輸出空注釋信息字符串
- }
- ///////////////////////////////////////////
- q=q->next;
- }
- memcpy(hcq+i,zfcend,sizeof(zfcend));i+=sizeof(zfcend);//添加一個字符串結(jié)尾標(biāo)記
- ///////////////////////////////////////////
- }
- void quzimo::zmlb_print_asm(int h,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[])
- {
- qmfx(QMFX);//根據(jù)取模方向重組字模數(shù)據(jù)
- //將字模鏈表組合成ASM格式輸出到一個緩存區(qū) x=1格式為0xaa否則格式為0XAA;
- char QZ[20];//前綴不能超過19字節(jié)
- char HZ[20];//后綴不能超過19字節(jié)
- char ZM[1500];//字模數(shù)據(jù)1字節(jié)格式化后需要5字節(jié)存儲空間
- char ZS[]=";字符: 的點陣字模\r\n"; //字符注釋信息
- char ZS_0[]=" \r\n";//注釋信息為空
- //char zm_c51[1100];//一條c51格式的完整字模信息
- char zfcend[]=" ";//字符串結(jié)束向緩存區(qū)輸出一個0x00的字符串結(jié)尾標(biāo)記避免緩存區(qū)輸出后面沒有準(zhǔn)確數(shù)據(jù)的亂碼
- int i=0;//輸出緩存區(qū)位置標(biāo)記
- int k=0;//字模格式化緩存區(qū)位置標(biāo)記
- ////////////////////////////
- //避免緩存區(qū)區(qū)溢出所以必須限定前后綴字符串輸入的長度
- int QZCD,HZCD;
- if(qzcd<20)
- {
- QZCD=qzcd;
- }else
- {
- QZCD=19;
- }
- if(hzcd<20)
- {
- HZCD=hzcd;
- }else
- {
- HZCD=19;
- }
- memcpy(QZ,qz,QZCD);
- memcpy(HZ,hz,HZCD);
- ////////////////////////////
- Node *q;
- q=zmlb_xz->head;
- /////////////////////////////////////////
- //遍歷字模數(shù)據(jù)鏈表并向緩存區(qū)輸出格式化后的鏈表數(shù)據(jù)
- while(q){
- //////////////////////////////////////////
- //格式化字模數(shù)據(jù)
- k=0;//字模緩存區(qū)指針清零
- for(int j=0;j<ZMCD;j++)
- {
- if(h==1)
- {
- sprintf(ZM+k,"%02XH,",(unsigned char)q->zm[j]);
- k+=4;
- //大寫X
- }else
- {
- sprintf(ZM+k,"%02xh,",(unsigned char)q->zm[j]);
- k+=4;
- //小寫x
- }
- }
- memcpy(ZS+6,q->zf,sizeof(char)*2);//格式化注釋信息+7的偏移是為了將原字符信息添加到注釋里面
- ///////////////////////////////////////////
- //向緩存區(qū)輸出格式化的字符串 -1是為了消除沒個單獨字符串的結(jié)尾標(biāo)記,否則格式后的字符串將不能完全顯示或亂碼
- memcpy(hcq+i,QZ,QZCD-1);i+=QZCD-1;//輸出前綴字符串
- memcpy(hcq+i,ZM,sizeof(char)*(ZMCD*4));i+=(ZMCD*4)-1;//輸出字模數(shù)據(jù)字符串,這里的指針偏移-1是為了消除數(shù)組尾部一個多余的','號
- memcpy(hcq+i,HZ,HZCD-1);i+=HZCD-1;//輸出后綴字符串
- if(jzs==1)
- {
- memcpy(hcq+i,ZS,sizeof(ZS)-1);i+=sizeof(ZS)-1;//輸出注釋信息字符串
- }else{
- memcpy(hcq+i,ZS_0,sizeof(ZS_0)-1);i+=sizeof(ZS_0)-1;//輸出空注釋信息字符串
- }
- ///////////////////////////////////////////
- q=q->next;
- }
- memcpy(hcq+i,zfcend,sizeof(zfcend));i+=sizeof(zfcend);//添加一個字符串結(jié)尾標(biāo)記
- ///////////////////////////////////////////
- }
- void quzimo::print_zm(char hcq[300])
- {
- //輸出原始字模數(shù)據(jù)鏈表里的最后一個字符的字模信
- char HC[300];
- zmlb->print_zm(HC);
- memcpy(hcq,HC,sizeof(char)*ZMCD);
- }
- void quzimo::print_lb()
- {
- //調(diào)試用輸出鏈表數(shù)據(jù)
- Node *q;
- q=zmlb->head;
- do{
- for(int x=0;x<32;x++)
- {
- printf("%02X ",(unsigned char)q->zm[x]);//(unsigned char)強制轉(zhuǎn)換后才能輸出2位的16進(jìn)制數(shù)
- }
- q=q->next;
- printf("\n");
- }while(q);
-
- }
復(fù)制代碼
|
|