• 打开文件 ```c int OpenTextFile(char *pcFileName) { struct stat tStat;

      g_iFdTextFile = open(pcFileName, O_RDONLY); / open / if (0 > g_iFdTextFile) {

      1. DBG_PRINTF("can't open text file %s\n", pcFileName);
      2. return -1;

      }

      if(fstat(g_iFdTextFile, &tStat)) / fstat函数获取文件信息(大小等属性) / {

        DBG_PRINTF("can't get fstat\n");
        return -1;
      

      }

      / 内存映射 / g_pucTextFileMem = (unsigned char )mmap(NULL , tStat.st_size, PROT_READ, MAP_SHARED, g_iFdTextFile, 0); if (g_pucTextFileMem == (unsigned char )-1) {

        DBG_PRINTF("can't mmap for text file\n");
        return -1;
      

      }

      / 文件末尾位置 / g_pucTextFileMemEnd = g_pucTextFileMem + tStat.st_size;

      / 选择文件对应的编码方式 / g_ptEncodingOprForFile = SelectEncodingOprForFile(g_pucTextFileMem);

      if (g_ptEncodingOprForFile) {

        /* 如果找到对应支持的编码方式,就将frame buffer的起始位置和文件内容实际的其实位置对应上 */
        g_pucLcdFirstPosAtFile = g_pucTextFileMem + g_ptEncodingOprForFile->iHeadLen;
        return 0;
      

      } else {

        /* 没有支持的编码,直接退出 */
        return -1;
      

      }

    }

    代码跟踪:
    ```c
    OpenTextFile()                                    /* 打开文件操作, draw.c */
        open(pcFileName, O_RDONLY)                    /* 只读方式打开 */
        fstat(g_iFdTextFile, &tStat)                /* 获取文件状态 */
        mmap(NULL , tStat.st_size, PROT_READ, MAP_SHARED, g_iFdTextFile, 0)    /* 内存映射 */
        SelectEncodingOprForFile()                    /* 选择文件编码方式, encoding_manager.c */
            isSupport()                                /* 不断判断该编码是否支持这个文件 */
    
    • 设置文件属性 ```c int SetTextDetail(char pcHZKFile, char pcFileFreetype, unsigned int dwFontSize) { int iError = 0; PT_FontOpr ptFontOpr; PT_FontOpr ptTmp; int iRet = -1;

      g_dwFontSize = dwFontSize;

    ptFontOpr = g_ptEncodingOprForFile->ptFontOprSupportedHead;
    while (ptFontOpr)
    {
        if (strcmp(ptFontOpr->name, "ascii") == 0)
        {
            iError = ptFontOpr->FontInit(NULL, dwFontSize);
        }
        else if (strcmp(ptFontOpr->name, "gbk") == 0)
        {
            iError = ptFontOpr->FontInit(pcHZKFile, dwFontSize);
        }
        else
        {
            iError = ptFontOpr->FontInit(pcFileFreetype, dwFontSize);
        }
    
        DBG_PRINTF("%s, %d\n", ptFontOpr->name, iError);
    
        ptTmp = ptFontOpr->ptNext;
    
        if (iError == 0)
        {
            /* 比如对于ascii编码的文件, 可能用ascii字体也可能用gbk字体, 
             * 所以只要有一个FontInit成功, SetTextDetail最终就返回成功
             */
            iRet = 0;
        }
        else
        {
            DelFontOprFrmEncoding(g_ptEncodingOprForFile, ptFontOpr);
        }
        ptFontOpr = ptTmp;
    }
    return iRet;
    

    }

    代码跟踪:
    ```c
    SetTextDetail()
        ptFontOpr = g_ptEncodingOprForFile->ptFontOprSupportedHead;        /* draw.c */
            AddFontOprForEncoding()                                        /* encodingmanager.c 这一步在编码初始化时进行 */
        ptFontOpr->FontInit()                                            /* draw.c 进行对应的初始化 */
        DelFontOprFrmEncoding()                                            /* 如果不支持,则从编码中删除字体 */