Я пытался улучшить свою систему GUI, записанную в Java для использования субпиксельного сглаживания, и был успешен, за исключением двух остающихся аномалий. Это - следование по моему другому вопросу от несколько недель назад.
Первая проблема состоит в том, что установка подсказок рендеринга, KEY_ANTIALIASING к VALUE_ANTIALIAS_ON заставляет KEY_TEXT_ANTIALIASING быть проигнорированным, когда это установлено на жидкокристаллический дисплей (субпиксель) значение AA. Кто-либо может пролить некоторый свет на это? В настоящее время я вынужден к VALUE_ANTIALIAS_OFF прежде, чем представить текст и снова включаю его после рендеринга текста (так, чтобы другое рисование, как круги, и т.д., было AA'd). Эта проблема доказана автономной тестовой программой ниже.
Вторая проблема состоит в том, что я не могу найти способ запросить базовую установку O/S для AA, таким образом, я должен сделать скорее kludgey обходное решение, которое должно создать JLabel Swing, добраться, это - FontMetrics, доберитесь, это - FontRenderContext, и затем получите подсказку AA от этого. Кроме вовлечения Swing в программе, которая иначе не делает абсолютно никакого использования Swing, он не будет работать над устройством, выполняющим J2ME JVM. Кто-либо может предложить лучший способ сделать это? Хорошо, если бы это требует J5 или J6, так как текущий клудж уже требует 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);
}
}
Могут ли свойства рабочего стола AWT помочь? В частности, «awt.font.desktophints» - они содержат подсказки AA, которые используют собственные компоненты, но могут быть применены к любому Graphics2D, который вы хотите.
Просто снимок в темноте, недавно прочитав раздел AA в Filthy Rich Clients.
Использование будет выглядеть примерно так:
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);
Я смог получить те же результаты (используя ваш пример класса и drawChars и drawImage, просто набрав drawString для простоты), что и режим LCD HRGB, используя эти подсказки и никаких других вызовов моя машинка.
Я не уверен, какой выпуск Java для этого требуется, если это то, что вы ищете ...
Не забывайте: "Введение свободно игнорирует подсказки полностью". Для справки, вот что я вижу в 24 точках: