ucgui 字型相關實現

simplaman發表於2007-08-29

ucgui支援等寬字型和變寬字型,支援不同編碼格式字符集如ascii,unicode,shift-jis

字型定義為

typedef struct {
  GUI_DISPCHAR*     pfDispChar; 
  GUI_GETCHARDISTX* pfGetCharDistX; 
  GUI_GETFONTINFO*  pfGetFontInfo; 
  GUI_ISINFONT*     pfIsInFont;
  tGUI_ENC_APIList* pafEncode;
  U8 YSize;
  U8 YDist;
  U8 XMag;
  U8 YMag;
  union {
    void  *pFontData;
    const GUI_FONT_MONO* pMono;
    const GUI_FONT_PROP* pProp;
  } p;
  U8 Baseline;
} GUI_FONT;
不同字型對應的顯示方式可能有差異,如顯示Mono、顯示多位元組字元、AntiAlias顯示等
體現為結構體中的pfDispChar,pfGetCharDistX,pfGetFontInfo,pfIsInFont四個函式
當然除了顯示方式,等寬不等寬字型在儲存上也有差異,這就是union p中pMono,pProp的由來。
等寬字型用結構GUI_FONT_MONO表示,裡面有U8 XSize表示字元寬度。而不等寬字型用結構GUI_FONT_PROP表示。即 GUI_FONT中的pProp,為一個單向連結串列。其中每項中有一個GUI_CHARINFO陣列。而每一個GUI_CHARINFO存有單個字元的寬度、圖形等資訊。

而不同的編碼是透過結構體指標pafEncode實現,該結構的定義如下
typedef struct {
  tGUI_GetLineDistX*          pfGetLineDistX;
  tGUI_GetLineLen*            pfGetLineLen;
  tGL_DispLine*               pfDispLine;
} tGUI_ENC_APIList;
兩個有意思的特性:
1 GUI_FONT_MONO 字型支援將兩個字元疊加生成新的字元,具體是透過結構體
GUI_FONT_TRANSLIST,GUI_FONT_TRANSINFO實現
2 對unicode的支援不是透過pafEncode實現,透過GUI_UC_STARTCHAR 0x1a,GUI_UC_ENDCHAR 0xe2來標誌UNICODE的開始結束[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/116625/viewspace-966795/,如需轉載,請註明出處,否則將追究法律責任。

相關文章