| /* |
| * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package sun.font; |
| |
| import sun.awt.FontConfiguration; |
| import sun.awt.X11FontManager; |
| import sun.font.FontUtilities; |
| import sun.font.SunFontManager; |
| import sun.util.logging.PlatformLogger; |
| |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.nio.charset.Charset; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Properties; |
| import java.util.Scanner; |
| |
| public class MFontConfiguration extends FontConfiguration { |
| |
| private static FontConfiguration fontConfig = null; |
| private static PlatformLogger logger; |
| |
| public MFontConfiguration(SunFontManager fm) { |
| super(fm); |
| if (FontUtilities.debugFonts()) { |
| logger = PlatformLogger.getLogger("sun.awt.FontConfiguration"); |
| } |
| initTables(); |
| } |
| |
| |
| public MFontConfiguration(SunFontManager fm, |
| boolean preferLocaleFonts, |
| boolean preferPropFonts) { |
| super(fm, preferLocaleFonts, preferPropFonts); |
| if (FontUtilities.debugFonts()) { |
| logger = PlatformLogger.getLogger("sun.awt.FontConfiguration"); |
| } |
| initTables(); |
| } |
| |
| /* Needs to be kept in sync with updates in the languages used in |
| * the fontconfig files. |
| */ |
| protected void initReorderMap() { |
| reorderMap = new HashMap<>(); |
| if (osName == null) { /* null means SunOS */ |
| initReorderMapForSolaris(); |
| } else { |
| initReorderMapForLinux(); |
| } |
| } |
| |
| private void initReorderMapForSolaris() { |
| /* Don't create a no-op entry, so we can optimize this case |
| * i.e. we don't need to do anything so can avoid slower paths in |
| * the code. |
| */ |
| // reorderMap.put("UTF-8", "latin-1"); |
| reorderMap.put("UTF-8.hi", "devanagari"); // NB is in Lucida. |
| reorderMap.put("UTF-8.ja", |
| split("japanese-x0201,japanese-x0208,japanese-x0212")); |
| reorderMap.put("UTF-8.ko", "korean-johab"); |
| reorderMap.put("UTF-8.th", "thai"); |
| reorderMap.put("UTF-8.zh.TW", "chinese-big5"); |
| reorderMap.put("UTF-8.zh.HK", split("chinese-big5,chinese-hkscs")); |
| reorderMap.put("UTF-8.zh.CN", |
| split("chinese-gb18030-0,chinese-gb18030-1")); |
| reorderMap.put("UTF-8.zh", |
| split("chinese-big5,chinese-hkscs,chinese-gb18030-0,chinese-gb18030-1")); |
| reorderMap.put("Big5", "chinese-big5"); |
| reorderMap.put("Big5-HKSCS", split("chinese-big5,chinese-hkscs")); |
| reorderMap.put("GB2312", split("chinese-gbk,chinese-gb2312")); |
| reorderMap.put("x-EUC-TW", |
| split("chinese-cns11643-1,chinese-cns11643-2,chinese-cns11643-3")); |
| reorderMap.put("GBK", "chinese-gbk"); |
| reorderMap.put("GB18030",split("chinese-gb18030-0,chinese-gb18030-1")); |
| |
| reorderMap.put("TIS-620", "thai"); |
| reorderMap.put("x-PCK", |
| split("japanese-x0201,japanese-x0208,japanese-x0212")); |
| reorderMap.put("x-eucJP-Open", |
| split("japanese-x0201,japanese-x0208,japanese-x0212")); |
| reorderMap.put("EUC-KR", "korean"); |
| /* Don't create a no-op entry, so we can optimize this case */ |
| // reorderMap.put("ISO-8859-1", "latin-1"); |
| reorderMap.put("ISO-8859-2", "latin-2"); |
| reorderMap.put("ISO-8859-5", "cyrillic-iso8859-5"); |
| reorderMap.put("windows-1251", "cyrillic-cp1251"); |
| reorderMap.put("KOI8-R", "cyrillic-koi8-r"); |
| reorderMap.put("ISO-8859-6", "arabic"); |
| reorderMap.put("ISO-8859-7", "greek"); |
| reorderMap.put("ISO-8859-8", "hebrew"); |
| reorderMap.put("ISO-8859-9", "latin-5"); |
| reorderMap.put("ISO-8859-13", "latin-7"); |
| reorderMap.put("ISO-8859-15", "latin-9"); |
| } |
| |
| private void initReorderMapForLinux() { |
| reorderMap.put("UTF-8.ja.JP", "japanese-iso10646"); |
| reorderMap.put("UTF-8.ko.KR", "korean-iso10646"); |
| reorderMap.put("UTF-8.zh.TW", "chinese-tw-iso10646"); |
| reorderMap.put("UTF-8.zh.HK", "chinese-tw-iso10646"); |
| reorderMap.put("UTF-8.zh.CN", "chinese-cn-iso10646"); |
| reorderMap.put("x-euc-jp-linux", |
| split("japanese-x0201,japanese-x0208")); |
| reorderMap.put("GB2312", "chinese-gb18030"); |
| reorderMap.put("Big5", "chinese-big5"); |
| reorderMap.put("EUC-KR", "korean"); |
| if (osName.equals("Sun")){ |
| reorderMap.put("GB18030", "chinese-cn-iso10646"); |
| } |
| else { |
| reorderMap.put("GB18030", "chinese-gb18030"); |
| } |
| } |
| |
| /** |
| * Sets the OS name and version from environment information. |
| */ |
| protected void setOsNameAndVersion(){ |
| super.setOsNameAndVersion(); |
| |
| if (osName.equals("SunOS")) { |
| //don't care os name on Solaris |
| osName = null; |
| } else if (osName.equals("Linux")) { |
| try { |
| File f; |
| if ((f = new File("/etc/fedora-release")).canRead()) { |
| osName = "Fedora"; |
| osVersion = getVersionString(f); |
| } else if ((f = new File("/etc/redhat-release")).canRead()) { |
| osName = "RedHat"; |
| osVersion = getVersionString(f); |
| } else if ((f = new File("/etc/turbolinux-release")).canRead()) { |
| osName = "Turbo"; |
| osVersion = getVersionString(f); |
| } else if ((f = new File("/etc/SuSE-release")).canRead()) { |
| osName = "SuSE"; |
| osVersion = getVersionString(f); |
| } else if ((f = new File("/etc/lsb-release")).canRead()) { |
| /* Ubuntu and (perhaps others) use only lsb-release. |
| * Syntax and encoding is compatible with java properties. |
| * For Ubuntu the ID is "Ubuntu". |
| */ |
| Properties props = new Properties(); |
| props.load(new FileInputStream(f)); |
| osName = props.getProperty("DISTRIB_ID"); |
| osVersion = props.getProperty("DISTRIB_RELEASE"); |
| } |
| } catch (Exception e) { |
| } |
| } |
| return; |
| } |
| |
| /** |
| * Gets the OS version string from a Linux release-specific file. |
| */ |
| private String getVersionString(File f){ |
| try { |
| Scanner sc = new Scanner(f); |
| return sc.findInLine("(\\d)+((\\.)(\\d)+)*"); |
| } |
| catch (Exception e){ |
| } |
| return null; |
| } |
| |
| private static final String fontsDirPrefix = "$JRE_LIB_FONTS"; |
| |
| protected String mapFileName(String fileName) { |
| if (fileName != null && fileName.startsWith(fontsDirPrefix)) { |
| return SunFontManager.jreFontDirName |
| + fileName.substring(fontsDirPrefix.length()); |
| } |
| return fileName; |
| } |
| |
| // overrides FontConfiguration.getFallbackFamilyName |
| public String getFallbackFamilyName(String fontName, String defaultFallback) { |
| // maintain compatibility with old font.properties files, which |
| // either had aliases for TimesRoman & Co. or defined mappings for them. |
| String compatibilityName = getCompatibilityFamilyName(fontName); |
| if (compatibilityName != null) { |
| return compatibilityName; |
| } |
| return defaultFallback; |
| } |
| |
| protected String getEncoding(String awtFontName, |
| String characterSubsetName) { |
| // extract encoding field from XLFD |
| int beginIndex = 0; |
| int fieldNum = 13; // charset registry field |
| while (fieldNum-- > 0 && beginIndex >= 0) { |
| beginIndex = awtFontName.indexOf("-", beginIndex) + 1; |
| } |
| if (beginIndex == -1) { |
| return "default"; |
| } |
| String xlfdEncoding = awtFontName.substring(beginIndex); |
| if (xlfdEncoding.indexOf("fontspecific") > 0) { |
| if (awtFontName.indexOf("dingbats") > 0) { |
| return "sun.font.X11Dingbats"; |
| } else if (awtFontName.indexOf("symbol") > 0) { |
| return "sun.awt.Symbol"; |
| } |
| } |
| String encoding = encodingMap.get(xlfdEncoding); |
| if (encoding == null) { |
| encoding = "default"; |
| } |
| return encoding; |
| } |
| |
| protected Charset getDefaultFontCharset(String fontName) { |
| return Charset.forName("ISO8859_1"); |
| } |
| |
| protected String getFaceNameFromComponentFontName(String componentFontName) { |
| return null; |
| } |
| |
| protected String getFileNameFromComponentFontName(String componentFontName) { |
| // for X11, component font name is XLFD |
| // if we have a file name already, just use it; otherwise let's see |
| // what the graphics environment can provide |
| String fileName = getFileNameFromPlatformName(componentFontName); |
| if (fileName != null && fileName.charAt(0) == '/' && |
| !needToSearchForFile(fileName)) { |
| return fileName; |
| } |
| return ((X11FontManager) fontManager).getFileNameFromXLFD(componentFontName); |
| } |
| |
| public HashSet<String> getAWTFontPathSet() { |
| HashSet<String> fontDirs = new HashSet<String>(); |
| short[] scripts = getCoreScripts(0); |
| for (int i = 0; i< scripts.length; i++) { |
| String path = getString(table_awtfontpaths[scripts[i]]); |
| if (path != null) { |
| int start = 0; |
| int colon = path.indexOf(':'); |
| while (colon >= 0) { |
| fontDirs.add(path.substring(start, colon)); |
| start = colon + 1; |
| colon = path.indexOf(':', start); |
| } |
| fontDirs.add((start == 0) ? path : path.substring(start)); |
| } |
| } |
| return fontDirs; |
| } |
| |
| /* methods for table setup ***********************************************/ |
| |
| private static HashMap<String, String> encodingMap = new HashMap<>(); |
| |
| private void initTables() { |
| // encodingMap maps XLFD encoding component to |
| // name of corresponding java.nio charset |
| encodingMap.put("iso8859-1", "ISO-8859-1"); |
| encodingMap.put("iso8859-2", "ISO-8859-2"); |
| encodingMap.put("iso8859-4", "ISO-8859-4"); |
| encodingMap.put("iso8859-5", "ISO-8859-5"); |
| encodingMap.put("iso8859-6", "ISO-8859-6"); |
| encodingMap.put("iso8859-7", "ISO-8859-7"); |
| encodingMap.put("iso8859-8", "ISO-8859-8"); |
| encodingMap.put("iso8859-9", "ISO-8859-9"); |
| encodingMap.put("iso8859-13", "ISO-8859-13"); |
| encodingMap.put("iso8859-15", "ISO-8859-15"); |
| encodingMap.put("gb2312.1980-0", "sun.font.X11GB2312"); |
| if (osName == null) { |
| // use standard converter on Solaris |
| encodingMap.put("gbk-0", "GBK"); |
| } else { |
| encodingMap.put("gbk-0", "sun.font.X11GBK"); |
| } |
| encodingMap.put("gb18030.2000-0", "sun.font.X11GB18030_0"); |
| encodingMap.put("gb18030.2000-1", "sun.font.X11GB18030_1"); |
| encodingMap.put("cns11643-1", "sun.font.X11CNS11643P1"); |
| encodingMap.put("cns11643-2", "sun.font.X11CNS11643P2"); |
| encodingMap.put("cns11643-3", "sun.font.X11CNS11643P3"); |
| encodingMap.put("big5-1", "Big5"); |
| encodingMap.put("big5-0", "Big5"); |
| encodingMap.put("hkscs-1", "Big5-HKSCS"); |
| encodingMap.put("ansi-1251", "windows-1251"); |
| encodingMap.put("koi8-r", "KOI8-R"); |
| encodingMap.put("jisx0201.1976-0", "JIS0201"); |
| encodingMap.put("jisx0208.1983-0", "JIS0208"); |
| encodingMap.put("jisx0212.1990-0", "JIS0212"); |
| encodingMap.put("ksc5601.1987-0", "sun.font.X11KSC5601"); |
| encodingMap.put("ksc5601.1992-3", "sun.font.X11Johab"); |
| encodingMap.put("tis620.2533-0", "TIS-620"); |
| encodingMap.put("iso10646-1", "UTF-16BE"); |
| } |
| |
| } |