如何获取字体图像已经搞清楚了,那么是怎么绘制的呢?
书接上文:
JDK绘制文字:六、字符对应的字体图像加载流程_柳鲲鹏
- FreetypeFontScaler.getGlyphImage()
调用本地函数getGlyphImageNative()
- freetypeScaler.c Java_sun_font_FreetypeFontScaler_getGlyphImageNative
getGlyphImageNativeInternal()
在这个函数中,加载了字体图像。然后根据不同的图像格式,使用不同的函数进行复制(CopyBW2Grey8/CopyGrey4ToGrey8/CopyFTSubpixelToSubpixel/CopyFTSubpixelVToSubpixel)
复制到哪里?GlyphInfo.image。这个对象是在函数中新产生的。一切处理后,调用ptr_to_jlong把指针转换为long后返回。
- FileFontStrike.getGlyphImagePtrs()
得到图像的指针后:
缓存起来:
setCachedGlyphPtr()
setCachedGlyphPtrInternal()
setCachedGlyphPtr()
setCachedGlyphPtrInternal():segLongGlyphImages[segIndex][subIndex] = glyphPtr;
复制到参数中的image
- GlyphList.setFromChars()
从这里可以看到,传递到getGlyphImagePtrs()的是本类的字段images。之后的绘制,肯定使用这个数据。
疑问:GlyphList是每次新产生的?或者是images长度一直为1?
- SolidTextRenderer(GlyphListPipe).drawChars()
调用setFromChars()之后,紧跟着就是drawGlyphList()
- SolidTextRenderer.drawGlyphList()
sg2d.loops.drawGlyphListLoop.DrawGlyphList(sg2d, sg2d.surfaceData, gl);
- DrawGlyphList.DrawGlyphList()
我们这个已经熟悉了,是一个本地函数。
- DrawGlyphList.c Java_sun_java2d_loops_DrawGlyphList_DrawGlyphList
参数glyphlist就是GlyphList,字段images有字体图像。
这个函数先是获取绘制句柄,再绘制图像。具体操作又是什么?