首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何强制启用Java text抗锯齿?

如何强制启用Java text抗锯齿?
EN

Stack Overflow用户
提问于 2014-07-01 02:31:42
回答 1查看 3K关注 0票数 6

在Kubuntu 14.04中运行Xilinx Vivado FPGA设计工具,它只在UI的某些部分使用抗锯齿字体,这使得它更难使用,更不用说难看了。其他人似乎也有相同的issue

因为它似乎至少部分是用Java编写的,所以我尝试了一些谷歌搜索后找到的建议解决方案

代码语言:javascript
复制
export _JAVA_OPTIONS="-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dsun.java2d.xrender=true"

没有任何视觉效果。

下面的一个小测试程序清楚地表明,除非显式地设置了字体呈现提示(但不是RenderingHints.KEY_TEXT_ANTIALIASING),否则将得到非抗锯齿文本。这在OpenJDK和Oracle JDK中都会发生。

代码语言:javascript
复制
import java.awt.*;
import java.awt.event.*;

// partially taken from http://stackoverflow.com/questions/2018102/java-font-rendering                                                     

public class AwtAA extends Panel {

    private final Font font = new Font(Font.SANS_SERIF, Font.BOLD, 16);
    private final int line = 24;
    private final int medskip = 16;

    AwtAA() {
    setBackground(SystemColor.control);
    }

    public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D)g;
    int py = 0;

    py = paintText(g2d, py, null, null);
    py += medskip;

    py = paintText(g2d, py, null, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
    py = paintText(g2d, py, null, RenderingHints.VALUE_ANTIALIAS_ON);
    py += medskip;

    py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, null);
    py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_ON,      null);
    py += medskip;

    py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
    py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_ON,      RenderingHints.VALUE_ANTIALIAS_DEFAULT);
    py += medskip;

    py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, RenderingHints.VALUE_ANTIALIAS_ON);
    py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_ON,      RenderingHints.VALUE_ANTIALIAS_ON);
    }

    private int paintText(Graphics2D g2d, int py, Object text, Object aa) {
    Graphics2D dgc = g2d;
    Image img = null;

    String text_aa = "none";
    if (text != null) {
        if (text.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT)) text_aa = "VALUE_TEXT_ANTIALIAS_DEFAULT";
        if (text.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_OFF)) text_aa = "VALUE_TEXT_ANTIALIAS_OFF";
        if (text.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_ON)) text_aa = "VALUE_TEXT_ANTIALIAS_ON";
    }

    String value_aa = "none";
    if (aa != null) {
        if (aa.equals(RenderingHints.VALUE_ANTIALIAS_DEFAULT)) value_aa = "VALUE_ANTIALIAS_DEFAULT";
        if (aa.equals(RenderingHints.VALUE_ANTIALIAS_OFF)) value_aa = "VALUE_ANTIALIAS_OFF";
        if (aa.equals(RenderingHints.VALUE_ANTIALIAS_ON)) value_aa = "VALUE_ANTIALIAS_ON";
    }

    char[] txt = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ (" + text_aa + ", " + value_aa + ")").toCharArray();
    GraphicsConfiguration cfg = getGraphicsConfiguration();
    img = cfg.createCompatibleImage(getWidth(), line);
    dgc = (Graphics2D)img.getGraphics();
    dgc.setColor(getBackground());
    dgc.fillRect(0, 0, getWidth(), line);
    dgc.setColor(g2d.getColor());

    if (text != null) dgc.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, text);
    if (aa != null) dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING, aa);

    dgc.setFont(font);
    dgc.drawChars(txt, 0, txt. length, 10, line-5);
    g2d.drawImage(img, 0, py, null);
    dgc.dispose();
    img.flush();

    return py + line;
    }

    public static void main(String[] args) {
    Frame wnd = new Frame("AWT Antialiased Text Sample");

    wnd.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    wnd.add(new AwtAA());
    wnd.setSize(new Dimension(850, 330));
    wnd.setVisible(true);
    }
}

因此,问题是如何更改默认值(未设置提示或设置为VALUE_TEXT_ANTIALIAS_DEFAULT)以在字体渲染中使用抗锯齿?

当我能找到的所有答案都围绕着上面的几个属性进行设置时,我开始查看源代码……并在SunGraphics2D类构造函数中对openjdk 7做了一些粗略的“修复”:

代码语言:javascript
复制
apt-get source openjdk-7-jre
cd openjdk-7-7u55-2.4.7
tar zxf jdk.tar.gz

cd jdk-9448fff93286/src/share/classes/sun/java2d
patch -p1 <<"__EOF__"
--- a/SunGraphics2D.java    2014-06-29 23:39:34.183177958 +0300
+++ b/SunGraphics2D.java    2014-06-29 23:39:18.675177667 +0300
@@ -244,7 +244,10 @@

         renderHint = SunHints.INTVAL_RENDER_DEFAULT;
         antialiasHint = SunHints.INTVAL_ANTIALIAS_OFF;
-        textAntialiasHint = SunHints.INTVAL_TEXT_ANTIALIAS_DEFAULT;
+        textAntialiasHint = SunHints.INTVAL_TEXT_ANTIALIAS_ON;
         fractionalMetricsHint = SunHints.INTVAL_FRACTIONALMETRICS_OFF;
         lcdTextContrast = lcdTextContrastDefaultValue;
         interpolationHint = -1;
__EOF__
javac SunGraphics2D.java
cd ../..
jar cvf /tmp/rt.jar sun/java2d/SunGraphics2D.class

然后将其运行为

代码语言:javascript
复制
java -Xbootclasspath/p:/tmp/rt.jar AwtAA

这对测试程序和Vivado工具都起到了作用(除了Vidado以某种方式启动,并且似乎不支持-Xbootclasspath,所以我真的必须在system rt.jar中更新SunGraphics2D类)。这似乎适用于OpenJDK和甲骨文。

最后一个问题..。除了猴子修补系统jars之外,还必须有其他方法强制将抗锯齿文本作为默认设置吗?

EN

回答 1

Stack Overflow用户

发布于 2014-08-16 22:28:57

感谢您的补丁jar解决方案,它可以工作,即使有一点混乱。

我不知道是否有比修补jar更好的强制抗锯齿文本的方法,但可以在启动Vivado之前使用以下命令,使其使用修补后的rt.jar,而无需更换主系统:

代码语言:javascript
复制
export _JAVA_OPTIONS="-Xbootclasspath/p:<PATH TO JAR>/rt.jar"

<PATH TO JAR>替换为您放置修补的rt.jar的位置(我使用/opt/Xilinx/Vivado/)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24496642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档