2014-06-30 7 views
5

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 gefunden
export _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?

+0

sehen, ob das hilft: http://www.webupd8.org/2013/06/install-openjdk-patched-with-font -fixes.html – Salem

+0

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

Antwort

1

Danke für die Patched-Jar-Lösung, es funktioniert, auch wenn ein bisschen chaotisch.

Ich weiß nicht, ob es einen besseren Weg, um die antialiased Text zu zwingen, als das Glas Patchen, aber es ist möglich, die folgenden vor dem Start Vivado zu verwenden, um den rt.jar gepatcht zu machen verwenden, ohne das Hauptsystem zu ersetzen:

export _JAVA_OPTIONS="-Xbootclasspath/p:<PATH TO JAR>/rt.jar" 

ersetzt <PATH TO JAR> mit, wo immer Sie die gepatchte rt.jar (ich benutze /opt/Xilinx/Vivado/) setzen

+0

Ist das deine Antwort? – Nabin

+0

@Nabin Es wäre ein Kommentar gewesen, wenn Stack Overflow mir erlaubt hätte, Kommentare zu posten, und es antwortet auf das Ausmaß, dass ich die systemweite "rt.jar" -Datei nicht durch die gepatchte ersetzen muss. – Russell