Java字体渲染

我一直在尝试增强使用 Java编写的GUI系统以使用子像素抗锯齿功能,并且已经成功,除了两个剩余的异常.这是跟随我的 other question from a few weeks ago.

一个问题是设置渲染提示KEY_ANTIALIASING为VALUE_ANTIALIAS_ON会导致KEY_TEXT_ANTIALIASING被设置为LCD(子像素)AA值时被忽略.任何人都可以看出这一点吗?目前,在渲染文本之前,我被迫使用VALUE_ANTIALIAS_OFF,并在渲染文本后重新开启(因此其他绘画,如圆形等)是AA’d).这个问题由下面的自包含测试程序证明.

第二个问题是我找不到方法查询AA的底层O / S设置,所以我必须做一个相当的kludgey解决方法,这是创建一个Swing JLabel,得到它的FontMetrics,得到它的FontRenderContext,然后得到AA提示.除了将Swing引入到其他方式绝对不使用Swing的程序中,它不会在运行任何J2ME JVM的设备上运行.有人可以建议一个更好的方式来做到这一点吗?如果需要J5或J6,这是可以的,因为目前的kludge已经需要J6(但只需要J4最好).我已经尝试了每个认设置,并使用AWT组件而不是JLabel.

测试程序

该程序验证子像素AA工作时,必须首先禁用一般的AA设置. (PS:我写的是一个后台缓冲区,因为我的基础图形用户界面,我想在相当的上下文中测试).

import java.awt.*;
import java.awt.event.*;

public class AwtTestFrame1b extends Panel {

private final Font                      font=new Font(Font.SANS_SERIF,Font.PLAIN,16);
private final int                       line=25;

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

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

    int                                 py=0;

    py=paintText(g2d,py,null,false);
    py=paintText(g2d,true );
    py+=line;

    py=paintText(g2d,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT,RenderingHints.VALUE_TEXT_ANTIALIAS_ON,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,false);
    py+=line;

    py=paintText(g2d,true );
    py=paintText(g2d,true );
    py+=line;
    }

private int paintText(Graphics2D g2d,int py,Object val,boolean aa) {
    Graphics2D                          dgc=g2d;
    char[]                              txt=("The quick brown fox jumped over the lazy dog ("+val+",General AA: "+aa+")").tochararray();
    Image                               img=null;

    GraphicsConfiguration cfg=getGraphicsConfiguration();
    img=cfg.createCompatibleImage(getWidth(),line);
    dgc=(Graphics2D)img.getGraphics();
    dgc.setColor(getBackground());
    dgc.fillRect(0,getWidth(),line);
    dgc.setColor(g2d.getColor());

    if(aa       ) { dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON ); }
    else          { dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF); }
    if(val!=null) { dgc.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,val); }
    dgc.setFont(font);

    dgc.drawChars(txt,txt.length,10,line-5);
    g2d.drawImage(img,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 AwtTestFrame1b());
    wnd.setSize(new Dimension(1000,600));
    wnd.setVisible(true);
    }

}

解决方法

AWT Desktop Properties是否有任何帮助?特别是,“awt.font.desktophints” – 这些包含本机组件使用的AA提示,但可以应用于任何您想要的Graphics2D.

刚刚在黑暗中射击,最近读过肮脏的富客户的AA部分.

使用会像这样:

String str = "A quick brown fox jumps over the lazy dog";
Toolkit tk = Toolkit.getDefaultToolkit();
Map desktopHints = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
Graphics2D g2d = (Graphics2D)g;

if(desktopHints != null) {
    g2d.addRenderingHints(desktopHints);
}

g2d.drawString(str,someX,someY);

我可以得到相同的结果(使用您的示例类和drawChars和drawImage,简单地键入drawString)作为LCD HRGB模式使用这些提示,在我的机器上没有其他调用.

我不知道这需要什么版本的Java,如果它是你正在寻找…

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量