कुबंटू 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
मेंकक्षा)। ऐसा लगता है कि ओपनजेडीके और ओरेकल दोनों के साथ काम करता है।
और अंतिम प्रश्न ... बंदर पैचिंग सिस्टम जार से डिफ़ॉल्ट के रूप में एंटीअलाइज्ड टेक्स्ट को मजबूर करने का कोई और तरीका होना चाहिए?
देखने के लिए कि इस मदद करता है
<PATH TO JAR>
की जगह: http://www.webupd8.org/2013/06/install-openjdk-patched-with-font -fixes.html – Salemपॉइंटर के लिए धन्यवाद, लेकिन यह केवल प्रभावित करता है कि फोंट कैसे आते हैं ई ने प्रस्तुत किया कि जब एए चालू है, तो समस्या यह थी कि एए को पहले स्थान पर कैसे मजबूर किया जाए। – tajuma