Uruchamianie narzędzia projektowego Xilinx Vivado FPGA w Kubuntu 14.04. W niektórych częściach interfejsu wykorzystuje się skrócone czcionki, co sprawia, że jest jeszcze trudny w użyciu, nie mówiąc o brzydkich wyglądach. Inni wydają się mieć to samo issue.Howto wymusić wygładzanie tekstu Java?
gdyż wydaje się być przynajmniej częściowo napisany w Javie, próbowałem sugerowane rozwiązania znalezione po kilku googlowania
export _JAVA_OPTIONS="-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dsun.java2d.xrender=true"
bez efektu wizualnego.
Poniższy mały program testowy dał do zrozumienia, że jeśli wskazówki dotyczące renderowania czcionek nie są jawnie ustawione (ale nie dla RenderingHints.KEY_TEXT_ANTIALIASING
), otrzymamy tekst nie zawierający antyaliasingu. Dzieje się tak zarówno w OpenJDK, jak i Oracle JDK.
import java.awt.*;
import java.awt.event.*;
// partially taken from http://stackoverflow.com/questions/2018102/java-font-rendering
public class AwtAA extends Panel {
private final Font font = new Font(Font.SANS_SERIF, Font.BOLD, 16);
private final int line = 24;
private final int medskip = 16;
AwtAA() {
setBackground(SystemColor.control);
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
int py = 0;
py = paintText(g2d, py, null, null);
py += medskip;
py = paintText(g2d, py, null, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
py = paintText(g2d, py, null, RenderingHints.VALUE_ANTIALIAS_ON);
py += medskip;
py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, null);
py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_ON, null);
py += medskip;
py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_ON, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
py += medskip;
py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, RenderingHints.VALUE_ANTIALIAS_ON);
py = paintText(g2d, py, RenderingHints.VALUE_TEXT_ANTIALIAS_ON, RenderingHints.VALUE_ANTIALIAS_ON);
}
private int paintText(Graphics2D g2d, int py, Object text, Object aa) {
Graphics2D dgc = g2d;
Image img = null;
String text_aa = "none";
if (text != null) {
if (text.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT)) text_aa = "VALUE_TEXT_ANTIALIAS_DEFAULT";
if (text.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_OFF)) text_aa = "VALUE_TEXT_ANTIALIAS_OFF";
if (text.equals(RenderingHints.VALUE_TEXT_ANTIALIAS_ON)) text_aa = "VALUE_TEXT_ANTIALIAS_ON";
}
String value_aa = "none";
if (aa != null) {
if (aa.equals(RenderingHints.VALUE_ANTIALIAS_DEFAULT)) value_aa = "VALUE_ANTIALIAS_DEFAULT";
if (aa.equals(RenderingHints.VALUE_ANTIALIAS_OFF)) value_aa = "VALUE_ANTIALIAS_OFF";
if (aa.equals(RenderingHints.VALUE_ANTIALIAS_ON)) value_aa = "VALUE_ANTIALIAS_ON";
}
char[] txt = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ (" + text_aa + ", " + value_aa + ")").toCharArray();
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 (text != null) dgc.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, text);
if (aa != null) dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING, aa);
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 AwtAA());
wnd.setSize(new Dimension(850, 330));
wnd.setVisible(true);
}
}
Więc pytanie brzmi jak mogę zmienić domyślną (albo żadne podpowiedzi ustawiona lub VALUE_TEXT_ANTIALIAS_DEFAULT
) do korzystania antyaliasing w renderowania czcionek?
Jak wszystkie odpowiedzi mogę znaleźć obszedł ustalającej te kilka właściwości powyżej, zacząłem szukać u źródła ... i kilka surowy „naprawić” w openjdk-7 w klasie SunGraphics2D
konstruktora:
apt-get source openjdk-7-jre
cd openjdk-7-7u55-2.4.7
tar zxf jdk.tar.gz
cd jdk-9448fff93286/src/share/classes/sun/java2d
patch -p1 <<"__EOF__"
--- a/SunGraphics2D.java 2014-06-29 23:39:34.183177958 +0300
+++ b/SunGraphics2D.java 2014-06-29 23:39:18.675177667 +0300
@@ -244,7 +244,10 @@
renderHint = SunHints.INTVAL_RENDER_DEFAULT;
antialiasHint = SunHints.INTVAL_ANTIALIAS_OFF;
- textAntialiasHint = SunHints.INTVAL_TEXT_ANTIALIAS_DEFAULT;
+ textAntialiasHint = SunHints.INTVAL_TEXT_ANTIALIAS_ON;
fractionalMetricsHint = SunHints.INTVAL_FRACTIONALMETRICS_OFF;
lcdTextContrast = lcdTextContrastDefaultValue;
interpolationHint = -1;
__EOF__
javac SunGraphics2D.java
cd ../..
jar cvf /tmp/rt.jar sun/java2d/SunGraphics2D.class
a następnie prowadził ją jako
java -Xbootclasspath/p:/tmp/rt.jar AwtAA
i to załatwiło sprawę do programu testowego, a także dla narzędzia Vivado (z wyjątkiem Vidado zostanie uruchomiona jakoś inaczej i nie wydaje się, aby uczcić -Xbootclasspath
, więc naprawdę musiał aktualizować SunGraphics2D
klasa w systemie rt.jar
). Wydaje się, że działa to zarówno z OpenJDK, jak i Oracle.
I ostatnie pytanie ... czy musi istnieć jakiś inny sposób wymuszenia antyalergii tekstu jako domyślnego niż słoiki systemu z łataniem małpy?
Zobacz, czy to pomaga: http://www.webupd8.org/2013/06/install-openjdk-patched-with-font -fixes.html – Salem
Dzięki za wskaźnik, ale ma to wpływ tylko na sposób e świadczone, jeśli i kiedy AA jest włączony, problemem było, jak wymusić AA na pierwszym miejscu. – tajuma