久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2514|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

c++字模處理類的部分關(guān)鍵代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:102014 發(fā)表于 2016-1-6 02:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

  1. #include <stdio.h>
  2. #include "zm_liangbiao.h"
  3. #include "juzheng.h"
  4. //取字模時應(yīng)該選擇全角輸入字符否則不能正確取字模
  5. class quzimo
  6. {
  7.    int ZKBJ;//字庫標(biāo)記:8=8*8,16=16*16,32=32*32,48=48*48
  8.    int ZMCD;//字模長度根據(jù)字庫標(biāo)記計算
  9.    int QMFX;//取字模方向
  10.    void qumo_1616(char zf[2],char zm[32]);//取字符的16*16點陣字模
  11.    void qumo(char zf[2],char zm[300]);//根據(jù)字庫類型標(biāo)記取一個字符的點陣字模并添加到緩存鏈表
  12.    public:
  13.    zm_liangbiao *zmlb,*zmlb_xz;//創(chuàng)建一個字模數(shù)據(jù)鏈表
  14.    quzimo(int zk,int fx){zmlb=new zm_liangbiao;zmlb_xz=new zm_liangbiao;ZKBJ=zk;QMFX=fx;ZMCD=ZKBJ*ZKBJ/8;}//初始化
  15.    void zmlb_add(char zf[2]);//添加一個字符的字模到字模鏈表
  16.    void zmlb_add_shougong(char zm[300]);//手工添加一個字模數(shù)據(jù)到鏈表
  17.    void zmlb_print_c51(int x,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[]);//將字模鏈表組合成C51格式輸出到一個緩存區(qū)
  18.    void zmlb_print_asm(int h,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[]);//將字模鏈表組合成asm格式輸出到一個緩存區(qū)
  19.    void qmfx(int QMFX);//根據(jù)取模方向重新組合字模數(shù)據(jù)
  20.    void print_zm(char hcq[300]);//輸出鏈表尾部的一個沒有格式化的字模數(shù)據(jù)
  21.    void print_lb();//調(diào)試用輸出鏈表數(shù)據(jù)
  22. };

  23. void quzimo::qumo_1616(char zf[2],char zm[32])
  24. {
  25.    //取字符的16*16點陣字模
  26.     FILE *fp_hzk;
  27.         char ZM[32];
  28.     unsigned long offset;//字模在16*16字庫中的偏移地址
  29.     offset=(((unsigned char)zf[0]-0xa1)*94+((unsigned char)zf[1]-0xa1))*32; //根據(jù)內(nèi)碼找出漢字在HZK16中的偏移位置,第一個字節(jié)是區(qū)碼第二個字節(jié)是位碼
  30.     if((fp_hzk=fopen("c:\\vc\\HZK16","rb"))==NULL) return;   //打開字庫文件  
  31.     fseek(fp_hzk,offset,SEEK_SET); //文件指針偏移到要找的漢字處
  32.     fread(ZM,32,1,fp_hzk);//讀取該漢字的字模
  33.     memcpy(zm,ZM,sizeof(char)*32);//返回獲取的字模數(shù)據(jù)
  34. }

  35. void quzimo::qmfx(int QMFX)
  36. {
  37.    //根據(jù)取模方向重新組合字模數(shù)據(jù)
  38.    int xz[48][48];
  39.    int xz1[48][48];
  40.    char zm[300];
  41.    Node *q;
  42.    q=zmlb->head;
  43.    int y,x,k;
  44.    //遍歷鏈表根據(jù)取模方向重組字模數(shù)據(jù)
  45.    while(q){
  46.           ////////////////////
  47.           //讀字模數(shù)據(jù)到數(shù)組
  48.           k=0;
  49.        for(y=0;y<ZKBJ;y++)
  50.                   for(x=0;x<ZKBJ;x+=8)
  51.                   {
  52.                          zjtodz_z(q->zm[k],&xz[y][x]);
  53.                          k++;
  54.                   }
  55.        /////////////////////
  56.        //數(shù)組向右旋轉(zhuǎn)90度
  57.        for(y=0;y<ZKBJ;y++)
  58.           {
  59.                   for(x=0;x<ZKBJ;x++)
  60.                   {
  61.                           xz1[x][y]=xz[ZKBJ-1-y][x];//直接順時針旋轉(zhuǎn)90度
  62.                   }
  63.           }
  64.           /////////////////////

  65.     switch(QMFX)
  66.         {
  67.         case 2:
  68.                 {
  69.     ///////////////////////
  70.         //縱向ACBD方式重組字模
  71.     k=0;
  72.         for(y=0;y<ZKBJ;y++)
  73.         {
  74.                 for(x=ZKBJ-8;x>=0;x-=8)
  75.                 {
  76.           zm[k]=dztozj_y(&xz1[y][x]); //讀8位顯存數(shù)據(jù)合成為一個字節(jié)
  77.                  k++;
  78.                 }
  79.         }
  80.     ///////////////////////////
  81.          break;
  82.                   }
  83.      case 3:
  84.                 {
  85.     ///////////////////////
  86.         //縱向BDAC方式重組字模
  87.     k=0;
  88.         for(y=ZKBJ-1;y>=0;y--)
  89.         {
  90.                 for(x=ZKBJ-8;x>=0;x-=8)
  91.                 {
  92.           zm[k]=dztozj_y(&xz1[y][x]); //讀8位顯存數(shù)據(jù)合成為一個字節(jié)
  93.                  k++;
  94.                 }
  95.         }
  96.     ///////////////////////////
  97.         break;
  98.                   }
  99.    case 0:
  100.                 {
  101.     //橫向ABCD方式重組字模
  102.     k=0;
  103.         for(y=0;y<ZKBJ;y++)
  104.         {
  105.                 for(x=0;x<ZKBJ;x+=8)
  106.                 {
  107.           zm[k]=dztozj_z(&xz[y][x]); //讀8位顯存數(shù)據(jù)合成為一個字節(jié)
  108.                  k++;
  109.                 }
  110.         }
  111.         /////////////////////////  
  112.         break;
  113.                 }
  114.         case 1:
  115.                 {
  116.     ///////////////////////////
  117.     //橫向BADC方式重組字模
  118.     k=0;
  119.         for(y=0;y<ZKBJ;y++)
  120.         {
  121.                 for(x=ZKBJ-8;x>=0;x-=8)
  122.                 {
  123.           zm[k]=dztozj_y(&xz[y][x]); //讀8位顯存數(shù)據(jù)合成為一個字節(jié)
  124.                  k++;
  125.                 }
  126.         }
  127.         /////////////////////////
  128.         break;
  129.                 }
  130.         }
  131.         zmlb_xz->add(q->ZKBJ,q->zf,zm);//重組后的字模數(shù)據(jù)鏈表
  132.     q=q->next;
  133.    }
  134.    

  135. }

  136. void quzimo::qumo(char zf[2],char zm[300])
  137. {
  138.    //根據(jù)字庫類型標(biāo)記取一個字符的點陣字模
  139. switch(ZKBJ)
  140. {
  141. case 8:
  142.            //暫不支持待擴展
  143.         break;
  144. case 16:
  145.         qumo_1616(zf,zm);//取字符的16*16點陣字模
  146.         break;
  147. case 32:
  148.            //暫不支持待擴展
  149.         break;
  150. case 48:
  151.            //暫不支持待擴展
  152.         break;
  153. }
  154. }

  155. void quzimo::zmlb_add(char zf[2])
  156. {
  157.   //添加一個字符的字模到字模鏈表
  158.         char ZM[300];//字模數(shù)據(jù)緩存區(qū)
  159.         qumo(zf,ZM);//取字模
  160.     zmlb->add(ZKBJ,zf,ZM);//添加一個字符數(shù)據(jù)
  161. }

  162. void quzimo::zmlb_add_shougong(char zm[300])
  163. {
  164.   //添加一個手工繪制的字模到字模鏈表
  165.   char *zf="000";//手工繪制標(biāo)記
  166.   zmlb->add(ZKBJ,zf,zm);//添加一個字符數(shù)據(jù)
  167. }

  168. void quzimo::zmlb_print_c51(int x,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[])
  169. {
  170.         qmfx(QMFX);//根據(jù)取模方向重組字模數(shù)據(jù)
  171.     //將字模鏈表組合成C51格式輸出到一個緩存區(qū) x=1格式為0xaa否則格式為0XAA;
  172.         char QZ[20];//前綴不能超過19字節(jié)
  173.         char HZ[20];//后綴不能超過19字節(jié)
  174.         char ZM[1500];//字模數(shù)據(jù)1字節(jié)格式化后需要5字節(jié)存儲空間
  175.     char ZS[]="//字符:   的點陣字模\r\n"; //字符注釋信息
  176.         char ZS_0[]=" \r\n";//注釋信息為空
  177.         //char zm_c51[1100];//一條c51格式的完整字模信息
  178.         char zfcend[]=" ";//字符串結(jié)束向緩存區(qū)輸出一個0x00的字符串結(jié)尾標(biāo)記避免緩存區(qū)輸出后面沒有準(zhǔn)確數(shù)據(jù)的亂碼
  179.         int i=0;//輸出緩存區(qū)位置標(biāo)記
  180.     int k=0;//字模格式化緩存區(qū)位置標(biāo)記
  181.         ////////////////////////////
  182.         //避免緩存區(qū)區(qū)溢出所以必須限定前后綴字符串輸入的長度
  183.         int QZCD,HZCD;
  184.         if(qzcd<20)
  185.         {
  186.                 QZCD=qzcd;
  187.         }else
  188.         {
  189.                 QZCD=19;
  190.         }
  191.     if(hzcd<20)
  192.         {
  193.                 HZCD=hzcd;
  194.         }else
  195.         {
  196.                 HZCD=19;
  197.         }
  198.     memcpy(QZ,qz,QZCD);
  199.     memcpy(HZ,hz,HZCD);
  200.     ////////////////////////////
  201.     Node *q;
  202.         q=zmlb_xz->head;//輸出重組后的字模數(shù)據(jù)
  203.     /////////////////////////////////////////
  204.     //遍歷字模數(shù)據(jù)鏈表并向緩存區(qū)輸出格式化后的鏈表數(shù)據(jù)
  205.     while(q){
  206.                         //////////////////////////////////////////
  207.                         //格式化字模數(shù)據(jù)
  208.                         k=0;//字模緩存區(qū)指針清零
  209.             for(int j=0;j<ZMCD;j++)
  210.                         {
  211.                                 if(x==1)
  212.                                 {
  213.                     sprintf(ZM+k,"0X%02X,",(unsigned char)q->zm[j]);
  214.                                         k+=5;
  215.                                         //大寫X       
  216.                                 }else
  217.                                 {
  218.                    sprintf(ZM+k,"0x%02x,",(unsigned char)q->zm[j]);
  219.                                         k+=5;
  220.                                         //小寫x
  221.                                 }
  222.                         }
  223.             memcpy(ZS+7,q->zf,sizeof(char)*2);//格式化注釋信息+7的偏移是為了將原字符信息添加到注釋里面
  224.                         ///////////////////////////////////////////
  225.                         //向緩存區(qū)輸出格式化的字符串 -1是為了消除沒個單獨字符串的結(jié)尾標(biāo)記,否則格式后的字符串將不能完全顯示或亂碼
  226.             memcpy(hcq+i,QZ,QZCD-1);i+=QZCD-1;//輸出前綴字符串
  227.             memcpy(hcq+i,ZM,sizeof(char)*(ZMCD*5));i+=(ZMCD*5)-1;//輸出字模數(shù)據(jù)字符串,這里的指針偏移-1是為了消除數(shù)組尾部一個多余的','號
  228.             memcpy(hcq+i,HZ,HZCD-1);i+=HZCD-1;//輸出后綴字符串
  229.                         if(jzs==1)
  230.                         {
  231.             memcpy(hcq+i,ZS,sizeof(ZS)-1);i+=sizeof(ZS)-1;//輸出注釋信息字符串
  232.                         }else{
  233.             memcpy(hcq+i,ZS_0,sizeof(ZS_0)-1);i+=sizeof(ZS_0)-1;//輸出空注釋信息字符串
  234.                         }
  235.                         ///////////////////////////////////////////
  236.      q=q->next;
  237.     }
  238.     memcpy(hcq+i,zfcend,sizeof(zfcend));i+=sizeof(zfcend);//添加一個字符串結(jié)尾標(biāo)記
  239.     ///////////////////////////////////////////
  240. }

  241. void quzimo::zmlb_print_asm(int h,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[])
  242. {
  243.         qmfx(QMFX);//根據(jù)取模方向重組字模數(shù)據(jù)
  244.    //將字模鏈表組合成ASM格式輸出到一個緩存區(qū) x=1格式為0xaa否則格式為0XAA;
  245.         char QZ[20];//前綴不能超過19字節(jié)
  246.         char HZ[20];//后綴不能超過19字節(jié)
  247.         char ZM[1500];//字模數(shù)據(jù)1字節(jié)格式化后需要5字節(jié)存儲空間
  248.     char ZS[]=";字符:   的點陣字模\r\n"; //字符注釋信息
  249.         char ZS_0[]=" \r\n";//注釋信息為空
  250.         //char zm_c51[1100];//一條c51格式的完整字模信息
  251.         char zfcend[]=" ";//字符串結(jié)束向緩存區(qū)輸出一個0x00的字符串結(jié)尾標(biāo)記避免緩存區(qū)輸出后面沒有準(zhǔn)確數(shù)據(jù)的亂碼
  252.         int i=0;//輸出緩存區(qū)位置標(biāo)記
  253.     int k=0;//字模格式化緩存區(qū)位置標(biāo)記
  254.         ////////////////////////////
  255.         //避免緩存區(qū)區(qū)溢出所以必須限定前后綴字符串輸入的長度
  256.         int QZCD,HZCD;
  257.         if(qzcd<20)
  258.         {
  259.                 QZCD=qzcd;
  260.         }else
  261.         {
  262.                 QZCD=19;
  263.         }
  264.     if(hzcd<20)
  265.         {
  266.                 HZCD=hzcd;
  267.         }else
  268.         {
  269.                 HZCD=19;
  270.         }
  271.     memcpy(QZ,qz,QZCD);
  272.     memcpy(HZ,hz,HZCD);
  273.     ////////////////////////////
  274.     Node *q;
  275.         q=zmlb_xz->head;
  276.     /////////////////////////////////////////
  277.     //遍歷字模數(shù)據(jù)鏈表并向緩存區(qū)輸出格式化后的鏈表數(shù)據(jù)
  278.     while(q){
  279.                         //////////////////////////////////////////
  280.                         //格式化字模數(shù)據(jù)
  281.                         k=0;//字模緩存區(qū)指針清零
  282.             for(int j=0;j<ZMCD;j++)
  283.                         {
  284.                                 if(h==1)
  285.                                 {
  286.                     sprintf(ZM+k,"%02XH,",(unsigned char)q->zm[j]);
  287.                                         k+=4;
  288.                                         //大寫X       
  289.                                 }else
  290.                                 {
  291.                    sprintf(ZM+k,"%02xh,",(unsigned char)q->zm[j]);
  292.                                         k+=4;
  293.                                         //小寫x
  294.                                 }
  295.                         }
  296.             memcpy(ZS+6,q->zf,sizeof(char)*2);//格式化注釋信息+7的偏移是為了將原字符信息添加到注釋里面
  297.                         ///////////////////////////////////////////
  298.                         //向緩存區(qū)輸出格式化的字符串 -1是為了消除沒個單獨字符串的結(jié)尾標(biāo)記,否則格式后的字符串將不能完全顯示或亂碼
  299.             memcpy(hcq+i,QZ,QZCD-1);i+=QZCD-1;//輸出前綴字符串
  300.             memcpy(hcq+i,ZM,sizeof(char)*(ZMCD*4));i+=(ZMCD*4)-1;//輸出字模數(shù)據(jù)字符串,這里的指針偏移-1是為了消除數(shù)組尾部一個多余的','號
  301.             memcpy(hcq+i,HZ,HZCD-1);i+=HZCD-1;//輸出后綴字符串
  302.                         if(jzs==1)
  303.                         {
  304.             memcpy(hcq+i,ZS,sizeof(ZS)-1);i+=sizeof(ZS)-1;//輸出注釋信息字符串
  305.                         }else{
  306.             memcpy(hcq+i,ZS_0,sizeof(ZS_0)-1);i+=sizeof(ZS_0)-1;//輸出空注釋信息字符串
  307.                         }
  308.                         ///////////////////////////////////////////
  309.      q=q->next;
  310.     }
  311.     memcpy(hcq+i,zfcend,sizeof(zfcend));i+=sizeof(zfcend);//添加一個字符串結(jié)尾標(biāo)記
  312.     ///////////////////////////////////////////
  313. }


  314. void quzimo::print_zm(char hcq[300])
  315. {
  316.         //輸出原始字模數(shù)據(jù)鏈表里的最后一個字符的字模信
  317.         char HC[300];
  318.         zmlb->print_zm(HC);
  319.     memcpy(hcq,HC,sizeof(char)*ZMCD);
  320. }

  321. void quzimo::print_lb()
  322. {
  323.     //調(diào)試用輸出鏈表數(shù)據(jù)
  324.     Node *q;
  325.         q=zmlb->head;
  326.         do{
  327.                 for(int x=0;x<32;x++)
  328.                 {
  329.                         printf("%02X ",(unsigned char)q->zm[x]);//(unsigned char)強制轉(zhuǎn)換后才能輸出2位的16進(jìn)制數(shù)
  330.                 }
  331.                 q=q->next;
  332.                 printf("\n");
  333.         }while(q);
  334.        
  335. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩福利视频 | 亚洲第一av| www成人免费 | 日本a∨视频 | 色毛片| japan21xxxxhd美女 日本欧美国产在线 | 国产精品大片在线观看 | 久久99久久 | 精久久久久 | 国产日韩欧美中文 | 国产一区二区三区四区五区加勒比 | 天天看天天爽 | 免费黄色大片 | 欧美一区二区三区高清视频 | 精品综合 | 国产精品久久久久久久久婷婷 | 综合网在线 | 亚洲精品视频免费看 | 成人国产精品久久 | 国产精品久久久久久久久久不蜜臀 | 欧美日韩网站 | 久久99国产精品 | 亚洲精品电影 | 亚洲永久字幕 | 成人久草| 丁香一区二区 | 午夜精品福利视频 | 丁香五月缴情综合网 | 成人中文网| 欧美一区二区免费 | 精品在线播放 | 久草视频网站 | 一区二区三区高清在线观看 | 亚洲精品在线视频 | 亚洲国产欧美在线人成 | 成人三级电影 | 91色视频在线观看 | av免费入口| 色综合网站 | 色噜噜亚洲男人的天堂 | 成人免费看黄网站在线观看 |