Java di rendering dei caratteri
-
19-09-2019 - |
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);
}
}
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: