MiniGUI字體顯示原理

數據結構

數據結構我先從別人的博客拉一張過來吧:
minigui邏輯字體,字體設備的結構圖
這裏包含了,邏輯字體和設備字體(多字符集以及單字符集),以及字符集操作集之間的關係。
可以看到:一個邏輯字體對應一個字符設備,一個字符設備對應一個字符集
也就是說一種邏輯字體只能專門顯示某種特定的字符集的字符串。比如專門顯示utf-8字符集的字符串,或者gb2312字符集的字符串。

字符集操作集(charset_ops)

在調用createLogFont接口創建邏輯字體時,會傳入charset字符集名稱,該參數用於將邏輯字體與字符集操作集進行綁定,如果創建過程中匹配到對應的設備字體,則charset參數不起作用,真是charset按照devfont來。
字符集操作集提供幾個接口,用於該字符集的操作,譬如判斷字符串是否爲當前字符集。各個接口具體說明參考博客:
https://www.cnblogs.com/b2tang/archive/2009/06/12/1502035.html

設備字體

在MiniGUI初始化過程中,mg_InitGDI函數會根據MiniGUI.cfg配置文件讀取邏輯字體文件,進行初始化,生成設備字體對象DevFont。
並通過AddDevFont函數將devfont對象保存到全局列表中(mb_dev_font_head)。

初始化devfont時,設備字體中的font_ops將被賦值爲全局對象__mg_fontops_infos->fontops, 字符集操作集按照配置文件的配置進行初始化

CreateLogFont函數創建邏輯字體對象時,會通過get_matched_devfont獲取匹配的設備字體,並通過dbc_font_ops->new_instance創建一個新的devfont,並綁定到邏輯字體中

邏輯字體

給對應控件的設備環境設置好邏輯字體後調用DrawText進行繪製。
DrawText最終會調用到devfont->font_ops->get_glyph_bbox函數獲取字體顯示區域。然後devfont->font_ops->get_glyph_bbox會調用devfont->charset_ops->conv_to_uc32將字符串轉換爲UNICODE編碼,去ttf文件中匹配字體。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章