< prev index next >

src/java.desktop/share/classes/sun/font/SunFontManager.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2008, 2018, 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 --- 1,7 ---- /* ! * Copyright (c) 2008, 2019, 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
*** 48,58 **** import java.util.TreeMap; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import javax.swing.plaf.FontUIResource; ! import sun.awt.AppContext; import sun.awt.FontConfiguration; import sun.awt.SunToolkit; import sun.awt.util.ThreadGroupUtils; import sun.java2d.FontSupport; import sun.util.logging.PlatformLogger; --- 48,58 ---- import java.util.TreeMap; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import javax.swing.plaf.FontUIResource; ! import sun.awt.FontConfiguration; import sun.awt.SunToolkit; import sun.awt.util.ThreadGroupUtils; import sun.java2d.FontSupport; import sun.util.logging.PlatformLogger;
*** 254,268 **** public FilenameFilter getType1Filter() { return t1Filter; } - @Override - public boolean usingPerAppContextComposites() { - return _usingPerAppContextComposites; - } - static { java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<Object>() { --- 254,263 ----
*** 1934,1964 **** * may be able to emulate the required style. */ public Font2D findFont2D(String name, int style, int fallback) { String lowerCaseName = name.toLowerCase(Locale.ENGLISH); String mapName = lowerCaseName + dotStyleStr(style); - Font2D font; /* If preferLocaleFonts() or preferProportionalFonts() has been * called we may be using an alternate set of composite fonts in this * app context. The presence of a pre-built name map indicates whether * this is so, and gives access to the alternate composite for the * name. */ ! if (_usingPerAppContextComposites) { ! @SuppressWarnings("unchecked") ! ConcurrentHashMap<String, Font2D> altNameCache = ! (ConcurrentHashMap<String, Font2D>) ! AppContext.getAppContext().get(CompositeFont.class); ! if (altNameCache != null) { ! font = altNameCache.get(mapName); ! } else { ! font = null; ! } ! } else { ! font = fontNameCache.get(mapName); ! } if (font != null) { return font; } if (FontUtilities.isLogging()) { --- 1929,1946 ---- * may be able to emulate the required style. */ public Font2D findFont2D(String name, int style, int fallback) { String lowerCaseName = name.toLowerCase(Locale.ENGLISH); String mapName = lowerCaseName + dotStyleStr(style); /* If preferLocaleFonts() or preferProportionalFonts() has been * called we may be using an alternate set of composite fonts in this * app context. The presence of a pre-built name map indicates whether * this is so, and gives access to the alternate composite for the * name. */ ! Font2D font = fontNameCache.get(mapName); if (font != null) { return font; } if (FontUtilities.isLogging()) {
*** 2159,2187 **** * We do not add these fonts to fontNameCache for the * app context case which eliminates the overhead of a per context * cache for these. */ - if (fontsAreRegistered || fontsAreRegisteredPerAppContext) { - Hashtable<String, FontFamily> familyTable = null; - Hashtable<String, Font2D> nameTable; - if (fontsAreRegistered) { ! familyTable = createdByFamilyName; ! nameTable = createdByFullName; ! } else { ! AppContext appContext = AppContext.getAppContext(); ! @SuppressWarnings("unchecked") ! Hashtable<String,FontFamily> tmp1 = ! (Hashtable<String,FontFamily>)appContext.get(regFamilyKey); ! familyTable = tmp1; ! ! @SuppressWarnings("unchecked") ! Hashtable<String, Font2D> tmp2 = ! (Hashtable<String,Font2D>)appContext.get(regFullNameKey); ! nameTable = tmp2; ! } family = familyTable.get(lowerCaseName); if (family != null) { font = family.getFontWithExactStyleMatch(style); if (font == null) { --- 2141,2153 ---- * We do not add these fonts to fontNameCache for the * app context case which eliminates the overhead of a per context * cache for these. */ if (fontsAreRegistered) { ! Hashtable<String, FontFamily> familyTable = createdByFamilyName; ! Hashtable<String, Font2D> nameTable = createdByFullName; family = familyTable.get(lowerCaseName); if (family != null) { font = family.getFontWithExactStyleMatch(style); if (font == null) {
*** 2682,2694 **** * return an AppContext specific list. * * Calling the methods below is "heavyweight" but it is expected that * these methods will be called very rarely. * - * If _usingPerAppContextComposites is true, we are in "applet" - * (eg browser) environment and at least one context has selected - * an alternate composite font behaviour. * If _usingAlternateComposites is true, we are not in an "applet" * environment and the (single) application has selected * an alternate composite font behaviour. * * - Printing: The implementation delegates logical fonts to an AWT --- 2648,2657 ----
*** 2696,2720 **** * We can detect that alternate fonts are in use and back-off to 2D, but * that uses outlines. Much of this can be fixed with additional work * but that may have to wait. The results should be correct, just not * optimal. */ - private static final Object altJAFontKey = new Object(); - private static final Object localeFontKey = new Object(); - private static final Object proportionalFontKey = new Object(); - private boolean _usingPerAppContextComposites = false; private boolean _usingAlternateComposites = false; - /* These values are used only if we are running as a standalone - * application, as determined by maybeMultiAppContext(); - */ private static boolean gAltJAFont = false; private boolean gLocalePref = false; private boolean gPropPref = false; ! /* This method doesn't check if alternates are selected in this app ! * context. Its used by the FontMetrics caching code which in such * a case cannot retrieve a cached metrics solely on the basis of * the Font.equals() method since it needs to also check if the Font2D * is the same. * We also use non-standard composites for Swing native L&F fonts on * Windows. In that case the policy is that the metrics reported are --- 2659,2675 ---- * We can detect that alternate fonts are in use and back-off to 2D, but * that uses outlines. Much of this can be fixed with additional work * but that may have to wait. The results should be correct, just not * optimal. */ private boolean _usingAlternateComposites = false; private static boolean gAltJAFont = false; private boolean gLocalePref = false; private boolean gPropPref = false; ! /* Its used by the FontMetrics caching code which in such * a case cannot retrieve a cached metrics solely on the basis of * the Font.equals() method since it needs to also check if the Font2D * is the same. * We also use non-standard composites for Swing native L&F fonts on * Windows. In that case the policy is that the metrics reported are
*** 2722,2751 **** * visible java.awt.Font. So in that case the metrics cache which tests * the Font does what we want. In the near future when we expand the GTK * logical font definitions we may need to revisit this if GTK reports * combined metrics instead. For now though this test can be simple. */ - public boolean maybeUsingAlternateCompositeFonts() { - return _usingAlternateComposites || _usingPerAppContextComposites; - } - public boolean usingAlternateCompositeFonts() { ! return (_usingAlternateComposites || ! (_usingPerAppContextComposites && ! AppContext.getAppContext().get(CompositeFont.class) != null)); ! } ! ! private static boolean maybeMultiAppContext() { ! Boolean appletSM = (Boolean) ! java.security.AccessController.doPrivileged( ! new java.security.PrivilegedAction<Object>() { ! public Object run() { ! SecurityManager sm = System.getSecurityManager(); ! return sm instanceof sun.awt.AWTSecurityManager; ! } ! }); ! return appletSM.booleanValue(); } /* Modifies the behaviour of a subsequent call to preferLocaleFonts() * to use Mincho instead of Gothic for dialoginput in JA locales * on windows. Not needed on other platforms. --- 2677,2688 ---- * visible java.awt.Font. So in that case the metrics cache which tests * the Font does what we want. In the near future when we expand the GTK * logical font definitions we may need to revisit this if GTK reports * combined metrics instead. For now though this test can be simple. */ public boolean usingAlternateCompositeFonts() { ! return _usingAlternateComposites; } /* Modifies the behaviour of a subsequent call to preferLocaleFonts() * to use Mincho instead of Gothic for dialoginput in JA locales * on windows. Not needed on other platforms.
*** 2756,2814 **** .info("Entered useAlternateFontforJALocales()."); } if (!FontUtilities.isWindows) { return; } - - if (!maybeMultiAppContext()) { gAltJAFont = true; - } else { - AppContext appContext = AppContext.getAppContext(); - appContext.put(altJAFontKey, altJAFontKey); - } } public boolean usingAlternateFontforJALocales() { - if (!maybeMultiAppContext()) { return gAltJAFont; - } else { - AppContext appContext = AppContext.getAppContext(); - return appContext.get(altJAFontKey) == altJAFontKey; - } } public synchronized void preferLocaleFonts() { if (FontUtilities.isLogging()) { FontUtilities.getLogger().info("Entered preferLocaleFonts()."); } /* Test if re-ordering will have any effect */ if (!FontConfiguration.willReorderForStartupLocale()) { return; } - - if (!maybeMultiAppContext()) { if (gLocalePref == true) { return; } gLocalePref = true; createCompositeFonts(fontNameCache, gLocalePref, gPropPref); _usingAlternateComposites = true; - } else { - AppContext appContext = AppContext.getAppContext(); - if (appContext.get(localeFontKey) == localeFontKey) { - return; - } - appContext.put(localeFontKey, localeFontKey); - boolean acPropPref = - appContext.get(proportionalFontKey) == proportionalFontKey; - ConcurrentHashMap<String, Font2D> - altNameCache = new ConcurrentHashMap<String, Font2D> (); - /* If there is an existing hashtable, we can drop it. */ - appContext.put(CompositeFont.class, altNameCache); - _usingPerAppContextComposites = true; - createCompositeFonts(altNameCache, true, acPropPref); - } } public synchronized void preferProportionalFonts() { if (FontUtilities.isLogging()) { FontUtilities.getLogger() --- 2693,2723 ----
*** 2818,2850 **** * to take any action. */ if (!FontConfiguration.hasMonoToPropMap()) { return; } - - if (!maybeMultiAppContext()) { if (gPropPref == true) { return; } gPropPref = true; createCompositeFonts(fontNameCache, gLocalePref, gPropPref); _usingAlternateComposites = true; - } else { - AppContext appContext = AppContext.getAppContext(); - if (appContext.get(proportionalFontKey) == proportionalFontKey) { - return; - } - appContext.put(proportionalFontKey, proportionalFontKey); - boolean acLocalePref = - appContext.get(localeFontKey) == localeFontKey; - ConcurrentHashMap<String, Font2D> - altNameCache = new ConcurrentHashMap<String, Font2D> (); - /* If there is an existing hashtable, we can drop it. */ - appContext.put(CompositeFont.class, altNameCache); - _usingPerAppContextComposites = true; - createCompositeFonts(altNameCache, acLocalePref, true); - } } private static HashSet<String> installedNames = null; private static HashSet<String> getInstalledNames() { if (installedNames == null) { --- 2727,2742 ----
*** 2863,2890 **** installedNames = names; } return installedNames; } ! /* Keys are used to lookup per-AppContext Hashtables */ ! private static final Object regFamilyKey = new Object(); ! private static final Object regFullNameKey = new Object(); private Hashtable<String,FontFamily> createdByFamilyName; private Hashtable<String,Font2D> createdByFullName; private boolean fontsAreRegistered = false; - private boolean fontsAreRegisteredPerAppContext = false; public boolean registerFont(Font font) { /* This method should not be called with "null". * It is the caller's responsibility to ensure that. */ if (font == null) { return false; } /* Initialise these objects only once we start to use this API */ ! synchronized (regFamilyKey) { if (createdByFamilyName == null) { createdByFamilyName = new Hashtable<String,FontFamily>(); createdByFullName = new Hashtable<String,Font2D>(); } } --- 2755,2779 ---- installedNames = names; } return installedNames; } ! private static final Object regFamilyLock = new Object(); private Hashtable<String,FontFamily> createdByFamilyName; private Hashtable<String,Font2D> createdByFullName; private boolean fontsAreRegistered = false; public boolean registerFont(Font font) { /* This method should not be called with "null". * It is the caller's responsibility to ensure that. */ if (font == null) { return false; } /* Initialise these objects only once we start to use this API */ ! synchronized (regFamilyLock) { if (createdByFamilyName == null) { createdByFamilyName = new Hashtable<String,FontFamily>(); createdByFullName = new Hashtable<String,Font2D>(); } }
*** 2917,2951 **** if (names.contains(familyName) || names.contains(fullName)) { return false; } /* Checks passed, now register the font */ ! Hashtable<String,FontFamily> familyTable; ! Hashtable<String,Font2D> fullNameTable; ! if (!maybeMultiAppContext()) { ! familyTable = createdByFamilyName; ! fullNameTable = createdByFullName; fontsAreRegistered = true; ! } else { ! AppContext appContext = AppContext.getAppContext(); ! @SuppressWarnings("unchecked") ! Hashtable<String,FontFamily> tmp1 = ! (Hashtable<String,FontFamily>)appContext.get(regFamilyKey); ! familyTable = tmp1; ! @SuppressWarnings("unchecked") ! Hashtable<String,Font2D> tmp2 = ! (Hashtable<String,Font2D>)appContext.get(regFullNameKey); ! fullNameTable = tmp2; ! ! if (familyTable == null) { ! familyTable = new Hashtable<String,FontFamily>(); ! fullNameTable = new Hashtable<String,Font2D>(); ! appContext.put(regFamilyKey, familyTable); ! appContext.put(regFullNameKey, fullNameTable); ! } ! fontsAreRegisteredPerAppContext = true; ! } /* Create the FontFamily and add font to the tables */ Font2D font2D = FontUtilities.getFont2D(font); int style = font2D.getStyle(); FontFamily family = familyTable.get(familyName); if (family == null) { --- 2806,2819 ---- if (names.contains(familyName) || names.contains(fullName)) { return false; } /* Checks passed, now register the font */ ! Hashtable<String, FontFamily> familyTable = createdByFamilyName; ! Hashtable<String, Font2D> fullNameTable = createdByFullName; fontsAreRegistered = true; ! /* Create the FontFamily and add font to the tables */ Font2D font2D = FontUtilities.getFont2D(font); int style = font2D.getStyle(); FontFamily family = familyTable.get(familyName); if (family == null) {
*** 2987,3002 **** public TreeMap<String, String> getCreatedFontFamilyNames() { Hashtable<String,FontFamily> familyTable; if (fontsAreRegistered) { familyTable = createdByFamilyName; - } else if (fontsAreRegisteredPerAppContext) { - AppContext appContext = AppContext.getAppContext(); - @SuppressWarnings("unchecked") - Hashtable<String,FontFamily> tmp = - (Hashtable<String,FontFamily>)appContext.get(regFamilyKey); - familyTable = tmp; } else { return null; } Locale l = getSystemStartupLocale(); --- 2855,2864 ----
*** 3017,3032 **** public Font[] getCreatedFonts() { Hashtable<String,Font2D> nameTable; if (fontsAreRegistered) { nameTable = createdByFullName; - } else if (fontsAreRegisteredPerAppContext) { - AppContext appContext = AppContext.getAppContext(); - @SuppressWarnings("unchecked") - Hashtable<String,Font2D> tmp = - (Hashtable<String,Font2D>)appContext.get(regFullNameKey); - nameTable = tmp; } else { return null; } Locale l = getSystemStartupLocale(); --- 2879,2888 ----
< prev index next >