Running Xilinx Vivado FPGA-Design-Tool in Kubuntu 14.04 es verwendet antialiased Schriftarten nur in einigen Teilen der Benutzeroberfläche macht es sogar schwer zu bedienen, um nicht zu sagen, hässlich aussehende. Andere scheinen dieselbe zu haben issue.Howto erzwingen Java-Text Antialiasing auf?
Da es zumindest teilweise in Java geschrieben zu sein scheint, habe ich versucht, die vorgeschlagenen Lösungen nach einiger
Googeln gefundenexport _JAVA_OPTIONS="-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dsun.java2d.xrender=true"
ohne visuelle Wirkung.
Ein kleines Testprogramm unten machte es offensichtlich, dass, wenn die Schriftart-Rendering-Hinweise nicht ausdrücklich festgelegt sind (aber nicht RenderingHints.KEY_TEXT_ANTIALIASING
), Sie Antialias-Text erhalten. Dies geschieht sowohl in OpenJDK als auch in 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);
}
}
Die Frage ist also, wie kann ich den Standard (entweder keine Hinweise festgelegt oder auf VALUE_TEXT_ANTIALIAS_DEFAULT
) Anti-Aliasing in der Schriftwiedergabe zu benutzen?
Wie alle Antworten, die ich gefunden konnte ging um über die wenigen Eigenschaften festlegen, begann ich an der Quelle zu suchen ... und machte einige rohe „fix“ in openjdk-7 in der Klasse SunGraphics2D
Konstruktor:
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
und lief es dann als
java -Xbootclasspath/p:/tmp/rt.jar AwtAA
und den Trick für das Testprogramm hat und auch für das Vivado Werkzeug (außer Vidado wird irgendwie anders gestartet und scheint nicht -Xbootclasspath
zu ehren, so dass ich wirklich aktualisieren musste der SunGraphics2D
Klasse im System rt.jar
). Dies scheint mit OpenJDK und Oracle zu funktionieren.
Und die letzte Frage ... es muss nur eine andere Möglichkeit geben, antialiased Text als Standard als Affe Patching System Gläser zu zwingen?
sehen, ob das hilft: http://www.webupd8.org/2013/06/install-openjdk-patched-with-font -fixes.html – Salem
Danke für den Zeiger, aber dies betrifft nur, wie Schriften ar Wenn AA angezeigt wird, war das Problem, wie man AA an erster Stelle erzwingen kann. – tajuma