我一直在尝试增强我用 Java 编写的 GUI 系统以使用亚像素抗锯齿,并且取得了成功,除了两个剩余的异常。这是几周前我的另一个问题的后续。
第一个问题是,将渲染提示设置为 LCD(子像素)AA 值时KEY_ANTIALIASING
会VALUE_ANTIALIAS_ON
导致忽略。KEY_TEXT_ANTIALIASING
任何人都可以对此有所了解吗?目前,我被迫VALUE_ANTIALIAS_OFF
在渲染文本之前将其打开并在渲染文本后重新打开它(以便其他绘画,如圆圈等,是 AA'd)。下面的自包含测试程序证明了这个问题。
第二个问题是我找不到查询 AA 的底层 O/S 设置的方法,所以我必须做一个相当笨拙的解决方法,即创建一个 Swing JLabel
、 get it's FontMetrics
、 get it'sFontRenderContext
然后从那。除了将 Swing 包含在一个完全不使用 Swing 的程序中之外,它不会在运行任何 J2ME JVM 的设备上工作。谁能建议一个更好的方法来做到这一点?如果它需要 J5 或 J6 也没关系,因为当前的 kludge 已经需要 J6(但最好只需要 J4)。我已经尝试了所有默认设置并使用 AWT 组件而不是JLabel
.
测试程序
该程序验证要使子像素 AA 工作,必须首先禁用常规 AA 设置。(PS:我写了一个后台缓冲区,因为我的底层 GUI 确实如此,并且我想在等效的上下文中进行测试)。
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,py,null ,true );
py+=line;
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF ,false);
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,false);
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON ,false);
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP ,false);
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,false);
py+=line;
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF ,true );
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,true );
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON ,true );
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP ,true );
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,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,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,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 AwtTestFrame1b());
wnd.setSize(new Dimension(1000, 600));
wnd.setVisible(true);
}
}