10

サブピクセル アンチエイリアシングを使用するように Java で記述された GUI システムを拡張しようとしており、2 つの異常を除いて成功しています。これは、数週間前の私の他の質問の続きです。

1 つ目の問題は、レンダリング ヒントKEY_ANTIALIASINGをLCD (サブピクセル) AA 値に設定すると無視されるように設定することですVALUE_ANTIALIAS_ONKEY_TEXT_ANTIALIASING誰でもこれに光を当てることができますか?現在、テキストをレンダリングする前に強制的VALUE_ANTIALIAS_OFFにレンダリングし、テキストをレンダリングした後にオンに戻します (円などの他のペイントが AA されるように)。この問題は、以下の自己完結型テスト プログラムによって証明されています。

2 番目の問題は、AA の基になる O/S 設定を照会する方法が見つからないことです。そのため、かなり面倒な回避策を実行する必要があります。つまり、 Swing を作成し、JLabelそれをFontMetrics取得FontRenderContextし、それを取得してから、AA ヒントを取得するというものです。それ。Swing をまったく使用しないプログラムに Swing を含めることは別として、J2ME JVM を実行しているデバイスでは機能しません。誰でもこれを行うためのより良い方法を提案できますか? 現在のクラッジにはすでに J6 が必要なので、J5 または J6 が必要な場合は問題ありません (ただし、J4 のみが必要な場合が最適です)。私はすでにすべてのデフォルト設定を試し、代わりに AWT コンポーネントを使用しましたJLabel


テストプログラム

このプログラムは、サブピクセル AA が機能するためには、まず一般的な AA 設定を無効にする必要があることを確認します。(PS: 基礎となる 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);
    }

}
4

2 に答える 2

10

AWTデスクトップのプロパティは役に立ちますか?特に、「awt.font.desktophints」-これらには、ネイティブコンポーネントが使用するAAヒントが含まれていますが、任意のGraphics2Dに適用できます。

最近、FilthyRichClientsの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のリリースはわかりません...

于 2010-01-07T04:57:04.693 に答える
5

忘れないでください:「実装はヒントを完全に無視することができます。」参考までに、24ポイントで見たものは次のとおりです。

AwtTestFrame、24 ポイント

于 2010-01-07T04:23:37.927 に答える