Renderowanie czcionek Java

Próbowałem ulepszyć mój system GUI napisany w Javie, aby używał antyaliasingu subpikseli i odniósł sukces, z wyjątkiem dwóch pozostałych anomalii. To jest kontynuacja mojegoinne pytanie sprzed kilku tygodni.

Pierwszym problemem jest to, że ustawienie wskazówek dotyczących renderowania KEY_ANTIALIASING na VALUE_ANTIALIAS_ON powoduje, że KEY_TEXT_ANTIALIASING jest ignorowane, gdy jest ustawione na wartość AA (subpiksel) AA. Czy ktoś może rzucić na to trochę światła? Obecnie jestem zmuszony do VALUE_ANTIALIAS_OFF przed renderowaniem tekstu i włączeniem go z powrotem po renderowaniu tekstu (tak, że innym obrazem, takim jak koła itp., Jest AA'd). Ten problem został potwierdzony przez niezależny program testowy poniżej.

Drugi problem polega na tym, że nie mogę znaleźć sposobu na zbadanie podstawowego ustawienia O / S dla AA, więc muszę zrobić raczej obejście, które polega na stworzeniu Swing JLabel, otrzymaniu FontMetrics, uzyskaniu FontRenderContext, a następnie uzyskaniu AA podpowiedź z tego. Oprócz włączania Swinga w programie, który w inny sposób nie używa Swinga, nie będzie działać na urządzeniu z JVM J2ME. Czy ktoś może zaproponować lepszy sposób na to? Jest OK, jeśli wymaga J5 lub J6, ponieważ obecny kludge już wymaga J6 (ale potrzeba tylko J4). Próbowałem już wszystkich ustawień domyślnych i używam komponentu AWT zamiast JLabel.

Program testowy

Ten program sprawdza, czy dla subpiksela AA działa, ogólne ustawienie AA musi być najpierw wyłączone. (PS: Piszę do bufora wstecznego, ponieważ mój podstawowy GUI to robi i chciałem przetestować w równoważnym kontekście).

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);
    }

}

questionAnswers(2)

yourAnswerToTheQuestion