--- old/src/share/classes/sun/java2d/SunGraphicsEnvironment.java 2009-08-07 10:51:59.000000000 +0200 +++ new/src/share/classes/sun/java2d/SunGraphicsEnvironment.java 2009-08-07 10:51:59.000000000 +0200 @@ -64,6 +64,8 @@ import sun.font.CompositeFontDescriptor; import sun.font.Font2D; import sun.font.FontManager; +import sun.font.FontManagerFactory; +import sun.font.FontManagerForSGE; import sun.font.NativeFont; /** @@ -73,102 +75,17 @@ * @see GraphicsDevice * @see GraphicsConfiguration */ - public abstract class SunGraphicsEnvironment extends GraphicsEnvironment - implements FontSupport, DisplayChangedListener { + implements DisplayChangedListener { - public static boolean isLinux; - public static boolean isSolaris; public static boolean isOpenSolaris; - public static boolean isWindows; - public static boolean noType1Font; private static Font defaultFont; - private static String defaultFontFileName; - private static String defaultFontName; - public static final String lucidaFontName = "Lucida Sans Regular"; - public static final String lucidaFileName = "LucidaSansRegular.ttf"; - public static boolean debugFonts = false; protected static Logger logger = null; - private static ArrayList badFonts; - public static String jreLibDirName; - public static String jreFontDirName; - private static HashSet missingFontFiles = null; - - private FontConfiguration fontConfig; - - /* fontPath is the location of all fonts on the system, excluding the - * JRE's own font directory but including any path specified using the - * sun.java2d.fontpath property. Together with that property, it is - * initialised by the getPlatformFontPath() method - * This call must be followed by a call to registerFontDirs(fontPath) - * once any extra debugging path has been appended. - */ - protected String fontPath; - - /* discoveredAllFonts is set to true when all fonts on the font path are - * discovered. This usually also implies opening, validating and - * registering, but an implementation may be optimized to avold this. - * So see also "loadedAllFontFiles" - */ - private boolean discoveredAllFonts = false; - - /* loadedAllFontFiles is set to true when all fonts on the font path are - * actually opened, validated and registered. This always implies - * discoveredAllFonts is true. - */ - private boolean loadedAllFontFiles = false; - - protected HashSet registeredFontFiles = new HashSet(); - public static String eudcFontFileName; /* Initialised only on windows */ - - private static boolean isOpenJDK; - /** - * A few things in Java 2D code are different in OpenJDK, - * so need a way to tell which implementation this is. - * The absence of Lucida Sans Regular is the simplest way for now. - */ - public static boolean isOpenJDK() { - return isOpenJDK; - } - - static { - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - - jreLibDirName = System.getProperty("java.home","") + - File.separator + "lib"; - jreFontDirName = jreLibDirName + File.separator + "fonts"; - File lucidaFile = - new File(jreFontDirName + File.separator + lucidaFileName); - isOpenJDK = !lucidaFile.exists(); - - String debugLevel = - System.getProperty("sun.java2d.debugfonts"); - - if (debugLevel != null && !debugLevel.equals("false")) { - debugFonts = true; - logger = Logger.getLogger("sun.java2d"); - if (debugLevel.equals("warning")) { - logger.setLevel(Level.WARNING); - } else if (debugLevel.equals("severe")) { - logger.setLevel(Level.SEVERE); - } - } - return null; - } - }); - }; public SunGraphicsEnvironment() { java.security.AccessController.doPrivileged( new java.security.PrivilegedAction() { public Object run() { - String osName = System.getProperty("os.name"); - if ("Linux".equals(osName)) { - isLinux = true; - } else if ("SunOS".equals(osName)) { - isSolaris = true; String version = System.getProperty("os.version", "0.0"); try { float ver = Float.parseFloat(version); @@ -186,188 +103,6 @@ } } catch (Exception e) { } - } else if ("Windows".equals(osName)) { - isWindows = true; - } - - noType1Font = "true". - equals(System.getProperty("sun.java2d.noType1Font")); - - if (!isOpenJDK()) { - defaultFontName = lucidaFontName; - if (useAbsoluteFontFileNames()) { - defaultFontFileName = - jreFontDirName + File.separator + lucidaFileName; - } else { - defaultFontFileName = lucidaFileName; - } - } - - File badFontFile = - new File(jreFontDirName + File.separator + "badfonts.txt"); - if (badFontFile.exists()) { - FileInputStream fis = null; - try { - badFonts = new ArrayList(); - fis = new FileInputStream(badFontFile); - InputStreamReader isr = new InputStreamReader(fis); - BufferedReader br = new BufferedReader(isr); - while (true) { - String name = br.readLine(); - if (name == null) { - break; - } else { - if (debugFonts) { - logger.warning("read bad font: " + name); - } - badFonts.add(name); - } - } - } catch (IOException e) { - try { - if (fis != null) { - fis.close(); - } - } catch (IOException ioe) { - } - } - } - - /* Here we get the fonts in jre/lib/fonts and register them - * so they are always available and preferred over other fonts. - * This needs to be registered before the composite fonts as - * otherwise some native font that corresponds may be found - * as we don't have a way to handle two fonts of the same - * name, so the JRE one must be the first one registered. - * Pass "true" to registerFonts method as on-screen these - * JRE fonts always go through the T2K rasteriser. - */ - if (isLinux) { - /* Linux font configuration uses these fonts */ - registerFontDir(jreFontDirName); - } - registerFontsInDir(jreFontDirName, true, Font2D.JRE_RANK, - true, false); - - /* Register the JRE fonts so that the native platform can - * access them. This is used only on Windows so that when - * printing the printer driver can access the fonts. - */ - registerJREFontsWithPlatform(jreFontDirName); - - /* Create the font configuration and get any font path - * that might be specified. - */ - fontConfig = createFontConfiguration(); - if (isOpenJDK()) { - String[] fontInfo = FontManager.getDefaultPlatformFont(); - defaultFontName = fontInfo[0]; - defaultFontFileName = fontInfo[1]; - } - getPlatformFontPathFromFontConfig(); - - String extraFontPath = fontConfig.getExtraFontPath(); - - /* In prior releases the debugging font path replaced - * all normally located font directories except for the - * JRE fonts dir. This directory is still always located and - * placed at the head of the path but as an augmentation - * to the previous behaviour the - * changes below allow you to additionally append to - * the font path by starting with append: or prepend by - * starting with a prepend: sign. Eg: to append - * -Dsun.java2d.fontpath=append:/usr/local/myfonts - * and to prepend - * -Dsun.java2d.fontpath=prepend:/usr/local/myfonts Disp - * - * If there is an appendedfontpath it in the font configuration - * it is used instead of searching the system for dirs. - * The behaviour of append and prepend is then similar - * to the normal case. ie it goes after what - * you prepend and * before what you append. If the - * sun.java2d.fontpath property is used, but it - * neither the append or prepend syntaxes is used then as - * except for the JRE dir the path is replaced and it is - * up to you to make sure that all the right directories - * are located. This is platform and locale-specific so - * its almost impossible to get right, so it should be - * used with caution. - */ - boolean prependToPath = false; - boolean appendToPath = false; - String dbgFontPath = System.getProperty("sun.java2d.fontpath"); - - if (dbgFontPath != null) { - if (dbgFontPath.startsWith("prepend:")) { - prependToPath = true; - dbgFontPath = - dbgFontPath.substring("prepend:".length()); - } else if (dbgFontPath.startsWith("append:")) { - appendToPath = true; - dbgFontPath = - dbgFontPath.substring("append:".length()); - } - } - - if (debugFonts) { - logger.info("JRE font directory: " + jreFontDirName); - logger.info("Extra font path: " + extraFontPath); - logger.info("Debug font path: " + dbgFontPath); - } - - if (dbgFontPath != null) { - /* In debugging mode we register all the paths - * Caution: this is a very expensive call on Solaris:- - */ - fontPath = getPlatformFontPath(noType1Font); - - if (extraFontPath != null) { - fontPath = - extraFontPath + File.pathSeparator + fontPath; - } - if (appendToPath) { - fontPath = fontPath + File.pathSeparator + dbgFontPath; - } else if (prependToPath) { - fontPath = dbgFontPath + File.pathSeparator + fontPath; - } else { - fontPath = dbgFontPath; - } - registerFontDirs(fontPath); - } else if (extraFontPath != null) { - /* If the font configuration contains an "appendedfontpath" - * entry, it is interpreted as a set of locations that - * should always be registered. - * It may be additional to locations normally found for - * that place, or it may be locations that need to have - * all their paths registered to locate all the needed - * platform names. - * This is typically when the same .TTF file is referenced - * from multiple font.dir files and all of these must be - * read to find all the native (XLFD) names for the font, - * so that X11 font APIs can be used for as many code - * points as possible. - */ - registerFontDirs(extraFontPath); - } - - /* On Solaris, we need to register the Japanese TrueType - * directory so that we can find the corresponding bitmap - * fonts. This could be done by listing the directory in - * the font configuration file, but we don't want to - * confuse users with this quirk. There are no bitmap fonts - * for other writing systems that correspond to TrueType - * fonts and have matching XLFDs. We need to register the - * bitmap fonts only in environments where they're on the - * X font path, i.e., in the Japanese locale. - * Note that if the X Toolkit is in use the font path isn't - * set up by JDK, but users of a JA locale should have it - * set up already by their login environment. - */ - if (isSolaris && Locale.JAPAN.equals(Locale.getDefault())) { - registerFontDir("/usr/openwin/lib/locale/ja/X11/fonts/TT"); - } - - initCompositeFonts(fontConfig, null); /* Establish the default font to be used by SG2D etc */ defaultFont = new Font(Font.DIALOG, Font.PLAIN, 12); @@ -395,7 +130,22 @@ return ret; } + /** + * Returns the number of screen devices of this graphics environment. + * + * @return the number of screen devices of this graphics environment + */ protected abstract int getNumScreens(); + + /** + * Create and return the screen device with the specified number. The + * device with number 0 will be the default device (returned + * by {@link #getDefaultScreenDevice()}. + * + * @param screennum the number of the screen to create + * + * @return the created screen device + */ protected abstract GraphicsDevice makeScreenDevice(int screennum); /** @@ -418,220 +168,17 @@ return new SunGraphics2D(sd, Color.white, Color.black, defaultFont); } - /* A call to this method should be followed by a call to - * registerFontDirs(..) - */ - protected String getPlatformFontPath(boolean noType1Font) { - if (fontPath == null) { - fontPath = FontManager.getFontPath(noType1Font); - } - return fontPath; - } - - private String[] platformFontDirs; - /** - * Get all directories which contain installed fonts. - */ - public String[] getPlatformFontDirs() { - if (platformFontDirs == null) { - String path = getPlatformFontPath(noType1Font); - StringTokenizer parser = - new StringTokenizer(path, File.pathSeparator);; - ArrayList pathList = new ArrayList(); - try { - while (parser.hasMoreTokens()) { - pathList.add(parser.nextToken()); - } - } catch (NoSuchElementException e) { - } - platformFontDirs = pathList.toArray(new String[0]); - } - return platformFontDirs; - } - - /** - * Whether registerFontFile expects absolute or relative - * font file names. - */ - protected boolean useAbsoluteFontFileNames() { - return true; - } - - /** - * Returns file name for default font, either absolute - * or relative as needed by registerFontFile. - */ - public String getDefaultFontFile() { - return defaultFontFileName; - } - - /** - * Returns face name for default font, or null if - * no face names are used for CompositeFontDescriptors - * for this platform. - */ - public String getDefaultFontFaceName() { - return defaultFontName; - } - - public void loadFonts() { - if (discoveredAllFonts) { - return; - } - /* Use lock specific to the font system */ - synchronized (lucidaFontName) { - if (debugFonts) { - Thread.dumpStack(); - logger.info("SunGraphicsEnvironment.loadFonts() called"); - } - FontManager.initialiseDeferredFonts(); - - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - if (fontPath == null) { - fontPath = getPlatformFontPath(noType1Font); - registerFontDirs(fontPath); - } - if (fontPath != null) { - // this will find all fonts including those already - // registered. But we have checks in place to prevent - // double registration. - if (!FontManager.gotFontsFromPlatform()) { - registerFontsOnPath(fontPath, false, - Font2D.UNKNOWN_RANK, - false, true); - loadedAllFontFiles = true; - } - } - FontManager.registerOtherFontFiles(registeredFontFiles); - discoveredAllFonts = true; - return null; - } - }); - } + private static FontManagerForSGE getFontManagerForSGE() { + FontManager fm = FontManagerFactory.getInstance(); + return (FontManagerForSGE) fm; } - - - public void loadFontFiles() { - loadFonts(); - if (loadedAllFontFiles) { - return; - } - /* Use lock specific to the font system */ - synchronized (lucidaFontName) { - if (debugFonts) { - Thread.dumpStack(); - logger.info("loadAllFontFiles() called"); - } - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - if (fontPath == null) { - fontPath = getPlatformFontPath(noType1Font); - } - if (fontPath != null) { - // this will find all fonts including those already - // registered. But we have checks in place to prevent - // double registration. - registerFontsOnPath(fontPath, false, - Font2D.UNKNOWN_RANK, - false, true); - } - loadedAllFontFiles = true; - return null; - } - }); - } - } - - /* - * This is for use only within getAllFonts(). - * Fonts listed in the fontconfig files for windows were all - * on the "deferred" initialisation list. They were registered - * either in the course of the application, or in the call to - * loadFonts() within getAllFonts(). The fontconfig file specifies - * the names of the fonts using the English names. If there's a - * different name in the execution locale, then the platform will - * report that, and we will construct the font with both names, and - * thereby enumerate it twice. This happens for Japanese fonts listed - * in the windows fontconfig, when run in the JA locale. The solution - * is to rely (in this case) on the platform's font->file mapping to - * determine that this name corresponds to a file we already registered. - * This works because - * - we know when we get here all deferred fonts are already initialised - * - when we register a font file, we register all fonts in it. - * - we know the fontconfig fonts are all in the windows registry - */ - private boolean isNameForRegisteredFile(String fontName) { - String fileName = FontManager.getFileNameForFontName(fontName); - if (fileName == null) { - return false; - } - return registeredFontFiles.contains(fileName); - } - - private Font[] allFonts; - - /** - * Returns all fonts installed in this environment. - */ - public Font[] getAllInstalledFonts() { - if (allFonts == null) { - loadFonts(); - TreeMap fontMapNames = new TreeMap(); - /* warning: the number of composite fonts could change dynamically - * if applications are allowed to create them. "allfonts" could - * then be stale. - */ - - Font2D[] allfonts = FontManager.getRegisteredFonts(); - for (int i=0; i < allfonts.length; i++) { - if (!(allfonts[i] instanceof NativeFont)) { - fontMapNames.put(allfonts[i].getFontName(null), - allfonts[i]); - } - } - - String[] platformNames = FontManager.getFontNamesFromPlatform(); - if (platformNames != null) { - for (int i=0; i 0) { - fontNames = new String[fontMapNames.size()]; - Object [] keyNames = fontMapNames.keySet().toArray(); - for (int i=0; i < keyNames.length; i++) { - fontNames[i] = (String)keyNames[i]; - } - } - Font[] fonts = new Font[fontNames.length]; - for (int i=0; i < fontNames.length; i++) { - fonts[i] = new Font(fontNames[i], Font.PLAIN, 1); - Font2D f2d = (Font2D)fontMapNames.get(fontNames[i]); - if (f2d != null) { - FontManager.setFont2D(fonts[i], f2d.handle); - } - } - allFonts = fonts; - } - - Font []copyFonts = new Font[allFonts.length]; - System.arraycopy(allFonts, 0, copyFonts, 0, allFonts.length); - return copyFonts; - } - /** * Returns all fonts available in this environment. */ public Font[] getAllFonts() { - Font[] installedFonts = getAllInstalledFonts(); - Font[] created = FontManager.getCreatedFonts(); + FontManagerForSGE fm = getFontManagerForSGE(); + Font[] installedFonts = fm.getAllInstalledFonts(); + Font[] created = fm.getCreatedFonts(); if (created == null || created.length == 0) { return installedFonts; } else { @@ -643,126 +190,9 @@ } } - /** - * Default locale can be changed but we need to know the initial locale - * as that is what is used by native code. Changing Java default locale - * doesn't affect that. - * Returns the locale in use when using native code to communicate - * with platform APIs. On windows this is known as the "system" locale, - * and it is usually the same as the platform locale, but not always, - * so this method also checks an implementation property used only - * on windows and uses that if set. - */ - private static Locale systemLocale = null; - public static Locale getSystemStartupLocale() { - if (systemLocale == null) { - systemLocale = (Locale) - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - /* On windows the system locale may be different than the - * user locale. This is an unsupported configuration, but - * in that case we want to return a dummy locale that will - * never cause a match in the usage of this API. This is - * important because Windows documents that the family - * names of fonts are enumerated using the language of - * the system locale. BY returning a dummy locale in that - * case we do not use the platform API which would not - * return us the names we want. - */ - String fileEncoding = System.getProperty("file.encoding", ""); - String sysEncoding = System.getProperty("sun.jnu.encoding"); - if (sysEncoding != null && !sysEncoding.equals(fileEncoding)) { - return Locale.ROOT; - } - - String language = System.getProperty("user.language", "en"); - String country = System.getProperty("user.country",""); - String variant = System.getProperty("user.variant",""); - return new Locale(language, country, variant); - } - }); - } - return systemLocale; - } - - /* Really we need only the JRE fonts family names, but there's little - * overhead in doing this the easy way by adding all the currently - * known fonts. - */ - protected void getJREFontFamilyNames(TreeMap familyNames, - Locale requestedLocale) { - FontManager.registerDeferredJREFonts(jreFontDirName); - Font2D[] physicalfonts = FontManager.getPhysicalFonts(); - for (int i=0; i < physicalfonts.length; i++) { - if (!(physicalfonts[i] instanceof NativeFont)) { - String name = - physicalfonts[i].getFamilyName(requestedLocale); - familyNames.put(name.toLowerCase(requestedLocale), name); - } - } - } - - private String[] allFamilies; // cache for default locale only - private Locale lastDefaultLocale; - - public String[] getInstalledFontFamilyNames(Locale requestedLocale) { - if (requestedLocale == null) { - requestedLocale = Locale.getDefault(); - } - if (allFamilies != null && lastDefaultLocale != null && - requestedLocale.equals(lastDefaultLocale)) { - String[] copyFamilies = new String[allFamilies.length]; - System.arraycopy(allFamilies, 0, copyFamilies, - 0, allFamilies.length); - return copyFamilies; - } - - TreeMap familyNames = new TreeMap(); - // these names are always there and aren't localised - String str; - str = Font.SERIF; familyNames.put(str.toLowerCase(), str); - str = Font.SANS_SERIF; familyNames.put(str.toLowerCase(), str); - str = Font.MONOSPACED; familyNames.put(str.toLowerCase(), str); - str = Font.DIALOG; familyNames.put(str.toLowerCase(), str); - str = Font.DIALOG_INPUT; familyNames.put(str.toLowerCase(), str); - - /* Platform APIs may be used to get the set of available family - * names for the current default locale so long as it is the same - * as the start-up system locale, rather than loading all fonts. - */ - if (requestedLocale.equals(getSystemStartupLocale()) && - FontManager.getFamilyNamesFromPlatform(familyNames, - requestedLocale)) { - /* Augment platform names with JRE font family names */ - getJREFontFamilyNames(familyNames, requestedLocale); - } else { - loadFontFiles(); - Font2D[] physicalfonts = FontManager.getPhysicalFonts(); - for (int i=0; i < physicalfonts.length; i++) { - if (!(physicalfonts[i] instanceof NativeFont)) { - String name = - physicalfonts[i].getFamilyName(requestedLocale); - familyNames.put(name.toLowerCase(requestedLocale), name); - } - } - } - - String[] retval = new String[familyNames.size()]; - Object [] keyNames = familyNames.keySet().toArray(); - for (int i=0; i < keyNames.length; i++) { - retval[i] = (String)familyNames.get(keyNames[i]); - } - if (requestedLocale.equals(Locale.getDefault())) { - lastDefaultLocale = requestedLocale; - allFamilies = new String[retval.length]; - System.arraycopy(retval, 0, allFamilies, 0, allFamilies.length); - } - return retval; - } - public String[] getAvailableFontFamilyNames(Locale requestedLocale) { - String[] installed = getInstalledFontFamilyNames(requestedLocale); + FontManagerForSGE fm = getFontManagerForSGE(); + String[] installed = fm.getInstalledFontFamilyNames(requestedLocale); /* Use a new TreeMap as used in getInstalledFontFamilyNames * and insert all the keys in lower case, so that the sort order * is the same as the installed families. This preserves historical @@ -771,7 +201,7 @@ * the tree map and just insert new entries, but not so much as * to justify the extra internal interface. */ - TreeMap map = FontManager.getCreatedFontFamilyNames(); + TreeMap map = fm.getCreatedFontFamilyNames(); if (map == null || map.size() == 0) { return installed; } else { @@ -793,405 +223,6 @@ } /** - * Returns a file name for the physical font represented by this platform - * font name. The default implementation tries to obtain the file name - * from the font configuration. - * Subclasses may override to provide information from other sources. - */ - protected String getFileNameFromPlatformName(String platformFontName) { - return fontConfig.getFileNameFromPlatformName(platformFontName); - } - - public static class TTFilter implements FilenameFilter { - public boolean accept(File dir,String name) { - /* all conveniently have the same suffix length */ - int offset = name.length()-4; - if (offset <= 0) { /* must be at least A.ttf */ - return false; - } else { - return(name.startsWith(".ttf", offset) || - name.startsWith(".TTF", offset) || - name.startsWith(".ttc", offset) || - name.startsWith(".TTC", offset) || - name.startsWith(".otf", offset) || - name.startsWith(".OTF", offset)); - } - } - } - - public static class T1Filter implements FilenameFilter { - public boolean accept(File dir,String name) { - if (noType1Font) { - return false; - } - /* all conveniently have the same suffix length */ - int offset = name.length()-4; - if (offset <= 0) { /* must be at least A.pfa */ - return false; - } else { - return(name.startsWith(".pfa", offset) || - name.startsWith(".pfb", offset) || - name.startsWith(".PFA", offset) || - name.startsWith(".PFB", offset)); - } - } - } - - public static class TTorT1Filter implements FilenameFilter { - public boolean accept(File dir, String name) { - return SunGraphicsEnvironment.ttFilter.accept(dir, name) || - SunGraphicsEnvironment.t1Filter.accept(dir, name); - } - } - - /* No need to keep consing up new instances - reuse a singleton. - * The trade-off is that these objects don't get GC'd. - */ - public static final TTFilter ttFilter = new TTFilter(); - public static final T1Filter t1Filter = new T1Filter(); - - /* The majority of the register functions in this class are - * registering platform fonts in the JRE's font maps. - * The next one is opposite in function as it registers the JRE - * fonts as platform fonts. If subsequent to calling this - * your implementation enumerates platform fonts in a way that - * would return these fonts too you may get duplicates. - * This function is primarily used to install the JRE fonts - * so that the native platform can access them. - * It is intended to be overridden by platform subclasses - * Currently minimal use is made of this as generally - * Java 2D doesn't need the platform to be able to - * use its fonts and platforms which already have matching - * fonts registered (possibly even from other different JRE - * versions) generally can't be guaranteed to use the - * one registered by this JRE version in response to - * requests from this JRE. - */ - protected void registerJREFontsWithPlatform(String pathName) { - return; - } - - /* Called from FontManager - has Solaris specific implementation */ - public void register1dot0Fonts() { - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - String type1Dir = "/usr/openwin/lib/X11/fonts/Type1"; - registerFontsInDir(type1Dir, true, Font2D.TYPE1_RANK, - false, false); - return null; - } - }); - } - - protected void registerFontDirs(String pathName) { - return; - } - - /* Called to register fall back fonts */ - public void registerFontsInDir(String dirName) { - registerFontsInDir(dirName, true, Font2D.JRE_RANK, true, false); - } - - private void registerFontsInDir(String dirName, boolean useJavaRasterizer, - int fontRank, - boolean defer, boolean resolveSymLinks) { - File pathFile = new File(dirName); - addDirFonts(dirName, pathFile, ttFilter, - FontManager.FONTFORMAT_TRUETYPE, useJavaRasterizer, - fontRank==Font2D.UNKNOWN_RANK ? - Font2D.TTF_RANK : fontRank, - defer, resolveSymLinks); - addDirFonts(dirName, pathFile, t1Filter, - FontManager.FONTFORMAT_TYPE1, useJavaRasterizer, - fontRank==Font2D.UNKNOWN_RANK ? - Font2D.TYPE1_RANK : fontRank, - defer, resolveSymLinks); - } - - private void registerFontsOnPath(String pathName, - boolean useJavaRasterizer, int fontRank, - boolean defer, boolean resolveSymLinks) { - - StringTokenizer parser = new StringTokenizer(pathName, - File.pathSeparator); - try { - while (parser.hasMoreTokens()) { - registerFontsInDir(parser.nextToken(), - useJavaRasterizer, fontRank, - defer, resolveSymLinks); - } - } catch (NoSuchElementException e) { - } - } - - protected void registerFontFile(String fontFileName, String[] nativeNames, - int fontRank, boolean defer) { - // REMIND: case compare depends on platform - if (registeredFontFiles.contains(fontFileName)) { - return; - } - int fontFormat; - if (ttFilter.accept(null, fontFileName)) { - fontFormat = FontManager.FONTFORMAT_TRUETYPE; - } else if (t1Filter.accept(null, fontFileName)) { - fontFormat = FontManager.FONTFORMAT_TYPE1; - } else { - fontFormat = FontManager.FONTFORMAT_NATIVE; - } - registeredFontFiles.add(fontFileName); - if (defer) { - FontManager.registerDeferredFont(fontFileName, - fontFileName, nativeNames, - fontFormat, false, fontRank); - } else { - FontManager.registerFontFile(fontFileName, nativeNames, - fontFormat, false, fontRank); - } - } - - protected void registerFontDir(String path) { - } - - protected String[] getNativeNames(String fontFileName, - String platformName) { - return null; - } - - /* - * helper function for registerFonts - */ - private void addDirFonts(String dirName, File dirFile, - FilenameFilter filter, - int fontFormat, boolean useJavaRasterizer, - int fontRank, - boolean defer, boolean resolveSymLinks) { - String[] ls = dirFile.list(filter); - if (ls == null || ls.length == 0) { - return; - } - String[] fontNames = new String[ls.length]; - String[][] nativeNames = new String[ls.length][]; - int fontCount = 0; - - for (int i=0; i < ls.length; i++ ) { - File theFile = new File(dirFile, ls[i]); - String fullName = null; - if (resolveSymLinks) { - try { - fullName = theFile.getCanonicalPath(); - } catch (IOException e) { - } - } - if (fullName == null) { - fullName = dirName + File.separator + ls[i]; - } - - // REMIND: case compare depends on platform - if (registeredFontFiles.contains(fullName)) { - continue; - } - - if (badFonts != null && badFonts.contains(fullName)) { - if (debugFonts) { - logger.warning("skip bad font " + fullName); - } - continue; // skip this font file. - } - - registeredFontFiles.add(fullName); - - if (debugFonts && logger.isLoggable(Level.INFO)) { - String message = "Registering font " + fullName; - String[] natNames = getNativeNames(fullName, null); - if (natNames == null) { - message += " with no native name"; - } else { - message += " with native name(s) " + natNames[0]; - for (int nn = 1; nn < natNames.length; nn++) { - message += ", " + natNames[nn]; - } - } - logger.info(message); - } - fontNames[fontCount] = fullName; - nativeNames[fontCount++] = getNativeNames(fullName, null); - } - FontManager.registerFonts(fontNames, nativeNames, fontCount, - fontFormat, useJavaRasterizer, fontRank, - defer); - return; - } - - /* - * A GE may verify whether a font file used in a fontconfiguration - * exists. If it doesn't then either we may substitute the default - * font, or perhaps elide it altogether from the composite font. - * This makes some sense on windows where the font file is only - * likely to be in one place. But on other OSes, eg Linux, the file - * can move around depending. So there we probably don't want to assume - * its missing and so won't add it to this list. - * If this list - missingFontFiles - is non-null then the composite - * font initialisation logic tests to see if a font file is in that - * set. - * Only one thread should be able to add to this set so we don't - * synchronize. - */ - protected void addToMissingFontFileList(String fileName) { - if (missingFontFiles == null) { - missingFontFiles = new HashSet(); - } - missingFontFiles.add(fileName); - } - - /** - * Creates this environment's FontConfiguration. - */ - protected abstract FontConfiguration createFontConfiguration(); - - public abstract FontConfiguration - createFontConfiguration(boolean preferLocaleFonts, - boolean preferPropFonts); - - /* - * This method asks the font configuration API for all platform names - * used as components of composite/logical fonts and iterates over these - * looking up their corresponding file name and registers these fonts. - * It also ensures that the fonts are accessible via platform APIs. - * The composites themselves are then registered. - */ - private void - initCompositeFonts(FontConfiguration fontConfig, - ConcurrentHashMap altNameCache) { - - int numCoreFonts = fontConfig.getNumberCoreFonts(); - String[] fcFonts = fontConfig.getPlatformFontNames(); - for (int f=0; ffilename - * mappings needed to speed start-up on Solaris. - * Augment this with the appendedpathname and the mappings - * for native (F3) fonts - */ - //String platName = platformFontName.replaceAll(" ", "_"); - //System.out.println("filename."+platName+"="+fontFileName); - registerFontFile(fontFileName, nativeNames, - Font2D.FONT_CONFIG_RANK, true); - - - } - /* This registers accumulated paths from the calls to - * addFontToPlatformFontPath(..) and any specified by - * the font configuration. Rather than registering - * the fonts it puts them in a place and form suitable for - * the Toolkit to pick up and use if a toolkit is initialised, - * and if it uses X11 fonts. - */ - registerPlatformFontsUsedByFontConfiguration(); - - CompositeFontDescriptor[] compositeFontInfo - = fontConfig.get2DCompositeFontInfo(); - for (int i = 0; i < compositeFontInfo.length; i++) { - CompositeFontDescriptor descriptor = compositeFontInfo[i]; - String[] componentFileNames = descriptor.getComponentFileNames(); - String[] componentFaceNames = descriptor.getComponentFaceNames(); - - /* It would be better eventually to handle this in the - * FontConfiguration code which should also remove duplicate slots - */ - if (missingFontFiles != null) { - for (int ii=0; ii altNameCache, - boolean preferLocale, - boolean preferProportional) { - - FontConfiguration fontConfig = - createFontConfiguration(preferLocale, preferProportional); - initCompositeFonts(fontConfig, altNameCache); - } - - /* If (as we do on X11) need to set a platform font path, - * then the needed path may be specified by the platform - * specific FontConfiguration class & data file. Such platforms - * (ie X11) need to override this method to retrieve this information - * into suitable data structures. - */ - protected void getPlatformFontPathFromFontConfig() { - } - - /** * From the DisplayChangedListener interface; called * when the display mode has been changed. */