如何获取字体图像已经搞清楚了,那么是怎么绘制的呢?

  书接上文:

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有字体图像。

这个函数先是获取绘制句柄,再绘制图像。具体操作又是什么?