天天看點

Skia深入分析5——skia文字繪制的實作

文字繪制主要包括編碼轉換(主要是中文)、字形解析(點線或image)和實際渲染三個步驟。在這個過程中,字形解析和實際渲染均是耗時步驟。skia對文字解析的結果做了一套緩存機制。在中文字較多,使用多種字型,繪制的樣式(粗/斜體)有變化時,這個緩存會變得很大,是以skia文字緩存做了記憶體上的限制。

1、skpaint

文字繪制與skpaint的屬性相關很大,先回頭看下skpaint相關的屬性

2、字型繪制基本流程

Skia深入分析5——skia文字繪制的實作

skcanvas

繪制文字和下劃線

skdraw

兩種繪制方式:

(1)将文字解析為路徑,然後繪制路徑,緩存路徑(drawtext_aspaths)。

(2)将文字解析為mask(32*32的a8圖檔),然後繪制模闆,緩存模闆。

cacheproc是翻譯字元編碼的函數,由skpaint::getdrawcacheproc産生:

skglyphcache:

字形解析的結果緩存。

skscalercontext:

負責字形的解析,有多種實作。android中是用freetype:skscalercontext_freetype。主要是generateimage和generatepath兩個方法:

generateimage:

generatepath:

3、字型緩存管理

sktypeface是skia中的字型類,對應可有多種字型庫解析實作。

由于android上面使用的是freetype,是以也隻講freetype分支。

freetype的使用方法可參考:http://blog.csdn.net/furtherchan/article/details/8667884

字型建立的代碼如下:

對于android,在系統初始化時,所有字型檔案在預加載時即被解析,包裝為skfacerec,存為一個全局連結清單。(frameworks/base/graphic 和 frameworks/base/core/jni目錄下面的代碼)

sktypeface 記錄一個字型的id,在使用時,到連結清單中查出相關的字型。

對一個字型和樣式,建一個 skglyphcache緩存,内含一個 skscalercontext 和一個 skglyph 的哈希表,skglyph 緩存一個字型中一個字解析出來的位圖。此有記憶體容量限制,當超過容量時,會清除之前緩存的位圖。hash沖突時,直接生成新字形替換原來的字形。

緩存限制的記憶體宏詳見:src/core/skglyphcache_globals.h。和include/core/skuserconfig.h中的sk_default_font_cache_limit宏

當繪制字型隻繪邊界或者位圖緩存機制不好處理時,将字型解析成點線,構成skpath,也做緩存。

Skia深入分析5——skia文字繪制的實作

繼續閱讀