找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

字模處理類(lèi)的部分關(guān)鍵代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72008 發(fā)表于 2015-1-11 19:47 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <stdio.h>

#include "zm_liangbiao.h"
#include "juzheng.h"
//取字模時(shí)應(yīng)該選擇全角輸入字符否則不能正確取字模
class quzimo
{
   int ZKBJ;//字庫(kù)標(biāo)記:8=8*8,16=16*16,32=32*32,48=48*48
   int ZMCD;//字模長(zhǎng)度根據(jù)字庫(kù)標(biāo)記計(jì)算
   int QMFX;//取字模方向
   void qumo_1616(char zf[2],char zm[32]);//取字符的16*16點(diǎn)陣字模
   void qumo(char zf[2],char zm[300]);//根據(jù)字庫(kù)類(lèi)型標(biāo)記取一個(gè)字符的點(diǎn)陣字模并添加到緩存鏈表
   public:
   zm_liangbiao *zmlb,*zmlb_xz;//創(chuàng)建一個(gè)字模數(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]);//添加一個(gè)字符的字模到字模鏈表
   void zmlb_add_shougong(char zm[300]);//手工添加一個(gè)字模數(shù)據(jù)到鏈表
   void zmlb_print_c51(int x,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[]);//將字模鏈表組合成C51格式輸出到一個(gè)緩存區(qū)
   void zmlb_print_asm(int h,int jzs,char qz[],int qzcd,char hz[],int hzcd,char hcq[]);//將字模鏈表組合成asm格式輸出到一個(gè)緩存區(qū)
   void qmfx(int QMFX);//根據(jù)取模方向重新組合字模數(shù)據(jù)
   void print_zm(char hcq[300]);//輸出鏈表尾部的一個(gè)沒(méi)有格式化的字模數(shù)據(jù)
   void print_lb();//調(diào)試用輸出鏈表數(shù)據(jù)
};

void quzimo::qumo_1616(char zf[2],char zm[32])
{
   //取字符的16*16點(diǎn)陣字模
    FILE *fp_hzk;
        char ZM[32];
    unsigned long offset;//字模在16*16字庫(kù)中的偏移地址
    offset=(((unsigned char)zf[0]-0xa1)*94+((unsigned char)zf[1]-0xa1))*32; //根據(jù)內(nèi)碼找出漢字在HZK16中的偏移位置,第一個(gè)字節(jié)是區(qū)碼第二個(gè)字節(jié)是位碼
    if((fp_hzk=fopen("c:\\vc\\HZK16","rb"))==NULL) return;   //打開(kāi)字庫(kù)文件  
    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];//直接順時(shí)針旋轉(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ù)合成為一個(gè)字節(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ù)合成為一個(gè)字節(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ù)合成為一個(gè)字節(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ù)合成為一個(gè)字節(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ù)字庫(kù)類(lèi)型標(biāo)記取一個(gè)字符的點(diǎn)陣字模
switch(ZKBJ)
{
case 8:
            //暫不支持待擴(kuò)展
        break;
case 16:
        qumo_1616(zf,zm);//取字符的16*16點(diǎn)陣字模
        break;
case 32:
            //暫不支持待擴(kuò)展
        break;
case 48:
            //暫不支持待擴(kuò)展
        break;
}
}

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

void quzimo::zmlb_add_shougong(char zm[300])
{
  //添加一個(gè)手工繪制的字模到字模鏈表
  char *zf="000";//手工繪制標(biāo)記
  zmlb->add(ZKBJ,zf,zm);//添加一個(gè)字符數(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格式輸出到一個(gè)緩存區(qū) x=1格式為0xaa否則格式為0XAA;
        char QZ[20];//前綴不能超過(guò)19字節(jié)
        char HZ[20];//后綴不能超過(guò)19字節(jié)
        char ZM[1500];//字模數(shù)據(jù)1字節(jié)格式化后需要5字節(jié)存儲(chǔ)空間
    char ZS[]="//字符:   的點(diǎn)陣字模\r\n"; //字符注釋信息
        char ZS_0[]=" \r\n";//注釋信息為空
        //char zm_c51[1100];//一條c51格式的完整字模信息
        char zfcend[]=" ";//字符串結(jié)束向緩存區(qū)輸出一個(gè)0x00的字符串結(jié)尾標(biāo)記避免緩存區(qū)輸出后面沒(méi)有準(zhǔn)確數(shù)據(jù)的亂碼
        int i=0;//輸出緩存區(qū)位置標(biāo)記
    int k=0;//字模格式化緩存區(qū)位置標(biāo)記
        ////////////////////////////
        //避免緩存區(qū)區(qū)溢出所以必須限定前后綴字符串輸入的長(zhǎng)度
        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;
                                        //大寫(xiě)X       
                                }else
                                {
                   sprintf(ZM+k,"0x%02x,",(unsigned char)q->zm[j]);
                                        k+=5;
                                        //小寫(xiě)x
                                }
                        }
            memcpy(ZS+7,q->zf,sizeof(char)*2);//格式化注釋信息+7的偏移是為了將原字符信息添加到注釋里面
                        ///////////////////////////////////////////
                        //向緩存區(qū)輸出格式化的字符串 -1是為了消除沒(méi)個(gè)單獨(dú)字符串的結(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ù)組尾部一個(gè)多余的','號(hào)
            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);//添加一個(gè)字符串結(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格式輸出到一個(gè)緩存區(qū) x=1格式為0xaa否則格式為0XAA;
        char QZ[20];//前綴不能超過(guò)19字節(jié)
        char HZ[20];//后綴不能超過(guò)19字節(jié)
        char ZM[1500];//字模數(shù)據(jù)1字節(jié)格式化后需要5字節(jié)存儲(chǔ)空間
    char ZS[]=";字符:   的點(diǎn)陣字模\r\n"; //字符注釋信息
        char ZS_0[]=" \r\n";//注釋信息為空
        //char zm_c51[1100];//一條c51格式的完整字模信息
        char zfcend[]=" ";//字符串結(jié)束向緩存區(qū)輸出一個(gè)0x00的字符串結(jié)尾標(biāo)記避免緩存區(qū)輸出后面沒(méi)有準(zhǔn)確數(shù)據(jù)的亂碼
        int i=0;//輸出緩存區(qū)位置標(biāo)記
    int k=0;//字模格式化緩存區(qū)位置標(biāo)記
        ////////////////////////////
        //避免緩存區(qū)區(qū)溢出所以必須限定前后綴字符串輸入的長(zhǎng)度
        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;
                                        //大寫(xiě)X       
                                }else
                                {
                   sprintf(ZM+k,"%02xh,",(unsigned char)q->zm[j]);
                                        k+=4;
                                        //小寫(xiě)x
                                }
                        }
            memcpy(ZS+6,q->zf,sizeof(char)*2);//格式化注釋信息+7的偏移是為了將原字符信息添加到注釋里面
                        ///////////////////////////////////////////
                        //向緩存區(qū)輸出格式化的字符串 -1是為了消除沒(méi)個(gè)單獨(dú)字符串的結(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ù)組尾部一個(gè)多余的','號(hào)
            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);//添加一個(gè)字符串結(jié)尾標(biāo)記
    ///////////////////////////////////////////
}


void quzimo::print_zm(char hcq[300])
{
        //輸出原始字模數(shù)據(jù)鏈表里的最后一個(gè)字符的字模信
        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)強(qiáng)制轉(zhuǎn)換后才能輸出2位的16進(jìn)制數(shù)
                }
                q=q->next;
                printf("\n");
        }while(q);
       
}

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表