Рендеринг шрифтов Java:Действительно ли общий AA должен быть отключен для субпиксельного AA?
-
19-09-2019 - |
Вопрос
Я пытался улучшить свою систему графического интерфейса, написанную на Java, для использования субпиксельного сглаживания и добился успеха, за исключением одной оставшейся аномалии.Это продолжение еще один мой вчерашний вопрос.
Оставшаяся проблема заключается в том, что установка подсказок рендеринга KEY_ANTIALIASING в значение VALUE_ANTIALIAS_ON приводит к игнорированию KEY_TEXT_ANTIALIASING, когда для него установлено значение LCD (субпиксельного) AA.Может кто-нибудь пролить некоторый свет на это?В настоящее время я вынужден VALUE_ANTIALIAS_OFF перед рендерингом текста и снова включать его после рендеринга текста (чтобы другие изображения, такие как круги и т. д., были AA).
Эта проблема подтверждается приведенной ниже автономной программой испытаний.Как вы можете увидеть, запустив его, круг окрашен AA, а шрифт — нет, и наоборот.Было бы неплохо иметь предварительно настроенный АА для работы со всеми видами рисования.
Автономная программа испытаний
import java.awt.*;
import java.awt.event.*;
public class AwtTestFrame1c extends Panel {
AwtTestFrame1c() {
setBackground(SystemColor.control);
}
public void paint(Graphics gc) {
Graphics2D g2d = (Graphics2D)gc;
int py=0;
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,true );
py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,false);
}
private int paintText(Graphics2D dgc, int py, Object val, boolean aa) {
char[] txt=("The quick brown fox jumped over the lazy dog ("+val+", General AA: "+aa+")").toCharArray();
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.drawOval(5,py+5,15,15);
dgc.drawChars(txt,0,txt.length,30,py+line-5);
return (py+line);
}
static private final Font font=new Font("SansSerif",Font.PLAIN,16);
static private final int line=25;
static public 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 AwtTestFrame1c());
wnd.setSize(new Dimension(1000, 300));
wnd.setVisible(true);
}
}
Решение
Немного покопавшись нашел вот это: ошибка 6263951.
Видимо в б17 перебор исправлен?Я не совсем уверен, как интерпретировать отчет об ошибке.
Определенно не работает в версии 1.6.0_17-b04 (MacOS X 10.5).
Другие советы
я обновлял ВиртуалБокс, поэтому я сделал снимки.Возможно, я просто вижу рендеринг хоста, но подозреваю, что это также зависит от реализации.