我正在尝试解决我正在开发的代码编辑器的问题,该问题仅在具有Retina显示屏的Mac上使用OpenJDK 11时出现。以下屏幕截图说明了该探针。顶部是OpenJDK 11(采用OpenJDK 11.0.5 HotSpot),底部是JDK 8(我相信Apple / Oracle JDK 8):
如您所见,OpenJDK 11使字体更宽。这是一个大问题,因为我正在使用FontRenderContext#getStringBounds
确定等宽列的宽度。使用默认的等宽字体(看起来像Menlo)和字体大小14,据报告每个字符前进8个像素,这正确地对应于JDK 8渲染,但不对应于OpenJDK 11渲染。更糟糕的是,在后一种情况下,似乎没有获得整数像素,而是8.5像素(第一条非注释行包含38个字符,在JDK 8上需要38 * 8 * 2 = 608像素,但是在OpenJDK 11上大约646像素。
更奇怪的是,此问题是[[通过渲染AttributedText
实例引起的]使用Graphics2D#drawString
。如果我转换为纯文本,请使用g.setFont
,OpenJDK 11的呈现方式与JDK 8完全相同。因此,它必须与呈现AttributedCharacterIterator
的特定实现有关。
Edit:
经过进一步的调试会话后,我发现ExtendedTextSourceLabel#createGV
和更深的SunLayoutEngine#layout
产生了区别,然后它们调用了本机代码,尽管在JDK 8中有相同的字体提示描述,字形数据中的_positions
设置为整数,而在OpenJDK 11中将其设置为小数(并且实际上也不是0.5
的倍数,因此与以下事实无关)我们在Retina显示器上运行;也许该字体由本机macOS字体支持)这是类路径上的
Inconsolata .ttf,字体大小为32。相比之下,字体大小为33:
这里基于FontRenderContext#getStringBounds
的报告的字体进度是17.0,由灰色矩形可视化,但是实际渲染略窄一些。