Domanda

Sono stato cercando di migliorare il mio sistema GUI scritto in Java da utilizzare subpixel antialiasing e hanno avuto successo, ad eccezione di due anomalie rimanenti. Si tratta di un seguito al mio altra domanda da un paio di settimane fa .

Il primo problema è che modificando indizi di rendering KEY_ANTIALIASING a VALUE_ANTIALIAS_ON provoca KEY_TEXT_ANTIALIASING essere ignorato quando è impostata su un valore AA LCD (subpixel). Qualcuno può fare luce su questo? Attualmente sono costretto a VALUE_ANTIALIAS_OFF prima del rendering del testo e riaccenderlo dopo il rendering del testo (in modo che altri la pittura, come i cerchi, ecc, è AA'd). Questo problema è dimostrato dal programma di test self-contained in basso.

Il secondo problema è che riesco a trovare alcun modo per interrogare la O sottostante / impostazione S per AA, quindi devo fare una soluzione piuttosto kludgey, che è quello di creare un JLabel swing, ottenere è FontMetrics, ottiene è FontRenderContext e quindi ottenere il suggerimento AA da questo. Oltre a essere condotta Oscillazione in un programma che altrimenti non ha assolutamente l'uso di Swing, non funzionerà su un dispositivo che esegue qualsiasi J2ME JVM. Qualcuno può suggerire un modo migliore per fare questo? Va bene se richiede J5 o J6, dal momento che il kludge attuale richiede già J6 (ma che necessitano solo J4 sarebbe meglio). Ho già provato ogni impostazione di default e l'utilizzo di un componente AWT invece di JLabel.


Test Program

Il programma verifica che per subpixel AA per funzionare, l'impostazione generale AA deve prima essere disabilitata. (PS: Ho scritto a un back-buffer perché la mia GUI sottostante fa, e ho voluto mettere alla prova in un contesto equivalente)

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

}
È stato utile?

Soluzione

AWT Proprietà desktop di alcun aiuto? In particolare, "awt.font.desktophints" - questi contengono l'AA suggerisce che i componenti nativi usano, ma possono essere applicati a qualsiasi Graphics2D che si desidera

.

Solo un salto nel buio, dopo aver letto di recente attraverso la sezione AA nel client Filthy Rich.

Usa sarebbe simile a questa:

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

Sono stato in grado di ottenere gli stessi risultati (utilizzando la classe esempio e drawChars e drawImage, solo drawString digitato per semplicità) come modo di HRGB LCD utilizzando questi suggerimenti e non altre chiamate sulla mia macchina.

Non sono sicuro di quello che il rilascio di Java questo richiede, se è quello che stai cercando ...

Altri suggerimenti

Non dimenticare: "Le implementazioni sono liberi di ignorare il Suggerimenti del tutto." Per avere un riferimento, ecco quello che vedo a 24 punti:

AwtTestFrame, 24 punti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top