LibGDX 实现 动态中文/freetype 加载

1
2
3
4
5
1. JSON读取
Skin.getJsonLoader() -> new Json() -> json.setSerializer()
读json文件size属性, new FreeTypeBitmapFontStub()
FreeTypeBitmapFontStub extends BitmapFont
FreeTypeBitmapFontStub.data instanceof FreeTypeBitmapFontData
1
2
3
4
5
6
7
8
2. Label初始化
new Label() -> Label.setStyle() {
FreeTypeFontManager.isFreeTypeFont(style.font)==true {
data.setSize(style.fontSize)
new FontInfo(data.getSize())
font = FreeTypeFontManager.getInstance().refresh(style.font==stub, newInfo)
}
cache = new BitmapFontCache(font) // cache里的 font == 第一次refresh出来的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
3. 更新文字
Label.setText() -> Widget.invalidateHierarchy()
-> Label.invalidate() { needsLayout=true; sizeInvalid=true }
渲染 -> draw() -> Widget.validate() -> Label.layout()
-> computeSize() -> cache.requireSequence(text) {
FreeTypeFontManager.isFreeTypeFont(this.font) == true:
this.font = FreeTypeFontManager.getInstance().refresh(this.font, curFontInfo) }
-> FreeTypeFontManager.refresh(font, newInfo) {
isStub == false
newInfo不含在当前子串里:
getFont(newInfo.size)
-> (FreeTypeFontGenerator)generator.generateFont(sizePixel, sequence, flip==false)
-> FreeTypeFontGenerator.generateData(size, chars, flip, packer==null)
-> FreeTypeFontGenerator.generateData(parameter) {
parameter.packer == null:
ownsAtlas = true
data.regions[i] = new TextureRegion(tex=new Texture()) // new出来的texture
return data
}
}