2014-06-30 11 views
5

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?

+0

Zobacz, czy to pomaga: http://www.webupd8.org/2013/06/install-openjdk-patched-with-font -fixes.html – Salem

+0

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

Odpowiedz

1

Dzięki za poprawione rozwiązanie słoika, działa, nawet jeśli trochę niechlujnie.

Nie wiem, czy jest lepszy sposób, aby wymusić tekst antyaliasing niż łatanie słoik, ale możliwe jest użycie następujących przed uruchomieniem Vivado aby użyć połatany rt.jar bez wymiany głównego systemu jednego:

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

zastępując <PATH TO JAR> z gdziekolwiek umieścić połatany rt.jar (używam /opt/Xilinx/Vivado/)

+0

Czy to twoja odpowiedź? – Nabin

+0

@Nabin Byłby to komentarz, gdyby Stack Overflow pozwolił mi dodawać komentarze, i odpowiada na to, że nie musiał zastępować całego systemu "rt.jar" z łatką. – Russell