代码之家  ›  专栏  ›  技术社区  ›  L. Cornelius Dol

Java字体渲染:一般AA是否必须关闭亚像素AA?

  •  6
  • L. Cornelius Dol  · 技术社区  · 16 年前

    我一直在尝试用Java编写的GUI系统来使用亚像素反走样,并且已经成功了,除了一个剩余的异常。这是对 my other question from yesterday .

    剩下的问题是,如果将“渲染提示”键“抗锯齿”设置为“值”,则当键“文本”抗锯齿设置为LCD(子像素)AA值时,它将被忽略。有人能解释一下吗?目前,我被迫在渲染文本之前关闭“Antialias”,并在渲染文本之后重新打开它(这样其他绘画,如圆形等,就可以被禁用)。

    这个问题通过下面的独立测试程序得到了证明。正如你所看到的,如果你运行它,当字体不是AA时,圆圈就会被涂上AA,反之亦然。最好是预先配置好AA,使其适用于所有的绘画。


    自备测试程序

    import java.awt.*;
    import java.awt.event.*;
    
    public class AwtTestFrame1c extends Panel {
    
    AwtTestFrame1c() {
        setBackground(SystemColor.control);
        }
    
    public void paint(Graphics gc) {
        Graphics2D                          g2d = (Graphics2D)gc;
        int                                 py=0;
    
        py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,true );
        py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,false);
        }
    
    private int paintText(Graphics2D dgc, int py, Object val, boolean aa) {
        char[]                              txt=("The quick brown fox jumped over the lazy dog ("+val+", General AA: "+aa+")").toCharArray();
    
        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.drawOval(5,py+5,15,15);
        dgc.drawChars(txt,0,txt.length,30,py+line-5);
    
        return (py+line);
        }
    
    static private final Font                      font=new Font("SansSerif",Font.PLAIN,16);
    static private final int                       line=25;
    
    static public 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 AwtTestFrame1c());
        wnd.setSize(new Dimension(1000, 300));
        wnd.setVisible(true);
        }
    
    }
    
    2 回复  |  直到 13 年前
        1
  •  1
  •   clstrfsck    16 年前

    四处摸索发现了这个: bug 6263951 .

    很明显,巴士台是固定在B17的?我不确定如何解释错误报告。

    在1.6.0_17-b04(MacOS X 10.5)上肯定断了。

        2
  •  2
  •   trashgod    16 年前

    我在更新 VirtualBox ,所以我拍了照片。我可能只是看到主机的呈现,但我怀疑它也依赖于实现。

    Ubuntu 9.10 AwtTestFrame Ubuntu http://i48.tinypic.com/33k4od0.png Mac OS X 10.5 AwtTestFrame Mac http://i49.tinypic.com/14wypu0.png 视窗7 AwtTestFrame WIn http://i45.tinypic.com/21a0n7n.png

    推荐文章