1. Font配置文件
位于frameworks/base/data/fonts
system_fonts.xml fallback_fonts.xml
文件结构
<family>
<nameset>
<name>sans-serif</name>
<name>arial</name>
<name>helvetica</name>
<name>tahoma</name>
<name>verdana</name>
</nameset>
<fileset>
<file>Roboto-Regular.ttf</file>
<file>Roboto-Bold.ttf</file>
<file>Roboto-Italic.ttf</file>
<file>Roboto-BoldItalic.ttf</file>
</fileset>
</family>
可以称每一个 family为一个字体族。 包括:正常字体,粗体,斜体,粗体斜体,每个家族包括四种字体,这四种字体不是都必须的。
2. 字体加载
zygote初始化时preloadclass会加载Typeface类,在这个类中会调用jni-->skia 加载字体。
(1)一些数据类型,加载字体解析xml文件,保存到这些数据结构中。
structFontFamily { ---> family
SkTDArray<const char*> fNames; ---> name ---> gDefaultNames
SkTDArray<FontFileInfo*>fFontFileArray; ---> file ---> gSystemFonts
int order;
};
FontFamily可以理解为字体族,对应一个<family>标签。
SkTDArray<constchar*> fNames 保存了<name>字段。
SkTDArray<FontFileInfo*>fFontFileArray 保存了<file>。
一个SkTDArray<FontFamily*>,可以保存整个xml文件信息。
structFontFileInfo {
FontFileInfo() : fFileName(NULL),fVariant(SkPaint::kDefault_Variant),
fLanguage() {
}
const char* fFileName;
SkPaint::FontVariant fVariant;
SkLanguage fLanguage;
};
FontFileInfo包含了三个字段,fFileName代表标签<file>里的字体文件名字;file 可以有属性 variant="elegant" 和 lang="ja&#