Java フォントのレンダリング
-
19-09-2019 - |
質問
私は Java で書かれた GUI システムを強化してサブピクセル アンチエイリアスを使用できるようにしようと試みてきましたが、残りの 2 つの異常を除いて成功しました。これは私の続編です 数週間前の別の質問.
最初の問題は、レンダリング ヒント KEY_ANTIALIASING を VALUE_ANTIALIAS_ON に設定すると、KEY_TEXT_ANTIALIASING が LCD (サブピクセル) AA 値に設定されているときに無視されることです。誰かこれについて光を当てられますか?現在、テキストをレンダリングする前に VALUE_ANTIALIAS_OFF にし、テキストをレンダリングした後に再びオンにすることを強制されています(円などの他のペイントが AA されるように)。この問題は、以下の自己完結型テスト プログラムによって証明されています。
2 番目の問題は、AA の基になる O/S 設定をクエリする方法が見つからないことです。そのため、Swing JLabel を作成し、その FontMetrics を取得し、FontRenderContext を取得してから、そこからのAAヒント。Swing をまったく使用しないプログラムに Swing を組み込む場合は別として、J2ME JVM を実行しているデバイスでは動作しません。誰かがこれを行うためのより良い方法を提案できますか?現在のクラッジにはすでに J6 が必要なので、J5 または J6 が必要な場合でも問題ありません (ただし、J4 のみが必要な場合が最適です)。私はすでにすべてのデフォルト設定を試し、JLabel の代わりに AWT コンポーネントを使用しました。
テストプログラム
このプログラムは、サブピクセル AA が機能するには、まず一般的な AA 設定を無効にする必要があることを検証します。(追伸:バックバッファに書き込むのは、基礎となる 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);
}
}
解決
暗闇の中でだけでショットが、最近痴女リッチクライアントでのAA部を介して読みました。
を使用するには、次のようになります
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);
私はこれらのヒントを使用してLCD HRGBモードと私のマシン上の他の呼び出しとして(あなたの例のクラスとdrawCharsとのdrawImage、簡略化のためだけ型付けにdrawStringを使用して)同じ結果を得ることができました。
私は、これは、それはあなたが探しているものだならば、必要とするJavaのものをリリースわからないんだけど...
他のヒント
忘れないで:「実装は自由に無視できます ヒント 参考までに、24 ポイントで私が見たものは次のとおりです。