2014-06-30 13 views
5

कुबंटू 14.04 में Xilinx विवाडो एफपीजीए डिज़ाइन टूल चलाना यह यूआई के कुछ हिस्सों में एंटीअलाइज्ड फोंट का उपयोग करता है जिससे इसे उपयोग करना मुश्किल हो जाता है, बदसूरत दिखने के लिए नहीं। अन्य issue समान प्रतीत होते हैं।जावा टेक्स्ट एंटीअलाइजिंग को कैसे प्रभावित करें?

यह जावा में कम से कम आंशिक लिखा जा रहा है के रूप में, मैं कुछ googling

export _JAVA_OPTIONS="-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dsun.java2d.xrender=true" 

किसी भी दृश्य प्रभाव के बिना के बाद पाया सुझाव दिया समाधान की कोशिश की।

नीचे एक छोटा परीक्षण कार्यक्रम यह स्पष्ट करता है कि जब तक फ़ॉन्ट प्रतिपादन संकेत स्पष्ट रूप से सेट नहीं होते हैं (लेकिन RenderingHints.KEY_TEXT_ANTIALIASING पर नहीं) तो आपको गैर-एंटीअलाइज्ड टेक्स्ट प्राप्त होगा। यह ओपनजेडीके और ओरेकल जेडीके दोनों में होता है।

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); 
    } 
} 

तो सवाल यह है कि कैसे मैं डिफ़ॉल्ट (या तो कोई संकेत सेट या VALUE_TEXT_ANTIALIAS_DEFAULT के लिए सेट) फ़ॉन्ट रेंडरिंग में एंटीलायज़िंग़ उपयोग करने के लिए बदल सकता है?

सभी जवाब मैंने पाया सकता है चारों ओर ऊपर उन कुछ गुण स्थापित करने चला गया के रूप में, मैं स्रोत को देखने के लिए शुरू कर दिया ... और SunGraphics2D निर्माता कक्षा में openjdk-7 में कुछ कच्चे "ठीक" बना दिया:

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 

और फिर

java -Xbootclasspath/p:/tmp/rt.jar AwtAA 

के रूप में यह भाग गया और यह (परीक्षण कार्यक्रम के लिए और भी Vivado उपकरण के लिए चाल किया था सिवाय Vidado किसी भी तरह अलग ढंग से शुरू किया जाता है और -Xbootclasspath सम्मानित करने के लिए प्रतीत नहीं होता है, तो मैं वास्तव में अद्यतन करने के लिए किया था 01 सिस्टम rt.jar मेंकक्षा)। ऐसा लगता है कि ओपनजेडीके और ओरेकल दोनों के साथ काम करता है।

और अंतिम प्रश्न ... बंदर पैचिंग सिस्टम जार से डिफ़ॉल्ट के रूप में एंटीअलाइज्ड टेक्स्ट को मजबूर करने का कोई और तरीका होना चाहिए?

+0

देखने के लिए कि इस मदद करता है <PATH TO JAR> की जगह: http://www.webupd8.org/2013/06/install-openjdk-patched-with-font -fixes.html – Salem

+0

पॉइंटर के लिए धन्यवाद, लेकिन यह केवल प्रभावित करता है कि फोंट कैसे आते हैं ई ने प्रस्तुत किया कि जब एए चालू है, तो समस्या यह थी कि एए को पहले स्थान पर कैसे मजबूर किया जाए। – tajuma

उत्तर

1

पैच किए गए जार समाधान के लिए धन्यवाद, यह काम करता है, भले ही थोड़ा गन्दा हो।

मैं वहाँ जार पैचिंग से एंटीएलियास पाठ के लिए मजबूर करने के लिए एक बेहतर तरीका है पता नहीं है, लेकिन यह मुख्य प्रणाली एक बदले बिना यह समझौता rt.jar का उपयोग करने के लिए Vivado शुरू करने से पहले निम्न का उपयोग करना संभव है:

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

भी आप डाल के साथ समझौता rt.jar (मैं /opt/Xilinx/Vivado/ का उपयोग करें)

+0

क्या आपका उत्तर है? – Nabin

+0

@Nabin यह एक टिप्पणी होगी, अगर स्टैक ओवरफ़्लो ने मुझे टिप्पणियां पोस्ट करने की अनुमति दी है, और यह सिस्टम-व्यापी 'rt.jar' फ़ाइल को पैच किए गए एक के साथ प्रतिस्थापित करने की सीमा का उत्तर नहीं देता है। – Russell

संबंधित मुद्दे