fontconfig 原始碼分析

2021-08-19 03:19:44 字數 2675 閱讀 6615

手頭專案遇到個ass庫,在這個庫的中用到了fontconfig庫,由於字元編碼問題,導致找不到字型檔案,所以不得不修改下fontconfig庫,看了看原始碼,頭大眼皮沉。。。寫個記錄屢屢思路

首先libass呼叫fontconfig庫整合了幾個函式

fontconfig_init();初始化fontfontconfg庫

fontconfig_select();選擇乙個字型,輸入族名編碼等引數,返回乙個可用的字型的字型檔案路徑。

fontconfig_done();銷毀庫物件

fontconfig_update();更新kudu庫物件

libass庫的rander.c檔案中的呼叫順序是init - select - update -select -update -……done;

並且定義了乙個fcinstance的結構體作為上下文,其中有個fcconfig*的指標存放fontconfig庫返回的上下文,fcconfig結構體內存放了一系列的set結構,其中包括config配置檔案的路徑,字型資料夾的路徑,具體字型檔案的路徑,字型替換的patterns等資訊。fontconfig的執行主要依靠該結構體。

首先是初始化

呼叫 fcconfigcreate();

函式返回乙個fcconfig結構體指標,並對結構體內各個set結構初始化,置零。

呼叫fcconfigparseandload();

引數為fcconfig結構體指標 和 字型配置檔案的路徑,最後是是否覆蓋。

說道這裡就得說下字型配置檔案一般命名為fonts.conf ,該檔案可以根據自己需求編輯,也可以直接找乙個套用(文件後會附乙份我常用的字型配置檔案)。所謂fonts.con檔案其實就是乙個xml,格式如下

<?xml version="1.0"?>

c:/windows/fonts

media/fonts

../../media/fonts

~/.fonts

windowstempdir_fontconfig_cache

~/.fontconfig

mono

monospace

sans serif

sans-serif

sans

sans-serif

arial

宋體sans

sans-serif

times

times new roman

serif

helvetica

arial

sans

courier

courier new

monospace

serif

times new roman

sans

arial

monospace

andale mono

conf.d

0x0020

0x00a0

0x00ad

0x034f

0x0600

0x0601

0x0602

0x0603

0x06dd

0x070f

0x115f

0x1160

0x1680

0x17b4

0x17b5

0x180e

0x2000

0x2001

0x2002

0x2003

0x2004

0x2005

0x2006

0x2007

0x2008

0x2009

0x200a

0x200b

0x200c

0x200d

0x200e

0x200f

0x2028

0x2029

0x202a

0x202b

0x202c

0x202d

0x202e

0x202f

0x205f

0x2060

0x2061

0x2062

0x2063

0x206a

0x206b

0x206c

0x206d

0x206e

0x206f

0x3000

0x3164

0xfeff

0xffa0

0xfff9

0xfffa

0xfffb

30

其中最重要的是windowsfontdir屬性,fontconfig會遞迴的查詢該資料夾下的所有字型檔案。

再有就是是乙個選擇模板 如:

mono

monospace

意思就是 嘗試(test)是否符合  family 的值中包含 mono 如果有,則編輯(edit ) family值為 monospace 。qual="any"的意思是只要有相同的就進入edit ,mode="assign"的意思是替換,由於family的屬性值為乙個列表,所以assgin是替換di的意第乙個匹配值,還有assign_all就是替換shux屬性值list中所有符合規則的值。

其實就是乙個條件替換的功能,將模板中的資訊按照寫出的規則替換。時,就是對字型引數進行操作了。比如字型的粗細,大小等。語法相近。

其他的引數用到時在詳細了解。

初始化獲取配置檔案結束。

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...